【问题标题】:Why this code works? [duplicate]为什么这段代码有效? [复制]
【发布时间】:2013-11-29 22:31:06
【问题描述】:

各位,我最近看到了一段代码,但不知道它为什么会起作用?

 public class Test1{

    static Test1 test(){
        System.out.println("test");
        return null;
    }

    static void print(){
        System.out.println("print");
    }

    public static void main(String...strings){
        test().print();
    }

}

【问题讨论】:

  • 如果你真的考虑它,它是有道理的。
  • 为什么你认为它没有?
  • 虽然这应该可以很好地编译,但它是糟糕的代码可读性的一个很好的例子:)
  • 假设你有 5 美元,你把这 5 美元给你自己,在这种情况下,你会说我给了自己 5 美元。它是同一个蒙古包,。方法是返回类,类也有tes.......等等
  • @RichardTingle,谢谢,真的是重复的。

标签: java static


【解决方案1】:

仔细看,print() 是一个静态方法。这意味着可以在没有Test1 实例的情况下调用它。 IE。它可以简单地称为:

Test.print();

test() 方法返回 null 的事实无关紧要。事实上,如果您使用的是现代 IDE,它可能会在您调用 test().print() 时发出警告,警告您正在尝试在对象实例上调用静态方法。

没有 NullPointerException,因为 JVM 没有尝试尊重 test() 返回的对象。 JVM 知道它不需要在对象实例上调用静态方法。

如果您想了解更多关于底层实现的信息,以及invokespecialinvokestatic 之间的区别,我建议您使用this question

【讨论】:

  • 这个我知道,但是你能给出更高级的解释吗?为什么我们没有收到 NPE?
  • @KirillSolokhov JVM 只知道它是静态方法时不需要取消引用该对象。
  • @Kirill 假设它不为空,编译器会做什么?使用声明的类并调用静态方法。与实际实例交谈是浪费时间,因此不会打扰。因此,JVM 甚至不知道它是空的
猜你喜欢
  • 2012-11-04
  • 2014-02-02
  • 2017-04-20
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多