《Java核心技術(shù)卷一》——4對(duì)象與類(lèi)

重新認(rèn)識(shí)類(lèi)吧...


4.1 類(lèi)

類(lèi)(class)是構(gòu)造對(duì)象的模板或藍(lán)圖蝌衔。由類(lèi)構(gòu)造對(duì)象的過(guò)程稱(chēng)為創(chuàng)建類(lèi)的實(shí)例齿梁。

重要概念:

  • 封裝:將數(shù)據(jù)和行為組合在一個(gè)包中痹扇,并對(duì)對(duì)象的使用者隱藏了數(shù)據(jù)的實(shí)現(xiàn)方式橡羞。實(shí)現(xiàn)封裝的關(guān)鍵在于絕對(duì)不能讓類(lèi)中的方法直接第訪問(wèn)其他類(lèi)的實(shí)例域。
  • 繼承:可以通過(guò)拓展一個(gè)類(lèi)來(lái)建立另外一個(gè)新的類(lèi)拜效。

類(lèi)之間的關(guān)系

在類(lèi)之間喷众,最常見(jiàn)的關(guān)系有

  • 依賴(lài)(“use-a”)
  • 聚合(“has-a”)
  • 繼承(“is-a”)

依賴(lài),如果一個(gè)類(lèi)的方法操縱另一個(gè)類(lèi)的對(duì)象紧憾,我們就說(shuō)一個(gè)依賴(lài)于另一個(gè)類(lèi)到千。
聚合,類(lèi)A的對(duì)象包含類(lèi)B的對(duì)象稻励。
繼承父阻,一種用于表示特殊與一般關(guān)系的。

關(guān)聯(lián)和聚合是一個(gè)意思望抽,只是UML符號(hào)表示不同加矛。聚類(lèi)的符號(hào)更易區(qū)分一點(diǎn)。

4.4 各種修飾符

實(shí)例域的修飾符

修飾符 作用
public 如果一個(gè)實(shí)例域被public修飾煤篙,那它可以被所有類(lèi)獲得斟览、修改,應(yīng)該避免用public修飾辑奈。
private 可以被本類(lèi)的訪問(wèn)器獲取苛茂、修改器修改已烤。
final 只能在初始化時(shí)設(shè)置值,在后面的操作中不能對(duì)它進(jìn)行修改妓羊。
static 所有本類(lèi)的實(shí)例共享被static修飾的實(shí)例域胯究。即使沒(méi)有一個(gè)實(shí)例對(duì)象,靜態(tài)域也存在躁绸。它屬于類(lèi)裕循,而不屬于任何獨(dú)立的對(duì)象。

方法的修飾符

修飾符 作用
public 任何類(lèi)的任何方法都可以調(diào)用這些方法净刮。
private 不會(huì)被外部其他類(lèi)調(diào)用剥哑,可以刪除它(意味著沒(méi)有類(lèi)依賴(lài)于該方法)。
static 可以認(rèn)為staic方法是沒(méi)有this參數(shù)的方法淹父。靜態(tài)方法不能訪問(wèn)實(shí)例域株婴,因?yàn)樗荒懿僮鲗?duì)象。但是靜態(tài)方法啊可以訪問(wèn)自身類(lèi)中的靜態(tài)域暑认。靜態(tài)方法屬于類(lèi)而不屬于實(shí)例困介,建議使用類(lèi)名調(diào)用靜態(tài)方法。

在下面兩種情況下使用靜態(tài)方法:

  • 一個(gè)方法不需要訪問(wèn)對(duì)象狀態(tài)穷吮,其所需參數(shù)都是通過(guò)顯示參數(shù)提供逻翁。
  • 一個(gè)方法只需要訪問(wèn)類(lèi)的靜態(tài)域。

main方法也是靜態(tài)方法捡鱼,每個(gè)類(lèi)可以有一個(gè)main方法。這是一個(gè)常用于對(duì)類(lèi)進(jìn)行單元測(cè)試的技巧酷愧。

4.6 對(duì)象構(gòu)造

重載

