在本教程中,您將借助示例學(xué)習(xí)Java中的封裝和數(shù)據(jù)隱藏。
封裝是面向?qū)ο缶幊痰闹匾δ苤?。封裝是指將字段和方法綁定在單個類中。
將類中的類似字段和方法捆綁在一起也有助于隱藏數(shù)據(jù)。
通常,封裝是將類似代碼包裝在一個地方的過程。
在Java中,我們可以將在單個類中一起操作的字段和方法捆綁在一起。例如,
class Rectangle { int length; int breadth; public void getArea() {} }
在上面的程序中,getArea()方法計算矩形的面積。為了計算面積,它需要長度(length)和寬度(breadth)。因此,數(shù)據(jù)字段length、breadth和方法getArea()被放在Rectangle類中。
數(shù)據(jù)隱藏是一種通過隱藏實(shí)現(xiàn)細(xì)節(jié)來限制數(shù)據(jù)成員訪問的方法。
封裝還提供了一種隱藏數(shù)據(jù)的方法。
數(shù)據(jù)隱藏可以通過訪問修飾符來實(shí)現(xiàn)。在Java中,有四個訪問修飾符:
public - 修飾的屬性或方法是公有的,可以在任何地方被訪問到,默認(rèn)所有的屬性和方法都是 public 的
private - 修飾的屬性或方法是私有的,不能在聲明它的類的外部訪問
protected - 修飾的屬性或方法是受保護(hù)的,它和 private 類似,區(qū)別是它在子類中也是允許被訪問的
default - 即不加任何訪問修飾符,通常稱為“默認(rèn)訪問模式“。該模式下,只允許在同一個包中進(jìn)行訪問。
要了解更多信息,請訪問Java 修飾符。
class Person { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } } class Main { public static void main(String[] args) { Person p1 = new Person(); p1.setAge(24); System.out.println("我的年齡是 " + p1.getAge()); } }
輸出結(jié)果
我的年齡是 24
在上面的實(shí)例中,我們有一個private字段age。因?yàn)樗撬接械?,所以不能從類外部訪問它。為了訪問age,我們使用了公共方法getAge()和setAge()。這些方法稱為getter和setter方法。
如果嘗試從Main類中訪問age字段,則會出現(xiàn)錯誤消息。
p1.age = 24; // error: age has private access in Person
將age設(shè)置為私有,可以限制來自類外部未經(jīng)授權(quán)的訪問。這是數(shù)據(jù)隱藏。
class Person { protected String profession; protected void displayInfo() { System.out.println("I am a " + profession); } } class Teacher extends Person { public static void main(String[] args) { Teacher t1 = new Teacher(); t1.profession = "teacher"; t1.displayInfo(); } }
輸出結(jié)果
I am a teacher
在上面的程序中,我們創(chuàng)建了一個Person類,其中包含protected字段 profession 和protected方法displayInfo()。
我們已經(jīng)從Teacher類(Person的子類)訪問了這些成員。
在Java中,封裝可幫助我們將相關(guān)的字段和方法保持在一起,從而使我們的代碼更整潔且易于閱讀。
它有助于控制我們數(shù)據(jù)字段的修改。 考慮一種情況,我們希望類中的age字段為非負(fù)數(shù)。 在這里,我們可以將age設(shè)為私有,并可以在setAge()方法內(nèi)部應(yīng)用邏輯。 例如,
class Person { private int age; public void setAge(int age) { if (age >= 0) { this.age = age; } } }
getter和setter方法提供對我們的類字段的只讀或只寫訪問。例如,
getName() // 提供只讀訪問 setName() //提供只寫訪問
它有助于解耦系統(tǒng)的組件。這些解耦的組件可以獨(dú)立且同時進(jìn)行開發(fā),測試和調(diào)試。并且,特定組件的任何更改都不會對其他組件產(chǎn)生任何影響。
人們通常認(rèn)為封裝是數(shù)據(jù)隱藏,但這并不完全正確。
封裝是指將相關(guān)字段和方法捆綁在一起。這使得我們能夠?qū)崿F(xiàn)數(shù)據(jù)隱藏。封裝本身并不是數(shù)據(jù)隱藏。