在java中扩展内部类
当涉及到内部类时,我很难实现我在Oracle文档中读到的关于继承的语句 声明: 嵌套类可以访问其封闭类的所有私有成员,包括字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员 为了测试这一点,也就是说,看看我是否能实现上述目标,我创建了一个顶级类OC1,它有一个内部类IC1,然后我创建了另一个顶级类OC2,它扩展了IC1 我还没来得及开始编写一个方法,IDE就在OC2类主体上阻止我说 “由于某些中间构造函数调用,DataStructure类型的封闭实例不可用” 我读了一些其他的答案,大多数都指向这两个方面 a) 将内部类更改为静态嵌套类--它解决了错误 b) 整个场景是不必要的,也是错综复杂的 代码如下:在java中扩展内部类,java,Java,当涉及到内部类时,我很难实现我在Oracle文档中读到的关于继承的语句 声明: 嵌套类可以访问其封闭类的所有私有成员,包括字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员 为了测试这一点,也就是说,看看我是否能实现上述目标,我创建了一个顶级类OC1,它有一个内部类IC1,然后我创建了另一个顶级类OC2,它扩展了IC1 我还没来得及开始编写一个方法,IDE就在OC2类主体上阻止我说 “由于某些中间构造函数调用,DataStructure类型的封闭实例不可用” 我读了一
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
}
我知道这不是一个理想的场景,但我不想将内部类更改为静态嵌套类——这将挫败我基本上尝试查看ArrayFints是否可以在没有OC1实例的情况下访问的目的
我是否曲解了这句话?如果没有,请告诉我正确的方向
PS-这是我在这里的第一个问题-如果一些指导方针被藐视,请提前道歉。是的,这是由Java的合成糖造成的陷阱。您认为内部非静态类具有默认的无参数构造函数,但这是错误的。在内部,IC1的构造函数将OC1作为构造函数中的第一个参数-即使您看不到它 这就是OC2构造函数必须使用OC1作为构造函数参数的原因:
public DataStructureChild(DataStructure argument) {
}
不幸的是,这不是很好,您需要确保参数不为null:
public DataStructureChild(DataStructure argument) {
argument.super();
}
它看起来非常复杂,但它可以工作。您可以这样做,因为您继承了对父类内部类的访问权
类DataStructureChild扩展了DataStructure{
公共数据结构子对象(){
}
公共图书馆{
InstanceArr ins=新InstanceArr();
ins.doSomething();
系统输出打印项次(ins.a);
}
}
但是你能给我一个链接或者解释一下你在哪里读到的吗?嵌套类可以访问其封闭类的所有私有成员,包括字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员
我知道的第一部分。但我从未考虑过一个单独的类扩展另一个类内部的类。特别是因为类和它们封闭的内部类之间通常存在隐式关系
编辑:
我相信你误解了这个说法
公共类继承扩展了Outer.Inner{
公共继承(){
新的外部().super();
}
公共静态void main(字符串[]args){
新继承().start();
}
公开作废开始(){
系统输出打印项次(a);
方法();
}
}
类外部{
公共图书馆{
}
保护类内部{
受保护的INTA=10;
受保护的内部(){
}
受保护的无效方法(){
System.out.println(“这是一条私人消息”);
}
}
}
一般来说,在Java中不存在需要使用非静态内部类的情况。这句话很有趣:“基本上是想看看ArrayFints在没有OC1实例的情况下是否可以访问。”ArrayFints属于OC1。如果没有OC1,您试图访问什么?(没有勺子!)。内部类IC1隐含着对OC1的引用。正如编译器所指示的那样,在不填充引用的情况下不能构造IC1。而且,如果OC1中没有定义OC2(它扩展了IC1),我就不知道初始化该引用的任何方法。@steven35事实并非如此。例如,它们非常适合实现迭代器或侦听器。静态内部类不能直接访问封闭类的实例字段,如果您想通过扩展适配器类来实现侦听器,这一点尤其有用。@Jamie-很抱歉造成混淆,当我试图避免OC1的实例时,我的意思是,在内部类中使用new操作符显式创建一个实例,并通过OC2中的IC1实例方法或其他类似方法访问它。我知道内部类的存在在OC1实例的范围内。在“超类中的私有成员”下,我试图找到一种方法在数据结构中进行一些操作,而不让DataStrcutureChild扩展数据结构,而是扩展InstanceArr,InstanceArr是数据结构中的内部类,其中数据结构的成员都是私有的。@AnirudhShukla在我的回答中看到我的评论。是的,这就成功了。我能够在没有任何可用的公共或受保护的获取者的情况下获取OC1的私人成员。非常感谢。我知道这个问题并不实际,但我还是把一些事情说得更清楚了<代码>公共类DataStructureChild扩展DataStructure.instanceArr{public DataStructureChild(DataStructure dr){dr.super();}公共静态void main(字符串args[]){DataStr
public DataStructureChild(DataStructure argument) {
argument.super();
}