如果多個(gè)方法有相同的名字驾诈、不同的參數(shù),便產(chǎn)生了重載溶浴。編譯器必須挑選出具體執(zhí)行哪個(gè)方法乍迄,它通過(guò)用各個(gè)方法給出的參數(shù)類(lèi)型與特定方法調(diào)用所使用的值類(lèi)型進(jìn)行匹配來(lái)挑選出相應(yīng)的方法。如果編譯器找不到匹配的參數(shù)士败,就會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤闯两。

默認(rèn)域初始化

如果在構(gòu)造器中沒(méi)有顯示地給域賦予初值,那么就會(huì)被自動(dòng)地賦為默認(rèn)值:數(shù)值為0谅将、布爾值為false漾狼、對(duì)象引用為null。然而饥臂,只有缺少程序設(shè)計(jì)經(jīng)驗(yàn)的人才會(huì)這樣做逊躁。注意:局部變量必須明確地初始化。

無(wú)參數(shù)的構(gòu)造器

如果類(lèi)中提供了至少一個(gè)構(gòu)造器隅熙,但是沒(méi)有提供無(wú)參數(shù)的構(gòu)造器稽煤,則在構(gòu)造對(duì)象時(shí)如果沒(méi)有提供參數(shù)就會(huì)被視為不合法核芽。僅當(dāng)類(lèi)沒(méi)有提供任何構(gòu)造器的時(shí)候,系統(tǒng)才會(huì)提供一個(gè)默認(rèn)的構(gòu)造器酵熙。

顯式域初始化

初始值不一定是常量值轧简。也可以調(diào)用方法對(duì)域進(jìn)行初始化。

參數(shù)名

不好的命名方式:只有閱讀代碼才能夠了解參數(shù)n和參數(shù)s的含義匾二。

public Employee(String n, double s)
{
    name = n;
    salary = s;
}

建議的命名方式:

public Employee(String aName, double aSalary)
{
    name = aName;
    salary = aSalary;
}

還有一種方式:參數(shù)變量用同樣的名字將實(shí)例域屏蔽起來(lái)吉懊。

public Employee(String name, double salary)
{
    this.name = name;
    this.salary = salary;
}

調(diào)用另一個(gè)構(gòu)造器

如果構(gòu)造器的第一個(gè)語(yǔ)句形如this,這個(gè)構(gòu)造器將調(diào)用同一個(gè)類(lèi)的另一個(gè)構(gòu)造器假勿。

public Employee(double s)
{
    // calls Employee(String, double)
    this("Employee #" + nextId, s)
    nextId++;
}

4.7 包

Java允許使用包(package)將類(lèi)組織起來(lái)借嗽。借助于包可以方便地組織自己的代碼,并將自己的代碼與別人提供的代碼庫(kù)分開(kāi)管理转培。
所有標(biāo)準(zhǔn)的Java包都處于java和javax包層次中恶导。
使用包的主要原因是確保類(lèi)名的唯一性。事實(shí)上浸须,為了確保包名的絕對(duì)唯一惨寿,Sun公司建議將公司的因特網(wǎng)域名以逆序的形式作為包名,并且對(duì)于不同的項(xiàng)目使用不同的子包删窒。對(duì)于我自己裂垦,可以使用如org.shijiatongxue.corejava。

在C++中肌索,與包機(jī)制類(lèi)似的是命名空間(namespace)蕉拢。在Java中,package與import語(yǔ)句類(lèi)似于C++中的namespace和using指令诚亚。

靜態(tài)導(dǎo)入

import語(yǔ)句不僅可以導(dǎo)入類(lèi)晕换,還增加了導(dǎo)入靜態(tài)方法和靜態(tài)域的功能。

例如:

import static java.lang.System.*;

就可以使用System類(lèi)的靜態(tài)方法和靜態(tài)域站宗,而不必加類(lèi)名前綴:

out.println("Goodbye, World!");
exit(0);

另外闸准,還可以導(dǎo)入特定的方法或域:

import static java.lang.System.out;

包作用域

如果沒(méi)有指定public或private,這個(gè)部分(類(lèi)梢灭、方法或變量)可以被同一個(gè)包中的所有方法訪問(wèn)夷家。
對(duì)于變量來(lái)說(shuō),必須顯示地標(biāo)記為private敏释,不然的話(huà)默認(rèn)為包可見(jiàn)库快。顯然,這樣做會(huì)破壞封裝性颂暇。

4.9 文檔注釋

類(lèi)注釋

