为何public static静态内部类无法被main方法访问?
为什么嵌套在接口内的public静态内部类无法直接在外部类的main方法中访问?
你遇到的问题本质是Java中嵌套类型的访问规则:即使是public的静态嵌套类,只要它属于另一个类型(这里是接口)的成员,就必须通过所属类型的名称来限定访问,不能直接在外部类的作用域中直接引用。
出错代码示例
public class MainClass { public static interface StaticParentType{ public static class StaticChildType implements StaticParentType {} } public static void main(final String[] args) { new StaticChildType(); // 这里无法直接找到StaticChildType } }
编译错误信息
$ java MainClass.java MainClass.java:10: error: cannot find symbol new StaticChildType(); ^ symbol: class StaticChildType location: class MainClass 1 error error: compilation failed
问题原因
StaticChildType是定义在StaticParentType这个接口内部的静态类,它的完整限定名是MainClass.StaticParentType.StaticChildType。在MainClass的main方法中,编译器只会在MainClass的直接成员和导入的类中查找StaticChildType,不会自动深入到StaticParentType的内部去查找,所以会报找不到符号的错误。
正确的访问方式
不需要将两个类型改成同级,只要在创建对象时加上所属接口的限定名即可:
public class MainClass { public static interface StaticParentType{ public static class StaticChildType implements StaticParentType {} } public static void main(final String[] args) { new StaticParentType.StaticChildType(); // 通过接口类名限定访问 } }
补充说明
你将StaticChildType改为和StaticParentType同级的方式之所以可行,是因为此时StaticChildType成为了MainClass的直接静态成员,编译器可以在MainClass的作用域中直接找到它。但这并不是唯一的解决办法,通过限定名访问嵌套在接口内的静态类才符合Java嵌套类型的访问规范。
内容的提问来源于stack exchange,提问作者davidalayachew
相关产品推荐
相关产品推荐

