7

为什么我们可以有静态最终成员但不能在非静态内部类中有静态方法?

我们可以在不实例化内部类的情况下访问外部类之外的内部类的静态最终成员变量吗?

4

1 回答 1

7

您可以在静态“内部”类中使用静态方法。

public class Outer {
    static String world() {
        return "world!";
    }
    static class Inner {
        static String helloWorld() {
            return "Hello " + Outer.world();
        }
    }   
    public static void main(String args[]) {
        System.out.println(Outer.Inner.helloWorld());
        // prints "Hello world!"
    }
}

然而,准确地说,Inner根据 JLS 术语 ( 8.1.3 ),它被称为嵌套类:

内部类可以继承不是编译时常量的静态成员,即使它们可能没有声明它们。不是内部类的嵌套类可以按照 Java 编程语言的通常规则自由声明静态成员。


此外,内部类可以有成员并不完全正确。static final更准确地说,它们还必须是编译时常量。以下示例说明了差异:

public class InnerStaticFinal {
    class InnerWithConstant {
        static final int n = 0;
        // OKAY! Compile-time constant!
    }
    class InnerWithNotConstant {
        static final Integer n = 0;
        // DOESN'T COMPILE! Not a constant!
    }
}

在这种情况下允许编译时常量的原因很明显:它们在编译时内联。

于 2010-03-20T07:50:20.753 回答