Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从空引用访问静态变量?_Java_Static_Nullreferenceexception - Fatal编程技术网

Java 如何从空引用访问静态变量?

Java 如何从空引用访问静态变量?,java,static,nullreferenceexception,Java,Static,Nullreferenceexception,最近我在浏览时发现了一段代码,要求读者确定它的输出是什么 虽然我得到了输出,但我对结果不满意(结果是“Hello”),因为我不知道如何从null引用访问静态成员。背景里发生了什么 public class StaticDEMO { private static String GREET = "Hello"; public static void main(String[] args) { StaticDEMO demo = null; Syst

最近我在浏览时发现了一段代码,要求读者确定它的输出是什么

虽然我得到了输出,但我对结果不满意(结果是“Hello”),因为我不知道如何从null引用访问静态成员。背景里发生了什么

public class StaticDEMO {

    private static String GREET = "Hello";

    public static void main(String[] args) {
        StaticDEMO demo = null;
        System.out.println(demo.GREET);
        // TODO code application logic here
    }
}

这是因为JVM知道您正试图访问特定类上的静态成员。因为您必须将
demo
声明为一个特定的类(在本例中为
StaticDEMO
),所以它知道使用它来查找
问候语

要明确的是,您不会经常遇到这种情况(实际上我必须输入这段代码来验证它,我不能说我见过这种情况)。主要是,最好总是按类引用静态字段,而不是对象实例(我们可以看到,对象实例可能为null!)

意思是,你更喜欢这个:

System.out.println(StaticDEMO.GREET);
编辑

我在:第15章,第11节:字段访问表达式中找到了对此的引用

示例15.11.1-2。接收器变量与静态字段访问无关

下面的程序演示了可以使用null引用访问类(静态)变量,而不会导致异常

[为简洁起见,此处未显示示例]


在Java中被修饰为静态的任何方法都意味着,该方法是类级memeber。这意味着,您不需要对象来访问静态成员。静态方法/变量由类本身维护,而不是由类的任何实例维护。在您的示例中,编译器已经知道该成员是静态成员,并且不需要任何实例来访问该静态方法

静态成员与类一起存储,而不是与它的任何特定实例一起存储。因此,实例是否为null并不重要—类中的成员仍然可以访问。

JVM只是忽略
null
,因为
GREET
是一个类字段,
demo
与引用
Class
字段无关


Static
方法不需要对象引用来调用它,因此即使对象引用为
null
,也可以调用它

因为它实际上没有使用引用。
StaticDEMO编译器知道
demo
是一个类引用,它可能为null,但它的类型是
StaticDEMO
,这是您的类。。这不是一个对象。。因为静态字段是在编译时确定的,所以这是可以的。但是看看代码块,它可能会在运行时抛出NULLPOINTEREXCEPTION或NULLREFERENCEEXCEPTION。。我的问题是这是如何工作的???我们被告知静态成员是类成员,只能通过类的名称访问。那么,在这种情况下,如何从空引用变量访问静态成员呢/因为它根本不使用引用,只使用引用的类型。即使使用对象而不是类来引用静态字段,JVM也知道对象(类)的类型,并在幕后使用它。规范特别将此称为合法(第15.11.1节)。我完全同意@Yadu,我知道静态方法/变量由类本身维护,而不是由类的任何实例维护,但我的问题是如何从空引用访问它?因为JVm知道您尝试访问的方法是静态方法,它忽略该实例。因为,即使您尝试使用类的不同实例访问静态方法,也会返回相同的方法/相同的结果。您是否尝试运行java将原始代码视为的代码?