Java 为什么这个代码有效?
伙计们,我最近看到了一些代码,但不知道它为什么会工作Java 为什么这个代码有效?,java,static,Java,Static,伙计们,我最近看到了一些代码,但不知道它为什么会工作 public class Test1{ static Test1 test(){ System.out.println("test"); return null; } static void print(){ System.out.println("print"); } public static void main(String...string
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();
}
}
仔细看,print()
是一种静态方法。这意味着可以在没有Test1
实例的情况下调用它。也就是说,它可以简单地称为:
Test.print();
test()
方法返回null这一事实与此无关。事实上,如果您使用的是现代IDE,它可能会在调用test().print()
时发出警告,警告您试图在对象实例上调用静态方法
不存在NullPointerException,因为JVM没有尝试遵从test()返回的对象。JVM知道它不需要在对象实例上调用静态方法
如果你想知道更多关于底层实现的信息,以及
invokespecial
和invokestatic
之间的区别,我建议。如果你真的想一想,这是有意义的。为什么你认为没有呢?虽然这应该可以很好地编译,但这是一个可怕代码可读性的极好例子:)Supose u有5美元,你把这5美元给你自己,在这种情况下,你会说我给了自己5美元。是一样的,。方法返回类,该类也有tes。。。。。。。诸如此类on@RichardTingle,谢谢,真的是重复的。我知道这一点,但你能给我更详细的解释吗?为什么我们不接收NPE?@KirillSolokhov JVM只知道当对象是静态方法时,它不需要取消引用该对象。@Kirill假设它不为null,编译器会怎么做?使用声明的类并调用静态方法。与实际实例交谈是浪费时间,因此不必费心。因此,JVM甚至不知道它是空的