您的位置:首页 > 其它

继承条件下的构造方法调用

2015-11-06 12:29 288 查看
(一)为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

答案:java 自动在派生类构造器中插入基类构造器运行,例如

class A {
A() { System.out.println("A constructor"); }
}

class B {
B() { System.out.println("B constructor"); }
}

public class C extends A {
B b = new B();
public static void main(String[] args) {
C c = new C();
}
}


那么,是不是可以认为基类构造器调用是派生类构造器的第一条语句,从而在派生类构造器调用的时候才调用呢?

然而结果是:A constructor B constructor

由此可见:基类的初始化发生在派生类的初始化(包括自动初始化、构造器等等)之前。,而是无参数时

(二)通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。调用基类中含“参数”的构造器时

class Grandparent {

public Grandparent() {
System.out.println("GrandParent Created.");
}

public Grandparent(String string) {
System.out.println("GrandParent Created.String:" + string);
}
}

class Parent extends Grandparent {

public Parent() {
super("Hello.Grandparent.");
System.out.println("Parent Created");
// super("Hello.Grandparent.");
}
}

class Child extends Parent {

public Child() {
System.out.println("Child Created");
}
}


但是结果GrandParent Created.String:Hello.Grandparent.(参数)

Parent Created
Child Created虽然你spuer("Hello.Grandparent")位于派生类的第一句,但是总之一句话,未显式调用基类构造器的情况下,编译器就查找基类的默认构造器,找不到报错;找到,加入对它的调用。基类没有默认构造器,就必须显式调用。基类的初始化发生在派生类的初始化(包括自动初始化、构造器等等)之前。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: