基本上,我相信Java设计人员在设计语言时犯了一个错误,并且由于涉及到兼容性问题,现在修复它为时已晚。是的,它可能导致非常误导的代码。是的,你应该避免这种情况。是的,你应该确保将IDE配置为将其视为错误,IMO。如果你曾经亲自设计过一种语言,请记住它作为避免这种情况的示例:)
只是为了回应DJClayworth的观点,这是C#所允许的:
public class Foo{ public static void Bar() { }}public class Abc{ public void Test() { // Static methods in the same class and base classes // (and outer classes) are available, with no // qualification Def(); // Static methods in other classes are available via // the class name Foo.Bar(); Abc abc = new Abc(); // This would *not* be legal. It being legal has no benefit, // and just allows misleading pre // abc.Def(); } public static void Def() { }}为什么我会误导我?因为如果我看一下代码,
someVariable.SomeMethod()我希望它使用的值
someVariable。如果
SomeMethod()是静态方法,则该期望无效;代码欺骗了我。怎么能说有可能是一个很好的事情吗?
奇怪的是,Java不允许你使用可能未初始化的变量来调用静态方法,尽管事实上它将要使用的唯一信息是变量的声明类型。这是一个前后矛盾,毫无用处的混乱局面。为什么允许它?
编辑:此编辑是对Clayton答案的回应,声称它允许继承静态方法。没有。静态方法并不是多态的。这是一个简短但完整的程序,以证明这一点:
class base{ static void foo() { System.out.println("base.foo()"); }}class Derived extends base{ static void foo() { System.out.println("Derived.foo()"); }}public class Test{ public static void main(String[] args) { base b = new Derived(); b.foo(); // Prints "base.foo()" b = null; b.foo(); // Still prints "base.foo()" }}如你所见,的执行时间值b被完全忽略。



