標籤:
類的積累:
在寫類的時候,必須做好安全性考慮,為確保類中各個元素被安全使用及讀取,必須符合下面三個原則:
所有域中的變數必須為private,類中必須設定public的域存取方法,類中應設定必需的域修改方法:
e.g.
public class test{ private String name; private int age; public test(String n, int a){ this.name = n; this.age = a; } public String getName(){ return name; } public String getAge(){ return age; } public void setAge(int a1){ this.age = a1; } }
值得注意的是: 在get的過程中,注意返回的值,當為非基礎資料型別 (Elementary Data Type)或者不可變的類
(
可變: byte, short, int, long, double, char, boolean。
不可變:Boolean, Byte, Character, Double, Float, Integer, Long, Short, String.
)
的時候,要注意賦值過程中的引用複製,所以會出現修改數值過程中不小心影響到其他同樣引用或者使用到該變數值的對象。需要使用clone()方法。 (Java2 核心技術 P107)。
不可變類:類中每個方法都不會改變其對象的類,一旦建立不能改變。例如String。可以參考如下部落格
正如上面書中的例子,雖然從外部看修改的是d的value,但由於harry的工作年限同樣指向了d所指向的Data類型的對象,從而在修改d的值的同時也莫名其妙的改變了harry的工作念想,這種錯誤是非常難以發現的,所以在return的方法中需要確定返回的值是否為非Object以外的類型。
方法中隱式參數和現實參數:
隱式參數是出現在方法中的參數,也是被傳入的參數,但是不會出現在方法參數列表中,通常這些參數前面可以加上"this."
e.g.
private int test(int a){
int tempt = 0;
return tempt = this.b + a;
}
很容易看出來b也是傳入的參數,但是並沒有出現在參數列表中,因此a是顯式參數,b是隱式參數。
Java方法採用的是值傳遞,非參數傳遞,因此傳遞的只是一個拷貝,而Java方法本身是不能修改傳入的參數的值,注意這裡的參數值得是基礎資料型別 (Elementary Data Type),而對於對象的參數則例外,下面這段代碼可以說明:
1 public class ParaInputPara { 2 public static void main(String args[]){ 3 Para p = new Para(10); 4 System.out.println("Before para change the value of l : " + p.l); 5 getPara(p); 6 System.out.println("After para change the value of l : " + p.l); 7 int iTest = 10; 8 System.out.println("Before iTest change the value of l : " + iTest); 9 changeFor(iTest);10 System.out.println("After iTest change the value of l : " + iTest);11 }12 private static void getPara(Para p){13 p.ParaChange(10);14 }15 private static void changeFor(int i){16 i+=10;17 } 18 }19 20 class Para{21 int l;22 public Para(int y){23 this.l = y;24 }25 26 public void ParaChange(int x){27 l+=x;28 }29 }
運行結果:
1 Before para change the value of l : 102 After para change the value of l : 203 Before iTest change the value of l : 104 After iTest change the value of l : 10
總之,在Java中除了基礎類型外,其他都是傳遞引用(即記憶體位址),不會進行對象的clone,因此在除了基礎類型和不可變類型外,當講引用傳遞給指定方法後,方法在對所引用的對象進行修改的時候變相的就修改了引用指定的對象。
另外,對於不可變類型,傳遞的也是引用,例如String a, 當執行 a + "b"的時候其實是從新產生了一個對象並重新指派至的引用,而舊的a則會在回收觸發的時候被回收。所以從效能上來講,單純的String + String會沒有StringBuffer的append方法效能高。
Java的自動回收機制不能夠滿足需求的情況下,為了更好的滿足資源的釋放應該對代碼中出現的所有需要釋放的方法提供close()或者dispose(),例如InputStream。
Java在建立類的時候一定要先寫預設建構函式,這是一個好習慣,因為假設你沒有寫預設建構函式,同時你又定義了非預設的一個建構函式,這樣在隨後的調用中,可能會出現各種問題。
Java Learning (3)