Java中靜態、非靜態程式碼塊, 無參、有參構造方法執行順序
阿新 • • 發佈:2019-01-24
基本概念
1、靜態程式碼塊和非靜態程式碼塊:
相同點:都是JVM載入類時且在建構函式執行之前執行,在類中都可以定義多個,一般在程式碼塊中對一些static變數進行賦值。
不同點:靜態程式碼塊在非靜態程式碼塊之前執行。靜態程式碼塊只在第一次new時執行一次,之後不再執行。而非靜態程式碼塊每new一次就執行一次。
2、構造方法:
構造方法的方法名和類名相同;無返回值型別;可以指定引數;完成物件的初始化。
注意:子類繼承父類的時候會自動繼承父類預設的無參構造方法。而如果父類裡面已經有一個帶有引數的構造函數了,如果沒有寫那個預設的不帶引數的建構函式的話,繼承的時候子類就會報錯,因為系統不知道要繼承哪個建構函式,必須明確的使用super()關鍵字來描述。
程式碼例項
/**
* @ClassName: ExtendsDemo
* @Description:優先順序父類 > 子類;靜態程式碼塊 > 非靜態程式碼塊 > 建構函式。注意靜態程式碼塊若執行 僅執行一次
*/
public class ExtendsDemo {
public static void main(String[] args) {
demofather fa = new demoson(); //執行了無參構造方法
System.out.println("\n"+fa.getClass());
fa = new demoson("000000000");
}
}
class demofather {
//靜態程式碼塊只在第一次new時執行一次,之後不再執行。而非靜態程式碼塊每new一次就執行一次。靜態程式碼塊 > 非靜態程式碼塊
static {
System.out.print(" 父類的靜態程式碼塊 ");
}
{
System.out.print(" 父類的非靜態程式碼塊 ");
}
//構造方法:完成物件的初始化
public demofather() {
System.out.print (" 父類無參構造 ");
}
//構造方法過載
public demofather(String a) {
System.out.print(a);
}
}
class demoson extends demofather {
static {
System.out.print(" 子類的靜態程式碼塊 ");
}
{
System.out.print(" 子類的非靜態程式碼塊 ");
}
//構造方法:完成物件的初始化
public demoson() {
System.out.print(" 子類無參構造 ");
}
//構造方法過載
public demoson(String b) {
//這裡的super關鍵字 指明要呼叫的父類建構函式是什麼
super("11111111");
System.out.print(b);
}
}
列印結果