问题:

子类继承父类,构造函数及公共属性的执行顺序是怎样的?

示例代码

 

Java代码
  1. <SPAN style="FONT-FAMILY: Times New Roman; FONT-SIZE: 14px">public class A extends C {
  2. B b = new B();
  3. static H h = new H();
  4. static {
  5. System.out.println("this is static tack");
  6. }
  7.  
  8. static void i() {
  9. System.out.println("this is static metod");
  10. }
  11.  
  12. public A() {
  13. System.out.println("this is class A");
  14.  
  15. }
  16.  
  17. public static void main(String[] args) {
  18. A a = new A();
  19. }
  20. }
  21.  
  22. class B {
  23. public B() {
  24. System.out.println("this is class B");
  25. }
  26. }
  27.  
  28. class C {
  29. D d = new D();
  30. static E e = new E();
  31. final F e1 = new F();
  32. static final G e2 = new G();
  33.  
  34. public C() {
  35. System.out.println("this is class C");
  36. }
  37. }
  38.  
  39. class D {
  40. public D() {
  41. System.out.println("this is class D");
  42. }
  43. }
  44.  
  45. class E {
  46. public E() {
  47. System.out.println("this is class E");
  48. }
  49. }
  50.  
  51. class F {
  52. public F() {
  53. System.out.println("this is class F");
  54. }
  55. }
  56.  
  57. class G {
  58. public G() {
  59. System.out.println("this is class G");
  60. }
  61. }
  62.  
  63. class H {
  64. public H() {
  65. System.out.println("this is class H");
  66. }
  67. }</SPAN>
public class A extends C { 	B b = new B(); 	static H h = new H(); 	static { 		System.out.println("this is static tack"); 	}  	static void i() { 		System.out.println("this is static metod"); 	}  	public A() { 		System.out.println("this is class A");  	}  	public static void main(String[] args) { 		A a = new A(); 	} }  class B { 	public B() { 		System.out.println("this is class B"); 	} }  class C { 	D d = new D(); 	static E e = new E(); 	final F e1 = new F(); 	static final G e2 = new G();  	public C() { 		System.out.println("this is class C"); 	} }  class D { 	public D() { 		System.out.println("this is class D"); 	} }  class E { 	public E() { 		System.out.println("this is class E"); 	} }  class F { 	public F() { 		System.out.println("this is class F"); 	} }  class G { 	public G() { 		System.out.println("this is class G"); 	} }  class H { 	public H() { 		System.out.println("this is class H"); 	} }

执行结果:

this is class E

this is class G
this is class H
this is static tack
this is class D
this is class F
this is class C
this is class B
this is class A

执行顺序:

1、实现父类公共的静态属性或静态的块级代码

2、实现本身的公共的静态属性

3、实现父类公共属性

4、执行父类的构造方法

5、实现本身的公共属性

6、执行本身的构造函数

7、静态方法不执行

补充:

当父类有多个构造函数,若子类用super(参数信息)指明调用父类有参数的构造函数,则不执行无参数的构造方法