| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1405 人关注过本帖
标题:请教大家super代表什么?
只看楼主 加入收藏
Hallelujah
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-9-18
收藏
 问题点数:0 回复次数:9 
请教大家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 
2009-11-04 16:39
流星雨
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:JAVA风暴
等 级:版主
威 望:43
帖 子:1854
专家分:1868
注 册:2004-5-30
收藏
得分:0 
super代表父类,建议你先把基本弄明白,继承的关系,不要搞那个 WithInner.Inner的内部类,会把你搞晕的。

感谢你们带我找到星空下美丽神话,无论经历多少苦痛也不放弃的梦;插上希望翅膀乘风我和你们飞翔,飞过海天尽头携手把梦想实现.....
2009-11-04 17:26
lampeter123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:54
帖 子:2508
专家分:6424
注 册:2009-1-30
收藏
得分:0 
Thinking in JAVA 这本书之所以称得上是经典,就是很多人都看不懂它的例子
以上例子是继承内部类的问题,在实际当中很少用,只有做深入研究才用得上

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

你的优秀和我的人生无关!!!!
    
    我要过的,是属于我自己的生活~~~
2009-11-04 17:39
pywepe
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:296
专家分:483
注 册:2009-4-5
收藏
得分:0 
父类的构造方法

java群
62635216
欢迎加入
2009-11-04 17:39
yes100
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-9-14
收藏
得分:0 
内部类是依赖于外部类的,所以在继承内部类的构造函数需要传递一个外部类的对象的引用;   
super是调用父类的构造函数,但是由于要调用内部类的构造函数,必须和一个外部类的对象引用相关联,所以需要
InheritInner(WithInner wi)
    {        wi.super();}
这种形式

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

[ 本帖最后由 yes100 于 2009-11-4 23:46 编辑 ]
2009-11-04 23:35
Hallelujah
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-9-18
收藏
得分:0 
那么请问wi.super()代表的是WithInner类的构造函数呢还是Inner类的构造函数呢?
如果是
WithInner的构造函数则第二个例子中
wi.super("aaaa");//假如是wi.super()则出错。表明wi.super("aaaa");代表是Inner的构造函数.
这句话如果换成wi.super()就会出错。
那么代表wi.super()在第一个例子中表示Inner类的构造函数了?
2009-11-05 08:09
xwlking
Rank: 4
来 自:湖南衡阳
等 级:业余侠客
威 望:1
帖 子:97
专家分:279
注 册:2009-11-1
收藏
得分:0 
刚刚编译了这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();的话只满足了外部类的构造函数,但没满足内部类需要传个参数的要求。
解释的有点烂啊。。不知道能不能理解。呵呵!

人总需相信自己,人总需依靠自己. ---永远的Beyond---
2009-11-05 18:36
Hallelujah
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-9-18
收藏
得分:0 
回复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()这个东西不是表示父类的构造函数吗?在这里怎么变了。
2009-11-06 08:28
xwlking
Rank: 4
来 自:湖南衡阳
等 级:业余侠客
威 望:1
帖 子:97
专家分:279
注 册:2009-11-1
收藏
得分:0 
你继承的是(extends WithInner.Inner)内部类,

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

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

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

super是调用父类的构造函数,你继承的是内部类,而内部类带参数,所以wi.super("aaaa");才满足要求.
外部类构造函数里的语句也打印出来了,是因为你创建了WithInner这个外部类的实例,自然就调用了这个外部类的构造函数.

人总需相信自己,人总需依靠自己. ---永远的Beyond---
2009-11-06 20:36
rxm24217
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-12-25
收藏
得分:0 
wi.super()是内部类Inner的构造函数!所以你的第一个程序得出的结论是错误的。
2009-12-25 22:14
快速回复:请教大家super代表什么?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030792 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved