我有以下代码
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对象的静态方法以及为什么不是非静态方法
答案 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");
}
由于它是静态的,因此不需要实例。