【问题标题】:Does a class inherit an abstract inner class declared within an interface when the class implements that interface?当类实现该接口时,该类是否继承了在接口中声明的抽象内部类?
【发布时间】:2019-01-05 01:39:50
【问题描述】:

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

方案一

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();
 }
}

输入: deep (master *) JavaStuffs $ javac sample.java
deep (master *) JavaStuffs $ java Test
输出:内部类 m1 方法

方案 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();

  }
}

输入: deep (master *) JavaStuffs $ javac sample.java
输出: sample.java:1309:错误:非法限定符;内部不是内部类
新 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();
 }
}

输入: deep (master *) JavaStuffs $ javac sample.java
输出: sample.java:1372:错误:非法限定符;内部不是内部类
新 J().super();
^ 1 个错误

Program 2Program 3中,我希望类在实现接口时会继承内部抽象类。但事实并非如此!谁能解释一下?一个确切的理由将不胜感激!

【问题讨论】:

    标签: java inheritance interface overriding abstract


    【解决方案1】:

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

    Java Language Specification states this in section 9.5:

    接口中的成员类型声明是隐式公共的,并且 静止的。允许冗余指定其中一个或两个 修饰符。

    因此,在您的程序 2 中,在类 Outer2 的构造函数中,您不能说 new J().super();,因为 Outer2 没有外部实例 - 它不是内部类。 javac 的错误说明了很多:“非法限定符;Inner 不是内部类”

    【讨论】:

    • 它不是接口内部的类,它是一个抽象类。您的“接口内的自动静态类”不适用于此处。
    • @DeepRoy 这是一个接口内的类。它是抽象的这一事实并没有减少一个类。它是一个静态的公共抽象成员类,不是一个内部类。
    • 我认为你是对的。甚至接口内的抽象类也表现得像静态类。
    【解决方案2】:

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

    嵌套类和接口不是继承自父类或实现的接口,但子类的实例可以作为其父类内部类的包含实例。

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

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 2011-09-16
      • 1970-01-01
      • 2021-12-21
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多