Java构造方法的执行顺序
1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法。
Class ThisClass{ }
默认隐式添加无参的构造方法,相当于
Class ThisClass{ public ThisClass(){ } }
2.构造方法的执行顺序。
(1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法。
public ThisClass(){ }默认隐式添加父类无参构造方法,相当于
public ThisClass(){ super(); }(2)如果构造方法中在第一条语句调用了本类的重载构造方法,则执行该类的重载构造方法,执行的规则同上。
public ThisClass(){ this(3); } public ThisClass(int x){ }
当调用ThisClass的无参构造方法时,因其第一句调用本类的重载构造方法,所以程序进入有参的重载方法中执行,有参构造方法符合(1)的情况,所以隐式添加父类的构造方法。
注:
(1)显式调用父类的构造方法和调用本类的其他重载构造方法都要求必须放在构造方法的第一条语句,所以同一个构造方法中不能既调用父类的构造方法,又调用本类的其他重载构造方法。
(2)子类构造方法中没有显式调用父类构造方法时,系统默认调用父类无参构造方法,而如果父类没有无参构造方法,则出现编译错误。
附: 当new一个对象时,代码的执行顺序
public class Test { public static void main(String[] args) { System.out.println("×××××第一次new B对象×××××"); new B(); System.out.println("×××××第二次new B对象×××××"); new B(); } } class A { { System.out.println("父类A的自由块"); } A() { System.out.println("父类A的构造方法\n"); } D d = new D("父类A的成员变量被初始化\n"); static { System.out.println("父类A的静态自由块"); } static D dd = new D("父类A的静态成员变量被初始化\n"); } class B extends A { static D ddd = new D("子类B的静态成员变量被初始化"); static { System.out.println("子类B的静态自由块\n"); } D dddd = new D("子类B的成员变量被初始化"); B() { super(); System.out.println("子类B的构造方法"); } { System.out.println("子类B的自由块\n"); } } class D { D(String str) { System.out.println(str); } }
执行结果:
×××××第一次new B对象××××× 父类A的静态自由块 父类A的静态成员变量被初始化 子类B的静态成员变量被初始化 子类B的静态自由块 父类A的自由块 父类A的成员变量被初始化 父类A的构造方法 子类B的成员变量被初始化 子类B的自由块 子类B的构造方法 ×××××第二次new B对象××××× 父类A的自由块 父类A的成员变量被初始化 父类A的构造方法 子类B的成员变量被初始化 子类B的自由块 子类B的构造方法
作者:tuu
出处:http://www.cnblogs.com/tutuu