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 。这个形式与常规类的继承构造略有不同,理解上要做区分。