Java 为什么';t编译器为super.staticMethod()发出警告

Java 为什么';t编译器为super.staticMethod()发出警告,java,static,compiler-warnings,super,eclipse-kepler,Java,Static,Compiler Warnings,Super,Eclipse Kepler,我知道我们应该通过类名以静态的方式访问静态成员,并理解为什么(下面的代码只是一个例子,我理解这是一种不好的做法)。但为什么当我尝试通过super关键字访问静态方法时,并没有编译器警告?考虑下一个代码: class Parent { static int staticField; static void staticMethod() {} } class Child extends Parent { void testStatic() { this.sta

我知道我们应该通过类名以静态的方式访问静态成员,并理解为什么(下面的代码只是一个例子,我理解这是一种不好的做法)。但为什么当我尝试通过super关键字访问静态方法时,并没有编译器警告?考虑下一个代码:

class Parent {
    static int staticField;
    static void staticMethod() {}
}

class Child extends Parent {
    void testStatic() {
        this.staticMethod(); // warning
        super.staticMethod(); // NO warnings
        new Child().staticMethod(); // warning
        new Parent().staticMethod(); // warning

        this.staticField++; // warning
        super.staticField++; // warning
        new Child().staticField++; // warning
        new Parent().staticField++; // warning
    }
}

所以,问题是为什么编译器不为行
super.staticMethod()提供警告

您的情况称为间接访问静态方法,默认情况下,该方法的警告为关闭。要启用它,请执行以下操作:

  • 在项目上单击鼠标右键,转到“属性”
  • Java编译器
  • 错误/警告
  • 配置工作区设置
  • 选中(激活)启用项目特定设置
  • 将间接访问静态方法更改为警告。

  • 我正在使用EclipseLuna,它适合我

    我的IDE会提醒我每一行。你有什么IDE,并且你已经检查过这个警告没有被明确禁用吗?super确实引用了一个实例——与它引用的实例相同——当前对象。我的IDE是Eclipse开普勒,默认的prefs是我正在使用IDEA的下一个@ajdev,它警告我这一点。也许Eclipse只是忽略了这一点,但这取决于IDE是否发出警告。@Tom谢谢。我是个新手,所以我只是想确保这不是超级关键字的一些奇怪和特殊的行为,我试过这么做。唯一的变化是警告:在编译器显示“应该以静态方式访问类型父级的静态方法staticMethod()”之前。在这之后(您描述的所有步骤),它说“应该直接访问类型父级的static方法staticMethod()。但是仍然是line
    super.staticMethod()没有警告。