首页 > 内部类的构造问题

内部类的构造问题

package test;

import test.A.B;

public class Test extends A.B.C {

    public Test(B b, String str) {
        b.super(str);
        //System.out.println(" * " + b);
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        A.B b = new A("A1").new B("B2");
        Test test = new Test(b, "C3");
    }

}

class A {
    A(String str) {
        System.out.println(str);
    }
    class B {
        B(String str) {
            System.out.println(str);
        }
        class C {
            C(String str) {
                System.out.println(str);
            }
        }
    }
}

弄不懂,为什么Test中直接super不可以,而要使用B的实例b调用super()。
另外super()的结果为什么是构造了C呢?


从这个例子来看,你在Test中直接调用super构造是不可以的,因为C是B的一个非静态类,也就是说,要构造C,你必须提供一个B的实例,就像前一句 A.B b = new A("A1").new B("B2"); 一样,要构造B,必须使用A的实例,而不能直接 A.B b = new A.B("B2");。 而因为 Test 位于 B 之外,所有直接继承 A.B.C 是无法实现构造的,所以就有了这里例子中很巧妙办法,通过在构造函数中传递 B 的实例,将 Test 的构造交给实例 B 来完成,这样就可以实现构造了。

另外,这里 b.super() 的调用,并不是调用了 b 的父类的构造方法,而是任然是调用 Test 的父类的构造方法(也就是 C 的构造方法),所以结果就是构造了 C 。这个形式与常规类的继承构造略有不同,理解上要做区分。

【热门文章】
【热门文章】