初始化一个类,必先初始化他的父类,如果有的话
父类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 }
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 }
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 }
测试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