JAVA繼承面試題目分析
阿新 • • 發佈:2018-12-22
package com.heima.eclipse; import java.awt.print.Printable; import java.util.Scanner; import javax.security.auth.x500.X500Principal; public class HelloWorld1 { public static void main(String[] args){ Zi z = new Zi(); } } class Fu { static { System.out.println("靜態程式碼塊Fu"); } { System.out.println("構造程式碼塊Fu"); } public Fu() { System.out.println("構造方法Fu"); } } class Zi extends Fu { static { System.out.println("靜態程式碼塊Zi"); } { System.out.println("構造程式碼塊Zi"); } public Zi() { //super(); System.out.println("構造方法Zi"); } }
輸出為:
靜態程式碼塊Fu
靜態程式碼塊Zi
構造程式碼塊Fu
構造方法Fu
構造程式碼塊Zi
構造方法Zi
1.jvm呼叫了main方法,main進棧;
2.遇到了Zi z = new Zi(),會先將Fu.class和Zi.class分別載入進記憶體,再建立物件,當Fu.class載入進記憶體,父類的靜態程式碼塊會隨著Fu.class一起載入,當Zi.class載入進記憶體,子類的靜態程式碼塊會隨著Zi.class一起載入,第一個輸出靜態程式碼塊fu,第二個輸出靜態程式碼塊Zi
3.走Zi類的構造方法,因為java中是分層初始化的,先初始化父類,再初始化子類,所以先走的父類構造,但是在執行父類構造時,發現父類有構造程式碼塊,構造程式碼塊是優先於構造方法執行的所以
第三個輸出構造程式碼塊Fu,第四個輸出構造方法Fu
4.父類初始化結束後,接著是子類的初始化,所以第五個輸出的是構造程式碼塊Zi,第六個輸出構造方法Zi.