第4章 對象與類
1.不要編寫返回引用可變對象的訪問器方法
例如:
class Employee{ private Date hireDay; public Date getHireDay() { return hireDay; }}Employee e = ...;Date d = e.getHireDay();
此時,d就是e的hireDay,對d的更改會直接造成e的hireDay的更改。
2.如果兩個對象屬於同一個類,那麼一個對象的方法可以訪問另一個對象的私人資料。
也就是說,Employee類的方法可以訪問Employee類的任何一個對象的私人域。例如:
class Employee{ ... public boolean equals(Employee other) { return name.equals(other.name); }}
調用:if(harry.equals(boss))…
此時,不僅訪問了harry的私人域,而且訪問了boss的私人域。
3.private final Date hiredate;僅僅意味著hiredate變數中的對象 引用 在物件建構之後不能被改變。hiredate的非final資料域是可以更改的。
4.靜態方法是一種不能向對象實施操作的方法,也就不能訪問靜態域,但是可以訪問靜態域。
例如:Math.pow(x,a);
在以下3種情況可以使用靜態方法:
(1)一個方法不需要訪問對象狀態,其所需參數都是通過顯式參數提供的。
(2)一個方法只需要訪問類的靜態域。
(3)像NumberFormat類一樣,使用Factory 方法建立不同類型的對象。
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();//靜態方法NumberFormat percentFormatter = NumberFormat.getPercentInstance();//靜態方法
5.每一個類都可以有一個main方法。
這是一個對類用於單元測試的技巧。
例如,Employee類有一個main方法,Application類是一個更大的類,也有一個main方法。此時想要獨立測試Employee類,只需java Employee;而使用java Application時,只會調用Application的main方法,不會執行Employee的main方法。
6.隱式參數和顯示參數
例如,number007.raiseSalary(5);其中number007就是隱式參數,而5就是顯示參數。
this可以用來表示隱式參數。
7.方法參數。
兩種:值調用和引用調用
Java中在函數參數中採用的對象引用,屬於值調用,而不是引用調用。就是說無法讓對象參數引用一個新的對象。
總結:(1)方法的參數是一個參考型別時,對參數的資料域的更改,會直接造成真正的對象的資料域發生改變。
(2)
public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; }
執行語句swap(employee1, employee2);
注意:此時employee1和employee2所引用的對象並沒有發生交換。
8.僅當類沒有提供任何構造器的時候,系統才會提供一個沒有參數的預設構造器。
9.在一個構造器中,可以使用this來調用另一個構造器。例如,
public Employee(double s){ this("Employee #" + nextId, s); nextId++;}
在調用Employee(double)構造器時,同時會調用Employee(String, double)構造器。
10.初始化塊
初始化資料域三種方式:(1)在聲明中賦值 (2)在構造器中賦值 (3)使用初始化塊
像下面這樣的成為初始化塊:
class Employee{ private static int nextId; private int id; //初始化塊 //只要構造類的對象,初始化塊就會被執行 { id = nextId; nextId++; } //靜態初始化塊(靜態初始化塊會優先執行) static { Random generator = new Random(); nextId = generator.nextInt(10000); } //構造器 ...}
初始化資料域順序:先執行初始化塊(先執行靜態),再調用構造器。
11.包
(1)一個類可以使用所屬包中的所有類,以及其他包中的公有類。
(2)不能匯入以java為首碼的所有包,例如import java.*;這樣是不行的。
(3)import語句不僅可以匯入包和類,還可以匯入類中的靜態域和靜態方法。例如import static java.lang.System.out;
(4)編譯命令:javac com/mycompany/PayrollApp.java
而解譯器命令: java com.mycompany.PayrollApp 使用的是.而不是/
(5)如果一個類的包名寫錯,可以正常編譯這個源檔案(如果不依賴於其他包),但是將無法執行,因為虛擬機器找不到.class類檔案。
(6)包範圍。變數標記為public的可以被任意類訪問;標記為private的只可以被定義他們的類使用;如果沒有指定,則可以被同一個包中的方法訪問。
12.Java只會對資料域進行初始化,而不會對局部資料變數進行初始化。