gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:59:03 25 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/7884004/

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