示例:
interface Outer {
default String get() {
return "hi";
}
class Inner {
String got() {
return get();
}
}
}
这会产生错误
java:非静态方法get()不能从静态上下文中引用。
内部接口/类始终是静态的;与外部类不同,在外部类中,除非声明为静态,否则它是非静态的。
这就是今天以及即将到来的Java 8的情况。在外部类和外部接口之间存在这种差异的根本原因吗?
更新:阅读@Radiodef的评论后,我将内部接口更改为内部类。外部类不能包含非静态内部接口,因此该示例令人困惑。无论如何,内部类确实是我想要的。
更新:供参考。这是完全合法的:
class Outer {
String get() {
return "hei";
}
class Inner {
String got() {
return get();
}
}
}
也许我误解了您的问题,但是您的代码段完全等同于
interface Outer {
public default String get() {
return "hi";
}
public static class Inner {
String got() {
return get();
}
}
}
作为the JLS Chapter 9.5 (Java 8)状态
接口中的成员类型声明为隐式
public
,并且static
。允许冗余地指定这两个或其中之一修饰符。
所以,如果有的话
Inner innerInstance = new Outer.Inner();
innerInstance.got();
将调用什么get()
?此处不涉及类型为Outer
的对象。
是否存在外部与外部之间存在这种差异的根本原因类和外部接口?
这不是问题。 您的班级代码是inner classes的示例,即。非static
嵌套类。 接口代码是static
嵌套类的示例。您正在比较两种不同的东西。
在封闭类中具有static
嵌套类的等效示例是
class Outer {
String get() {
return "hei";
}
public static class Inner {
String got() {
return get(); // won't compile
}
}
}
再次出现get()
没有意义,因为没有相应的(封闭的)实例来调用它。
[问题,如@Radiodef所述,为
为什么该类必须是隐式静态的呢?现有规格?
然后我的答案如下:
根据定义,接口是
独立系统或不同群体相互作用的点
接口没有状态,没有行为。它仅描述行为。接口成员隐式为static
,因为接口没有状态。