直接修改物件的成员变数课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《直接修改物件的成员变数课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 直接 修改 物件 成员 变数 课件
- 资源描述:
-
1、ROBERTCHAPTER 9 建構方法12本章重點本章重點l9-1 建構方法(Constructor)l9-2 封裝與資訊隱藏l9-3 static 共享成員變數l9-4 綜合演練3前言前言l以前一章範例程式中的汽車類別為例,每次建立物件後,都還要在 main()方法中另行設定物件的成員變數的設定物件的成員變數的(初始初始)值:值:void setCar(double g,double e)gas=g;eff=e;oldcar.setCar(100,10);4前言前言l如果可以將建立物件與設定物件狀態的動作結合在一起,會有以下優點:l避免忘記設定物件初始狀態,這種錯誤看起來雖然是小事,但往往
2、在程式出錯時也最容易忽略。由於編譯器無法猜測物件在產生後是否需要進行任何初始化的動作,因此無法像是警告您變數尚未設定初值的方式提出警示。l更接近自然界的物件。舉例來說,小嬰孩必定在出生前就決定了膚色與髮色,而不會是先出生,然後才顯現膚色或是髮色。既然如此,程式中的各個物件也應該在產生的同時就設定好初始狀態,直接參與程式的執行。l為了解決上述的問題,Java 這一類物件導向的程式語言便提供一個特別的機制,來幫物件設定初始狀態,而這也就是本章的主題。59-1 建構方法建構方法(Constructor)l建構方法就是物件導向程式語言對於物件初始化的解決方案。顧名思義,建構方法是一個方法(method
3、),比較特別的是:它是在建立物件時由系統自動自動呼叫,以建構物件初始的狀態,因此名之為建構方法。也因為在物件產生時會自動呼叫建構方法,因此使用 new 運算子時,才必須在類別的名稱之後加上一對小括號小括號,這對小括號的意義就是呼叫建構方法。建構方法與一般方法的比較建構方法與一般方法的比較建構方法建構方法l目的/功能:l設定物件(屬性/成員變數)之初始值l類別(class)中定義之注意事項1.建構方法名稱必須與類別名稱一樣2.沒有傳回值型態,連void也沒有!3.預設的建構方法=空的建構方法(若有定義建構方法,則必須自行定義預設建構方法)4.帶參數的建構方法,規則如一般方法5.主程式中使用方法:
4、無參數:TEST a=new TEST();有參數:TEST a=new TEST(1,2,3);1.在建構方法中要呼叫其他同名的建構方法,不可直呼其名,必須用this()取代之,且必須放置在方法中的第一行67建構方法建構方法(Constructor)l9-1-1 預設建構方法(Default Construcor)l9-1-2 自行定義建構方法l無參數的建構方法l具有參數的建構方法l9-1-3 建構方法的多重定義(Overloading)l9-1-4 this 保留字89-1-1 預設建構方法預設建構方法(Default Construcor)l建構方法的名稱與類別名稱相同相同,如果類別之中
5、並未定義任何建構方法,則 Java 編譯器會自動幫類別定義一個預設建構方法預設建構方法,例如:9預設建構方法預設建構方法(Default Construcor)l在上面這個例子中,Test 類別就沒有定義任何的建構方法,因此 Java 編譯器便會自動定義一個預設的建構方法,此時就如同以下的程式:109-1-2 自行定義建構方法自行定義建構方法l如果需要對新建立的物件進行任何初始化設定,那麼就可以自行定義建構方法。定義建構方法時除了要依循一般方法的定義規則外,還有以下幾點需要注意:l建構方法不能傳回任何值建構方法不能傳回任何值,因此因此不需也不能註明傳回不需也不能註明傳回值型別值型別,連連 vo
6、id 也不可加上也不可加上,如果加上傳回型別如果加上傳回型別,反反而會造成編譯錯誤而會造成編譯錯誤。l建構方法一定建構方法一定要和類別同名要和類別同名,而無法使用其他名稱來為建構方法命名。11無參數的建構方法無參數的建構方法試問:若增加Test b=new Test();b.x=?b.y=?12具有參數的建構方法具有參數的建構方法l建構方法也可以接受參數接受參數,讓物件的建構時更具彈性。建構方法若能接受參數,在建立物件時,就可以透過跟隨在 new 運算子以及類別名稱之後的那一對小括號傳入參數。例如:13試問:若增加Test b=new Test(40,30);b.x=?b.y=?14具有參數的
7、建構方法具有參數的建構方法l要特別注意的是,一旦定義了建構方法之後,使用 new 運算子產生物件時就必須依據建構方法的定義,傳入相同數量相同數量以及型型別的參數別的參數,就像是呼叫一般的方法一樣,否則編譯時就會產生錯誤,例如:15具有參數的建構方法具有參數的建構方法l編譯後的錯誤訊息告訴我們,編譯器找不到僅需要單一個整數的建構方法。169-1-3 建構方法的多重定義建構方法的多重定義(Overloading)l建構方法也和一般的方法一樣,可以使用多重定義多重定義的方式,定義多種版本的建構方法,以便能夠依據不同的場合,為新產生的物件進行最適當的初始設定。編譯器會依據所傳入參數的個數個數以及資料型
8、別資料型別,選擇符合的建構方法,就像是編譯器選擇多重定義的一般方法時一樣。l舉例來說,底下的類別就同時定義有多個版本的建構方法:17建構方法的多重定義建構方法的多重定義(Overloading)1819建構方法的多重定義建構方法的多重定義(Overloading)l有一點需要特別注意:當我們為類別定義需要參數的建構方法時,Java編譯器就不會替我們建立無參數的預設建構方法預設建構方法,因此這時候最好也自行為類別加上一個不需參數的建構方法不需參數的建構方法。因為當程式產生物件時,未必每次都需要將物件設定為特定狀態,此時這個不需參數的建構方法就可以提供一種預設狀態預設狀態給物件,撰寫程式時就可以享
9、有一定程度的方便性。l因此,建議在為類別設計建構方法時建議在為類別設計建構方法時,先定義一個不具參數的先定義一個不具參數的建構方法建構方法,可以將物件設定為預設的狀態。接著可以將物件設定為預設的狀態。接著,再根據不同的再根據不同的情況情況,定義特殊的版本定義特殊的版本。209-1-4 this 保留字保留字l由於建構方法主要的用途是設定物件的初始狀態,傳入的參數大多與類別的成員變數相關,因此在為這些參數命名時通常都會和成員變數相同,這時就和一般的方法一樣,參數的名稱會遮蔽掉遮蔽掉(Shadowing)成員變數。如果需要存取成員時,就可以使用上一章介紹過的 this 保留字保留字,以表示目前執行
10、此方法的物件。例如:2122this 保留字保留字l除了在參數名稱與成員名稱相同的情況派上用場外,this 保留字還有一個很大的妙用。l如果在建構方法中所需要進行的設定,有一部份在另外一個版本的建構方法中完全重複,而想要在直接呼叫該版本的建構方法時,並不能直接使用類別名稱呼叫該建構方法:2324this 保留字保留字l在第 6 行中,本來想要利用另一個只需單一參數的建構方法設定成員變數 x 的值,但是從編譯後的錯誤訊息說明了編譯器找不到一個叫做 Test()的方法。換句話說,雖然建構方法和一般方法很類似,但在 Java 中卻是被視為不同的元素,不能以呼叫其它方法的方式呼叫建構方法。因此要呼叫其
11、他版本的建構方法,必須使用 this 保留字保留字,例如:25注意:此二行不得調換,建構方法中呼叫另一同名建構方法this()必須為第一行26this 保留字保留字l第 6 行的敘述,就是使用 this 呼叫其他版本建構方法的方式,在 this 之後的小括號可以放入要傳遞給其他版本建構方法的參數,編譯器就是透過這裡的參數個數與型別來找尋適當的其他版本。l為了類別特性的一致性,建議您可以多利用 this 保留字,將重複的設定動作集中在適當的建構方法中,並且在其他需要同樣建構方式的建構方法中呼叫該建構方法,避免因為在不同的建構方法中的疏忽,而使得產生的物件行為或是特性不一致。279-2 封裝與資訊
12、隱藏封裝與資訊隱藏l學會建構方法的用法後,即可在建立物件時,一併完成物件的初始化,不必再於 main()方法中直接修改物件的成員變數。但我們現在僅只是不必直接存取成員變數,對物件導向程式設計方法對物件導向程式設計方法,則是要求則是要求不能不能直接修改物件的成員變數。直接修改物件的成員變數。以術語來說就是資訊隱藏資訊隱藏(Information Hiding),亦即類別外部(例如 main()方法)不能看到、接觸到物件內部的資訊(屬性)。28封裝與資訊隱藏封裝與資訊隱藏l那外部要如何得知或改變物件的屬性呢?那就必須透過類別公開給外部的方法,對應到生活中實際接觸的物件也是如此,例如要讓車子前進,必
13、透過車子提供給外部的油門;要轉彎,可使用方向盤;而要讓行進中的車子停止,則要使用剎車。油門、方向盤、剎車就是車子提供給我們操作車子的方法,使用這些方法,就會改變車子的狀態與屬性(速度、方向、位置、油量等等)。29封裝與資訊隱藏封裝與資訊隱藏l因此設計類別時,就必須提供必要的方法,讓外部能正常操作物件;l而透過這種程式設計方式,只要類別有公開能操作物件的方法,其他人就算完全不知道類別內部是如何設計、運作,也可透過這些公開的介面來使用我們所設計好的類別,達到程式碼重複使用、提高軟體開發效率的目的。l就好比大部份的駕駛人不會瞭解車子內部是如何設計與運作,但只要會使用車子公開的油門、方向盤、剎車.等介
14、面,就會開車。而將類別的屬性、操作屬性的方法包裝在一起,只對外公開必要的介面,即稱為封封裝裝(Encapsulation)。30封裝與資訊隱藏封裝與資訊隱藏l9-2-1 類別成員的存取控制l9-2-2 為成員變數撰寫存取方法l9-2-3 傳回成員物件的資訊3PFSl3PlPrivate:成員變數不得直接使用lsetXXX()、getXXX()lProtected、PubliclFlFinal:變數一經設定初始值後,不得再改變lSlStatic:一經宣告即可使用l用於變數:具獨立且共同之記憶體空間l用於方法:不須宣告即可以類別名稱呼叫之ltoString()印印中加物件名稱,若有宣告則呼叫toS
15、tring(),否則為該物件之參照位址lSystem.out.println(“IOU”+a);lSystem.out.println(“IOU”+a.toString();31329-2-1 類別成員的存取控制類別成員的存取控制l為了讓外部不能任意存取封裝在類別內的屬性或方法,我們必須在類別之中,使用存取控制字符存取控制字符(Access Modifier)來限制外部對類別成員變數的存取。以下可以使用的存取限制字符:33類別成員的存取控制類別成員的存取控制l其中 protected 存取控制字符會在第 11、13 章做進一步的說明,本章先說明 private 及 public。private
16、 存取控制字符,就如其英文字面含意一樣,是指該成員變數是類別所私有私有,除了類別中的方法以外,對於其他的類別來說,這個成員變數都好像看不到一樣,無法使用。例如:34類別成員的存取控制類別成員的存取控制35類別成員的存取控制類別成員的存取控制36類別成員的存取控制類別成員的存取控制l這正好一開始所提到的資訊隱藏特性,在上述的例子中,main()方法不能直接存取物件的成員變數值,只能透過類別所提供的 show()、modifyMember()方法來顯示或修改成員變數,至於怎麼顯示或修改,main()方法則不需去瞭解。l如果沒有特別標示存取控制字符,Java 就會採用預設控制預設控制(Default
17、 Access),也就是只有同一個套件(Package)的類別可以存取此成員變數。l套件:目前只需先記得,如果編譯好的.class 檔案都位於同一個資料夾,那麼這些類別就會被視為是在同一個套件中。l同一個檔案中的類別在編譯後都會在同一個資料夾下。l存取限制字符也可以應用在方法上,用來限制哪些方法可以被外界呼叫,而哪些方法只是提供給類別中的其他方法呼叫。379-2-2 為成員變數撰寫存取方法為成員變數撰寫存取方法l為了實作資訊隱藏資訊隱藏這個物件導向程式設計的基本觀念,在設計類別時,就要注意應盡量避免暴露類別內部的實作細節,讓類別的使用者可不依賴內部實作細節亦可撰寫程式。這樣的好處之一,即是若日
18、後類別需變更內部的實作方式,但只要它仍提供相同的操作方法,則使用者也不必修改使用到該類別的程式。l因此為了隱藏成員變數,我們就需適時地為成員變數加上存取限制。一般而言,可使用下列的原則:38為成員變數撰寫存取方法為成員變數撰寫存取方法l除非必要,最好所有成員變數都加上 private 存取限制。l如果使用此類別的程式需要透過成員來完成某件事,就由類別提供方法來完成。l如果需要修改或取得成員的值,就提供專門存取成員的方法。l通常用來取得取得成員值的方法會命名為 getXXX,其中 XXX 就是成員變數的名稱;相對的,l用來設定設定成員值的方法就稱為setXXX。這樣一來,可以將更改成員的動作侷限
19、在此方法中,往後對於除錯或要為更改成員而引發的影響加上處理工作時就會比較方便。39為成員變數撰寫存取方法為成員變數撰寫存取方法l相同的道理,對於類別中所定義的方法,加上存取限制的通則如下:l如果是要提供給外界呼叫的方法,請明確的標示為 public 存取限制。像是剛剛所提到的 get、set 方法,就是最好的例子。l如果只是供類別中其他的方法呼叫的方法,請明確的標示為 private 存取限制,以避免被類別外部的程式呼叫。40為成員變數撰寫存取方法為成員變數撰寫存取方法l對於建構方法,除非有特別的用途,否則應該都標示為 public,因為若是標示為 private,則 new 運算子就無法呼叫
展开阅读全文