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

Tom*_*sky 27 java oop

为什么允许以下内容:

public class Foo {
  public Foo() { ... }
  public void Foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)

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

bca*_*cat 22

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


duf*_*ymo 14

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


emo*_*ory 11

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

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
Run Code Online (Sandbox Code Playgroud)

如果您无法控制Father界面,但确实可以控制Son该类,那么您必须以Son某种方式进行更改.你可以

  1. 更改Son类的名称
  2. 打破与Father班级的关系
  3. 添加Son方法

如果Son该类是许多其他项目的依赖项,那么#1和#2可能是不可接受的,让您别无选择,只能添加该Son( )方法.

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


sam*_*aur 5

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

但是,没有任何有效的理由来实际命名与类名称相同的方法。这将被认为是非常不好的做法。