为什么允许以下内容:
public class Foo {
public Foo() { ... }
public void Foo() { ... }
}
是否有正当理由将方法命名为与类相同?
答案 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
。你可以
Son
类Father
类Son
方法如果Son
类是许多其他项目的依赖项,那么#1和#2可能是不可接受的,除了添加Son( )
方法之外别无选择。
这是一个非常人为的例子。你永远不应该在实际代码中看到这样的东西。
答案 3 :(得分:4)
构造函数与类具有相同的名称,属于Type命名空间。方法命名空间与Java中的类型命名空间不同。所以这在技术上是允许的(这不会超载)。
但是,实际命名方法与类名相同没有任何正当理由。这将被视为一种非常糟糕的做法。
答案 4 :(得分:2)
我看不出它的正当理由。
C#提供编译器错误 - “成员名称不能与其封闭类型相同”
这可能非常令人困惑,特别是在使用反射来查看对象的构图时。
答案 5 :(得分:1)
该方法的返回值被定义为void,而构造函数没有返回值,这使它们不同,因而是有效的代码。然而,为什么有人想这样做是超出我的。
答案 6 :(得分:1)
原因是在构造函数中,我们在创建类的对象时传递值。这就是为什么构造函数的名称应该相同,以便它可以采用传递的值并在对象创建类。