Java編程思想第05章初始化與清理.ppt_第1頁
Java編程思想第05章初始化與清理.ppt_第2頁
Java編程思想第05章初始化與清理.ppt_第3頁
Java編程思想第05章初始化與清理.ppt_第4頁
Java編程思想第05章初始化與清理.ppt_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第五章 初始化與清理, 初始化 清理 數(shù)組的初始化和枚舉類型,一、用構(gòu)造器確保初始化,1、 為什么要引入構(gòu)造器(constructor)? 假設(shè)沒有構(gòu)造器,那么我們用戶就要 自己去完成初始化工作 但用戶可能不知道如何初始化,甚至 會忘記初始化,一、用構(gòu)造器確保初始化,2、 構(gòu)造器如何取名? C+語言采用的解決方案看來最簡單 而且最符合邏輯,所以在Java中也是 采用了這種方案 構(gòu)造器采用與類相同的名稱,一、用構(gòu)造器確保初始化,3、 構(gòu)造器的種類 無參的構(gòu)造器(習(xí)慣稱為默認(rèn)構(gòu)造器) 帶參的構(gòu)造器,一、用構(gòu)造器確保初始化,4、 構(gòu)造器的特點(diǎn) 構(gòu)造器是一種特殊類型的方法,因?yàn)?它沒有返回值 分析:與

2、返回值為void (空)的區(qū)別, 后者仍有可能以其它形式返回某些值,二、方法重載,1、 方法重載的概念 方法名相同,而參數(shù)類型列表不同 也就是依靠參數(shù)的個(gè)數(shù)、類型和順序 的不同加以區(qū)分(后者不推薦使用),二、方法重載,2、 在C+和Java中,為什么必須要支持 方法重載? 構(gòu)造器是一個(gè)非常重要的原因, 既然構(gòu)造器的名字由類名所決定,就只能有 一個(gè)構(gòu)造器名,那么如果想用多種方式創(chuàng)建 一個(gè)對象,該怎么辦? 典例:Tree() / 無參構(gòu)造器 Tree(int i) / 帶參構(gòu)造器 為了讓方法名相同而參數(shù)不同的構(gòu)造器同時(shí) 存在,必須用到方法重載,三、默認(rèn)構(gòu)造器, 如果你寫的類沒有構(gòu)造器,那么編譯器

3、會自動幫你創(chuàng)建一個(gè)默認(rèn)構(gòu)造器(無參 構(gòu)造器) 如果已經(jīng)定義了一個(gè)構(gòu)造器(無論是否 有參數(shù)),編譯器就不會幫你自動創(chuàng)建 默認(rèn)構(gòu)造器, 典例1:P83代碼 class Bird public class DefaultConstructor public static void main(String args) Bird b = new Bird() / Default! 表達(dá)式new Bird()將調(diào)用默認(rèn)構(gòu)造器,即使你 并沒有明確定義它, 典例2:P83代碼 Bird class Bird2 Bird2(int i) Bird2(double d) public class NoSynthe

4、sis public static void main(String args) /! Bird2 b = new Bird2();/ 為什么出錯(cuò)? Bird2 b2 = new Bird2(1); Bird2 b3 = new Bird2(1.0); ,四、this關(guān)鍵字,1、 this關(guān)鍵字的含義 概念:指向?qū)ο蟊旧淼囊?問題:為什么需要this關(guān)鍵字?, class Banana void peel(int i)/*.*/ public class BananaPeel public static void main(String args) Banana a=new Banana()

5、; Banana b=new Banana(); a.peel(1); b.peel(2); , 仔細(xì)分析以上代碼在內(nèi)存中執(zhí)行的情況 首先,我們知道:編譯器只為每個(gè)對象的數(shù)據(jù) 成員分配存儲空間,而不為成員函數(shù)分配空間, 成員函數(shù)將隨著整個(gè)類的裝載而裝載 為什么?所有對象的成員函數(shù)都是一樣的, 所以沒必要為成員函數(shù)分配空間, 于是產(chǎn)生了一個(gè)有意思的問題: 成員函數(shù)是怎么知道它究竟被哪個(gè)對象調(diào)用的? 答案是:通過this關(guān)鍵字(編譯器自動完成) 編譯器將a.peel(1)理解為Banana.peel(a,1) / 即將當(dāng)前所操作對象的引用作為第一個(gè)參數(shù)傳遞 給peel(),四、this關(guān)鍵字,2、

6、 我們?nèi)绾问褂胻his關(guān)鍵字? 返回當(dāng)前對象的引用 典例分析P84代碼, public class Leaf int i=0; Leaf Increment() i+; return this; void print System.out.println(“i=”+i); , public static void main(String args) Leaf x=new Leaf(); x.increment().increment() .increment().print(); ,四、this關(guān)鍵字, 在構(gòu)造器中調(diào)用構(gòu)造器 為避免重復(fù)代碼,往往使用this關(guān)鍵字 分析P86代碼, publi

