gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:28:02 24 4
gpt4 key购买 nike

在最近的一个问题中,有人询问静态方法,其中一个答案表示您通常使用以下内容来调用它们:

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/56599569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com