伙计们我最近看到了一些代码,并且不知道为什么会有效?
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();
}
}
答案 0 :(得分:2)
仔细观察,print()
是一种静态方法。这意味着可以在没有Test1
实例的情况下调用它。即它可以简单地称为:
Test.print();
test()
方法返回null的事实无关紧要。实际上,如果您使用的是现代IDE,则可能会在调用test().print()
时发出警告,警告您正在尝试在对象实例上调用静态方法。
没有NullPointerException,因为JVM没有尝试推测test()返回的对象。 JVM知道它不需要在对象的实例上调用静态方法。
如果您想了解有关底层实施的更多信息,以及invokespecial
和invokestatic
之间的区别,我建议this question。