当前位置: 首页 > 知识库问答 >
问题:

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

令狐宣
2023-03-14

我正在运行以下java版本
openjdk版本“10.0.1”2018-04-17
openjdk运行时环境(构建10.0.1 10-Ubuntu-3ubuntu1)
openjdk 64位服务器虚拟机(构建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();
 }
}

输入:deep(master*)JavaStuffs$javac示例。java
deep(master*)JavaStuffs$java测试
输出:内部类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();

  }
}

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

输入:深(master*)JavaStuff$javacsample.java
输出:sample.java:1372:错误:非法限定符;内部不是内部类
new J(). Super();
^1错误

在程序2和程序3中,我希望类在实现接口时继承内部抽象类。但事实并非如此!有人能解释一下吗?一个准确的理由将被高度赞赏!

共有2个答案

季森
2023-03-14

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

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

将一个类或接口嵌套在另一个类或接口中首先提供了一个额外级别的名称空间<代码>父级。内部是与子类不同的类。内部——不考虑任何其他因素,你知道,因为他们的名字不同。因此,子类不会继承嵌套类。没有什么好办法,也没有什么特别的优势。

慕通
2023-03-14

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

Java语言规范在第9.5节中说明了这一点:

接口中的成员类型声明是隐式公开和静态的。允许冗余指定这两个修饰符中的一个或两个。

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

 类似资料:
  • 问题内容: 我有以下界面: 我在下面有抽象类(没有提到方法插入): 我有具体的课程: 最后,SpecificEntryBean定义为: 我有以下错误: 类型SpecificEntry必须实现继承的抽象方法SingleRecordInterface.insert(AbstractEntryBean) 考虑到SpecificEntryBean扩展了AbstractEntryBean,所以我不明白此错误

  • 快速提问,我正在学习接口和继承。 这不是实际的代码,只是一个例子。假设我有抽象类“动物”。对马和犬类等组有一些继承。还有一个接口“宠物”。它将用于动物的不同子类。犬类“狗”的子类实现了接口“宠物”。因此“狗”的所有子类也实现了接口“宠物”,而不必在“狗”的每个子类上单独实现“宠物”,对吗?

  • 问题内容: 接口是否从 Java中的类继承? 如果否,那么我们如何在接口实例上调用对象类的方法 问题答案: 接口是否从 Java中的类继承? 不,他们没有。而且,就这一点而言,也不存在所有接口都隐式继承的通用“根”接口(与类一样)。() 如果否,那么我们如何在接口实例上调用对象类的方法 接口为中的每个公共方法隐式声明一个方法。因此,该方法被隐式声明为接口中的成员(除非它已经从超级接口继承了该方法)

  • 在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体。interface为类提供了接口规范。 在继承中,我们为了提高程序的可复用性,引入的继承机制。当时的继承是基于类的。interface接口同样可以继承,以拓展原interface。 接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法

  • 在定义一个类时往往会使其继承某个父类或者实现某个接口,在扩展中实现这个功能非常方便。下面我先给出PHP语言中的代码。 <?php interface i_myinterface { public function hello(); } class parent_class implements i_myinterface { public function hello()

  • 我已经研究了接口、抽象类和继承的用法。我知道每一种都有其用途,但我还是有点困惑。 我知道一般一个类只能扩展另一个类,虽然有些可能支持多个继承,但它可以实现多个接口(这可能是使用接口的主要原因)。然而,如果我是正确的,这个类也可以被另一个类扩展。我还看到抽象类可能比接口更快,并且可以有非静态的最终变量。 所以,我仍然不确定什么时候使用哪个更好。也许通过举例可以更好地理解这一点。我不反对使用任何东西,