1. 程式人生 > >JAVA繼承面試題目分析

JAVA繼承面試題目分析

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.