亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chapter6.htm

?? Thinking In Java第二版(中文)
?? HTM
?? 第 1 頁 / 共 3 頁
字號:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Thinking in Java | Chinese Version by Trans Bot</title>

<meta name="Microsoft Theme" content="inmotion 111, default"></head>

<body background="../_themes/inmotion/inmtextb.gif" tppabs="http://member.netease.com/%7etransbot/Thinking%20in%20Java/_themes/inmotion/inmtextb.gif" bgcolor="#FFFFCC" text="#000000" link="#800000" vlink="#996633" alink="#FF3399">

<p>第6章 類再生<br>
<br>
“Java引人注目的一項特性是代碼的重復使用或者再生。但最具革命意義的是,除代碼的復制和修改以外,我們還能做多得多的其他事情。”<br>
<br>
在象C那樣的程序化語言里,代碼的重復使用早已可行,但效果不是特別顯著。與Java的其他地方一樣,這個方案解決的也是與類有關的問題。我們通過創建新類來重復使用代碼,但卻用不著重新創建,可以直接使用別人已建好并調試好的現成類。<br>
但這樣做必須保證不會干擾原有的代碼。在這一章里,我們將介紹兩個達到這一目標的方法。第一個最簡單:在新類里簡單地創建原有類的對象。我們把這種方法叫作“合成”,因為新類由現有類的對象合并而成。我們只是簡單地重復利用代碼的功能,而不是采用它的形式。<br>
第二種方法則顯得稍微有些技巧。它創建一個新類,將其作為現有類的一個“類型”。我們可以原樣采取現有類的形式,并在其中加入新代碼,同時不會對現有的類產生影響。這種魔術般的行為叫作“繼承”(Inheritance),涉及的大多數工作都是由編譯器完成的。對于面向對象的程序設計,“繼承”是最重要的基礎概念之一。它對我們下一章要講述的內容會產生一些額外的影響。<br>
對于合成與繼承這兩種方法,大多數語法和行為都是類似的(因為它們都要根據現有的類型生成新類型)。在本章,我們將深入學習這些代碼再生或者重復使用的機制。<br>
<br>
6.1 合成的語法<br>
就以前的學習情況來看,事實上已進行了多次“合成”操作。為進行合成,我們只需在新類里簡單地置入對象句柄即可。舉個例子來說,假定需要在一個對象里容納幾個String對象、兩種基本數據類型以及屬于另一個類的一個對象。對于非基本類型的對象來說,只需將句柄置于新類即可;而對于基本數據類型來說,則需在自己的類中定義它們。如下所示(若執行該程序時有麻煩,請參見第3章3.1.2小節“賦值”):<br>
<br>
218-219頁程序<br>
<br>
WaterSource內定義的一個方法是比較特別的:toString()。大家不久就會知道,每種非基本類型的對象都有一個toString()方法。若編譯器本來希望一個String,但卻獲得某個這樣的對象,就會調用這個方法。所以在下面這個表達式中:<br>
System.out.println(&quot;source = &quot; + source) ;<br>
編譯器會發現我們試圖向一個WaterSource添加一個String對象(&quot;source 
=&quot;)。這對它來說是不可接受的,因為我們只能將一個字串“添加”到另一個字串,所以它會說:“我要調用toString(),把source轉換成字串!”經這樣處理后,它就能編譯兩個字串,并將結果字串傳遞給一個System.out.println()。每次隨同自己創建的一個類允許這種行為的時候,都只需要寫一個toString()方法。<br>
如果不深究,可能會草率地認為編譯器會為上述代碼中的每個句柄都自動構造對象(由于Java的安全和謹慎的形象)。例如,可能以為它會為WaterSource調用默認構建器,以便初始化source。打印語句的輸出事實上是:<br>
<br>
219頁下程序<br>
<br>
在類內作為字段使用的基本數據會初始化成零,就象第2章指出的那樣。但對象句柄會初始化成null。而且假若試圖為它們中的任何一個調用方法,就會產生一次“違例”。這種結果實際是相當好的(而且很有用),我們可在不丟棄一次違例的前提下,仍然把它們打印出來。<br>
編譯器并不只是為每個句柄創建一個默認對象,因為那樣會在許多情況下招致不必要的開銷。如希望句柄得到初始化,可在下面這些地方進行:<br>
(1) 
在對象定義的時候。這意味著它們在構建器調用之前肯定能得到初始化。<br>
(2) 在那個類的構建器中。<br>
(3) 
緊靠在要求實際使用那個對象之前。這樣做可減少不必要的開銷——假如對象并不需要創建的話。<br>
<br>
下面向大家展示了所有這三種方法:<br>
<br>
220-221頁程序<br>
<br>
請注意在Bath構建器中,在所有初始化開始之前執行了一個語句。如果不在定義時進行初始化,仍然不能保證能在將一條消息發給一個對象句柄之前會執行任何初始化——除非出現不可避免的運行期違例。<br>
下面是該程序的輸出:<br>
<br>
221頁中程序<br>
<br>
調用print()時,它會填充s4,使所有字段在使用之前都獲得正確的初始化。<br>
<br>
6.2 繼承的語法<br>
繼承與Java(以及其他OOP語言)非常緊密地結合在一起。我們早在第1章就為大家引入了繼承的概念,并在那章之后到本章之前的各章里不時用到,因為一些特殊的場合要求必須使用繼承。除此以外,創建一個類時肯定會進行繼承,因為若非如此,會從Java的標準根類Object中繼承。<br>
用于合成的語法是非常簡單且直觀的。但為了進行繼承,必須采用一種全然不同的形式。需要繼承的時候,我們會說:“這個新類和那個舊類差不多?!睘榱嗽诖a里表面這一觀念,需要給出類名。但在類主體的起始花括號之前,需要放置一個關鍵字extends,在后面跟隨“基礎類”的名字。若采取這種做法,就可自動獲得基礎類的所有數據成員以及方法。下面是一個例子:<br>
<br>
222頁程序<br>
<br>
這個例子向大家展示了大量特性。首先,在Cleanser append()方法里,字串同一個s連接起來。這是用“+=”運算符實現的。同“+”一樣,“+=”被Java用于對字串進行“過載”處理。<br>
其次,無論Cleanser還是Detergent都包含了一個main()方法。我們可為自己的每個類都創建一個main()。通常建議大家象這樣進行編寫代碼,使自己的測試代碼能夠封裝到類內。即便在程序中含有數量眾多的類,但對于在命令行請求的public類,只有main()才會得到調用。所以在這種情況下,當我們使用“java 
Detergent”的時候,調用的是Degergent.main()——即使Cleanser并非一個public類。采用這種將main()置入每個類的做法,可方便地為每個類都進行單元測試。而且在完成測試以后,毋需將main()刪去;可把它保留下來,用于以后的測試。<br>
在這里,大家可看到Deteregent.main()對Cleanser.main()的調用是明確進行的。<br>
需要著重強調的是Cleanser中的所有類都是public屬性。請記住,倘若省略所有訪問指示符,則成員默認為“友好的”。這樣一來,就只允許對包成員進行訪問。在這個包內,任何人都可使用那些沒有訪問指示符的方法。例如,Detergent將不會遇到任何麻煩。然而,假設來自另外某個包的類準備繼承Cleanser,它就只能訪問那些public成員。所以在計劃繼承的時候,一個比較好的規則是將所有字段都設為private,并將所有方法都設為public(protected成員也允許衍生出來的類訪問它;以后還會深入探討這一問題)。當然,在一些特殊的場合,我們仍然必須作出一些調整,但這并不是一個好的做法。<br>
注意Cleanser在它的接口中含有一系列方法:append(),dilute(),apply(),scrub()以及print()。由于Detergent是從Cleanser衍生出來的(通過extends關鍵字),所以它會自動獲得接口內的所有這些方法——即使我們在Detergent里并未看到對它們的明確定義。這樣一來,就可將繼承想象成“對接口的重復利用”或者“接口的再生”(以后的實施細節可以自由設置,但那并非我們強調的重點)。<br>
正如在scrub()里看到的那樣,可以獲得在基礎類里定義的一個方法,并對其進行修改。在這種情況下,我們通常想在新版本里調用來自基礎類的方法。但在scrub()里,不可只是簡單地發出對scrub()的調用。那樣便造成了遞歸調用,我們不愿看到這一情況。為解決這個問題,Java提供了一個super關鍵字,它引用當前類已從中繼承的一個“超類”(Superclass)。所以表達式super.scrub()調用的是方法scrub()的基礎類版本。<br>
進行繼承時,我們并不限于只能使用基礎類的方法。亦可在衍生出來的類里加入自己的新方法。這時采取的做法與在普通類里添加其他任何方法是完全一樣的:只需簡單地定義它即可。extends關鍵字提醒我們準備將新方法加入基礎類的接口里,對其進行“擴展”。foam()便是這種做法的一個產物。<br>
在Detergent.main()里,我們可看到對于Detergent對象,可調用Cleanser以及Detergent內所有可用的方法(如foam())。<br>
<br>
6.2.1 初始化基礎類<br>
由于這兒涉及到兩個類——基礎類及衍生類,而不再是以前的一個,所以在想象衍生類的結果對象時,可能會產生一些迷惑。從外部看,似乎新類擁有與基礎類相同的接口,而且可包含一些額外的方法和字段。但繼承并非僅僅簡單地復制基礎類的接口了事。創建衍生類的一個對象時,它在其中包含了基礎類的一個“子對象”。這個子對象就象我們根據基礎類本身創建了它的一個對象。從外部看,基礎類的子對象已封裝到衍生類的對象里了。<br>
當然,基礎類子對象應該正確地初始化,而且只有一種方法能保證這一點:在構建器中執行初始化,通過調用基礎類構建器,后者有足夠的能力和權限來執行對基礎類的初始化。在衍生類的構建器中,Java會自動插入對基礎類構建器的調用。下面這個例子向大家展示了對這種三級繼承的應用:<br>
<br>
224-225頁程序<br>
<br>
該程序的輸出顯示了自動調用:<br>
<br>
Art constructor<br>
Drawing constructor<br>
Cartoon constructor<br>
<br>
可以看出,構建是在基礎類的“外部”進行的,所以基礎類會在衍生類訪問它之前得到正確的初始化。<br>
即使沒有為Cartoon()創建一個構建器,編譯器也會為我們自動合成一個默認構建器,并發出對基礎類構建器的調用。<br>
<br>
1. 含有自變量的構建器<br>
上述例子有自己默認的構建器;也就是說,它們不含任何自變量。編譯器可以很容易地調用它們,因為不存在具體傳遞什么自變量的問題。如果類沒有默認的自變量,或者想調用含有一個自變量的某個基礎類構建器,必須明確地編寫對基礎類的調用代碼。這是用super關鍵字以及適當的自變量列表實現的,如下所示:<br>
<br>
225-226頁程序<br>
<br>
如果不調用BoardGames()內的基礎類構建器,編譯器就會報告自己找不到Games()形式的一個構建器。除此以外,在衍生類構建器中,對基礎類構建器的調用是必須做的第一件事情(如操作失當,編譯器會向我們指出)。<br>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区在线观看乱码| 亚洲国产美女搞黄色| 欧美精品国产精品| 91成人在线免费观看| 一本一本久久a久久精品综合麻豆| 国产风韵犹存在线视精品| 国产福利一区二区三区视频| 国产成人高清在线| 成人毛片在线观看| 成人在线一区二区三区| 国产91色综合久久免费分享| 99综合影院在线| 91在线观看免费视频| 在线视频国产一区| 欧美日韩精品一区二区| 欧美一区二区三区播放老司机| 欧美一二三在线| 久久久久国产一区二区三区四区| 中文子幕无线码一区tr| 亚洲综合一二三区| 久久国产精品色| 成人美女视频在线观看18| 在线视频观看一区| 日韩视频中午一区| 国产精品视频看| 亚洲一区二区三区美女| 麻豆精品蜜桃视频网站| 成人免费电影视频| 欧美三级视频在线播放| 精品国产伦一区二区三区免费| 国产精品视频免费看| 日日骚欧美日韩| 国产福利91精品| 欧美妇女性影城| 日本一区二区三区在线不卡| 亚洲午夜激情av| 国产黄色精品网站| 欧美一区二区三区啪啪| 国产精品蜜臀在线观看| 奇米精品一区二区三区在线观看一| 国产91色综合久久免费分享| 69av一区二区三区| 亚洲欧洲制服丝袜| 韩日欧美一区二区三区| 欧美色图片你懂的| 国产欧美综合在线| 欧美另类变人与禽xxxxx| 色偷偷久久一区二区三区| 日韩视频在线一区二区| 亚洲视频你懂的| 久久99精品国产麻豆不卡| 欧美三区在线视频| 国产精品久99| 国产传媒欧美日韩成人| 3751色影院一区二区三区| 亚洲欧美成人一区二区三区| 国产成人在线观看| xfplay精品久久| 青青草伊人久久| 欧美日韩中文字幕一区二区| 国产精品国产三级国产有无不卡 | 91精品国产高清一区二区三区| 中文字幕欧美一区| 国产精品一区二区黑丝| 精品国产91乱码一区二区三区 | 91精品在线观看入口| 亚洲自拍偷拍麻豆| 欧美三级视频在线观看| 一区二区三国产精华液| 色综合夜色一区| 亚洲精品亚洲人成人网| 在线观看视频欧美| 亚洲视频免费观看| 色综合天天综合色综合av| 国产精品久久久久天堂| 色综合视频一区二区三区高清| 日韩一区日韩二区| 91免费在线视频观看| 亚洲美女在线国产| 欧美亚洲丝袜传媒另类| 午夜电影一区二区| 日韩欧美亚洲国产精品字幕久久久| 欧美96一区二区免费视频| 日韩视频123| 国产在线精品不卡| 中文字幕av资源一区| 色综合久久综合中文综合网| 亚洲最大的成人av| 欧美精品乱人伦久久久久久| 日本欧美在线观看| 久久精品视频一区二区三区| 国产成人精品亚洲午夜麻豆| 亚洲天堂精品视频| 欧美私模裸体表演在线观看| 青青青伊人色综合久久| 久久久国产精品不卡| 99精品在线观看视频| 亚洲成a人片综合在线| 精品国产91九色蝌蚪| 成人自拍视频在线| 亚洲大型综合色站| 精品国产免费一区二区三区香蕉| 成人午夜精品在线| 亚洲成人免费视| 久久久久久久综合| 91精品福利在线| 国内成人免费视频| 亚洲欧美色综合| 精品不卡在线视频| 色综合久久久久久久久| 黑人精品欧美一区二区蜜桃 | 五月综合激情婷婷六月色窝| 欧美成人a在线| 91麻豆免费观看| 久久精品久久99精品久久| 亚洲精品自拍动漫在线| 精品福利视频一区二区三区| 99久久国产综合精品色伊| 欧美aaa在线| 亚洲成国产人片在线观看| 中文字幕欧美国产| 亚洲精品一区二区三区影院 | 成人一级片网址| 日本美女一区二区三区| 亚洲视频一区二区免费在线观看| 欧美一级久久久久久久大片| 91欧美激情一区二区三区成人| 国产一本一道久久香蕉| 日韩国产精品91| 亚洲自拍偷拍麻豆| 综合中文字幕亚洲| 久久精品亚洲国产奇米99| 日韩欧美高清在线| 欧美日韩精品专区| 欧美在线观看一区| 色94色欧美sute亚洲线路二| 国产成人免费视频| 国产米奇在线777精品观看| 麻豆精品视频在线观看免费| 日韩精品午夜视频| 亚洲高清免费在线| 一区二区三区中文字幕在线观看| 欧美国产乱子伦| 欧美激情一区二区三区在线| 久久久一区二区三区捆绑**| 久久先锋影音av| 久久久www免费人成精品| 欧美第一区第二区| 日韩欧美国产一区二区在线播放| 91精品国产综合久久久久久久久久 | 日韩欧美国产成人一区二区| 欧美在线免费观看视频| 色综合久久久久久久久| 色综合久久久久综合体| 91黄色小视频| 欧美日韩精品一区二区在线播放| 欧美性猛交xxxxxxxx| 欧美日韩美少妇| 91精品国产高清一区二区三区蜜臀 | 在线不卡a资源高清| 欧美精品久久一区| 日韩欧美高清dvd碟片| 久久久久久久久一| 国产女人18水真多18精品一级做| 天天色综合成人网| 青青国产91久久久久久| 久久66热偷产精品| 粉嫩aⅴ一区二区三区四区| 国产亚洲综合色| 日韩av一二三| 日韩精品一卡二卡三卡四卡无卡| 午夜日韩在线观看| 久草这里只有精品视频| 国产成人在线网站| 色综合一区二区三区| 777色狠狠一区二区三区| 精品久久久久久久一区二区蜜臀| 久久人人爽人人爽| 亚洲精品免费在线播放| 视频一区二区三区在线| 久久99精品久久久久| 99re热视频精品| 欧美二区三区的天堂| 国产女主播视频一区二区| 亚洲男人的天堂网| 精品一区二区三区久久久| 成人国产精品免费观看动漫| 在线观看一区不卡| 久久综合一区二区| 亚洲欧美福利一区二区| 韩国女主播一区| 欧美中文字幕一区| 中文字幕国产一区| 日本麻豆一区二区三区视频| 91网站视频在线观看| 久久综合国产精品| 久久久不卡网国产精品一区| 成人欧美一区二区三区黑人麻豆 | 亚洲综合久久久久| 国内欧美视频一区二区|