參考自–《Java核心技術卷1》
1 基於類的訪問權限
方法可以訪問所調用對象的私有數據。一個方法可以訪問所屬類的所有對象的私有數據。如:
//Employee類
class Employee{
private String name;
...
public boolean equals(Employee other){
return this.name.equals(other.name);
}
}
上述方法訪問了當前類對象的私有域,同時訪問了other的私有域。這是合法的(Employee類的方法可以訪問Employee類任何一個對象的私有域)。
1.1 私有方法
在實現一個類時,由於公有數據非常危險,所以應該將所有的數據域都設置爲私有的。
絕大多數方法都被設計爲公有(public)的,但在某些特殊情況下,也可能將它們設計爲私有的。比如:有時,可能希望將一個計算代碼劃分爲若干個獨立的輔助方法,通常這些輔助方法不應該成爲公有接口的一部分,這是由於它們往往與當前的實現機制非常緊密,或者需要一個特別的協議以及一個特別的調用順序。最好將這樣的方法設計爲private。
私有方法不會被外部的其他類調用,可以將其刪去(如果方法是公有的,就不能將其刪去,因爲其他代碼很可能依賴於它)。
1.2 final實例域
可以將實例域定義爲 final 。構建對象時必須初始化這樣的域。即**必須確保在每個構造器執行之後,這個域的值被設置,並且在後面的操作中,不能夠再對它進行修改。**如:
class Employee{
private final String name;
...
}
//將nama域聲明爲final,在對象構建之後,這個值將不會再被修改
final 修飾符大都應用於基本類型域,或不可變類的域(如果類中的每個方法都不會改變其對象實例,這種類就是不可變的類)。String類就是一個不可變的類。
對於可變的類,使用 final 修飾符很容易引起混亂。如:
private final StringBuilder sb;
在構造器中初始化:
sb = new StringBUilder();
這裏的 final 修飾符只是表示存儲在 sb 變量中的對象引用不會再指示其他 SringBuilder
對象,但是這個對象可以改:sb.append("xxx");
2 方法參數
將參數傳遞給方法的方式:
- 按值調用 – 表示方法接收的是調用者提供的值
- 按引用調用 – 表示方法接收的是調用者提供的變量地址
一個方法可以修改傳遞引用所對應的變量值,而不能修改傳遞值調用所對應的變量值。
Java方法的參數共有兩種類型:基本數據類型,對象引用。
2.1 調用基本數據類型
方法得到的所有參數值的一個拷貝,方法不能修改傳遞給它的任何參數變量的內容。
此時,毫無疑問,這種參數傳遞的方式爲 按值調用 。
看下例:
//定義方法
public static void raise(double x){
x = 3 * x; //將參數值擴大至3倍
}
調用該方法:
double percent = 10; //定義變量
raise(percent); //按值調用參數 percent
//percent的值仍爲10
看看具體的執行過程:
1)x 被初始化爲 percent 值的一個拷貝(即 10 )
2)x 被乘 3 後爲 30,但是 percent 仍爲 10
3)方法 raise 結束後參數變量 x 不再使用
2.2 對象引用
當參數爲 對象引用 時,可以修改對象的實例域。
但,對象引用 仍是 按照傳遞的。方法不能讓對象參數引用一個新的參數(如對兩個對象的 swap 交換操作)。
如下例:
//Employee類
class Employee{
...
private double salary;
...
public void raiseSalary(int x){
//將salary提升x倍
this.salary = this.salary * x;
}
...
public static void tripleSalary(Employee e){
e.raiseSalary(2);
}
}
調用:
harry = new Employee(...); //已對salary初始化
tripleSalary(harry); //對harry的salary實例域增大至2倍
// harry.salary成功增大至2倍
具體執行過程:
1)tripleSalary
方法的參數 e 被初始化爲 harry 的拷貝,即對象的引用(對象引用 harry 和它的拷貝同時引用同一個對象)
2)raiseSalary
這個方法應用於這個對象引用。e 和 harry 同時引用的那個 Employee 對象的 salary 值增大至 3 倍
3)tripleSalary
方法結束後,參數變量 e 不再使用。對象變量 harry 繼續引用 salary 值增大至 3 倍的Employee 對象
2.3 Java方法參數總結
- 一個方法不能修改一個基本數據類型的參數
- 一個方法可以改變一個對象參數的狀態
- 一個方法不能讓對象參數引用一個新的對象