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

Java 与构造函数同名的方法-为什么?,java,oop,Java,Oop,为什么允许以下情况: public class Foo { public Foo() { ... } public void Foo() { ... } } 是否有正当理由将方法命名为与类相同的方法?这是令人发指的。我不会允许这样的事情在代码审查中幸存下来 方法的返回值被定义为void,而构造函数没有返回值,这使得它们不同,因此是有效的代码。然而,我无法理解为什么会有人想这样做。我的猜测是,这是允许的,因为明确禁止它会给Java的标识符命名规则增加另一个要求,但好处微乎其微。与C++不

为什么允许以下情况:

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

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

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

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

我的猜测是,这是允许的,因为明确禁止它会给Java的标识符命名规则增加另一个要求,但好处微乎其微。与C++不同,java总是要求构造函数用<代码>新的< /Cord>关键字调用,因此,对于标识符是否引用方法或构造函数,从来没有任何歧义。我确实同意,一个与其父类同名的方法乍一看是相当令人困惑的,而且几乎肯定应该避免。也就是说,我很高兴他们选择了不通过禁止此类方法来进一步使语言复杂化。

构造函数与类同名,属于类型名称空间。方法名称空间不同于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
如果您不能控制
接口,但是可以控制
类,那么您必须以某种方式更改
。你可以

  • 更改子类的名称
  • 打破与父亲的关系
  • 添加
    Son
    方法
  • 如果
    Son
    类是许多其他项目的依赖项,那么#1和#2可能是不可接受的,这使您别无选择,只能添加
    Son()
    方法


    这是一个非常做作的例子。你不应该在实际代码中看到这样的事情。

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