我有以下代码
public class Sample {
public static void display(){
System.out.println("Hai Sample");
}
public void displays(){
System.out.println("Hai Sample");
}
}
public class Sample2 {
public static void main(String[] args) {
Sample obj=null;
obj.display();
obj.displays();
}
}
在这里,当我们对 Sample obj 使用 assign null 时,我只能访问静态方法。如果我使用像 Sample obj= new Sample();
这样的新运算符,我可以访问静态和非静态方法。
我的问题是,这里如何进行对象初始化以及 null 如何引用 Sample 对象的静态方法以及为什么不是非静态方法
最佳答案
不同之处在于,在一种情况下 (new Sample()
),您有一个实例。在第二种情况下 (null
),您不。
display
是静态方法(与类相关,不是任何实例); displays
是一个instance 方法(与特定实例相关)。这是 Java 语法的一个怪癖,允许您通过一些看起来像实例引用的东西来引用static
字段和方法。由于该实例并未实际使用,因此未取消引用,因此它为 null
的事实不会造成任何问题。
main
中的代码实际上是这样的:
public static void main(String[] args) {
Sample obj=null;
Sample.display(); // `display` is static, no instance is used
obj.displays(); // `displays` is non-static, requires an instance
}
当你似乎通过obj
调用display
时,实际上所有编译器使用obj
变量是为了查看它的类型是什么(在本例中,示例
)。变量的值(null
或实例,无论哪种方式)根本没有使用,也没有错误。
相比之下,调用displays
时,obj
变量用于其类型(Sample
)和它的值,因为当调用 displays
时,JVM 需要一个引用作为调用的 this
。尝试使用 null
引用调用实例方法是错误的。
关于java - 静态函数和非静态函数中 'Object obj = new Object()'和 'Object obj = null'的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36472315/