Наличие 2 переменных с тем же именем в классе, который расширяет другой класс в Java

Если вы оказались в контейнере, вы должны выполнить команду для входа в этот контейнер.

Если вы забыли, где находитесь, введите docker ps. Если это не удается, вы находитесь в док-контейнере.

Редактировать:

Очевидно, этот простой трюк не работает, когда вы запускаете Docker в Docker.

12
задан Martin Andersson 21 April 2009 в 13:46
поделиться

4 ответа

В некотором смысле вы переопределяете поля суперкласса. Но это гораздо проще сделать случайно, потому что нет перегрузки полей (у вас есть только одна переменная с заданным именем, тип не имеет значения). Это называется переменной «скрытие» или «затенение». Итак, вы правы, в результате вы получите два поля с одинаковым именем.

Ваш второй пример верен. Они унаследованы от суперкласса и, поскольку они не объявлены закрытыми, они видны подклассу. Обычно плохая практика - обращаться непосредственно к полям суперкласса, и если нет веских причин, они должны быть объявлены закрытыми. Ваш пример вызова супер-конструктора - лучший подход.

Кроме того, если вы скрываете поле с другим именем, вы по-прежнему можете ссылаться на них как super.x, super.y, против this.x, this.y, вам следует избегать этой ситуации, если это вообще возможно.

13
ответ дан 2 December 2019 в 06:45
поделиться

В дополнение к тому, что говорили другие: Является ли Тело точкой ? Нет, Тело имеет свойство position типа Point . Поэтому Тело , вероятно, не должно расширяться Точка . Если вы избавляетесь от наследования (от реализации), тогда вы избавляетесь от множества проблем. Это и использовать частный (не защищенный !) И окончательный либерально.

4
ответ дан 2 December 2019 в 06:45
поделиться

Да, у вас будет две переменные, одна скрывает другую. Имеет смысл разрешить это по двум причинам:

  1. Предположим, у вас есть базовый класс Base и производный класс Derived , который автор Base понятия не имеет о. Должен ли автор Base никогда не иметь возможности добавлять какие-либо поля только потому, что производный класс может разделять поля? Или Derived прекратить компиляцию, когда изменение Base на самом деле не влияет на корректность?
  2. Ваши поля почти всегда должны быть закрытыми, и в этот момент не имеет значения, дублируются имена или нет - ни одна «сторона» не узнает о переменных другого.
5
ответ дан 2 December 2019 в 06:45
поделиться

Я быстро понял, что при этом будут созданы две переменные внутри класса Body с именем x и две другие переменные в Body с именем y , Как это вообще возможно, и почему в Java это разрешено?

На самом деле нет, вы не создаете две переменные с одинаковым именем, очевидно, компилятор не должен и не допустит этого.

Что вы делают теневое копирование существующих переменных, определенных как x и y , что означает, что Body.x и Body.y по существу перекрывают имена для Point.x и Point .y, делая последние две переменные полностью недоступными из класса Body ( ссылка на определение «затенения» в спецификации языка Java ).

Затенение имен обычно воспринимается как плохая практика и причина ошибок ,

1
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: