super代表java,请教大家super代表什么?

请教大家super代表什么?

照书上说super应该表示是被继承类的构造函数

但java编程思想第十章中一个程序把我搞糊涂了:

class WithInner

{

class Inner

{

}

}

public class InheritInner extends WithInner.Inner

{

InheritInner(WithInner wi)

{wi.super();}

public static void main(String args[])

{

WithInner wi = new WithInner();

InheritInner ii = new InheritInner(wi);

}

}

可以编译运行。wi.super表示的应该是WithInner这个类的构造函数

可我把程序改成下面这样:

class WithInner

{

public WithInner()

{

System.out.println("WithInner Constructor");

}

class Inner

{

public Inner(String a){        System.out.println("Inner Constructor."+a);}

}}

public class InheritInner extends WithInner.Inner

{

//    InheritInner(WithInner wi){        wi.super();}

public InheritInner(WithInner wi)

{

wi.super("aaaa");//假如是wi.super()则出错。表明wi.super("aaaa");代表是Inner的构造函数.        System.out.println("-----------------");

System.out.println("InheritInner()");

}

public static void main(String args[])

{

WithInner wi = new WithInner();

InheritInner ii = new InheritInner(wi);

}

}

也可以运行,运行结果:

WithInner Constructor

Inner Constructor.aaaa

-----------------

InheritInner()

这表示wi.super("aaaa")代表的是内部类Inner的构造函数。这怎么可能呢?

有没有高人告诉我wi.super()代表是WithInner的构造函数还是Inner类的构造函数还是别的什么?

[本帖最后由 Hallelujah 于 2009-11-4 16:48 编辑]

搜索更多相关的解决方案:

代表  super

----------------解决方案--------------------------------------------------------

super代表父类,建议你先把基本弄明白,继承的关系,不要搞那个 WithInner.Inner的内部类,会把你搞晕的。

----------------解决方案--------------------------------------------------------

Thinking in JAVA 这本书之所以称得上是经典,就是很多人都看不懂它的例子

以上例子是继承内部类的问题,在实际当中很少用,只有做深入研究才用得上

[本帖最后由 lampeter123 于 2009-11-4 17:43 编辑]

----------------解决方案--------------------------------------------------------

父类的构造方法

----------------解决方案--------------------------------------------------------

内部类是依赖于外部类的,所以在继承内部类的构造函数需要传递一个外部类的对象的引用;

super是调用父类的构造函数,但是由于要调用内部类的构造函数,必须和一个外部类的对象引用相关联,所以需要

InheritInner(WithInner wi)

{        wi.super();}

这种形式

正好你的例子证明了这一点,如果把吧构造函数去掉,结果就错了。

[本帖最后由 yes100 于 2009-11-4 23:46 编辑]

----------------解决方案--------------------------------------------------------

那么请问wi.super()代表的是WithInner类的构造函数呢还是Inner类的构造函数呢?

如果是

WithInner的构造函数则第二个例子中

wi.super("aaaa");//假如是wi.super()则出错。表明wi.super("aaaa");代表是Inner的构造函数.这句话如果换成wi.super()就会出错。

那么代表wi.super()在第一个例子中表示Inner类的构造函数了?

----------------解决方案--------------------------------------------------------

刚刚编译了这2段代码,第1段代码如果在WithInner,Inner类中写个构造函数,分别打印一句话。如下:

class WithInner

{

public WithInner()

{

System.out.println("aaaa");

}

class Inner

{

public Inner()

{

System.out.println("bbbbb");

}

}

}

你会发现外部类和内部类的语句都打印出来了。

那么,运行第2段代码,象LZ所说的如果wi.super("aaaa");传个参数过去的话就没问题,如果是wi.super();的话就会报错。我认为这个是内部类的一些规范。 WithInner类中包含了一个内部类Inner,且Inner类中的构造函数是需要传个参数进去的。 那么wi.super("aaaa");是成立的,是先调用了外部类的构造函数,然后调用内部类的构造函数。 而wi.super();的话只满足了外部类的构造函数,但没满足内部类需要传个参数的要求。

解释的有点烂啊。。不知道能不能理解。呵呵!

----------------解决方案--------------------------------------------------------

回复7楼:

其实这个问题在第二个程序里已经表现得很清楚了。

public WithInner()

{

System.out.println("WithInner Constructor");

}

class Inner

{

public Inner(String a){        System.out.println("Inner Constructor."+a);}

}

也可以运行,运行结果:

WithInner Constructor

Inner Constructor.aaaa

也说明了这点。我只是不明白wi.super()这个东西不是表示父类的构造函数吗?在这里怎么变了。

----------------解决方案--------------------------------------------------------

你继承的是(extends WithInner.Inner)内部类,

wi.super()会出错,原因就是你继承的是内部类,而内部类是个带参数的构造函数,所以你必须传个参数过去.

所以当你wi.super("aaaa");这样写的时候,就是满足了内部类的要求.

WithInner wi = new WithInner();这一句就是调用外部类的构造方法.

super是调用父类的构造函数,你继承的是内部类,而内部类带参数,所以wi.super("aaaa");才满足要求.

外部类构造函数里的语句也打印出来了,是因为你创建了WithInner这个外部类的实例,自然就调用了这个外部类的构造函数.

----------------解决方案--------------------------------------------------------

wi.super()是内部类Inner的构造函数!所以你的第一个程序得出的结论是错误的。

----------------解决方案--------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值