根据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)中却具有非NonStaticInterfaceInsideClassClassWithInterface)接口呢?实际上,我们甚至不能在内部类内部具有静态接口(对于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/

10-16 17:08