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

时间:2010-08-03 23:16:32

标签: java oop

为什么允许以下内容:

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

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

7 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:14)

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

答案 2 :(得分:10)

我能想到的唯一正当理由是 - 如果父类在编写子类后添加了方法,那么:

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. 的名称
  3. 打破与Father
  4. 的关系
  5. 添加Son方法
  6. 如果Son类是许多其他项目的依赖项,那么#1和#2可能是不可接受的,除了添加Son( )方法之外别无选择。

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

我看不出它的正当理由。

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

这可能非常令人困惑,特别是在使用反射来查看对象的构图时。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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