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!
}
}
为什么编译时常被允许在这方面是很明显的原因。
编译时内联是一个实现细节。更重要的是,在代码可能合法使用的情况下,用常量加载的最终静态字段的行为与用相同常量加载的静态实例字段的行为不可区分。非静态内部类的静态成员的适当行为将是模糊的,但对于用常量加载的静态最终字段,解决歧义性的两种可能方式都会产生相同的结果。 – supercat 2014-03-18 20:29:16