对象obj = new Object()'之间的区别和'对象obj = null'在静态和非静态功能

时间:2016-04-07 09:40:46

标签: 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使用赋值null时,我只能访问静态方法。如果我使用像Sample obj= new Sample();这样的新运算符,我可以访问静态和非静态方法。

这里我的问题是,如何在此处进行对象初始化以及如何null引用Sample对象的静态方法以及为什么不是非静态方法

5 个答案:

答案 0 :(得分:1)

不同之处在于,在一种情况下(new Sample()),您有一个实例。在第二种情况下(null),您

display是一个静态方法(与类有关,而不是任何实例); displays实例方法(与特定实例相关)。这是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
}

当您似乎通过display调用obj时,实际上所有编译器都使用obj变量来查看其类型是什么(在这种情况下,{{1} })。根本没有使用变量(Sample或实例的,并且没有错误。

相比之下,调用null时,displays变量的类型(obj的值都会被使用,因为调用时{{1} JVM需要一个引用用作调用的Sample。尝试使用displays引用调用实例方法是错误的。

答案 1 :(得分:1)

与实例成员不同,您不需要该类的实际实例来访问static成员。

所以,你在哪里:

obj.display();

这被JVM视为:

Sample.display();

并且没有问题。

然而,实例成员依赖于(并且每个实例都是唯一的)实例。它不存在,直到实例出现。

obj.display();

是您永远不应该编写的代码:可能必须在以后维护您的代码的人可能将其误认为是实例成员,并且假设调用该方法的影响仅限于该实例,而不是。

关于创建新实例的细节,请查看official documentation中主题的页面。

答案 2 :(得分:1)

静态方法可以通过类访问,不需要实例化。但是你必须得到一个类的实例才能访问静态方法。

应该查看这个已解决的问题:What does the 'static' keyword do in a class?

答案 3 :(得分:1)

  

这里我的问题是,如何在此处进行对象初始化以及如何null引用Sample对象的静态方法

它没有! null为null。

您可以在不创建任何对象的情况下调用静态方法。

此外,您应该以静态方式调用静态方法:

Sample.display();

一个好的IDE应该像访问方法一样给你一个警告/错误:

  

应该以静态方式访问Sample类型的静态方法display()

答案 4 :(得分:1)

何时 -

Sample obj=null;

你正试图访问,

public void display() {
    System.out.println("Error");
}

它会显示错误。它需要一个实例。但你可以称之为 -

public static void display(){
    System.out.println("Success");   
}

由于它是静态的,因此不需要实例。