当 class 实现该接口时,class 是否继承在该接口内声明的抽象内部 class?

Does a class inherit an abstract inner class declared within an interface when the class implements that interface?

我是运行以下java版本
openjdk 版本“10.0.1”2018-04-17
OpenJDK 运行时环境 (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64 位服务器 VM(构建 10.0.1+10-Ubuntu-3ubuntu1,混合模式)

节目 1

class Outer{
abstract class Inner{
    void m1(){
        System.out.println("Inner class m1 method");
    }
  }

 }


class Outer2 extends Outer.Inner{
Outer2(){
new Outer().super();
  }
}
class Test{
public static void main(String[] args) {
new Outer2().m1();
 }
}

输入:深(大师*)JavaStuffs $javacsample.java
深 (master *) JavaStuffs $ java 测试
输出:内部classm1方法

节目 2

interface Outer{
    abstract class Inner{
    void m1(){
        System.out.println("Inner class m1 method");
    }
  }
}
class J implements Outer{

}
class Outer2 extends J.Inner{

Outer2(){
    new J().super();
  }
}
class Test{
public static void main(String[] args) {
    new Outer2().m1();

  }
}

输入:深(大师*)JavaStuffs $javacsample.java
输出: sample.java:1309:错误:非法限定符;内在不是内在class
新 J().super();
^ 1 个错误

节目 3

interface Outer{
abstract class Inner{
    void m1(){
        System.out.println("Inner class m1 method");
   }
 }
}
class J implements Outer{
class InnerJ extends Inner{

 }
}
class Outer2 extends J.Inner{
Outer2(){
new J().super();
 }
}
class Test{
public static void main(String[] args) {
    new J().new InnerJ().m1();
    new Outer2().m1();
 }
}

输入:深(大师*)JavaStuffs $javacsample.java
输出: sample.java:1372:错误:非法限定符;内在不是内在class
新 J().super();
^ 1 个错误

程序2程序3中,我预计class将继承内部抽象class 当它实现接口时。但事实并非如此!谁能解释一下?一个确切的原因将不胜感激!

没有。 类继承父类的实例变量和实例方法,实现相同的接口。他们可以访问其父 classes 的静态成员以及直接或间接实现的接口 ,就好像 它们是继承的一样,但这在技术上是另一回事。

嵌套的 classes 和接口不是继承的,既不是从父 classes 也不是从实现的接口,但是子 class 的实例可以作为包含实例它的父 class 的内部 class.

将一个 class 或接口嵌套在另一个内部首先提供了一个额外的命名空间级别。 Parent.InnerChild.Inner 不同 class -- 不考虑任何其他因素,您知道因为它们的名称不同。因此,子 classes 不会继承嵌套的 classes。没有什么好办法,也没有什么特别的优势。

在接口内定义的成员 class 总是隐式地 static。它不是内部 class,而是静态成员 class,并且没有与之关联的外部 class 实例。

Java Language Specification states this in section 9.5:

A member type declaration in an interface is implicitly public and static. It is permitted to redundantly specify either or both of these modifiers.

因此,在您的程序 2 中,在 class Outer2 的构造函数内部,您不能说 new J().super();,因为 Outer2 没有外部实例 -它不是内部 class。来自 javac 的错误说明了很多:"illegal qualifier; Inner is not an inner class"