繁体   English   中英

在Java中扩展内部类

[英]Extending an inner class in java

当涉及到内部类时,我很难实现我在Oracle Docs中阅读的有关继承的语句。

该声明 :

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

为了测试这一点,即查看是否可以实现上述目标,我创建了一个具有内部类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-这是我的第一个问题-如果不遵守某些准则,请事先道歉。

是的,这是由Java的合成糖引起的陷阱。 您认为内部非静态类具有默认无参数构造函数,但这是错误的。 在内部,IC1的构造函数将OC1作为构造函数中的第一个参数-即使您看不到它。

这就是为什么OC2构造函数必须使用OC1作为构造函数参数的原因:

public DataStructureChild(DataStructure argument) {
}

不幸的是,这不是绝对的,您需要确保该参数不为空:

public DataStructureChild(DataStructure argument) {
    argument.super();
}

看起来很奇怪,但是有效。

您可以执行此操作,因为您继承了对父级内部类的访问。

class DataStructureChild extends DataStructure {
    public DataStructureChild() {
    }

    public void foo() {
         InstanceArr ins = new InstanceArr();
         ins.doSomething();
         System.out.println(ins.a);
    }
}

但是,您能否提供一个链接或解释您在以下地方读到的内容? 嵌套类可以访问其封闭类的所有私有成员,包括字段和方法。 因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员。

我知道的第一部分。 但是我从来没有考虑过一个单独的类来扩展另一个类的内部类。 尤其是因为类及其封闭的内部类之间通常存在隐式关系。

编辑:

我相信您误解了该声明。

  1. 它说您的子类继承了内部类。 那是真实的。
  2. 它还说,一旦完成,您就可以访问继承的内部类的私有值。 如上所示,这也是正确的:

因此,它只是在谈论通过继承访问内部类,而不是直接扩展它。

但是,如果您确实想在不传递引用的情况下具有这种继承关系,则可以采用这种方法。


    public class Inheritance extends Outer.Inner {

       public Inheritance() {
          new Outer().super();
       }
       public static void main(String[] args) {
          new Inheritance().start();
       }
       public void start() {
          System.out.println(a);
          method();

       }

    }

    class Outer {
       public Outer() {
       }

       protected class Inner {
          protected int a = 10;

          protected Inner() {
          }
          protected void method() {
             System.out.println("This is a private message");
          }
       }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM