为什么不能拥有具有相同签名的静态和非静态方法是有原因的?
Is there a reason why one can't have a static and a non-static method with identical signature?
我刚刚意识到以下内容无法编译:
class MyCoolClass {
static void do(){..}
void do(){..}
}
是否有充分的理由禁止这样做?也许它会导致一些我目前遗漏的问题?
我目前能看到的唯一问题是有人可能会尝试调用静态方法,但实际上调用了非静态方法。但这听起来与相互隐藏的子类上的静态方法相当,所以我不认为这是一个 "good" 原因。
如果认为对象在该方法的第 0 个参数上调用了一个方法,那么它甚至是该方法的正常重载。
如果您想知道:我想要这个,因为它允许为 new MyCoolClass().do()
创建快捷方式 MyCoolClass.do()
或静态导入甚至 do()
.
我认为在创建对象时处理起来可能会有问题。您可能知道,您可以通过对象引用调用静态函数,例如:
SomeClass s = new SomeClass();
s.do(); //can be static method, can be normal method
当然,通过对象调用静态方法的情况很少见,但也有可能。
这是因为Java编译器使用方法名和参数类型的有序列表来唯一标识class中的方法。 static 是修饰符标志,不被视为唯一标识的一部分。唯一标识在运行时也很重要,因为 class 文件仅包含标识方法所需的那些键。 class方法所在的名称,然后是方法名,然后是参数列表。
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.4.3.3
我刚刚意识到以下内容无法编译:
class MyCoolClass {
static void do(){..}
void do(){..}
}
是否有充分的理由禁止这样做?也许它会导致一些我目前遗漏的问题?
我目前能看到的唯一问题是有人可能会尝试调用静态方法,但实际上调用了非静态方法。但这听起来与相互隐藏的子类上的静态方法相当,所以我不认为这是一个 "good" 原因。
如果认为对象在该方法的第 0 个参数上调用了一个方法,那么它甚至是该方法的正常重载。
如果您想知道:我想要这个,因为它允许为 new MyCoolClass().do()
创建快捷方式 MyCoolClass.do()
或静态导入甚至 do()
.
我认为在创建对象时处理起来可能会有问题。您可能知道,您可以通过对象引用调用静态函数,例如:
SomeClass s = new SomeClass();
s.do(); //can be static method, can be normal method
当然,通过对象调用静态方法的情况很少见,但也有可能。
这是因为Java编译器使用方法名和参数类型的有序列表来唯一标识class中的方法。 static 是修饰符标志,不被视为唯一标识的一部分。唯一标识在运行时也很重要,因为 class 文件仅包含标识方法所需的那些键。 class方法所在的名称,然后是方法名,然后是参数列表。
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.4.3.3