gpt4 book ai didi

java - 静态函数和非静态函数中 'Object obj = new Object()'和 'Object obj = null'的区别

转载 作者:行者123 更新时间:2023-11-29 07:35:24 24 4
gpt4 key购买 nike

我有以下代码

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com