为什么我们不能在非静态内部类中使用静态方法呢?
public class Foo {
class Bar {
static void method() {} // Compiler error
}
}
如果我把内部类设为静态的,它就能工作。为什么?
public class Foo {
static class Bar { // now static
static void method() {}
}
}
在Java 16+中,这两个都是有效的。
发布于 2009-06-10 12:02:38
由于内部类的实例与其外部类的实例隐式关联,因此它本身不能定义任何静态方法。由于静态嵌套类不能直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。
发布于 2012-05-08 13:09:43
唯一的原因是“不是必须的”,那么为什么还要费心去支持它呢?
从语法上讲,没有理由禁止内部类具有静态成员。尽管Inner
的一个实例与Outer
的一个实例相关联,但是如果java决定这样做的话,仍然可以使用Outer.Inner.myStatic
来引用Inner
的静态成员。
如果您需要在所有Inner
实例之间共享某些内容,只需将它们作为静态成员放入Outer
即可。这并不比在Inner
中使用静态成员更糟糕,在这种情况下,Outer
仍然可以访问Inner
的任何私有成员(不会改进封装)。
如果您需要在由一个outer
对象创建的所有Inner
实例之间共享某些内容,将它们作为普通成员放入Outer
类中会更有意义。
我不同意“静态嵌套类几乎只是一个顶级类”的观点。我认为真正将静态嵌套类/内部类视为外部类的一部分会更好,因为它们可以访问外部类的私有成员。外部类的成员也是“内部类的成员”。因此不需要在内部类中支持静态成员。外部类中的一个普通/静态成员就足够了。
发布于 2021-03-22 03:34:18
向JDK16添加记录的工作还提到,静态方法和字段现在可以与内部类一起使用,甚至允许main()
启动该类。
例如,这段代码在JDK16中编译和运行,并且可以选择作为java Outer
或java Outer$Inner
运行main()
public class Outer {
public static void main(String[] args) {
System.out.println("Outer class main xxx="+Inner.xxx+" nnn="+(++Inner.nnn)+" iii="+(--iii));
aaa();
Inner.zzz();
}
public static void aaa() {
System.out.println("aaa() nnn="+(++Inner.nnn)+" iii="+(--iii));
}
public static int iii = 100;
class Inner {
public static final String xxx= "yyy";
public static int nnn = 0;
public static void zzz() {
System.out.println("zzz() "+" nnn="+(++nnn)+" iii="+(--iii));
}
public static void main(String[] args) {
System.out.println("Inner class main xxx="+xxx+" nnn="+(++nnn)+" iii="+(--iii));
zzz();
aaa();
}
}
}
https://stackoverflow.com/questions/975134
复制相似问题