9.類的訪問權限和方法參數【Java溫故系列】

參考自–《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方法參數總結
  • 一個方法不能修改一個基本數據類型的參數
  • 一個方法可以改變一個對象參數的狀態
  • 一個方法不能讓對象參數引用一個新的對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章