Java類 靜態程式碼塊、構造程式碼塊、建構函式初始化順序
建構函式
public class Hello{ public Hello(String name){//建構函式 System.out.println("Hello " + name ); } public static void main(String []args) { Hello A = new Hello("xiaoming"); } }
執行結果:
$ java Hello Hello xiaoming
建構函式的作用是用於給物件進行初始化
一個物件建立,建構函式只執行一次
構造程式碼塊
public class Hello{ {//構造程式碼塊 System.out.println("Hello World"); } public static void main(String []args) { Hello A = new Hello(); } }
執行結果:
$ java Hello Hello World
構造程式碼塊是給所有物件進行統一初始化,而建構函式是給對應的物件初始化
建構函式可以是多個,構造程式碼塊中定義的是不同物件共性的初始化內容。如下:
public class Hello{ {//構造程式碼塊 System.out.println("Hello Java"); } public Hello(){//建構函式A System.out.println("Hello A"); } public Hello(String name){//建構函式B System.out.println("Hello " + name ); } public static void main(String []args) { Hello A = new Hello(); //物件A 呼叫建構函式A Hello B = new Hello("B"); //物件B 呼叫建構函式B } }
執行結果:
$ java Hello Hello Java Hello A Hello Java Hello B
靜態程式碼塊
public class Hello{ static{//靜態程式碼塊 System.out.println("Static Code"); } public static void main(String []args) {//主函式 System.out.println("Main ()"); } }
執行結果:
$ java Hello Static Code Main ()
靜態程式碼塊是給類初始化的,而構造程式碼塊是給物件初始化的。
靜態程式碼塊在同一類中只執行一次,如下:
public class Hello{ static {//靜態程式碼塊 System.out.println("Static Code"); } public Hello(){//建構函式 System.out.println("Hello World"); } public static void main(String []args) { Hello A = new Hello(); Hello B = new Hello(); } }
執行結果:
$ java Hello Static Code Hello World Hello World
Java類初始化順序
public class Hello{ static {//靜態程式碼塊 System.out.println("Hello A"); } {//構造程式碼塊 System.out.println("Hello B"); } public Hello () {//建構函式 System.out.println("Hello C"); } public static void main(String []args) { System.out.println("Main ()"); Hello A =new Hello(); } }
執行結果:
$ java Hello Hello A Main () Hello B Hello C
靜態程式碼塊>構造程式碼塊>建構函式
對於繼承
class HelloA{ static {//靜態程式碼塊 System.out.println("A的靜態程式碼塊"); } {//構造程式碼塊 System.out.println("A的構造程式碼塊"); } public HelloA(){//建構函式 System.out.println("A的建構函式"); } } public class HelloB extends HelloA{ static {//靜態程式碼塊 System.out.println("B的靜態程式碼塊"); } {//構造程式碼塊 System.out.println("B的構造程式碼塊"); } public HelloB(){//建構函式 System.out.println("B的建構函式"); } public static void main(String[] args) { HelloB B = new HelloB(); } }
執行結果
$ java HelloB A的靜態程式碼塊 B的靜態程式碼塊 A的構造程式碼塊 A的建構函式 B的構造程式碼塊 B的建構函式
父類的靜態程式碼塊>子類的靜態程式碼塊>父類的構造程式碼塊>執行父類的建構函式>子類的構造程式碼塊>執行子類的建構函式