Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口中的嵌套类是隐式静态的还是最终的?_Java_Interface_Nested - Fatal编程技术网

Java 接口中的嵌套类是隐式静态的还是最终的?

Java 接口中的嵌套类是隐式静态的还是最终的?,java,interface,nested,Java,Interface,Nested,接口内部的所有变量都是公共的、静态的和最终的 所以,如果我在一个接口中声明一个嵌套类,它会变成静态的和最终的吗 Interface I { class c { static void m(){ } } } 让我们看看。让我们创建如下结构: interface Interface{ class Foo{} } 现在我们可以测试: System.out.println("static: " + Modifier.isStatic(Interface

接口内部的所有变量都是公共的、静态的和最终的

所以,如果我在一个接口中声明一个嵌套类,它会变成静态的和最终的吗

Interface I
{
    class c
    {
        static void m(){ }
    }
}

让我们看看。让我们创建如下结构:

interface Interface{
    class Foo{}
}
现在我们可以测试:

System.out.println("static: " + Modifier.isStatic(Interface.Foo.class.getModifiers()));
System.out.println("final: " + Modifier.isFinal(Interface.Foo.class.getModifiers()));
其中打印:

静态:对 决赛:错 所以嵌套类是隐式静态的,但不是最终的


我们还可以通过向接口添加类Bar扩展Foo{}来确认这一点。final类不能扩展,但由于这样的代码编译良好,这意味着Foo不是final

让我们来看看。让我们创建如下结构:

interface Interface{
    class Foo{}
}
现在我们可以测试:

System.out.println("static: " + Modifier.isStatic(Interface.Foo.class.getModifiers()));
System.out.println("final: " + Modifier.isFinal(Interface.Foo.class.getModifiers()));
其中打印:

静态:对 决赛:错 所以嵌套类是隐式静态的,但不是最终的


我们还可以通过向接口添加类Bar扩展Foo{}来确认这一点。final类不能扩展,但由于这样的代码编译良好,这意味着Foo不是final

嵌套在接口中的类的行为类似于嵌套在类中的静态类,也就是说,构建嵌套类的实例不需要外部类的实例。根据:

8.1.3内部类和封闭实例

[…]接口的成员类是隐式静态的§9.5,因此从不被视为内部类


但是,这些类不是最终类,除非您显式地将它们指定为最终类。这是有意义的,因为实现接口的类可能需要一个机会来扩展接口内定义的嵌套类。

接口内嵌套的类的行为类似于类内嵌套的静态类,从某种意义上说,构造嵌套类的实例不需要外部类的实例。根据:

8.1.3内部类和封闭实例

[…]接口的成员类是隐式静态的§9.5,因此从不被视为内部类


但是,这些类不是最终类,除非您显式地将它们指定为最终类。这是有意义的,因为实现接口的类可能需要一个机会来扩展接口中定义的嵌套类。

我要问的是接口内部的类是静态的?为什么不是最终的?如果是内部的,它就不会是静态的。你们的意思是“嵌套”类。我问的是接口内部的类是静态的?为什么它不是最终的?如果它是内部的,它就不会是静态的。你的意思是“嵌套”类。值得注意的是,Foo可以成为final,但它需要明确地完成,就像任何final类一样。谢谢你的回答。但为什么它不是最终的???@ShimbuGowda这是一个错误的问题。正确的问题是:为什么它应该是最终的?或者更确切地说:是否有任何理由将接口中的所有内部类设置为final?有必要将内部类设置为静态,因为非静态内部类总是绑定到周围类的具体实例。由于无法实例化接口,非静态内部类没有定义良好的语义,因此接口中的所有内部类都是隐式静态的。但并没有必要将所有的内部类都设置为最终类。@ShimbuGowda是什么让你们认为它应该是最终类的?类、接口、枚举等类型的用途不同于变量或方法,因此不同的规则适用于它们。@ShimbuGowda final on fields的语义不同于final on Class的语义。字段上的“最终”表示,一旦分配了字段,就不能重新分配。最后一个类的意思是,这个类不能有任何子类。虽然接口的所有成员都充当常量,但没有理由不允许您对接口的嵌套类进行子类化。值得注意的是,可以将Foo设置为final,但它需要像任何final类一样显式执行。谢谢您的回答。但为什么它不是最终的???@ShimbuGowda这是一个错误的问题。正确的问题是:为什么它应该是最终的?或者更确切地说:是否有任何理由将接口中的所有内部类设置为final?有必要将内部类设置为静态,因为非静态内部类总是绑定到周围类的具体实例。由于无法实例化接口,非静态内部类没有定义良好的语义,因此接口中的所有内部类都是隐式静态的。但并没有必要将所有的内部类都设置为最终类。@ShimbuGowda是什么让你们认为它应该是最终类的?类、接口、枚举等类型的用途不同于变量或方法,因此不同的规则适用于它们。@ShimbuGowda final on fields的语义不同于final on Class的语义。字段上的“最终”表示,一旦分配了字段,就不能重新分配。最后一个类的意思是,这个类不能有任何子类。虽然接口的所有成员都充当常量,但没有理由不允许您对接口的嵌套类进行子类化。