与构造函数同名的方法 – 为什么?

为什么允许以下内容:

public class Foo { public Foo() { ... } public void Foo() { ... } } 

是否有正当理由将方法命名为与类相同?

我的猜测是它是允许的,因为明确禁止它会增加Java的标识符命名规则的另一个要求,几乎没有什么好处。 与C ++不同,Java总是要求使用new关键字调用构造函数,因此对于标识符是指方法还是构造函数,从不存在任何歧义。 我确实同意一个与其父类同名的方法乍一看是相当混乱的,应该几乎可以避免。 也就是说,我很高兴他们选择不通过禁止这些方法来进一步使语言复杂化。

这太令人发指了。 我不会允许这样的事情在代码审查中存活下来。

唯一合理的理由 – 我能想到 – 利用它是因为父类在编写子类后添加了方法:

 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. 打破与Fatherclass的关系
  3. 添加Son方法

如果Son类是许多其他项目的依赖项,则#1和#2可能是不可接受的,除了添加Son( )方法之外别无选择。

这是一个非常人为的例子。 你永远不应该在真正的代码中看到这样的东西。

构造函数与类具有相同的名称,属于Type命名空间。 方法命名空间与Java中的类型命名空间不同。 所以这在技术上是允许的(这不是重载)。

但是,实际命名方法与类名相同没有任何正当理由。 这将被视为一种非常糟糕的做法。

我看不出它的正当理由。

C#提供编译器错误 – “成员名称不能与其封闭类型相同”

这可能非常令人困惑,尤其是在使用reflection来查看对象的组成时。

方法的返回值被定义为void,而构造函数没有返回值,这使它们不同,因而是有效的代码。 然而,为什么有人想要这样做是超出我的。

原因是在构造函数中,我们在创建类的对象时传递值。这就是为什么构造函数的名称应该相同,以便它可以接受传递的值并在创建对象时初始化class上。