为什么接口只能在最前面声明
好吧,我知道这是规则:
根据JLS:8.1.3内部类和Enclosing实例,内部类可能不会声明静态初始值设定项或成员接口。 内部类可能不会声明静态成员,除非它们是编译时常量字段。
根据8.5.2静态成员类型声明,“成员接口总是隐式静态的,允许但不要求声明成员接口来明确列出静态修改器”。 他们永远是顶级的,而不是内在的。
我只是想知道为什么。 如果我们被允许在内部类中声明接口,会发生什么? 如果我把它放到另一个Class文件中,内部类是不是会成为顶级类?
如果我把它放到另一个Class文件中,内部类是不是会成为顶级类?
不,它仍然是一个内部类,文件名表示为(IIRC它是OuterClass$InnerClass.class
)。
内部类可以访问外部类的属性,即它们依赖于外部类的实例。 有了接口,你不能这样做。 想想一个完全不相关的类,它必须由相应的外部类实例创建。 如果外部类不知道谁实现了该接口,那么这将如何完成?
你可以做的是在外部类中声明静态接口,因此仅仅使用outer作为名称空间:
public class OuterClass {
public static interface InnerInterface { //protected and private would be fine too, depending on what makes sense
}
}
编辑:其实,我误解了这个问题,因为接口静态无论如何,这里是一个更新的代码片段:
public class OuterClass {
public static InnerClass { //static inner class making OuterClass just be a namespace
public interface InnerInnerInterface { //protected and private would be fine too, depending on what makes sense
}
}
}
作为一种解决方法,您可以定义一个抽象内部内部类,缺点是必须坚持单一继承约束。
从静态和非静态的角度来考虑它。 “顶级”类建立了一个静态上下文,因为它可以在没有任何封闭实例的情况下被访问。 即您可以从主要方法访问顶级类。 这同样适用于顶级类的任何静态成员。 但是,内部类既不存在于*也不建立任何静态上下文。 因此它不能有任何静态成员,并且只能通过其包含类的实例(如构造函数和其他实例成员)来访问它。 从主要方法来说,你不能说Outer.Inner.SOME_FIELD,因为内部类的成员只对含有的类有意义。
*有点
根据定义,顶级类和它的内部类紧密耦合。 接口是一种减少耦合的手段。
链接地址: http://www.djcxy.com/p/91979.html