您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java中如何初始化靜態和非靜態成員變量,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Java中非靜態成員變量、靜態成員變量的初始化時機。
非靜態變量
我們在這里分析三種結構,著重分析這三種結構的初始化順序:
成員變量初始化語句;
成員變量初始化塊;
構造函數;
示例一:
public class MyTest { private String name = "wei.hu"; public MyTest(String name) { System.out.println("This is constructor. Will assign the variable name to: " + name + "."); System.out.println("Before the name was modified: " + this.name); this.name = name; System.out.println("After the name was modified: " + this.name); } { System.out.println("This is initialize block. Will assign the variable name to: chouchou"); System.out.println("Before the name was modified: " + this.name); this.name = "chouchou"; System.out.println("After the name was modified: " + this.name); } public String getName() { return name; } public static void main(String[] args) { MyTest myTest = new MyTest("mengna"); System.out.println(myTest.getName()); } } #輸出 This is initialize block. Will assign the variable name to: chouchou Before the name was modified: wei.hu After the name was modified: chouchou This is constructor. Will assign the variable name to: mengna. Before the name was modified: chouchou After the name was modified: mengna mengna
示例二:
public class MyTest { public MyTest(String name) { System.out.println("This is constructor. Will assign the variable name to: " + name + "."); System.out.println("Before the name was modified: " + this.name); this.name = name; System.out.println("After the name was modified: " + this.name); } private String name = "wei.hu"; { System.out.println("This is initialize block. Will assign the variable name to: chouchou"); System.out.println("Before the name was modified: " + this.name); this.name = "chouchou"; System.out.println("After the name was modified: " + this.name); } public String getName() { return name; } public static void main(String[] args) { MyTest myTest = new MyTest("mengna"); System.out.println(myTest.getName()); } } #結果(與示例一相同) This is initialize block. Will assign the variable name to: chouchou Before the name was modified: wei.hu After the name was modified: chouchou This is constructor. Will assign the variable name to: mengna. Before the name was modified: chouchou After the name was modified: mengna mengna
示例三:
public class MyTest { public MyTest(String name) { System.out.println("This is constructor. Will assign the variable name to: " + name + "."); System.out.println("Before the name was modified: " + this.name); this.name = name; System.out.println("After the name was modified: " + this.name); } { System.out.println("This is initialize block. Will assign the variable name to: chouchou"); System.out.println("Before the name was modified: " + this.name); this.name = "chouchou"; System.out.println("After the name was modified: " + this.name); } private String name = "wei.hu"; public String getName() { return name; } public static void main(String[] args) { MyTest myTest = new MyTest("mengna"); System.out.println(myTest.getName()); } } #結果 This is initialize block. Will assign the variable name to: chouchou Before the name was modified: null After the name was modified: chouchou This is constructor. Will assign the variable name to: mengna. Before the name was modified: wei.hu After the name was modified: mengna mengna 分析: 注意本示例的結果與上面兩個示例的結果不同。 1、當我們想將成員變量name賦值為chouchou之前,發現this.name為null。也就是說初始化語句沒有先執行,而是先執行了初始化塊; 2、當在執行構造函數時,我們想將成員變量name賦值為mengna,發現賦值之前,this.name不再是chouchou,而是wei.hu,這說明了什么? 因為初始化塊先執行,如果緊接著執行構造函數的話,那么在構造函數賦值語句執行之前,this.name應該是chouchou才對。但是在構造函數賦值語句執行之前,this.name的值變成了wei.hu,那么足以證明: 1)初始化塊先執行; 2)下來執行了初始化語句; 3)最后執行了構造函數;
結論:
通過上面三個示例,我們可以發現,對于非靜態的成員變量:
初始化語句、初始化塊,總是先于構造函數執行;
初始化語句、初始化塊的和執行順序,取決于 初始化語句、初始化塊在代碼中的書寫順序。寫在上面的先執行。
靜態變量
我們在這里也分析三種結構:
靜態初始化語句;
靜態初始化塊;
構造函數;
示例一:
public class MyTest { public static String name = "wei.hu"; public MyTest() { System.out.println("This is constructor. Will assign the variable name to: chouchou"); System.out.println("Before the name was modified: " + name); name = "chouchou"; System.out.println("After the name was modified: " + name); } static { System.out.println("This is static initialize block. Will assign the variable name to: mengna"); System.out.println("Before the name was modified: " + name); name = "mengna"; System.out.println("After the name was modified: " + name); } public static void main(String[] args) { System.out.println(MyTest.name); } } #結果 This is static initialize block. Will assign the variable name to: mengna Before the name was modified: wei.hu After the name was modified: mengna mengna 分析: 通過打印輸出,我們發現在執行靜態初始快之前,靜態變量name已經初始化為wei.hu了。也就是說: 1、靜態初始化語句先執行; 2、下來執行靜態初始化塊; 3、構造函數未執行; ---------------------
示例二:
public class MyTest { public MyTest() { System.out.println("This is constructor. Will assign the variable name to: chouchou"); System.out.println("Before the name was modified: " + MyTest.name); name = "chouchou"; System.out.println("After the name was modified: " + MyTest.name); } static { System.out.println("This is static initialize block. Will assign the variable name to: mengna"); System.out.println("Before the name was modified: " + MyTest.name); name = "mengna"; System.out.println("After the name was modified: " + MyTest.name); } public static String name = "wei.hu"; public static void main(String[] args) { System.out.println(MyTest.name); } } #結果 This is static initialize block. Will assign the variable name to: mengna Before the name was modified: null After the name was modified: mengna wei.hu 分析: 初始化塊在對靜態變量賦值之前,發現MyTest.name的值為空。 在最后打印出MyTest.name時,發現輸出的值是wei.hu,而不是mengna。也就是說,在初始化塊執行之后,執行了靜態初始化語句。 1、先執行靜態初始化塊; 2、再執行靜態初始化語句; 3、構造函數未執行; ---------------------
結論:
對于靜態字段,初始化有如下規則:
1. 若靜態初始化語句在前,靜態代碼塊在后,則先執行靜態初始化語句;
2. 若靜態代碼塊在前,靜態初始化語句在后,則先執行靜態代碼塊;
看完上述內容,你們對Java中如何初始化靜態和非靜態成員變量有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。