Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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 - Fatal编程技术网

Java 空对象上的静态变量输出

Java 空对象上的静态变量输出,java,Java,以下示例代码来自: 它打印“电子交易系统”,而不是NullPointerException。有人能解释为什么吗?在空对象-系统上如何引用类别 它打印“电子交易系统”而不是NullPointerException。 有人能解释为什么吗?如何在null上引用类别 对象系统 类别是一个静态变量,静态变量在类加载时初始化。因此,变量类别的内存分配和初始化在类加载时完成,因此您可以获取其值。静态变量可以使用实例或类名获取,但在内部,它将使用编译代码中的类名引用 private static String

以下示例代码来自:

它打印“电子交易系统”,而不是
NullPointerException
。有人能解释为什么吗?在空对象-
系统
上如何引用
类别

它打印“电子交易系统”而不是NullPointerException。 有人能解释为什么吗?如何在null上引用类别 对象系统

类别
是一个
静态
变量,静态变量在类加载时初始化。因此,变量
类别
的内存分配和初始化在类加载时完成,因此您可以获取其值。静态变量可以使用实例或类名获取,但在内部,它将使用编译代码中的类名引用

private static String category = "electronic trading system";
category是一个静态字符串,我们知道调用静态字符串时需要创建对象

“category”字段位于静态上下文中,然后不需要TradingSystem1的任何实例进行访问

正确访问“类别”是:

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

class Test3 {
    static String mountain = "Chocorua";
    static Test3 favorite(){
        System.out.print("Mount ");
        return null;
    }
    public static void main(String[] args) {
        System.out.println(favorite().mountain);
    }
}
即使
favorite()
的结果是
null
,也会出现
NullPointerException
没有被抛出。打印的“挂载”表明主 表达式确实在运行时得到了充分的评估,尽管事实如此 只有它的类型,而不是它的值,用于确定要选择的字段 访问权限(因为字段是静态的)

长话短说:
运行时非常聪明,知道访问静态属性实际上并不需要该字段,因此它令人惊讶。

静态字段不与任何实例绑定:

    TradingSystem1 system = null;
    System.out.println(system.category);

    System.out.println(TradingSystem1 .category);

您引用的是一个类变量,一个静态成员。类变量不存在于每个实例中,但每个对象只存在一次(请参阅

Java语言规范规定了:

如果该字段是静态的: 将对主表达式求值,并放弃结果。如果对主表达式求值 突然完成时,字段访问表达式出于相同的原因突然完成。 如果该字段是final,则结果是主表达式类型的类或接口中指定的类变量的值。 如果字段不是final,则结果是一个变量,即主表达式类型的类中指定的类变量


因此,对于静态字段,主表达式的值(在您的示例中为系统)被丢弃。空值被忽略,因为编译器只需要知道类型(类)就可以访问类变量(静态成员).

您正在通过一个实例访问一个静态变量。不要这样做,像这样疯狂的事情会发生,原因是+1
    TradingSystem1 system = null;
    System.out.println(system.category);
    System.out.println(TradingSystem1 .category);