内部类是否会被外部类的子类继承?

4
我尝试了下面的代码,并根据它的执行结果得出内部类被继承到外部类的子类中的结论。这个结论正确吗?
    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

来自 outter.inner 的 hello

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

由于这行代码有效,所以意味着内部类被继承到了ChildClass中。
我有些困惑是因为我在链接上发现了以下声明:
当外部类被其子类扩展时,成员内部类不会被继承到子类。为了在外部类的子类中使用内部类属性,子类必须也有一个内部类,并且该内部类必须扩展外部类的内部类。

我在这里不明白你的观点... Inner 有一个名为 i 的字段,代码明确打印该字段的值 inner.i - 这与任何父类或外部类无关。该语句只是创建了一个 Inner 类,它是 ChildClass 实例的内部类,在该语句中也创建了该实例。 - user85421
看一下这里的第一个答案:https://dev59.com/_FbTa4cB1Zd3GeqP9EfY - martino
2个回答

4

我将通过一个例子来说明这个陈述:

当一个外部类被它的子类继承时,成员内部类不会被继承到子类中。为了在外部类的子类中使用内部类属性,子类也必须有一个内部类,而且该内部类必须继承外部类的内部类。

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{     }
}

好的,所以引号中的语句对于私有字段是正确的。要从外部类之外的内部类访问私有字段,我们必须在外部类的子类中扩展内部类。 - Anuj Rastogi
只需要进行一个小的更正。您需要将内部类中的 i 改为 protected/public/default。因为如果它是 private,那么在子类中会出现错误。 - Ashishkumar Singh
@Ashish 所解释的重点是,如果内部类被继承到ChildClass中,但是ChildClass无法访问内部类的私有字段,因为它在外部类之外。要实现这一点,我们需要另一个类"inner2",它将扩展内部类。 - Anuj Rastogi
@Veselin,我对你的回答上面的评论正确吗? - Anuj Rastogi
所以这就像是两个类,扩展一个并不意味着另一个会被继承。 我想知道这个语句的有效性: Inner inner = (new ChildClass()).new Inner(); - Anuj Rastogi
显示剩余3条评论

0

这个语句:

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

这并不真正被继承到ChildClass

如果你打破它,基本上你是在做这个:

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

现在你可以在ChildClass上调用new Inner(),因为它扩展了Outter
这并不意味着ChildClass可以调用Inner中的任何方法/属性,仅仅因为InnerOutter的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接