4 回答

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
我打破了封裝嗎?
你沒有破壞任何東西。受保護(hù)的成員對(duì)世界其他地方仍然不可見(不包括包中的類和子類)。
Modifier Class Package Subclass World
private N N N N
protected Y Y Y N
如果您需要直接控制受保護(hù)的字段并繞過可能會(huì)扭曲該訪問的 getter/setter,那么受保護(hù)的字段絕對(duì)沒問題。
另一方面,當(dāng)您不經(jīng)常使用該字段時(shí),私有字段是有意義的:private String name;并且"Name is " + getName()是完全正確的,因?yàn)槟魂P(guān)心究竟會(huì)返回什么 - 任何代表名稱的東西就足夠了。
根據(jù)經(jīng)驗(yàn),“使用對(duì)特定成員有意義的最嚴(yán)格的訪問級(jí)別。private除非您有充分的理由不這樣做,否則請(qǐng)使用?!?/p>

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于我所讀到的內(nèi)容,要進(jìn)行強(qiáng)大的封裝,您通常將屬性設(shè)置為私有,然后使用公共方法訪問它們。
對(duì)于強(qiáng)大/適當(dāng)?shù)姆庋b,您將屬性設(shè)置為私有。句號(hào)。您不應(yīng)該通過任何方法訪問這些屬性,而應(yīng)該提供使用這些屬性來實(shí)現(xiàn)某些業(yè)務(wù)邏輯的方法。
[...]它說只有公共/受保護(hù)的成員才會(huì)繼承到子類[...]
一切都將被繼承,只是對(duì)子類不可見。所以它將是對(duì)象的一部分,你不能直接訪問它。
[使用公共/受保護(hù)的屬性] 但是如果我這樣做,我會(huì)破壞封裝嗎?
是的。當(dāng)您使內(nèi)部狀態(tài)可用時(shí),您幾乎總是會(huì)破壞封裝,無論是直接(使其成為私有以外的任何東西),還是使用“getter”或類似方法。

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
出于強(qiáng)封裝的原因,將屬性設(shè)置為私有并使用諸如 mutators 和 accessors 之類的公共方法訪問它們是一種正確的方法。
但是當(dāng)你有內(nèi)在的時(shí)候,這是不行的嗎?
是的,只有公共/受保護(hù)的成員可以繼承給子類,私有類不能傳遞給子類。
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
我打破了封裝嗎?
并不真地。根據(jù)定義,封裝是一個(gè)保護(hù)屏障,可以防止數(shù)據(jù)被該屏障之外的代碼訪問,并且一個(gè)類中的數(shù)據(jù)對(duì)其他類是隱藏的。使用受保護(hù)的成員進(jìn)行繼承允許子類訪問數(shù)據(jù)。
但是封裝的概念是對(duì)象內(nèi)部的信息/數(shù)據(jù)是隱藏的,對(duì)象內(nèi)部的屬性或方法只能通過對(duì)象自身提供的接口獲取。也就是說,對(duì)象內(nèi)部的細(xì)節(jié)或邏輯是隱藏的,除非允許對(duì)象提供的方法/接口,否則其他對(duì)象無法理解和改變對(duì)象的內(nèi)部細(xì)節(jié)。
說白了,我們只需要了解對(duì)象的外部,不需要了解內(nèi)部結(jié)構(gòu)。例如,我們可以通過 getDescription() 獲取 Employee 信息,但我們不需要知道如何獲取信息。因此,這似乎是封裝的一種應(yīng)用。
public void getDescription(){
return "Name is " + getName() + " and salary is " + this.salary;
} // void method can not return a value, modified to the following code
public void getDescription(){
System.out.println( "Name is " + getName() + " and salary is " + this.salary);
}
添加回答
舉報(bào)