继承内部类的问题

不白吃饭 2010-07-21 11:56:30
这个例子:
class Car
{
class Wheel
{
}
}

class Planewheel extends car.Wheel
{
Planewheel(Car car)
{
car.super(); //建立从内部类对象到外部类对象的引用关系,这里问什么是super?
}
public static void main(String[] args)
{
Car car=new Car();
Planewheel pw=new Planewheel(car);
}
}



内部类和外部类之间难道不是外部类为super么?


...全文
64 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
不白吃饭 2010-07-21
  • 打赏
  • 举报
回复
Planewheel(Car car)
{
car.super(); //建立从内部类对象到外部类对象的引用关系
}

这个运行是绝对没问题的。只是super让人费解。


我看过别人的解释:
由于内部类构建器必须同封装类对象的一个句柄联系到一起,所以从一个内部类继承,需要创建一个构建器的时候,默认对象已经没有意义,不能只是传递封装对象的一个句柄。必须在构建器中采用下述语法:
enclosingClassHandle.super();
它提供了必要的句柄,以便程序正确编译。
内部类中隐藏一个outer指针$this,指向外围类的对象。
用java反射分析类结构时,wheel会被解析成car$wheel
this是一个对象指针,可以指向一个对象。但super与this不同,只是告诉编辑器调用父类方法或构造器,并不是一个指针。可以用this给一个对象附值,可以return this,但绝对不能用super给对象附值或return super。
car.super(),可以分两步理解。car提供一个句柄,用于通过外围类找到内部类,super,提示调用父类构造器。
另外,java中点运算符“.”的功能有两个:一是引用类中成员,二是指示包的层次等级。
这里应该表示的是层次等级。
不白吃饭 2010-07-21
  • 打赏
  • 举报
回复
class Car
{
class Wheel
{
}
}

class Planewheel extends car.Wheel
{
Planewheel( )
{
super( );
}
public static void main(String[] args)
{
Car car=new Car();
Planewheel pw=new Planewheel( );
}
}

楼上这样是正解吗。
Planewheel( )
{
super( );
}
此时构建Wheel对象时跳过了外部类Car了啊。
Jlins 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chdw 的回复:]
Planewheel(Car car)
{
car.super(); //建立从内部类对象到外部类对象的引用关系,这里问什么是super?
}

不需要这样写的
只需要
Planewheel() {
super();//参数的构造函数可以不写
}


调用者只需要Planewheel pw=new Planewheel();

不需要创建父类的。
[/Quote]
+1
ChDw 2010-07-21
  • 打赏
  • 举报
回复
Planewheel(Car car)
{
car.super(); //建立从内部类对象到外部类对象的引用关系,这里问什么是super?
}

不需要这样写的
只需要
Planewheel() {
super();//参数的构造函数可以不写
}


调用者只需要Planewheel pw=new Planewheel();

不需要创建父类的。
meadking 2010-07-21
  • 打赏
  • 举报
回复
这个牛尖值得钻一下,......
不白吃饭 2010-07-21
  • 打赏
  • 举报
回复
<Thinking in Java> 之内部类,有这么一个例程:
class WithInner{
class Inner{
}
}

class InheritInner extends WithInner.Inner{
public InheritInner(WithInner wi){
wi.super();
}
public static void main(String[] args){
WithInner wi=new WithInner();
InheritInner ii=new InheritInner(wi);
}
}


一摸一样的

1、子类的构造函数先必须调用父类的构造函数
2、而内部类特殊性在于其构造函数要一个外部类的实例才能调用
这两个合起来就是wi.super();
只能这么理解了。
由于原因1,super被编译器理解为Planewheel的super。
由于原因2,super必须被wi调用。

另car.super( ); //等同于car.new car.Wheel();

-----------------------------------------
o(︶︿︶)o 唉


62,614

社区成员

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

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