類(lèi)注釋必須放在import語(yǔ)句之后缺谴,類(lèi)定義之前。

/**
*A {@code Card} object represents a playing card...
*...
*...
*/
public class Card
{
...
}

方法注釋

/**
* Raises the salary of an emplyee.
* @param byPercent the percentage by which to raise the salary(e.g. 10 means 10%)
* @return the amount of the raise
*/
public double raiseSalary(double byPercent)
{
    double raise = salary * byPercent / 100;
    salary += raise;
    return raise;
}

域注釋

只需要對(duì)公有域(通常指的是靜態(tài)常量)建立文檔。例如湿蛔,

/**
* The "Hearts" card suit
*/
public static final int HEART = 1;

4.10 類(lèi)設(shè)計(jì)技巧

  1. 一定要保證數(shù)據(jù)私有
  2. 一定要對(duì)數(shù)據(jù)初始化
    Java不對(duì)局部變量初始化膀曾,但是會(huì)對(duì)對(duì)象的實(shí)例域進(jìn)行初始化。最好不要依賴(lài)于系統(tǒng)的默認(rèn)值阳啥。而是應(yīng)該顯式低初始化所有的數(shù)據(jù)添谊。具體的初始化方式可以是提供默認(rèn)值。也可以是在所有的構(gòu)造器中設(shè)置默認(rèn)值察迟。
  3. 不要在類(lèi)中使用過(guò)多的基本類(lèi)型
    就是說(shuō)斩狱,用其他的類(lèi)替代多個(gè)相關(guān)的基本類(lèi)型的使用。這樣會(huì)使類(lèi)更加易于理解且易于修改扎瓶。
  4. 不是所有的域都需要獨(dú)立的域訪問(wèn)器和域更改器
  5. 將職責(zé)過(guò)多的類(lèi)進(jìn)行分解
  6. 類(lèi)名和方法名要能夠體現(xiàn)它們的職責(zé)
    命名類(lèi)名的良好習(xí)慣是采用一個(gè)名詞(Order)所踊、前面有形容詞修飾的名詞(RushOrder)或動(dòng)名詞修飾名詞(BillingAddress)。對(duì)于方法來(lái)說(shuō)概荷,習(xí)慣是訪問(wèn)器方法用小寫(xiě)get開(kāi)頭秕岛,更改器方法用小寫(xiě)的set開(kāi)頭。
  7. 優(yōu)先使用不可變類(lèi)
    更改對(duì)象的問(wèn)題在于误证,如果多個(gè)線程視圖同時(shí)更新一個(gè)對(duì)象继薛,就會(huì)發(fā)生并發(fā)更改。其結(jié)果是不可預(yù)料的愈捅。如果類(lèi)是不可變的遏考,就可以安全地在多個(gè)線程間共享其對(duì)象。

本章完蓝谨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灌具,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子像棘,更是在濱河造成了極大的恐慌稽亏,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缕题,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胖腾,警方通過(guò)查閱死者的電腦和手機(jī)烟零,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咸作,“玉大人锨阿,你說(shuō)我怎么就攤上這事〖欠#” “怎么了墅诡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桐智。 經(jīng)常有香客問(wèn)我末早,道長(zhǎng)烟馅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任然磷,我火速辦了婚禮郑趁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姿搜。我一直安慰自己寡润,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布舅柜。 她就那樣靜靜地躺著梭纹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪致份。 梳的紋絲不亂的頭發(fā)上变抽,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音知举,去河邊找鬼瞬沦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雇锡,可吹牛的內(nèi)容都是我干的逛钻。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锰提,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼曙痘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起立肘,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤边坤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谅年,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茧痒,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年融蹂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旺订。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡超燃,死狀恐怖区拳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情意乓,我是刑警寧澤樱调,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響笆凌,放射性物質(zhì)發(fā)生泄漏圣猎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一菩颖、第九天 我趴在偏房一處隱蔽的房頂上張望样漆。 院中可真熱鬧,春花似錦晦闰、人聲如沸放祟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跪妥。三九已至,卻和暖如春声滥,著一層夾襖步出監(jiān)牢的瞬間眉撵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工落塑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纽疟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓憾赁,卻偏偏與公主長(zhǎng)得像污朽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子龙考,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容