【问题标题】:Why are non-static references to static variables compilable? [duplicate]为什么对静态变量的非静态引用是可编译的? [复制]
【发布时间】:2013-05-25 08:41:36
【问题描述】:

假设我有以下代码:

public class Everything{
    public static int answer = 42;

    public int getAnswer(){
        return this.answer;
    }
}

从技术上讲,this.answer 实际上并不存在,但编译器会发出警告让我们离开。为什么我们不会得到一个编译错误呢?

【问题讨论】:

  • 您的 IDE 很可能会显示警告。 通过实例引用访问的静态成员或类似的东西。
  • 它们是可编译的,因为规范说它是允许的。还有什么其他原因?

标签: java syntax


【解决方案1】:

加载 Everything 类时,所有静态块和静态变量都按照它们出现的顺序执行/初始化。因此,对静态变量的任何进一步引用都将引用那些。使用类名还是实例从同一个类访问它们并不重要。 (甚至 fge 指出的空引用)

【讨论】:

    【解决方案2】:

    this 是对Everything 实例的有效引用。因此,它是对Everything 类的有效引用,因此是访问该类的任何静态成员和/或方法的有效方式。

    你甚至可以这样做:

    Everything nothing = null;
    nothing.answer; // Does not throw an NPE!!
    

    通常,这不是很好的做法...例如,IDEA 会警告您“通过实例引用访问静态成员”。

    【讨论】:

    • 我绝对同意没有人应该编写这样的代码。我想我只是一直认为一个类的实例和类本身是完全不同的结构。对我来说,允许模糊类和类实例之间的界限似乎真的很奇怪,但只有在编写了可以说是糟糕的代码时。
    • @BenLawry 将此行为与 C# 进行对比,在 C# 中调用实例变量的静态方法是编译时错误。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 2014-03-18
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2014-12-25
    相关资源
    最近更新 更多