类的初始化顺序

初始化一个类,必先初始化他的父类,如果有的话

 

父类ParentTest1

子类ChildTest1

 

 1 package com.yitian.test.override;
 2 
 3 /**
 4  * 测试父类,测试重写
 5  * @author tong
 6  *
 7  */
 8 public class ParentTest1 {
 9     
10     static String s = "parentStatic";
11     
12     String parentName = "parentName";
13     
14     String testName = "parentTestName";
15     {
16         System.out.println();
17         System.out.println("parent++++初始化变量++++");
18         System.out.println("parent++++初始化块++++");
19         System.out.println();
20     }
21     static {
22         System.out.println();
23         System.out.println("parent初始化静态变量++++");
24         System.out.println("parent初始化静态块++++");
25         System.out.println();
26     }
27     
28     /**
29      * 初始化顺序
30      * 1初始化父类
31      * 2初始化静态变量
32      * 3初始化静态块
33      * 
34      * 4变量
35      * 
36      */
37     public ParentTest1() {
38         System.out.println();
39         System.out.println("before++Parent()构造方法+++");
40         test3();
41         System.out.println("after++Parent()构造方法+++");
42         System.out.println();
43         System.out.println();
44     }
45     
46     public void test3() {
47         System.out.println();
48         System.out.println("before++Parent+++test3()");
49         System.out.println("Parent+++test3()++");
50         System.out.println(parentName);
51         System.out.println("after++Parent+++test3()");
52         System.out.println();
53     }
54     
55 }
ParentTest1
 1 package com.yitian.test.override.overload;
 2 
 3 import com.yitian.test.override.ParentTest1;
 4 
 5 public class ChildTest1 extends ParentTest1 {
 6     
 7     static String s = "childStatic";
 8     
 9     String childName = "childName";
10     
11     String testName = "childTestName";
12     {
13         System.out.println();
14         System.out.println("child++++初始化变量++++");
15         System.out.println("child++++初始化块++++");
16         System.out.println();
17     }
18     
19     static {
20         System.out.println();
21         System.out.println("child初始化静态变量++++");
22         System.out.println("child初始化静态块++++");
23         System.out.println();
24     }
25     
26     /**
27      * 初始化顺序
28      * 1初始化子类,必先初始化父类,
29      * 2初始化父类
30      * 3父类初始化静态变量
31      * 4父类初始化静态块
32      * 5子类初始化静态变量
33      * 6子类初始化静态块
34      * 7父类变量
35      * 8父类块
36      * 9父类构造方法
37      * 10子类变量
38      * 11子类块
39      * 12子类构造方法
40      * 
41      */
42     public ChildTest1() {
43         System.out.println();
44         System.out.println("before++Child()构造方法+++");
45         test3();
46         System.out.println("after++Child()构造方法+++");
47         System.out.println();
48         System.out.println();
49     }
50     
51     @Override
52     public void test3() {
53         System.out.println();
54         System.out.println("Child++test3()++++");
55         System.out.println("childName++++" + childName);
56         System.out.println("testName++++" + testName);
57         System.out.println();
58     }
59     
60 }
ChildTest1
 1 package com.yitian.test.override;
 2 
 3 import org.junit.Test;
 4 
 5 import com.yitian.test.override.overload.ChildTest1;
 6 
 7 public class Test1 {
 8     
 9     @Test
10     public void testride() {
11         new ChildTest1();
12         // new ParentTest1();
13     }
14     
15 }
Test1

 

 

测试new ChildTest1();

初始化子类,先判断有没有父类

有父类先初始化父类

父类执行构造方法前,先判断有没有静态变量,和静态块

有静态变量,先初始化静态变量和静态快

在判断子类有没有静态变量和静态块

初始化子类静态变量,和静态块

初始化父类变量

初始化父类块

初始化父类构造方法

初始化子类变量

初始化子类块

初始化子类构造方法

 

输出结果:


parent初始化静态变量++++
parent初始化静态块++++


child初始化静态变量++++
child初始化静态块++++


parent++++初始化变量++++
parent++++初始化块++++


before++Parent()构造方法+++

Child++test3()++++
childName++++null
testName++++null

after++Parent()构造方法+++

 

child++++初始化变量++++
child++++初始化块++++


before++Child()构造方法+++

Child++test3()++++
childName++++childName
testName++++childTestName

after++Child()构造方法+++

 

 

因为子类重写了父类的方法,父类执行构造方法时,调用的方法是子类的,但是子类的变量还没有初始化,

所以第一次初始化父类调用子类方法的时候输出为null

 

posted @ 2017-08-26 19:20  壹品轩  阅读(204)  评论(0编辑  收藏  举报