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