java中子類繼續父類,法式運轉次序的深刻剖析。本站提示廣大學習愛好者:(java中子類繼續父類,法式運轉次序的深刻剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是java中子類繼續父類,法式運轉次序的深刻剖析正文
我們常常在項目中應用繼續,然則常常不太明確,法式運轉的次序和道理,特別是應用上轉型對象的時刻,和父類子類中都有static變量和辦法時,不曉得先運轉誰。我也是寫了一個例子。總結了一下。
父類:
public class TestStatic {
public static String name="china";
{
System.out.println("========辦法體========");
}
static{
name="England";
System.out.println("========靜態法式塊======");
}
TestStatic(){
System.out.println("=========結構辦法========");
}
public static void main(String[] args){
System.out.println("========主辦法========"+name);
}
public void test(){
System.out.println("========測試辦法=========");
}
}
子類:
public class TestExtendStatic extends TestStatic{
//public static String name="HUBEI";
{
System.out.println("========無稱號辦法體========");
}
static{
//name="SUIZHOU";
System.out.println("========子類靜態法式塊======");
}
TestExtendStatic(){
System.out.println("=========子類結構辦法========");
}
public void test(){
System.out.println("========子類測試辦法=========");
}
public static void main(String[] args){
System.out.println("========子類主辦法========"+name);
TestStatic ts = new TestExtendStatic();// 上轉型對象
ts.test();
}
}
輸入以下:
========靜態法式塊====== :父類static法式塊
========子類靜態法式塊====== :子類static法式塊 【不是靜態辦法】
========子類主辦法========England :子類主辦法
========辦法體======== :父類中非靜態代碼塊
=========結構辦法======== :父類結構辦法
========無稱號辦法體======== :子類中非靜態代碼塊
=========子類結構辦法======== :子類結構辦法
========子類測試辦法========= :子類測試辦法
履行次序: 父類靜態變量和靜態法式塊 --- 子類的靜態變量和靜態法式塊 --- 父類非靜態代碼塊 --- 父類中結構辦法 --- 子類中非靜態代碼塊 --- 子類中結構辦法 --- 接上去才是 對象挪用的方
法。
只需是用new 創立對象,分派了內存空間,不論是將援用賦給上轉型對象,照樣賦給子類對象,下面辦法都必需履行。
即:TestStatic ts = new TestExtendStatic();// 上轉型對象
TestExtendStatic ts = new TestExtendStatic();// 子類對象
下面加粗法式都邑履行。
下面法式中 ts.test(); ts作為上轉型對象挪用的是 子類繼續的父類中的辦法,由於test()在子類中被重寫了,所以輸入的為子類中的語句。
假如將子類中 main 辦法該成以下:
public static void main(String[] args){
System.out.println("========子類主辦法========"+name);
TestStatic ts = new TestExtendStatic();
ts.test();
System.out.println("-------------------------");
ts = new TestExtendStatic();
ts.test();
}
輸入:
========靜態法式塊====== 父類中靜態法式塊
========子類靜態法式塊====== 子類中靜態法式塊
========子類主辦法========England 子類中主辦法
========辦法體======== 父類中非靜態代碼塊
=========結構辦法======== 父類中結構辦法
========無稱號辦法體======== 子類中非靜態法式塊
=========子類結構辦法======== 子類中結構辦法
========子類測試辦法========= 對象詳細挪用的辦法
------------------------- 靜態變量和法式塊只履行一次
========辦法體======== 父類中非靜態代碼塊
=========結構辦法======== 父類中結構辦法
========無稱號辦法體======== 子類中非靜態代碼塊
=========子類結構辦法======== 子類中結構辦法
========子類測試辦法=========
假如將子類主辦法 中更改成:
TestStatic ts = new TestStatic ();// 應用父類結構辦法創立
ts.test();
輸入為:
========靜態法式塊====== 父類靜態法式塊
========子類靜態法式塊====== 子類靜態法式塊 【由於法式在子類中運轉的,所以子類的靜態法式塊必需運轉】
========辦法體======== 父類非靜態法式塊
=========結構辦法======== 父類結構辦法
========測試辦法========= 父類詳細辦法test()
假如將上述代碼放到父類中,就不會加載子類 靜態法式塊了。
經由過程下面 我們還可以發明,靜態法式塊運轉 是在主辦法之前,非靜態法式塊運轉是在主辦法以後。
我在父類中 主辦法中創立一個對象 挪用test(),運轉的成果:
========靜態法式塊====== 靜態代碼塊
===main==
========辦法體======== 非靜態代碼塊
=========結構辦法======== 結構辦法
========測試辦法=========
總結:
法式運轉時(一個類中),會第一時光加載運轉靜態代碼塊,一旦創立對象,就會履行非靜態代碼塊和無參結構辦法。 而在繼續中,法式運轉時 會先加載父類中靜態代碼塊 然後加載自己靜態代碼塊,一旦創立對象(應用子類結構辦法創立),就會挪用 父類非靜態代碼塊,父類結構辦法,然後就是自己 非靜態代碼塊,自己結構辦法。