我正在在线阅读有关Java中嵌套接口的一些文章[1] [2],我知道
interface A {
...
interface B { // this is static by default
...
}
}
但是我不确定
class C {
...
interface D { // Is this static by default? Why?
...
}
}
简而言之,“嵌套接口始终是静态的”是真的吗?
[1] https://beginnersbook.com/2016/03/nested-or-inner-interfaces-in-
java/
[2] https://www.programcreek.com/2013/08/inner-interface-in- Java
/
非静态内部类仅仅是语法糖。非静态内部类与标准“外部”类完全相同,但有一个例外:它具有一个外部类类型的不可见字段,该字段已声明final
。内部类的所有构造函数都必须将要设置此字段的外部实例作为第一个参数..然后,遍历了所有语法糖袋以隐藏它们。
但这确实是这样,您可以使用javap进行确认。因此,鉴于:
public class Outer { public class Inner {} }
与:
public class Outer {}
class Desugared {
private final Outer outer;
public Desugared(Outer outer) { this.outer = outer; }
}
除了语法,这些内容相同:
Outer o = new Outer();
o.new Outer.Inner();
是相同的:
Outer o = new Outer();
new Desugared(o);
等。
事情是这样的:接口 没有field 。
鉴于他们没有, 他们不可能有这个隐藏的领域
。因此,它们不能是“非静态的”。因此,它们是隐式的“静态”(它们没有隐式可用的外部类实例),并且您不能更改它。
问题内容: 在Oracle的Java 教程中,我找到了以下文本: 与类方法和变量一样,静态嵌套类与其外部类相关联。与静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法-它只能通过对象引用来使用它们。 注意:静态嵌套类与它的外部类(和其他类)的实例成员进行交互,就像其他任何顶级类一样。实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。 静态嵌套类使用
问题内容: 我很难用Java的非静态嵌套类来解决问题。考虑以下示例,该示例先显示“ Inner”,然后显示“ Child”。 我知道Inner实例始终必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是语法的含义- 为什么调用内部构造函数? 我只看到一个用于调用超类构造函数和调用重写方法的超类版本的纯文本,但从未使用过这种形式。 问题答案: 这称为“合格的超类构造函
问题内容: 我想在嵌套的静态接口中使用泛型类。我的目标是做这样的事情: 但是我得到一个错误:无法对非静态类型T进行静态引用。如果进行一些更改(如下所述),我可以在接口内部使用泛型,但是我想避免使用此方法,因为编写同一个类两次:一次用于MyClass,一次用于MyInterface。 谢谢。 编辑 :我想这样做: 要么 问题答案: 静态嵌套类或嵌套接口(顺便说一句,始终是静态的)与其外部类(或接口)
在clang/llvm 3.6.2中,以下代码在使用编译时导致编译错误: 命令行调用: 如果我将更改为不再是模板,如 然后代码干净地编译。值得注意的是,GCC 5.2.1 在 下接受这两个版本。同样值得注意的是,将移动到封闭的类模板正文中(但将其保留为模板)也会导致 clang 接受这一点。 相对于标准,哪种行为是正确的?这是GCC中的bug,clang,还是两者都有? (我在cfe用户上问了同样
问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。