Java 使用null实例调用静态方法
最近有人问我下一个代码的输出是什么:Java 使用null实例调用静态方法,java,Java,最近有人问我下一个代码的输出是什么: class MyClass { static void printMessage() { System.out.println("Hello from static"); } public static void main(String[] args) { MyClass instance = null; instance.printMessage(); } } 输出 "Hello from
class MyClass {
static void printMessage() {
System.out.println("Hello from static");
}
public static void main(String[] args) {
MyClass instance = null;
instance.printMessage();
}
}
输出
"Hello from static" without compile or runtime errors.
我知道可以使用类的名称调用静态方法,比如MyClass.staticMethod(),我还知道可以在非静态方法中调用静态方法,但是上面的代码让我感到困惑。有人能给我解释一下如何使用空实例调用静态方法吗?谢谢。您可能会考虑
instance.printMessage()当printMessage()
作为instance.MyClass.printMessage()是静态的时,code>代码>
真正的代码是:
class MyClass{
static void printMessage(){
System.out.println("Hello from static");
}
public static void main(String[] args){
MyClass instance = null;
instance.printMessage();
}
}
我们可以利用想象力使其更容易理解:
class MyClass{
static void printMessage(){
System.out.println("Hello from static");
}
public static void main(String[] args){
MyClass instance = null;
instance.MyClass.printMessage();
}
}
您可能在这一行instance.printMessage()处收到警告代码>说
类型中的静态方法printData()
CallingStaticMethodOnNullReference应以静态方式访问
因此,在编译时,即使使用或不使用类名
调用该方法,编译器也会将类名
与方法调用一起添加到.Class
文件中,如MyClass.printMessage()代码>。这就是为什么你没有得到任何例外。有时,如果您从编译器的角度考虑,代码操作会更好。基本上,因为编译器将其视为编写的MyClass.printMessage()
-根本不使用引用。在实例上调用静态
方法只是一个设计缺陷,由于向后兼容性,无法消除。它只是工作,因为instance
被定义为MyClass
,但是静态调用并不介意分配给它的值。现在修复该错误为时已晚,但无论如何都不应该以这种方式调用静态方法。欢迎使用Stackoverflow。没有类实例,我们可以访问静态方法。MyClass.printMessage();调用静态成员或方法时不需要实例。因为静态成员属于类而不是实例。所以instance.printMessage()代码>等于MyClass.printMessage()