null对象上的静态变量输出

时间:2013-11-28 12:14:31

标签: java

以下示例代码来自: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

6 个答案:

答案 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()的结果是nullNullPointerException   不被抛出。印刷的“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值,因为编译器只需要知道类型(类)以访问类变量(静态成员)。