7、c class Flower int petalCount=0; String s=“initial value”; Flower(int petalCount) /*.*/ Flower(String ss) /*.*/ Flower(int petalCount,String s) this(petalCount); this.s=s; / Another use of this . ,五、清理:終結(jié)處理和垃圾回收,1、 C+的析構(gòu)函數(shù)(destructor) 什么時(shí)候調(diào)用析構(gòu)函數(shù)? 當(dāng)對象脫離其作用域時(shí)(如對象所在的 函數(shù)已調(diào)用完畢),系統(tǒng)自動調(diào)用析構(gòu) 函數(shù),五、清理:終結(jié)處理和垃圾回收

8、, 析構(gòu)函數(shù)的作用是什么? 析構(gòu)函數(shù)往往用來做清理善后的工作 例如: 在建立對象時(shí)用new開辟了一片 內(nèi)存空間,應(yīng)在退出前在析構(gòu)函數(shù)中用 delete釋放,五、清理:終結(jié)處理和垃圾回收, 是否每一個(gè)類都具有析構(gòu)函數(shù)? 如果用戶沒有編寫析構(gòu)函數(shù),編譯系統(tǒng) 會自動生成一個(gè)缺省的析構(gòu)函數(shù),而它 也不進(jìn)行任何操作,五、清理:終結(jié)處理和垃圾回收,2、 垃圾回收器的作用 Java沒有析構(gòu)函數(shù) 垃圾回收器只知道釋放那些經(jīng)由new 關(guān)鍵字分配的內(nèi)存, 問題1:是否存在不經(jīng)new分配的內(nèi)存? 如果不存在:上面一段話應(yīng)該改為垃圾回收器 能夠回收一切不再需要的內(nèi)存 如果存在:但在Java中一切都是對象,而對象 必須

9、經(jīng)由new關(guān)鍵字來分配內(nèi)存 答案:確實(shí)存在著不經(jīng)new分配的內(nèi)存(利用 本地方法調(diào)用非Java代碼,如C的malloc函數(shù)), 問題2:垃圾回收器是否知道如何釋放這塊特殊 的內(nèi)存? 答案很顯然:不知道 那么這塊特殊的內(nèi)存如何釋放呢?Java允許在 類中定義一個(gè)finalize()方法,可以通過調(diào)用 該方法來實(shí)現(xiàn), 問題3:垃圾回收器是否等同于析構(gòu)函數(shù)? 不等同(范圍不等同) 在C+中,每一個(gè)對象一定會通過析構(gòu)函數(shù)而 銷毀 而垃圾回收器只知道回收經(jīng)由new分配的內(nèi)存, 而其它的對象(不經(jīng)new分配的)不能被垃圾 回收器回收,五、清理:終結(jié)處理和垃圾回收,3、 垃圾回收器是如何工作的? 在堆上分配

10、對象的代價(jià)十分高昂 但由于垃圾回收器的存在,Java從堆 分配空間的速度,可以和其它語言從 堆棧分配空間的速度相媲美(了解),六、成員初始化,1、 Java編譯器將盡力保證:所有變量在 使用前都要進(jìn)行恰當(dāng)?shù)某跏蓟?Java的變量有兩種:引用變量和基本 類型變量,后者又分為下面兩種情況,六、成員初始化, 非數(shù)據(jù)成員(方法中局部變量) Java以編譯時(shí)錯(cuò)誤的形式來保證其 初始化 典例分析:, void f() int i; i+; / Error,i not initialized 強(qiáng)制程序員提供一個(gè)初始值 編譯器可以為i賦一個(gè)默認(rèn)值,但是未初始化的 局部變量更有可能是程序員的疏忽, 所以采用 默

11、認(rèn)值反而會掩蓋這種失誤,六、成員初始化, 數(shù)據(jù)成員為基本類型 Java將為類的每個(gè)基本數(shù)據(jù)成員提供 自動初始化(保證都會有一個(gè)初始值) 典例分析:P92代碼(自己調(diào)試),六、成員初始化, 引用類型 無論是否數(shù)據(jù)成員,如果不將其初始化, 該對象引用會被Java自動賦值為null,六、成員初始化,2、 指定初始化 Java允許:在定義類的數(shù)據(jù)成員的同時(shí) 可以為其賦初值 優(yōu)點(diǎn):簡單直觀 缺點(diǎn):每個(gè)對象都具有相同的初值, 典例:P93代碼 void public class InitialValues2 int i ; / 自動初始化 int j = 999; / 先自動初始化,再指定初始化 注意:C

