Java——訪問控制(概念理解+應用舉例)

1.關於Java中的訪問控制

Java語言中,通過訪問(權限)控制符來隱藏類中的具體實現。類不但將數據結構和對數據結構進行的訪問和操作進行類封裝;而且對封裝後的成員通過訪問控制符,該隱藏的隱藏,該暴露的暴露。達到訪問的安全性、類的可維護性、類數據的完整性。
通過訪問控制符可以實現良好的類封裝。訪問控制符與繼承無關,即不可以繼承。

訪問控制的三個原因: 訪問安全、可維護性、數據的完整性。在類中可以出現訪問控制符的三處單元:①類的聲明;② 方法的聲明;③字段的聲明。

在Java中,一共有四類訪問控制符,分別是publc、protected、默認(default、friendly)和private。

這四者的訪問級別從高到低依次是:publc > protected > 默認(default、friendly) > private。見下圖👇👇👇

那麼既然說到了訪問控制,就不僅僅是對類來說,同時也會涉及到包,在之前的博文中也講到過,Java中的包其實就是一個文件夾,但是包實際上也是一個訪問控制的邏輯單元:庫單元。見下圖👇👇👇

2.四類訪問控制符的作用域

2.1 public 

public定義的爲公共屬性或方法,任何地方都可以進行訪問!!! 

2.2 protected

protected定義的爲受保護的屬性或方法,同一個包中的類可以進行訪問,不同包中的子類也可以進行訪問!!! 

 

 

2.3 默認(包的訪問權限) 

默認(default、friendly)定義的爲缺省屬性或方法,同一個包中的類可以進行訪問,不同包中的類無法進行訪問!!! 

 

2.4 private

private定義的爲私有屬性或方法,只有在包含private對應的類中才可以進行訪問,類外無法進行訪問!!! 

 

3.訪問控制符的使用原則 

考慮到安全性、可維護性、完整性以及高內聚低偶合,儘可能使用低級別的訪問控制符。

訪問控制符從高到低的級別(範圍):public、protected、默認、private。

應儘可能地總是將字段指定爲 private,減少類間數據結構耦合;否則,將產生高耦合,耦合的數據結構不具有可維護性。類中的方法實現與訪問控制符無關,總是隱藏的,具有可維護性。 

下面,我們舉幾個例子,來更好的理解這四類訪問控制符!!!👇👇👇

Example 1:同一個包下的訪問

我們首先創建一個包,包名爲:p1,並且在這個包下創建三個類文件,分別爲公共類MyClass1、(默認)缺省類MyClass2以及包含main方法的公共類Test,詳細內容請看下面的代碼:👇👇👇

package p1;
public class MyClass1 {
	public int a=5;
	private int b=10;
	protected int c=20;
	int d=30;
	public void func1() {
		System.out.println("func1");
	}
	private void func2() {
		System.out.println("func2");
		System.out.println(b);
	}
	protected void func3() {
		System.out.println("func3");
	}
	void func4() {
		System.out.println("func4");
	}
}
package p1;
class MyClass2 {
	public void func1() {
		System.out.println("func1 of MyClass2");
	}
}
package p1;
public class Test {
	public static void main(String[] args) {
		MyClass1 obj1=new MyClass1();
		System.out.println(obj1.a);//a是公共屬性,任何地方都可以訪問
		//System.out.println(obj1.b);//本行代碼會報錯!!!b是私有屬性,類MyClass1外無法訪問
		System.out.println(obj1.c);//c是受保護屬性,同一個包下的類可以訪問,其他包中的子類也可以訪問
		System.out.println(obj1.d);//d是缺省屬性,同一個包下的類可以訪問
		//所謂缺省,就是指系統默認的方法
		obj1.func1();//func1()是公共方法,任何地方都可以訪問
		//obj1.func2();//func2()爲私有方法,類MyClass1外無法訪問
		obj1.func3();//func3()是受保護方法,同一包中的類可以訪問,其他包中的子類也可以訪問
		obj1.func4();//func4()是缺省方法,同一包中的類可以訪問
		MyClass2 obj2=new MyClass2();
		obj2.func1();//同一個包中的缺省訪問控制類可以進行訪問
	}
}

在第一塊代碼中,我們分別定義這四類訪問控制符對應的屬性及方法,並且爲其賦值。

