2010-08-03 6 views

ответ

18

Я предполагаю, что это разрешено, потому что явно запрет на это добавит еще одно требование к правилам именования идентификаторов Java для получения очень небольшой пользы. В отличие от, скажем, C++, Java всегда требует, чтобы конструкторы вызывались с ключевым словом new, поэтому никогда не возникает двусмысленности в отношении того, относится ли идентификатор к методу или конструктору. Я согласен с тем, что метод с тем же именем, что и его родительский класс, с первого взгляда довольно запутан, и его почти наверняка следует избегать. Тем не менее, я рад, что они решили не усложнять язык, запретив такие методы.

13

Это отвратительно. Я бы не позволил такой вещи пережить обзор кода.

1

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

4

Конструктор имеет то же имя, что и класс, и попадает под пространство имен типов. Пространство имен методов отличается от пространства имен типов в Java. Так что это технически разрешено (и это не перегрузка).

Однако нет никакой реальной причины фактически называть метод таким же, как имя класса. Это будет считаться очень плохой практикой.

2

Я не вижу действительной причины для этого.

C# обеспечивает ошибку компилятора - «Имена участников не может быть такой же, как и их вмещающих Тип»

Это может быть довольно запутанным, особенно при использовании отражения смотреть на состав объекта.

9

Единственная веская причина - что я могу думать - для использования этого, если родительский класс добавляет методы после того, как вы написали класс ребенка:

interface Father { } // version 1.0 

class Son implements Father { Son () { } } // version 1.0 

interface Father { void Son () ; /* new method */ } // version 2.0 

class Son implements Father { Son () { } void Son () { } } // version 2.0 

Если вы не имеете никакого контроля интерфейса Father, но имеют контроль над классом Son, тогда вам нужно как-то изменить Son. Вы можете

  1. Изменить имя Son класса
  2. Разорвать отношения с Father класса
  3. добавить метод Son

Если Son класс является зависимость многих других проектов, то # 1 и # 2 могут быть неприемлемыми, оставляя вас без выбора, кроме как добавить метод Son().

Это очень надуманный пример. Вы никогда не должны видеть такую ​​вещь в реальном коде.

1

Причина в том, что в конструкторах мы передаем значения во время создания объекта класса.поэтому поэтому имя конструктора должно быть таким же, чтобы оно могло принимать переданные значения и инициализироваться во время создания объекта класса.

Смежные вопросы