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对象

总结:
  继承结构在内存中运行步骤:
  父类静态变量以及静态程序块 --- 子类的静态变量以及静态程序块 ---(子类主方法)--- 父类非静态代码块 --- 父类初始化---父类中构造方法 --- 子类中非静态代码块 --- 子类初始化---子类中构造方法 --- 对象调用的方法
原文地址:https://www.cnblogs.com/ne709/p/9475958.html