求教:一个继承内隐类的问题。

dddeee 2003-08-30 01:56:01
这是在《JAVA编程思想》上看到的一道例题,是关于继承inner classes(内隐类)的。

先把代码和书上的一些原话写出来,如下:

由于inner class的构造函数必须连接到一个reference指向outer class 对象身上,所以
当你继承inner class时,事情便稍微复杂些。问题出在“指向outer class对象”的那个
神秘reference必须被初始化。但derived class之内不存在可连接的缺省对象,这个问题
的答案是,使用专用语法,明确产生该关联性:

class WithInner {
class Inner{}
}

public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi) {
wi.super(); //---这里不懂,wi.super()指的是什么,有什么用?
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}

想了很久也不懂,请高手指点一下!
...全文
200 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhh200308 2003-08-30
  • 打赏
  • 举报
回复
谢谢你的理解与例子,我现在基本上懂了。super指的是当前继承类的基类。super()是指那个基类的初始化。wi.super()指的应该是new WithInner.Inner(),它完成了对基类的初始化。这样说对吗
---------------------------------------------------
Ok。

我第一次看时把“InheritInner extends WithInner.Inner”
看成了"InheritInner extends WithInner"所以造成误解,
所以我第一贴的理解完全错了。


谢谢你们的提示,终于让我懂了这个例子。不过storm999,你给出的那个代码中(WithInner).this.a = 0;
是不是应该为WithInner.this.a=0;?
----------------------------------------
正确格式应该是WithInner.this.a=0;
我刚刚复习了一下<<core java 2>>,在第222页计到了。

dddeee 2003-08-30
  • 打赏
  • 举报
回复
to zhh200308(虚荣心与星星):
谢谢你的理解与例子,我现在基本上懂了。super指的是当前继承类的基类。super()是指那个基类的初始化。wi.super()指的应该是new WithInner.Inner(),它完成了对基类的初始化。这样说对吗?

to storm999(飛魚) & cd1860(守莲小子) :
谢谢你们的提示,终于让我懂了这个例子。不过storm999,你给出的那个代码中(WithInner).this.a = 0;
是不是应该为WithInner.this.a=0;?
dddeee 2003-08-30
  • 打赏
  • 举报
回复
刚才我打了三个小时的蓝球,现在特别的累呀
我谢谢大家对我的帮助和支持。我很感动。
cd1860 2003-08-30
  • 打赏
  • 举报
回复
很高兴(虚荣心与星星)终于搞清楚了,就是这么回事,因为如果是普通的类
你直接super()就可以在子类中给它初始化了,而恰恰这个类是一个内部类,
所以要想找到它当然要先找到它是哪个类的内部类。所以就出现了上面的情
况。
zhh200308 2003-08-30
  • 打赏
  • 举报
回复
哦我搞清楚了,原来Inner才是InheritInner的父类(刚才看走眼了)
并且Inner又是WithInner内部类,必须通过
outerObject(也就是wi)来引用super()
zhh200308 2003-08-30
  • 打赏
  • 举报
回复
sorry!!!sorry!!!sorry!!!
刚才做了一下测试,我上面所说的要全部否定了;
测试例子
class WithInner {
WithInner() { System.out.println("WithInner()"); }
WithInner(int i) { System.out.println("WithInner1()"); }
class Inner{
Inner() {
System.out.println("Inner()");
}
Inner(int i) {
System.out.println("Inner1()");
}
}
}

public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi) {
wi.super(); //---这里不懂,wi.super()指的是什么,有什么用?
System.out.println("InheritInner()");
}
public static void main(String[] args) {
WithInner wi = new WithInner(1);
InheritInner ii = new InheritInner(wi);
}
}

结果出乎预料:
WithInner1()
Inner()
InheritInner()

wi.super()竟然是调用了Inner(),
把wi.super()改为wi.super(1),调用的是Inner(int),
还要仔细想想先。。。
storm999 2003-08-30
  • 打赏
  • 举报
回复
Inner內部類實際上有一個對外部類的引用﹐
你用這個
(WithInner)this
應可以訪問WithInner的類成員,如下
class WithInner{
private int a;
class Inner{
changeOuterValue(){
(WithInner).this.a = 0;
}
}
}
非靜態內部類都有這個引用﹐所以在繼承時﹐必須也要提供這個引用。
不知我這樣講你清楚了沒有?
zhh200308 2003-08-30
  • 打赏
  • 举报
回复
wi.super(),也就相当于new WithInner()吧!
也就是你上面提到的:“指向outer class对象”的那个神秘reference必须被初始化;

因为InheritInner extends WithInner.Inner ,你可以这样理解:
把InheritInner 看作是WithInner的内部类(这说法可能不对),
在new InheritInner()之前自然也要new WithInner()了。

以上只是个人看法,仅供参考,这种情况不常见。
dddeee 2003-08-30
  • 打赏
  • 举报
回复
谢先!
selfboss 2003-08-30
  • 打赏
  • 举报
回复
我帮你先UP一下。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