Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用null实例调用静态方法_Java - Fatal编程技术网

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()