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

内部类是否继承到外部类的子类?

空英达
2023-03-14

我尝试了下面的代码,根据它,我理解内部类继承到OuterClass的子类。是正确的吗?

    class Outter{
    int i=1;
    class Inner{
        int i=2;
        public void hello(){
            System.out.println("hello from outter.inner");
        }
    }
}

    class ChildClass extends Outter{
        class ChildInner{

        }
    }
    public class Classes {
        public static void main(String[] args) {
            Inner inner = (new ChildClass()).new Inner();
            System.out.println(inner.i);
            inner.hello();
        }
    }

输出除外:

2.

奥特你好。内部的

Inner inner = (new ChildClass()).new Inner();

当这行代码运行时,它应该意味着内部类被继承给了ChildClass

我很困惑,因为我在链接上发现了下面的语句

当外部类由其子类扩展时,成员内部类将不会继承到子类。若要在外部类的子类内使用内部类属性,子类还必须具有内部类,并且该内部类必须扩展外部类的内部类。

共有2个答案

南宫阳冰
2023-03-14

声明:

Inner inner = (new ChildClass()).new Inner();

不是真正继承到ChildClass

如果你打破它,你基本上是这样做的:

ChildClass child = new ChildClass();
Inner inner = child.new Inner();

现在,您可以在ChildClass上调用new(),因为它扩展了Outter

这并不意味着ChildClass可以调用internal中的任何方法/属性,仅仅因为internalOutter的一部分

邵刚洁
2023-03-14

因此,我将用一个例子来说明这一说法:

当外部类由其子类扩展时,成员内部类将不会继承到子类。若要在外部类的子类内使用内部类属性,子类还必须具有内部类,并且该内部类必须扩展外部类的内部类

class Outter {      
    void method(){
       Inner test=new Inner();
       test.i=5; //No problem to do that even if i is private because it is inner class
    } 
    class Inner {
        private int i = 2; 
    }
}

class ChildClass extends Outter{
     void method2(){
        Inner test=new Inner();
        test.i=5;  //Does not compile
        }
}

您不能访问子类中的“i”。如果你也在那里延伸内部,你可以:

class ChildClass extends Outter{
 void method2(){
    Inner2 test=new Inner2();
    test.i=5;  //Compiles fine because we have also extended the inner class (like written in the quoted text)
    }

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

  • 我有一个类“C”,它有一个内部类“Ci”。“C”类继承了“S”类。“S”类也有一个内部类“Si”。“Ci”能继承“Si”吗?非常感谢任何回应的人。 这样的事情可能吗?

  • 问题内容: 限制条件: 我有一个编写的Maven源代码生成器,它是从具有嵌套名称空间的某些数据文件创建POJO类的。我希望每个名称空间都嵌套为一个内部类。在某些情况下,我最终会得到内部类,这些内部类与最外部类的简单名称相同。 所有类都必须是作用域,因为这是对类型安全包装器的覆盖,例如属性文件,但是是分层的。 我不能更改名称,否则我将更改名称含义和包含数据的名称空间。 给出比我有以下代码: 内部类应

  • 我知道如果我想扩展内部类,我应该这样做: 但是在这种情况下,我不明白该怎么办?如何获取内部对象的封闭实例? 此变体不编译:

  • 我正在阅读关于从内部类继承的内容,我一直在努力理解下面的代码是如何工作的: 据我所知,关键字Super指的是超类,Super()指的是它没有参数构造函数。在外层类的情况下,超类是Object类。 我想了解一下,这段代码是如何工作的。 为什么Object类的实例化使扩展内部类成为可能? 创建Object类实例与创建外层类对象有什么关系? 删除包含"o.super();"的行会导致错误: java:包

  • 问题内容: 我读过一个子类不能继承私有字段或方法。但是,在这个例子中 运行时,输出为。似乎是从继承了private属性。 所以,请解释这里发生了什么。谢谢。 问题答案: 子类具有其超类的字段,但不能直接访问它们。同样,子类“具有”私有方法,但是您不能直接从子类中调用或重写它们。 在有关继承的Java文档中,它说 子类并 没有 继承父类的私有成员。 但是,我认为将其视为 子类继承其父类的私有成员,但