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

标签 java object static null

我有以下代码

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/

相关文章:

java - Spring Data JPA连接2个表

java - Hazelcast为Map添​​加索引,其中不同类的对象实现相同的接口(interface)

java - ActiveMQ MapMessage 接收带有空 theTable 的消息

java - 使用 RxJava 执行并行任务并等待其中最后一个任务完成

javascript - 在 JavaScript 和 Angular 中动态地将变量插入到对象路径中

java - 我什么时候应该在方法中使用它?

c++ - 在 C++ 中使用带 vector 的对象有更好或更正确的方法吗?

java - 操作日期的静态方法。多线程问题

c++ - 在哪里放置用于(例如)std::sort 的比较函数?

C++:静态原语在程序退出时是否无效?