gpt4 book ai didi

java - 在java中扩展一个内部类

转载 作者:行者123 更新时间:2023-11-30 07:40:39 24 4
gpt4 key购买 nike

我在尝试实现我在 Oracle 文档中读到的有关内部类继承的声明时遇到了问题。

声明:

嵌套类可以访问其封闭类的所有私有(private)成员——包括字段和方法。因此,子类继承的公共(public)或 protected 嵌套类可以间接访问父类(super class)的所有私有(private)成员。

为了测试这一点,即看看我是否能实现上述目标,我创建了一个顶级类 OC1,它有一个内部类 IC1,然后我创建了另一个扩展 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合成糖引起的Trap。您认为内部非静态类具有默认无参数构造函数,但这是错误的。在内部,IC1 的构造函数将 OC1 作为构造函数中的第一个参数 - 即使您看不到它。

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

public DataStructureChild(DataStructure argument) {
}

不幸的是,这还不够,你需要确保参数不是空的:

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

它看起来很奇怪,但它确实有效。

关于java - 在java中扩展一个内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com