三大特性之淺談封裝
前言
英語:Encapsulation——封裝,包裝。
面向對象的封裝與真實世界的目的是一樣的。封裝能夠使外部訪問者不能隨意存取對象的內部數據,隱藏了對象的內部細節,只保留有限的對外接口。外部訪問者不用關心對象的內部細節,使得操作對象變得簡單。
好處
先通過閱讀下面的文字,再回來理解可能會更好一點
- 減少了耦合(物理學上類似相互影響的概念)
- 便於維護和修改
- 可以隱藏信息,一些具體實現代碼,安全性
- 對成員變量精准控制
介紹(實現方式)
-
Java 面向對象的封裝性是通過對成員變量和方法進行訪問控制實現的。這里就涉及到了訪問控制的四個關鍵字了。
類別\不同地方 同一個類 同一個包 不同包的子類 不同包非子類 私有的(private) Yes No No No 默認 Yes Yes No No 保護的(protected) Yes Yes Yes No 公有的(public) Yes Yes Yes Yes -
封裝是一種保護作用,將其變量以及方法保護起來,防止被隨機訪問,所以一定程度上增強了代碼的安全性。
示例
- 下面是代碼示例,私有類只能在同一個類中被訪問,否則會報錯。

private還可以防止直接訪問特定的構造器(或全部的構造器)
package music.daima.ebook;
class TestClass{
private TestClass(){}
static TestClass make(){
return new TestClass();
}
}
public class PrivateDaiMa {
public static void main(String args[]){
// TestClass x = new TestClass();
TestClass x = TestClass.make();
// 不能通過構造器來創建TestClass,要通過調用make方法才可以
}
}
報錯信息說明TestClass的private將其構造器給私有化了,不能直接訪問。

- 訪問不同包的protected方法(非子類的),先是定義在Music類中的BaoHu方法。

在其它包訪問,就會報錯,因為在Music里面這個BaoHu的方法用的是protected修飾的。

其實在Idea寫代碼時候,定義的屬性之類可以在左下角有個概覽,可以查看是什么類型的

- 整體的test代碼
import music.Music;//導入了music包的Music類
class test{
test(int i){
i = i + 1;
}
private String name;//將其變為public String name;的話下面就可以訪問
public int num=2;//公有的可以被訪問
double i = 2.2;//默認的定義,也可以被訪問,在本包里面
}
public class FengZhuang {
public static void main(String args[]){
test a = new test(6);
System.out.println(a.num);
//a.name就會報錯,因為在上面的name是私有的
Music ceshi = new Music();//導入了不同的包中的類
// ceshi.BaoHu();報錯,是在其它包里的protected方法
}
}
小結
訪問成員有兩種方式:一種是調用,即通過類或對象調用它的成員,如p.printX()語句;另一種是繼承,即子類繼承父類的成員變量和方法。在開發使用的時候,應該盡量限制類中成員的可見性
-
公有訪問級別任何情況下兩種方式都可以;(public)
-
默認訪問級別在同一包中兩種訪問方式都可以,不能在包之外訪問;()
-
保護訪問級別在同一包中與默認訪問級別一樣,兩種訪問方式都可以。但是在不同包之
外只能繼承訪問;(protected)
-
私有訪問級別只能在本類中通過調用方法訪問,不能繼承訪問。(private)
感謝閱讀!!!
才疏學淺,有不對的地方請指出。