在第二塊代碼中,僅僅是定義了一個缺省類,以及一個公共方法。

在最後這個代碼塊中,我們利用前文對訪問控制符的理解,來創建對應的類對象,用對象來調用這些屬性及方法。

(詳細的註釋,我已經寫在代碼中了,大家可以仔細理解),下面是程序運行的結果:👇👇👇

Example 2:不同包之間的非繼承訪問

我們在第一個例子的基礎上,再新創建一個包,包名爲:p2,在這個包下,我們首先使用 import p1.MyClass1; 來將包p1中的公共類MyClass1進行導入,而缺省類MyClass2就無法進行導入,原因是:缺省類在對應包外不可見!!!之後,我們在包p2下,創建一個包含main方法的類文件Test,詳細內容大家來看下面的代碼:👇👇👇

package p2;//不同包間的非繼承訪問
import p1.MyClass1;
//import p1.MyClass2;報錯!!!不能導入不同包中的缺省類,缺省類在對應包外不可見
public class Test {
	public static void main(String[] args) {
		MyClass1 obj1=new MyClass1();
		System.out.println(obj1.a);//a爲公共屬性,任何地方都可以訪問
		//System.out.println(obj1.b);//報錯!!!b爲私有屬性,類外無法訪問
		//System.out.println(obj1.c);//報錯!!!c是受保護屬性,不同包中的非子類無法訪問
		//System.out.println(obj1.d);//報錯!!!d是缺省屬性,不同包中的類不能訪問
		obj1.func1();//func1()是公共方法,任何地方都可以訪問
		//obj1.func2();//報錯!!!func2()爲私有方法,類外無法訪問
		//obj1.func3();//報錯!!!func3()爲受保護方法,不同包中的非子類無法訪問
		//obj1.func4();//報錯!!!func4()是缺省方法,不同包中的類不能訪問
		//MyClass2 obj2=new MyClass2();//報錯!!!不可以訪問不同包中的缺省類
	}
}

代碼的解釋,我也已經將註釋寫的挺清楚的了,大家可以參考着理解一下,下面是程序的運行結果:👇👇👇 

Example 3:不同包之間的繼承訪問

第三個例子中,我們同樣是在第一個例子的基礎上,再新創建一個包,包名爲:p3, 那麼在這個包下,我們仍然是先使用 import p1.MyClass1; 來將包p1中的公共類MyClass1進行導入,而缺省類MyClass2就無法進行導入,原因是:缺省類在對應包外不可見!!!之後,我們在包p3下,創建一個包含main方法的類文件Test,但是這裏我們使用類Test去繼承包p1中的類MyClass1。詳細內容,我們來看下面的代碼:👇👇👇

package p3;//不同包間的繼承訪問
import p1.MyClass1;
//import p1.MyClass2;報錯!!!不能導入不同包中的缺省類,缺省類在對應包外不可見
public class Test extends MyClass1 {
	public static void main(String[] args) {
		Test obj1=new Test();
		System.out.println(obj1.a);//a爲公共屬性,任何地方都可以訪問
		//System.out.println(obj1.b);//報錯!!!b爲私有屬性,類外無法訪問
		System.out.println(obj1.c);//c爲受保護屬性,不同包中的子類可以訪問
		//System.out.println(obj1.d);//報錯!!!d是缺省屬性,不同包中的類不能訪問
		obj1.func1();//func1()爲公共方法,任何地方都可以訪問
		//obj1.func2();報錯!!!func2()是私有方法,類外無法訪問
		obj1.func3();//func3()爲受保護方法,不同包中的子類可以訪問
		//obj1.func4();//func4()爲缺省方法,不同包中的類無法訪問
	}
}

在這裏,我們的類Test繼承了類MyClass1,所以不僅僅是public定義的公共屬性及方法可以訪問,而且protected定義的受保護的屬性及方法,也可以在其他包中的子類下進行訪問,大家可以理解一下代碼中的註釋。程序的運行結果如下: 👇👇👇


那麼,以上就是博主總結的Java語言中訪問控制的相關內容,其實主要就是那四個訪問控制符的理解和使用,博文中也許會有表達不嚴謹之處、又或是錯誤,也希望大家可以指出糾正,感謝CSDN的博友們,感謝感謝!!!😀😀😀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章