java - 是通过对象 "bad form"调用静态方法吗?为什么?

标签 java methods static instance

在最近的一个问题中,有人询问了静态方法,其中一个答案表明您通常用类似的方式调用它们:

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/

相关文章:

java - 使用java将jpg图像添加在一起

c# - C# 和 java 是否支持静态类型?

android - 其他 Activity 类中的方法

java - 多模块项目 : reuse static method between test classes from different modules

c++ - c/c++中的静态指针默认值

c - 错误 : initializer element is not a compile-time constant

java - 使代码可测试的首选方法:依赖注入(inject)与封装

java - 如何单击主菜单中的子菜单链接

java - 自动售货机程序及打印阵列

api - 使用 GetterUtils 和 ParamUtils 的区别