12、+不允許這樣做,必須全部通過構(gòu)造 函數(shù)來初始化,七、構(gòu)造器初始化,1、 初始化的第一基本原則 可以用構(gòu)造器來進(jìn)行初始化 但執(zhí)行順序是:先自動初始化,再指定 初始化,最后調(diào)用構(gòu)造器進(jìn)行初始化, public class Counter int i=99; Counter() i=7; / . 執(zhí)行順序:i首先被自動初始化為0,然后指定 初始化為99,最后利用構(gòu)造器初始化為7, 大家肯定會問一個(gè)問題:既然這些數(shù)據(jù)成員的 初始化已經(jīng)得到保證,那還要構(gòu)造器做什么? 首先:自動初始化只是保證這些Java類的穩(wěn)定性 它的值并不是實(shí)際情況所需要的值 其次:構(gòu)造器存在著并沒有為某個(gè)數(shù)據(jù)成員進(jìn)行 初始化的危險(xiǎn),

13、那么如果沒有自動初始化,我們 該怎么辦?,七、構(gòu)造器初始化,2、 變量的初始化順序 變量定義的先后順序決定其初始化順序 不管這些變量的定義位于什么地方, 它們一定會在任何方法(包括構(gòu)造器) 被調(diào)用之前得到初始化,七、構(gòu)造器初始化,3、 靜態(tài)數(shù)據(jù)的初始化 還有一個(gè)棘手的問題沒有解決:, 我們從前面知道:類的數(shù)據(jù)成員將會先后進(jìn)行 自動初始化和指定初始化 問題是:類的數(shù)據(jù)成員又分為靜態(tài)數(shù)據(jù)成員和 非靜態(tài)數(shù)據(jù)成員,那么在所謂的自動初始化和 指定初始化過程中,是先做靜態(tài)成員的初始化 還是先做非靜態(tài)成員的初始化?,七、構(gòu)造器初始化, 初始化的第二基本原則 初始化的順序是先靜態(tài)對象,而后是非 靜態(tài)對象 典例

14、分析:P95, 分析: 1、public所修飾的類是主類,里面包含的main方法 稱為主方法,是程序的入口點(diǎn) 所謂程序的入口點(diǎn)是指:程序?qū)倪@個(gè)地方開始 執(zhí)行,而這將會導(dǎo)致主類的加載, 分析: 2、前面提到:不管變量的定義位于什么地方,它們 一定會在任何方法(包括構(gòu)造器)被調(diào)用之前得 到初始化 所以: table 和cupboard 兩個(gè)靜態(tài)變量將首先被 初始化,而在利用構(gòu)造器初始化的過程中,將導(dǎo) 致Table類和Cupboard類的先后加載, 分析: 3、重要結(jié)論:(后面章節(jié)還要仔細(xì)分析) 類在必要的時(shí)候才會被加載 這樣一來,我們很容易知道:該類的靜態(tài)初始化 也只有在必要的時(shí)候才會進(jìn)行, 分

15、析: 4、推論:初始化第二基本原則的重要補(bǔ)充 靜態(tài)對象的初始化發(fā)生在類的加載時(shí)期 非靜態(tài)對象的初始化發(fā)生在創(chuàng)建對象時(shí)期,八、數(shù)組初始化,1、 有關(guān)數(shù)組的基本知識 數(shù)組的概念 數(shù)組只是相同類型的,且用一個(gè)標(biāo)識符 封裝到一起的一個(gè)對象序列或基本類型 數(shù)據(jù)序列,八、數(shù)組初始化, 數(shù)組的聲明(P99) 如:int a;或者int a; 僅僅聲明了對數(shù)組的一個(gè)引用,而且 也沒有給數(shù)組對象本身分配任何空間,八、數(shù)組初始化, 數(shù)組的定義 包括給數(shù)組創(chuàng)建相應(yīng)的存儲空間, 以及對數(shù)組的初始化,八、數(shù)組初始化, 數(shù)組的固定成員length 同C/C+一樣,Java數(shù)組計(jì)數(shù)也是從 0開始,到length-1結(jié)束 一

16、旦越界,則系統(tǒng)自動拋出異常,八、數(shù)組初始化, 數(shù)組的大?。ㄅcC/C+很大不同) 數(shù)組的大小可以在運(yùn)行時(shí)刻才決定, P100的ArrayNew.java可證明這點(diǎn) 但是不推薦這種使用方式,八、數(shù)組初始化, 數(shù)組元素的類型可以是對象引用, 這種數(shù)組稱為引用數(shù)組 注意對引用數(shù)組進(jìn)行初始化,否則在 程序中所使用的是空引用(null),八、數(shù)組初始化,2、 可變參數(shù)列表 應(yīng)用于參數(shù)個(gè)數(shù)或類型未知的場合 典例分析P102, public class NewVarArgs / 可變參數(shù)列表的語法 static void printArray(Object.args) / Foreach語法 for(Object obj : agrs) System.out.println(obj+“”); Sy

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論