猿问

在java中扩展一个内部类

当涉及到内部类时,我在尝试实现我在 Oracle 文档中阅读的有关继承的声明时遇到了麻烦。


该声明 :


嵌套类可以访问其封闭类的所有私有成员——字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员。


为了测试这一点,即看看我是否可以实现上述目标,我创建了一个具有内部类 IC1 的顶级类 OC1,然后我创建了另一个扩展 IC1 的顶级类 OC2。


在我什至可以开始编写单个方法之前,IDE 在 OC2 类主体本身处阻止了我说


“由于某些中间构造函数调用,没有类型 DataStructure 的封闭实例可用”


我读了一些其他答案,其中大部分指向 a) 将内部类更改为静态嵌套类——它解决了错误 b) 整个场景是不必要的和复杂的。


这是代码:


 public class DataStructure {

    // Create an array

    private final static int SIZE = 15;

    private int[] arrayOfInts = new int[SIZE];


    public DataStructure() {

        // fill the array with ascending integer values

        super();

        for (int i = 0; i < SIZE; i++) {

            arrayOfInts[i] = i;

        }

    }


    //other methods

    //IC1

    protected  class instanceArr{


        private int a = 8;

        private static final int B = 4;

        protected instanceArr(){

        }


        protected void doSomething(){

            System.out.println("arrayOfInts[] is accessible " + arrayOfInts[6]);

        }


    }


    //main method

}

OC2


public class DataStructureChild extends DataStructure.instanceArr{



    public DataStructureChild(){


    }

}

我知道这种情况并不理想,但我不想将内部类更改为静态嵌套类 - 这会破坏我的目的,即基本上尝试查看是否可以在没有 OC1 实例的情况下访问 arrayOfInts。


我误解了这句话吗?如果没有,请指出我正确的方向。


PS - 这是我的第一个问题 - 如果某些准则被蔑视,请提前道歉。


炎炎设计
浏览 218回答 2
2回答

繁花不似锦

是的,这是Java合成糖引起的Trap。您认为内部非静态类具有默认无参数构造函数,但这是错误的。在内部,IC1 的构造函数将 OC1 作为构造函数中的第一个参数——即使您看不到它。这就是 OC2 构造函数必须使用 OC1 作为构造函数参数的原因:public&nbsp;DataStructureChild(DataStructure&nbsp;argument)&nbsp;{ }不幸的是,这还不够,您需要确保参数不为空:public&nbsp;DataStructureChild(DataStructure&nbsp;argument)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;argument.super(); }它看起来很奇怪,但它确实有效。

慕工程0101907

您可以这样做,因为您继承了对父类内部类的访问权。class DataStructureChild extends DataStructure {&nbsp; &nbsp; public DataStructureChild() {&nbsp; &nbsp; }&nbsp; &nbsp; public void foo() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;InstanceArr ins = new InstanceArr();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ins.doSomething();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(ins.a);&nbsp; &nbsp; }}但能否请您提供一个链接或解释一下您是在哪里阅读以下内容的?&nbsp;嵌套类可以访问其封闭类的所有私有成员——字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员。我知道的第一部分。但是我从来没有考虑过一个单独的类扩展另一个类的内部类。特别是因为类与其封闭的内部类之间通常存在隐式关系。编辑:我相信你误解了这个声明。它说你的子类继承了内部类。那是真实的。它还说一旦完成,您就可以访问继承的内部类的私有值。如上所示,这也是正确的:所以它只是在谈论通过继承访问内部类,而不是直接扩展它。然而,如果你真的想在不传递引用的情况下拥有那种继承关系,你可以走这条路。&nbsp; &nbsp;public class Inheritance extends Outer.Inner {&nbsp; &nbsp; &nbsp; &nbsp;public Inheritance() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Outer().super();&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Inheritance().start();&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;public void start() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(a);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; method();&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; }&nbsp; &nbsp; class Outer {&nbsp; &nbsp; &nbsp; &nbsp;public Outer() {&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;protected class Inner {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected int a = 10;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected Inner() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected void method() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("This is a private message");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答