Почему следующие разрешенные:Методы с тем же именем, что и конструктор - почему?
public class Foo {
public Foo() { ... }
public void Foo() { ... }
}
Есть ли когда-либо веской причины для обозначения метода такой же, как класс?
Почему следующие разрешенные:Методы с тем же именем, что и конструктор - почему?
public class Foo {
public Foo() { ... }
public void Foo() { ... }
}
Есть ли когда-либо веской причины для обозначения метода такой же, как класс?
Я предполагаю, что это разрешено, потому что явно запрет на это добавит еще одно требование к правилам именования идентификаторов Java для получения очень небольшой пользы. В отличие от, скажем, C++, Java всегда требует, чтобы конструкторы вызывались с ключевым словом new
, поэтому никогда не возникает двусмысленности в отношении того, относится ли идентификатор к методу или конструктору. Я согласен с тем, что метод с тем же именем, что и его родительский класс, с первого взгляда довольно запутан, и его почти наверняка следует избегать. Тем не менее, я рад, что они решили не усложнять язык, запретив такие методы.
Это отвратительно. Я бы не позволил такой вещи пережить обзор кода.
Возвращаемое значение метода определяется как void, тогда как конструктор не имеет возвращаемого значения, что делает их разными и, следовательно, действительными. Однако, почему кто-то хочет это сделать, это выходит за рамки меня.
Конструктор имеет то же имя, что и класс, и попадает под пространство имен типов. Пространство имен методов отличается от пространства имен типов в Java. Так что это технически разрешено (и это не перегрузка).
Однако нет никакой реальной причины фактически называть метод таким же, как имя класса. Это будет считаться очень плохой практикой.
Я не вижу действительной причины для этого.
C# обеспечивает ошибку компилятора - «Имена участников не может быть такой же, как и их вмещающих Тип»
Это может быть довольно запутанным, особенно при использовании отражения смотреть на состав объекта.
Единственная веская причина - что я могу думать - для использования этого, если родительский класс добавляет методы после того, как вы написали класс ребенка:
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
. Вы можете
Son
классаFather
классаSon
Если Son
класс является зависимость многих других проектов, то # 1 и # 2 могут быть неприемлемыми, оставляя вас без выбора, кроме как добавить метод Son()
.
Это очень надуманный пример. Вы никогда не должны видеть такую вещь в реальном коде.
Причина в том, что в конструкторах мы передаем значения во время создания объекта класса.поэтому поэтому имя конструктора должно быть таким же, чтобы оно могло принимать переданные значения и инициализироваться во время создания объекта класса.