由於遮蔽而導致字段初始化混亂
在Java 中,遮蔽是指作用域內聲明的變數用在外部作用域中聲明的相同名稱。在提供的程式碼片段中:
class StringArray { private String[] elements; private int capacity; public StringArray() { int capacity = 10; // Local variable shadowing field String[] elements; // Local variable shadowing field elements = new String[capacity]; } // Getters omitted for brevity }
局部變數遮蔽
建構函式體內的第一條和第二條語句宣告名為capacity和elements的局部變數。這些局部變數隱藏同名的實例變數。因此,構造函數作用域內對容量和元素的任何賦值或引用都會專門影響局部變數。
隱藏規則
隱藏規則規定局部變數的優先權高於局部變數。實例變數在其範圍內。這意味著初始化為 10 的局部變數容量優先於實例變數容量,而實例變數則未初始化。同樣,對元素的賦值會初始化局部變量,而不是實例變數。
欄位初始化
由於實例變數沒有在建構函式中明確初始化,因此它們是為其各自型別指派預設值:0 表示容量,null 表示元素。這就是類別中的 getter 方法傳回這些預設值的原因。
解
要解決此問題,請消除局部變數宣告並引用實例變數直接:
public StringArray() { this.capacity = 10; this.elements = new String[this.capacity]; }
避免
為了防止這種混淆,採用局部變數和實例變數使用唯一名稱的做法。
以上是為什麼我的 Java 實例變數看似已在建構函式中初始化,但未初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!