当前位置: 代码迷 >> Java相关 >> 请教大家super代表什么?
  详细解决方案

请教大家super代表什么?

热度:399   发布时间:2009-11-04 16:39:12.0
请教大家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的构造函数!所以你的第一个程序得出的结论是错误的。
----------------解决方案--------------------------------------------------------
  相关解决方案