淺談Java中的例項初始化器
文首先給出個例子來探究下什麼是例項變數初始化器,什麼是例項初始化器,以及什麼是靜態初始化器。然後看看例項初始化器是怎麼工作的。
1. 執行的順序
先看看下面這段程式碼,你覺著哪部分會先被執行呢?
public class Foo { //instance variable initializer 例項變數初始化器 String s = "abc"; //constructor 建構函式 public Foo() { System.out.println("constructor called"); } //static initializer 靜態初始化器 static { System.out.println("static initializer called"); } //instance initializer 例項變數初始化器 { System.out.println("instance initializer called"); } public static void main(String[] args) { new Foo(); new Foo(); } }
輸出如下:
static initializer called instance initializer called constructor called instance initializer called constructor called
2. Java的例項初始化器是如何工作的?
上面的例子中的例項初始化器包含一段列印字元的程式碼。要理解它是如何工作的,我們可以把它想象成變數賦值的過程,這樣就不難理解了。
除了這麼賦值:
int b = 0;
還可以這麼寫:
int b; b = 0;
因此,例項初始化器和例項變數初始化器就大同小異了。
3. 什麼時候會用到例項初始化器?
能用到實力初始化器的時候比較少。但有些時候還是一個例項變數初始化器的替代選擇,比如:
- 初始化程式碼必須處理異常情況
- 執行一個例項變數沒辦法進行的計算
當然,這些需求還是可以在建構函式中實現的。但是一個類有多個建構函式的話,你就得在每個建構函式裡面重複同樣的程式碼了。
寫在例項初始化器中的程式碼,無論你使用哪一個建構函式,例項初始化器中程式碼都會被執行(可能說的多,用的少吧)。
另一個例項初始化器的應用場景是匿名內部類,因為這種情況下根本就不能建立建構函式。(這可能是放置日誌程式碼的好地方?)
相關文章
- 來說說 Java 中的例項初始化器Java
- 來說說Java中的例項初始化器Java
- 淺談Java類中的變數初始化順序Java變數
- java 例項變數初始化Java變數
- 淺談java中的反射Java反射
- 淺談Java中的HashmapJavaHashMap
- 淺談Java迭代器Java
- 淺談MVC框架中View層的優雅設計及例項MVC框架View
- Java類初始化和例項化Java
- 淺談 Java 中 this 的使用(轉)Java
- 淺談Java中的內部類Java
- 淺談java中的併發控制Java
- java中靜態初始化塊,例項初始化塊,建構函式區別Java函式
- 淺談Java中的淺拷貝和深拷貝Java
- 淺談java8中的流的使用Java
- 淺談java中extends與implements的區別Java
- C++ 結構體例項和類例項的初始化C++結構體
- 淺析Java併發中的單例模式Java單例模式
- Java中內部類的例項化Java
- 淺談JavaScript中的thisJavaScript
- 淺談HTTP中Get與Post的區別-javaHTTPJava
- 淺談Java的反射原理Java反射
- 淺談 Java集合Java
- 【轉】java中註解的使用與例項Java
- Java中Websocket使用例項解讀JavaWeb
- 淺談OC物件初始化的三種姿勢物件
- 淺談Java中的鎖:Synchronized、重入鎖、讀寫鎖Javasynchronized
- 淺談react 中的 this 指向React
- 淺談React中的diffReact
- 淺談JavaScript中的介面JavaScript
- Java 經典例項:自定義迭代器Java
- 淺談JAVA集合框架(引的)Java框架
- ruby中的類例項變數和例項的例項變數變數
- Java虛擬機器中獲得Runtime例項的方法是什麼?Java虛擬機
- 淺談java泛型Java泛型
- 淺談Java抽象類Java抽象
- 淺談Java併發Java
- 淺談連結器