Java 为什么对静态变量的非静态引用是可编译的?

Java 为什么对静态变量的非静态引用是可编译的?,java,syntax,Java,Syntax,假设我有以下代码: public class Everything{ public static int answer = 42; public int getAnswer(){ return this.answer; } } 从技术上讲,this.answer实际上并不存在,但编译器给了我们一个警告。我们为什么不改为得到一个编译错误?此是对一切实例的有效引用。因此,它是对Everything类的有效引用,因此也是访问该类的任何静态成员和/或方法的有效

假设我有以下代码:

public class Everything{
    public static int answer = 42;

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

从技术上讲,
this.answer
实际上并不存在,但编译器给了我们一个警告。我们为什么不改为得到一个编译错误?

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

你甚至可以:

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

一般来说,这不是很好的做法。。。例如,IDEA将警告您“通过实例引用访问静态成员”。

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

你甚至可以:

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

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

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

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

您的IDE很可能会显示警告。静态成员通过实例引用或类似的方式访问。它们是可编译的,因为规范说这是允许的。还有什么其他原因?您的IDE很可能会显示警告。静态成员通过实例引用或类似的方式访问。它们是可编译的,因为规范说这是允许的。还有什么其他原因呢?我绝对同意没有人应该写这样的代码。我想我总是认为类的实例和类本身是完全不同的构造。我觉得很奇怪,类和类实例之间的界限被允许模糊,但只有在编写了可能很糟糕的代码时才允许这样做。@BenLawry将这种行为与C#进行对比,C#对实例变量调用静态方法是一种编译时错误。我绝对同意任何人都不应该编写这样的代码。我想我总是认为类的实例和类本身是完全不同的构造。我觉得很奇怪,类和类实例之间的界限被允许模糊,但只有在编写了可能很糟糕的代码时才允许模糊。@BenLawry将这种行为与C#进行对比,C#对实例变量调用静态方法是编译时错误。