2010-03-20 111 views

回答

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! 
    } 
} 

为什么编译时常被允许在这方面是很明显的原因。

+0

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

相关问题