以下示例代码来自:http://javarevisited.blogspot.in/2011/11/static-keyword-method-variable-java.html
public class TradingSystem1 {
private static String category = "electronic trading system";
public static void main(String[] args) {
TradingSystem1 system = null;
System.out.println(system.category);
}
}
它打印“电子交易系统”而不是NullPointerException
。谁能解释为什么?如何在空对象category
上引用system
?
答案 0 :(得分:3)
JLS - Example 15.11.1-2. Receiver Variable Is Irrelevant For static Field Access
以下程序演示了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
不被抛出。印刷的“Mount”表明了Primary 尽管事实如此,表达式确实在运行时完全评估 那个 只有它的类型,而不是它的值, 用于确定哪个字段到 访问(因为字段山是static
)。
长话短说: 运行时足够聪明,知道访问静态属性实际上并不需要该字段,所以很有意思。
答案 1 :(得分:1)
“类别”字段位于静态上下文中,因此不需要任何TradingSystem1实例进行访问。
正确访问“类别”是:
TradingSystem1.category
答案 2 :(得分:1)
静态字段不依赖于任何实例:
TradingSystem1 system = null;
System.out.println(system.category);
与
相同 System.out.println(TradingSystem1 .category);
答案 3 :(得分:0)
它打印“电子交易系统”而不是NullPointerException。 谁能解释为什么?如何在null上引用类别 对象系统?
category
是一个static
变量,并且在加载类时初始化静态变量。所以变量category
的内存分配和初始化是在加载类时完成的,因此你可以获取它的值。静态变量可以使用实例或类名来获取,但在内部它将使用编译代码中的类名来引用。
答案 4 :(得分:0)
private static String category = "electronic trading system";
category是一个静态字符串,我们知道,为了调用静态字符串,我们需要创建对象
答案 5 :(得分:0)
您指的是一个类变量,一个静态成员。每个实例不存在类变量,但每个对象只存在一次(参见Chapter 8.3.1.1 (static Fields)。
Java语言规范在Chapter 15.11.1 (Field Access Using a Primary)中指定:
如果该字段是静态的: 将评估Primary表达式,并丢弃结果。如果评估主要表达方式 突然完成,字段访问表达式出于同样的原因突然完成。 如果该字段是final,则结果是类或接口中指定的类变量的值,该类是Primary表达式的类型。 如果该字段不是final,则结果是一个变量,即类中指定的类变量,它是Primary表达式的类型。
因此,对于静态字段,将丢弃主表达式的值(在示例中 system )。简单地忽略null值,因为编译器只需要知道类型(类)以访问类变量(静态成员)。