根据this问题,我理解为什么接口是静态的。所以我尝试了以下代码:
public class ClassWithInterface {
static interface StaticInterfaceInsideClass { }
interface NonStaticInterfaceInsideClass { }
//interface is not allowed inside non static inner classes
//Error: The member interface InterfaceInsideInnerClass can
//only be defined inside a top-level class or interface or
//in a static context
class InnerClassWithInterface {
interface InterfaceInsideInnerClass {}
}
//Error: The member interface StaticInterfaceInsideInnerClass
//can only be defined inside a top-level class or interface or
//in a static context
class InnerClassWithStaticInterface {
static interface StaticInterfaceInsideInnerClass {}
}
static class StaticNestedClassWithInterface {
interface InterfaceInsideStaticNestedClass {}
}
}
//Static is not allowed for interface outside class
//Error: Illegal modifier for the interface
//InterfaceOutsideClass; only public & abstract are permitted
static interface InterfaceOutsideClass {}
我有以下疑问:
如果接口是隐式静态的,为什么在类内部允许使用
StaticInterfaceInsideClass
显式static
修饰符,而对于InterfaceOutsideClass
不允许使用它?NonStaticInterfaceInsideClass
是否也是静态的?也就是说,在类内部,显式使用static
或不使用它不会有任何区别,并且接口默认始终为static
?为什么我们不能在非静态内部类(
static
)中具有非InterfaceInsideInnerClass
接口(InnerClassWithInterface
),而在顶级类(static
)中却具有非NonStaticInterfaceInsideClass
(ClassWithInterface
)接口呢?实际上,我们甚至不能在内部类内部具有静态接口(对于StaticInterfaceInsideInnerClass
)。但为什么?有人可以列出导致所有这些行为的单个或最小规则吗?
最佳答案
有人可以列出导致所有这些行为的单个或最小规则吗?
没有接口也可以观察到相同的行为。内部类(即非静态嵌套类)不能具有自己的静态成员类,因此以下代码也给出了编译错误:
class A {
// inner class
class B {
// static member class not allowed here; compilation error
static class C {}
}
}
因此,“最小规则集”是:
“如果内部类声明一个显式或隐式静态的成员,则将导致编译时错误,除非该成员是常量变量”(JLS §8.1.3)
“成员接口是隐式静态的(第9.1.1节)。允许成员接口的声明冗余地指定
static
修饰符。” (JLS §8.5.1)使用这两个规则,我们可以解释一切:
NonStaticInterfaceInsideClass
是成员接口,因此根据规则2隐式静态。InterfaceInsideInnerClass
是成员接口,因此根据规则2是隐式静态的。它是内部类的成员,因此根据规则1是编译时错误。StaticInterfaceInsideInnerClass
在语义上与InterfaceInsideInnerClass
相同;根据规则2,static
修饰符是多余的。InterfaceInsideStaticNestedClass
是成员接口,因此它在规则2中是隐式静态的,但在规则1中却不被禁止,因为它是静态嵌套类的成员,而不是内部类。不允许使用
InterfaceOutsideClass
修饰符,因为它不是成员接口,并且规则2仅允许成员接口具有static
修饰符。关于java - 了解Java接口(interface)的静态性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60366253/