Java——继承的运行顺序
首先看一个代码
父类代码:
1 public class Parent { 2 3 { 4 System.out.println("Parent非静态代码块"); 5 } 6 7 static { 8 System.out.println("Parent静态代码块"); 9 } 10 11 public String name; 12 13 14 public Parent() { 15 this.name = "小明"; 16 // play1(); 17 play(); 18 } 19 20 // public void play1() { 21 // System.out.println(name +"在Parent类中玩游戏!!!"); 22 // } 23 24 public void play() { 25 System.out.println(name +"在Parent类中玩游戏!!!"); 26 } 27 }
子类代码:
1 public class Sub extends Parent{ 2 3 { 4 System.out.println("Sub非静态代码块"); 5 } 6 7 static { 8 System.out.println("Sub静态代码块"); 9 } 10 11 public String name; 12 13 public Sub(String name) { 14 super(); 15 this.name = name; 16 } 17 18 public void play() { 19 System.out.println(name +"在Sub类中玩游戏!!!"); 20 } 21 }
main方法代码:
1 public class Main { 2 3 public static void main(String[] args) { 4 5 // System.out.println("========主方法========"); 6 7 Sub sub = new Sub("小强"); 8 9 sub.play(); 10 11 12 } 13
运行的结果是:Parent静态代码块
Sub静态代码块
Parent非静态代码块
null在Sub类中玩游戏!!!
Sub非静态代码块
小强在Sub类中玩游戏!!!
其中有几个点需要注意:
(1)输出null的原因是当时name还没有进行初始化(sub.name)
(2)而play()运行出来sub的原因是没有parent对象
总结:
继承结构在内存中运行步骤:
父类静态变量以及静态程序块 --- 子类的静态变量以及静态程序块 ---(子类主方法)--- 父类非静态代码块 --- 父类初始化---父类中构造方法 --- 子类中非静态代码块 --- 子类初始化---子类中构造方法 --- 对象调用的方法