Java基礎-----繼承中的初始化
阿新 • • 發佈:2018-12-23
前言
子類構造方法執行前預設先執行父類的無參構造方法。
一個類的初始化過程
成員變數進行初始化
(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();
}
}