为什么这段代码能够工作?

3

各位,我最近看到了一些代码,但不知道它为什么能够工作?

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

}

如果你真的仔细思考,这就有意义了。 - arshajii
你为什么认为它不会呢? - vandale
2
尽管这段代码应该可以编译通过,但它是可读性极差的代码的一个绝佳例子 :) - JamoBox
假设你有5美元,然后你把这5美元给了自己,这种情况下,你会说我给了自己5美元。这是同一个ger。方法返回类,而该类也有tes......等等。 - Azad
@RichardTingle,谢谢,这确实是重复的。 - Kirill Solokhov
那个链接提供了很多有用的答案,希望它们能够澄清一切。 - Richard Tingle
1个回答

2

仔细观察,print() 是一个静态方法。这意味着它可以在没有 Test1 实例的情况下被调用。也就是说,它可以直接被调用:

Test.print();
test()方法返回null是无关紧要的。事实上,如果您使用现代IDE,它可能会警告您调用test().print()时正在尝试在对象实例上调用静态方法。
没有NullPointerException,因为JVM不尝试引用test()返回的对象。 JVM知道它不需要在对象实例上调用静态方法。
如果您想了解底层实现以及invokespecialinvokestatic之间的区别,我建议您参考这个问题

1
我知道这个,但你能给一个更高级的解释吗?为什么我们没有收到NPE? - Kirill Solokhov
1
@KirillSolokhov JVM 知道当一个方法是静态方法时,它不需要解引用对象。 - jwa
假设其不为null,编译器会怎么做?使用声明的类并调用静态方法。与实际实例交互是浪费时间,因此不会打扰它。由于这个原因,JVM甚至不知道它是null。 - Richard Tingle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接