在最近的一个问题中,有人询问了静态方法,其中一个答案表明您通常用类似的方式调用它们:
MyClassName.myStaticMethod();
对此的评论还指出,您也可以通过具有以下内容的对象调用它:
MyClassName myVar;
myVar.myStaticMethod();
但它被认为是错误的形式。
现在在我看来,这样做实际上可以让我的生活更轻松,所以我不必担心什么是静态的(a)。
通过对象调用静态函数有什么问题吗?显然,您不希望创建一个全新的对象只是为了调用它:
Integer xyzzy;
int plugh = xyzzy.parseInt ("42", 10);
但是,如果您已经有了所需类型的对象,使用它会有问题吗?
(a) 显然,我不能调用非静态方法:
MyClassName.myNonStaticMethod();
但这不是我在这里要问的问题。
最佳答案
在我看来,使它如此难以阅读的真正用例是这样的。下面的代码打印了什么?
//in a main method somewhere
Super instance = new Sub();
instance.method();
//...
public class Super {
public static void method() {
System.out.println("Super");
}
}
public class Sub extends Super {
public static void method() {
System.out.println("Sub");
}
}
答案是它打印“Super”,因为静态方法不是虚拟的。即使 instance
是一个 Sub
,编译器也只能处理 Super
的变量类型。但是,通过 instance
而不是 Super
调用该方法,您巧妙地暗示它将是虚拟的。
事实上,阅读 instance.method()
的开发人员必须查看方法的声明(其签名)才能知道实际调用的是哪个方法。你提到
it seems to me that doing this can actually make my life easier so I don't have to worry about what's static or not
但在上述情况下,上下文实际上非常重要!
我可以相当自信地说,语言设计者一开始就允许这样做是错误的。远离。
关于java - 是通过对象 "bad form"调用静态方法吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884004/