Java中空引用的静态字段

Tin*_*iny 117 java static

staticJava中的成员(static字段或static方法)与其各自的类相关联,而不是与此类的对象相关联.以下代码尝试访问null引用上的静态字段.

public class Main
{
    private static final int value = 10;

    public Main getNull()
    {
        return null;
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        System.out.println("value = "+main.getNull().value);
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然main.getNull()返回null,但它可以工作和显示value = 10.这段代码是如何工作的?

ass*_*ias 92

该行为在Java语言规范中指定:

null引用可用于访问类(静态)变量而不会导致异常.

更详细地说,静态字段评估,例如Primary.staticField如下工作(强调我的) - 在您的情况下,Primary = main.getNull():

  • 将评估Primary表达式,并丢弃结果.[...]
  • 如果该字段是非空的final字段,则结果是类或接口中指定的类变量的值,该类是Primary表达式的类型.[...]

  • @JonofAllTrades:真正的问题是为什么选择允许静态成员作为实例被调用...对我来说,它似乎只会导致混乱和代码不太可读. (13认同)
  • @Falanwe这是允许的,但在Eclipse中引发警告:"静态字段Main.value应该以静态方式访问".至少我们这些挑剔的警告(像我一样)会避免这样的代码. (8认同)
  • @JonofAllTrades我认为这是显而易见的:在调用null引用时不抛出任何异常是合理的,因为它无关紧要,因为该方法是静态的. (6认同)
  • 如果有人有关于*为什么*这个选择的信息,那将是有趣的. (5认同)
  • @Falanwe:同意,这是一个我没有需要的构造,尽管我主要在.NET中工作,但不允许这样做.我猜你可能想要在给出父类的引用时调用子类的适当静态方法. (2认同)

SLa*_*aks 19

因为,正如您所说,静态字段与实例无关.

从实例引用中访问静态字段的能力(正如您所做的那样)仅仅是一种语法糖,没有其他含义.
您的代码编译为

main.getNull(); 
Main.value
Run Code Online (Sandbox Code Playgroud)

  • 我会称它为语法糖,更像是语法锯尘;) (7认同)