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);