使用null实例调用静态方法

时间:2017-07-27 07:14:36

标签: 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 static" without compile or runtime errors.

我知道可以使用类的名称来调用静态方法,例如 MyClass.staticMethod(),而且我知道你可以在非静态方法中调用静态方法,但是上面的代码对我来说很困惑。任何人都可以向我解释如何使用null实例调用静态方法?感谢。

2 个答案:

答案 0 :(得分:0)

instance.printMessage();静态为printMessage()

时,您可能会想到instance.MyClass.printMessage();

真正的代码是:

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

 }

答案 1 :(得分:0)

您可能会在此行instance.printMessage();上发出警告

  

来自类型的静态方法printData()   应以静态方式访问CallingStaticMethodOnNullReference

因此,即使在使用或不使用Class name的情况下调用方法进行编译,编译器也会在Class name文件中添加.class和方法调用,如MyClass.printMessage(); 。这就是为什么你没有得到任何例外。如果您从编译器的角度思考,有时代码操作会更好。