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