最近在複習Java的基礎,遇到了一些比較偏的考核題目,特地總結一下需要注意的知識點!不過在使用IDE編程的時候,這些問題都會馬上被IDE識別出來,編譯是通不過的。我在這裡提出來就相當於給初學者一些貢獻吧!
一、聲明局部變數是的一些特性和規則
(1)聲明的局部變數是不會被預設初始化的,成員變數則是會被預設初始化的。例如:
class Demo { public static void main(String[] args) { String s; System.out.println(s); }}
上面的這段範例程式碼中,直接輸出s是錯誤的,連編譯都不同通過,因為在main方法中聲明s,這時s是局部變數,不會被預設初始化值,因此在下面直接輸出是有錯誤的。代碼改寫如下即可:
class Demo { String s; public static void main(String[] args) { System.out.println(s); }}
這樣輸出的話就是null了,因為s被聲明為成員變數,因此預設會被初始化值null。
(2)聲明局部變數的前面不能有任何許可權存取修飾詞(public、protected和private),只能是friendly的預設友好的,但是可以使用final來修飾局部變數。
二、使用final來修飾基本類型局部變數和參考型別局部變數的區別
(1)final修飾基本類型局部變數的時候,不能對其基本類型的資料值進行修改。因為final修飾的變數是最終的,不能被改變。如下代碼:
public class Something { public int addOne(final int x) { return ++x; }}
這裡addOne方法中使用final int x作為參數,下面再對其進行自增是錯誤的。
(2)final修飾參考型別的局部變數的時候,也就是對象。這時可以修改對象中的屬性資訊,但是不能修改對象的引用。比如下面的代碼:
public class Something { public static void main(String[] args) { Other o = new Other(); new Something().addOne(o); } public void addOne(final Other o) { o.i++; }}class Other { public int i;}
這裡addOne方法接收的參數是一個對象,而在方法體中自增了對象中的屬性 i 的值,而對象的引用地址沒有被修改,因此不會發生錯誤。而如果在方法體中寫上:o = new Other(); 這時就會報錯了。
(3)在類中被final修飾聲明的成員變數不會預設初始化值。因此必須在構造器之前就得給定一個具體值。例如下面的代碼:
class Something { final int i;// 這行就已經報錯了,編譯不能通過,沒有初始化值 public void doSomething() { System.out.println("i = " + i); }}
final int i是個final的instant variable (執行個體變數,或叫成員變數)。final的instant
variable沒有default value,必須在constructor (構造器)結束之前被賦予一個明確的值。可以修改為"final
int i =0;"。