1. 程式人生 > >Java基礎-----繼承中的初始化

Java基礎-----繼承中的初始化

前言

子類構造方法執行前預設先執行父類的無參構造方法。

一個類的初始化過程

成員變數進行初始化
(1)預設初始化。
(2)顯示初始化。
(3)構造方法初始化。

案例演示
package duixiang;

class Fu {
	public int num = 10;
	
	public Fu() {
		System.out.println("fu");
	}
}

class Zi extends Fu {
	public int num = 20;
	public Zi() {
		System.out.println("Zi");
	}
	
	public void show() {
		int num = 30;
		System.out.println(num);//30
		System.out.println(this.num);//20
		System.out.println(super.num);
	}
}

public class ExtendsTest {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}

執行結果如下:
在這裡插入圖片描述

初始化變數、程式碼塊和構造方法的初始化順序
package duixiang;

class Test1 {
	Test1(){
		System.out.println("Test1構造方法!");
	}
}

public class DemoTest {
	Test1 test1 = new Test1();
	static {
		System.out.println("static");
	}
	
	{
		System.out.println("普通程式碼塊");
	}
	
	DemoTest() {
		System.out.println("DemoTest構造方法");
	}
	
	public static void main(String[] args) {
		DemoTest demoTest = new DemoTest();
		
	}
}

執行結果如下:
在這裡插入圖片描述

子父類的初始化(分層初始化)

先進行父類初始化,然後進行子類初始化。

雖然子類中構造方法預設有一個super(),初始化的時候,不是按照那個順序進行的。而是按照分層初始化進行的,它僅僅表示要先初始化父類資料,再初始化子類資料。

package duixiang;

class DemoX {
	DemoY dy = new DemoY();
	
	DemoX() {
		System.out.println("X");
	}
}

class DemoY {
	DemoY() {
		System.out.println("Y");
	}
}
public class DemoZ extends DemoX{
	DemoY dy = new DemoY();
	DemoZ() {
		System.out.println("Z");
	}
	
	public static void main(String[] args) {
		new DemoZ();
	}
}

執行結果如下:
在這裡插入圖片描述
對其編譯後產生的class檔案用反編譯軟體檢視,其程式碼如下:

// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space 
// Source File Name:   DemoZ.java

package duixiang;

import java.io.PrintStream;

// Referenced classes of package duixiang:
//			DemoX, DemoY

public class DemoZ extends DemoX
{

	DemoY dy;

	DemoZ()
	{
		dy = new DemoY();
		System.out.println("Z");
	}

	public static void main(String args[])
	{
		new DemoZ();
	}
}