1、National Taiwan UniversityDepartment of Computer Science and Information EngineeringManaging InheritanceLecturer:曾學文National Taiwan UniversityDepartment of Computer Science and Information EngineeringOutlinethis存取控制(Access Control)static 關鍵字實體成員與類別成員static 初值設定區塊Your Turn物件導向語言三大特性封裝(Encapsulation)繼
2、承(Inheritance)同名異型(Polymorphism)OverridingOverloadingsuper 關鍵字Java 物件祖先:Object 類別Final Classes and MethodsYour TurnNational Taiwan UniversityDepartment of Computer Science and Information Engineeringthis 關鍵字this 關鍵字:用來存取目前的物件通常在 instance method 或建構元(constructor)內使用 this,可以呼叫目前物件的任何成員。原因:成員變數被 method
3、 或是建構元內的同名參數給遮蔽了常使用在 constructor 裡,當參數與成員變數名稱相同時在 method 裡使用 this 的目的,是為了要避免成員變數與參數之間的混用(ambiguity),尤其當參數名稱與成員變數名稱相同時this 也可用來呼叫此物件的 methodsthis 也可以用來呼叫此物件的 constructorNational Taiwan UniversityDepartment of Computer Science and Information Engineeringthis 關鍵字可以透過 this,呼叫相同類別底下的另一個建構元呼叫相同類別底下的另一個建構元
4、public class AClass private int x,y;private int width,height;public AClass()this(0,0,0,0);public AClass(int width,int height)this(0,0,width,height);public AClass(int x,int y,int width,int height)this.x=x;this.y=y;this.width=width;this.height=height;.National Taiwan UniversityDepartment of Computer S
5、cience and Information Engineeringthis 關鍵字具有二個建構元的 Box 類別class Box double width,height,depth;/預設的建構元Box()this(1,2,3);/可以自行指定長寬的建構元Box(int width,int height,int depth)this.width=width;this.height=height;this.depth=depth;National Taiwan UniversityDepartment of Computer Science and Information Engineeri
6、ngthis 關鍵字Example:BoxDemo.javaclass BoxDemo public static void main(String args)/宣告、配置與初始化Box物件Box myBox1=new Box();Box myBox2=new Box(10,20,30);double vol1,vol2;/顯示第一個盒子的體積myBox1.showVolume();/獲得第二個盒子的體積myBox2.showVolume();National Taiwan UniversityDepartment of Computer Science and Information Eng
7、ineeringYour Turn建立一個 Rectangle 類別此類別必須完成下列要求建構元 初始化預設長、寬各為 8、4 可自行設定矩形之長與寬 可以複製相同物件的建構元(傳進去的參數為要copy的物件)顯示目前的長、寬之值取得目前矩形之面積畫矩形,由*構成邊長sdfsadsadsa在 RectangleDemo 類別下,寫個 main()來測試所有功能National Taiwan UniversityDepartment of Computer Science and Information EngineeringYour TurnHintclass Rectangle final
8、int DEFAULT_LENGTH=8;final int DEFAULT_WIDTH=4;private int length;private int width;Rectangle()Rectangle(int length,int width)Rectangle(Rectangle obj)void showLW()double getArea()void drawRect()public static void main(String args)National Taiwan UniversityDepartment of Computer Science and Informati
9、on Engineering存取控制(Access Control)控制存取的關鍵字public、protected、private置於類別或成員宣告之前若沒有指定任何存取權限,表示此類別或成員僅供相同類別庫的其他類別使用,稱為 package access 層級將類別或成員設定為 package access 層級的好處是可使同在一個類別庫下的每個類別互相使用成員National Taiwan UniversityDepartment of Computer Science and Information Engineering存取控制(Access Control)public任何類別皆可
10、存取defaultpacketage accessprotected允許宣告的類別、子類別與同一個套件中的類別使用private只有在類別內部可以存取對於成員變數,通常設定為 private 權限,再透過 methods,如 get/set 來存取資料National Taiwan UniversityDepartment of Computer Science and Information Engineering存取控制(Access Control)Class Access類別不可設定為 private 或 protected若為了避免他人任意使用 constructors 建立物件 可
11、將 constructors 設定為 private 另外提供 static 的 methods 建立物件、複製物件main()必須由程式外部的程式碼來呼叫(Java 執行時期系統),所以 main()必須為 public設計存取秘訣:設定適合但最嚴苛的存取等級。因此,盡量使用 private。如此在修改成員變數內容時,只能透過 method。除非,在評估設為 public後會對於程式效能有顯著提升的情況。National Taiwan UniversityDepartment of Computer Science and Information Engineering存取控制(Access
12、 Control)Example:Alpha.javaprivate int iamprivate=1;int iampackage=2;/package accessprotected int iamprotected=3;public int iampublic=4;private void privateMethod()System.out.println(iamprivate Method);void packageMethod()/default:package access System.out.println(iampackage Method);protected void p
13、rotectedMethod()System.out.println(iamprotected Method);public void publicMethod()System.out.println(iampublic Method);National Taiwan UniversityDepartment of Computer Science and Information Engineering存取控制(Access Control)Example:DeltaOne.javapackage One;public class DeltaOne public static void mai
14、n(String args)Alpha a=new Alpha();/a.privateMethod();/illegal a.packageMethod();/legal a.protectedMethod();/legal a.publicMethod();/legal /System.out.println(iamprivate:“+a.iamprivate);/illegal System.out.println(iampackage:“+a.iampackage);/legal System.out.println(iamprotected:“+a.iamprotected);/le
15、gal System.out.println(iampublic:“+a.iampublic);/legal National Taiwan UniversityDepartment of Computer Science and Information Engineering存取控制(Access Control)Example:DeltaTwo.javapackage Two;import One.*;public class DeltaTwo public static void main(String args)Alpha alpha=new Alpha();/alpha.privat
16、eMethod();/illegal /alpha.packageMethod();/illegal /alpha.protectedMethod();/illegal alpha.publicMethod();/legal /System.out.println(iamprivate:“+alpha.iamprivate);/illegal /System.out.println(iampackage:“+alpha.iampackage);/illegal /System.out.println(iamprotected:“+alpha.iamprotected);/illegal Sys
17、tem.out.println(iampublic:“+alpha.iampublic);/legal National Taiwan UniversityDepartment of Computer Science and Information Engineeringstatic 關鍵字實體成員與類別成員變數或 methods 若宣告為 static,則此變數或 methods 即為類別變數(class variables)或類別方法(class methods)宣告為 static 的變數或 methods 不屬於任何此類別的物件,屬於此類別所有物件共同擁有此類別所有物件共同擁有宣告 s
18、tatic DataType VarName;static ReturnType MethodName(Arg List)使用 ClassName.VarName ClassName.MethodName(Arg List)National Taiwan UniversityDepartment of Computer Science and Information Engineeringstatic 關鍵字使用時機無論此類別擁有多少物件,這份資料只需要一份某種方法在實行時,與個別的物件無關即便是沒有任何物件被產生,依舊可以使用被宣告成 static 的變數與 methods;相反的,inst
19、ance variables 與 methods 必須透過物件才能實施在 static methods 裡,無法直接呼叫 instance methods 或直接使用 instance variables因為 instance variables 與 methods 必須透過物件才能實施National Taiwan UniversityDepartment of Computer Science and Information Engineeringstatic 關鍵字被用 static 宣告的類別方法和類別變數,意思上就像是其他程式語言中的全域函數(global functions)和全域
20、變數(global variables),例如:語言因此,如果要很多宣告成 static 的方法或變數的話,必須要謹慎使用!National Taiwan UniversityDepartment of Computer Science and Information Engineeringstatic 關鍵字-實體成員與類別成員National Taiwan UniversityDepartment of Computer Science and Information Engineeringstatic 關鍵字-實體成員與類別成員Example:StaticDemo.javapublic
21、class StaticDemo public int instanceInteger=0;public int instanceMethod()return instanceInteger;public static int classInteger=0;public static int classMethod()return classInteger;public static void main(String args)National Taiwan UniversityDepartment of Computer Science and Information Engineering
22、static 初值設定區塊class 變數或是實體變數,可以直接設定初值public class BedAndBreakfast public static final int MAX_CAPACITY=10;/initialize to 10 private boolean full=false;/initialize to false 限制:不能用 if-else 來設定初值設定初值時,不可以處理 exceptions若發生 exceptions,也無法做錯誤處理National Taiwan UniversityDepartment of Computer Science and Inf
23、ormation Engineeringstatic 初值設定區塊static 初值設定區塊Java 允許將 static 變數集合起來進行初始化動作語法:因為 x 和 isOK 都是 class 變數,無法在建構元中設定初值,且利用 static 初設設定區塊可以處理 exceptions。class TestClass static int x;static boolean isOK;static x=100;/static int x;isOK=false;/static isOK;National Taiwan UniversityDepartment of Computer Scie
24、nce and Information Engineering建構元(Constructors)修飾建構元的關鍵字private 如果一個類別裡所有的建構元都是宣告成 private 的話,那這個類別應該會有 public 的類別方法(class method),讓其他類別建立此類別之物件protected 只有該類別的 subclass,或是屬同一個 package 裡的類別,才可以使用此建構元public 所有類別都可以使用此建構元預設 只有同一個 package 裡的類別,才能使用此建構元National Taiwan UniversityDepartment of Computer S
25、cience and Information EngineeringYour Turn整理上次寫的 Rectangle 類別此類別必須完成下列要求此類別不提供 constructor 供外部存取(為 private)要提供三個 class methods 來建立 Rectangle 物件 第一個是使用預設長寬:長 8,寬 4(createRect)第二個是可以讓使用者自行指定(createRect)第三個複製矩形(cloneRect)顯示目前的長、寬之值(showLW)取得目前矩形之面積(getArea)畫矩形,由*構成邊長(drawRect)National Taiwan Universit
26、yDepartment of Computer Science and Information EngineeringYour TurnHint/建構元private Rectangle()/另一個建構元private Rectangle(int length,int width)/此建構元提供給 cloneObj 用,用以複製private Rectangle(Rectangle obj)/提供一個可以製造長方形的 class methodstatic Rectangle createRect()/提供一個可以製造且自行設定長方形的 class methodstatic Rectangle
27、createRect(int len,int width)/複製此長方形static Rectangle cloneRect(Rectangle obj)/顯示現在的長、寬void showLW()/取得現在的面積double getArea()/畫出此長方形void drawRect()National Taiwan UniversityDepartment of Computer Science and Information Engineering物件導向三大特性封裝(Encapsulation)設計 Class,決定要將哪些屬性,方法,事件封入類別中的動作叫做封裝。讓程式碼可以以Cla
28、ss為單位分類,並讓文件撰寫可以用物件導向模式撰寫(e.g.,class diagram)。繼承(Inheritance)設計 Class 時,先利用現存 Class 作為“祖先”,再加以增加或修改功能的動作叫繼承。讓程式碼可以輕易地重複使用,並形成樹狀結構之class diagram。同名異型(Polymorphism)呼叫相同的函式,卻會出現不同的行為的現象,稱為同名異型。分為“overriding”及“overloading”。擴充既有程式碼之功能。National Taiwan UniversityDepartment of Computer Science and Informati
29、on Engineering物件導向三大特性封裝(Encapsulation)設計一個 Class 的屬性,方法,事件,稱為“封裝”一個類別。人類屬性:身高 體重 年齡方法:走路 跑步事件:被打 驚嚇 開心National Taiwan UniversityDepartment of Computer Science and Information Engineering物件導向三大特性繼承(Inheritance)設計 Class 時,先利用現存 Class 作為“祖先”,再加以增加或修改功能的動作叫繼承。讓程式碼可以輕易地重複使用,並形成樹狀結構之class diagram貝多芬貝多芬人類
30、屬性:身高 體重 年齡方法:走路 跑步事件:被打 驚嚇 開心=165=80=45音樂家音樂家作曲作曲發表發表National Taiwan UniversityDepartment of Computer Science and Information Engineering物件導向三大特性同名異型(Polymorphism)Overriding 若繼承下來後,不滿意祖先定義的方法,子孫可以在繼承以後重新改寫,稱為 Overriding。人類屬性:身高 體重 年齡方法:走路 跑步事件:被打 驚嚇 開心音樂家音樂家作曲作曲發表發表人類.走路()約一分鐘三十步 音樂家.走路()約一分鐘十步 同樣是
31、呼叫同樣是呼叫“走路走路”,宣告成人類與音樂家宣告成人類與音樂家就是不一樣。就是不一樣。National Taiwan UniversityDepartment of Computer Science and Information Engineering物件導向三大特性同名異型(Polymorphism)Overloading 同一份函式,準備多種定義,以供各種場合呼叫,稱為Overloading。人類屬性:身高 體重 年齡方法:走路 跑步事件:被打 驚嚇 開心音樂家音樂家作曲作曲作曲作曲(委託人委託人)音樂家音樂家.作曲作曲(“王先生王先生”)自動判斷National Taiwan Uni
32、versityDepartment of Computer Science and Information Engineering封裝(Encapsulation)將資料(屬性)與方法(行為)封裝在一個物件裡頭,物件裡頭的資料與方法被緊緊的綁在一起,並擁有資訊隱藏(Information hiding)的特性。Example:TimeDemo.javaclass Time private int hour;private int minute;private int second;public Time()public void setTime(int hh,int mm,int ss)pub
33、lic String toString()National Taiwan UniversityDepartment of Computer Science and Information Engineering繼承(Inheritance)繼承概念圖National Taiwan UniversityDepartment of Computer Science and Information Engineering繼承(Inheritance)語法:class ClassName extends BaseClass例如:class Line extends GraphicsObjectBase
34、 Class(SuperClass):基底類別、父類別Derived Class(Subclass):衍生類別、子類別Java 理論上不支援多重繼承,也就是說,一個子類別只能有一個父類別。子類別將會繼承到父類別中所有可以存取的成員,包括:變數以及方法注意:建構元(constructor)無法被繼承Java 中每個物件的總祖先:Object 類別(java.lang.Object)National Taiwan UniversityDepartment of Computer Science and Information Engineering繼承(Inheritance)可繼承成員Super
35、class 中宣告為 public 或 protected 的成員。如果 Subclass 與 Superclass 在同一個 package 中,會繼承未做任何存取控制宣告的成員。不可繼承成員如果 Subclass 與 Superclass 在不同 package,所有未宣告有效範圍的成員全部不繼承。(因為預設式 package access)Superclass 中宣告成 private 的成員National Taiwan UniversityDepartment of Computer Science and Information Engineering繼承(Inheritance)
36、Example:Dog.javapublic class Dog/屬性(Variables)private String name;private String color;private int age;/建構元(Constructor)public Dog(String name,String color,int age)this.name=name;this.color=color;this.age=age;/方法(Methods)public void bark()public void handshake()public void rollover(int theTimes)Nati
37、onal Taiwan UniversityDepartment of Computer Science and Information Engineering繼承(Inheritance)Example:Pomer.javapublic class Pomer extends Dog/建構元public Pomer(String name,String color,int age)super(name,color,age);/新的方法public void proud()System.out.println(哼.);National Taiwan UniversityDepartment o
38、f Computer Science and Information Engineering同名異型(Polymorphism)覆蓋 Overriding若繼承下來後,不滿意祖先定義的方法,子孫可以在繼承以後重新改寫,稱為 Overriding。可覆蓋成員 任何與 Superclass 同名的成員必覆蓋成員 Subclass 一定要覆蓋 superclass 中宣告為 abstract 的 methods,除非 subclass 本身也是 abstract 類別不可覆蓋成員 Subclass 不可覆蓋 superclass 的 final methodsNational Taiwan Univ
39、ersityDepartment of Computer Science and Information Engineering同名異型(Polymorphism)覆蓋 Overriding將 父類別 Dog 的 Handshake 方法 Override 掉class Pomer extends Dog/建構元public Pomer(String name,String color,String age)super(name,color,age);/將父類別 Dog 中原有的 handshake()方法 Override 掉public void handshake()System.out
40、.println(你的手洗了嗎?);public void proud()System.out.println(“哼.);National Taiwan UniversityDepartment of Computer Science and Information Engineering同名異型(Polymorphism)過載 Overloading同一份函式,準備多種定義,以供各種場合呼叫,稱為Overloading。建構元也可以利用參數的不同,來達成 overloadingNational Taiwan UniversityDepartment of Computer Science a
41、nd Information Engineering同名異型(Polymorphism)建構元的 Overloadingclass Pomer extends Dog/具有 overloading 的建構元public Pomer()super(“GoodDog”,“Red”,12);public Pomer(String name,String color,String age)super(name,color,age);/override 父類別 Dog 中的 handshake()方法public void handshake()System.out.println(你的手洗了嗎?);p
42、ublic void proud()System.out.println(“哼.);National Taiwan UniversityDepartment of Computer Science and Information Engineering同名異型(Polymorphism)方法的 Overloadingclass Pomer extends Dog/建構元public Pomer(String name,String color,String age)super(name,color,age);/具有 overloading 的 rollover()public void rol
43、lover()for(int i=1;i=5;i+)System.out.println(我滾 +i+次);public void rollover(int thetimes)for(int i=1;i=thetimes;i+)National Taiwan UniversityDepartment of Computer Science and Information Engineeringsuper 關鍵字this&super 關鍵字this:指的是目前的 classsuper:指的是父類別使用 super 來呼叫父類別中的方法語法:super.methodName(argList);su
44、per.Bark();super.Rollover(5);若子類別中沒有建構元(constructor),可單用 super 來呼叫父類別中的建構元語法:super(argList);National Taiwan UniversityDepartment of Computer Science and Information EngineeringJava 物件祖先:Object 類別Java 中的所有物件,全部繼承自 java.lang.Object只要程式設計師沒有以 extends 指定 繼承之物件,Java 會自動用 Object 作為所有物件的父物件。National Taiwan
45、 UniversityDepartment of Computer Science and Information EngineeringJava 物件祖先:Object 類別以下是 Object 中的方法,可能是您想 Overriding 的:clone()equals()toString()finalize()以下是 Object 中,宣告為 final 的方法,不可以 Overriding:getClass()hashCode()notify()notifyAll()wait()National Taiwan UniversityDepartment of Computer Scienc
46、e and Information EngineeringJava 物件祖先:Object 類別clone()原始宣告:protected Object clone()throws CloneNotSupportedException作用:複製一份物件本身,並傳回去。要求:要讓類別成為可複製類別的最簡單方法:在類別宣告最後加上 implements Cloneable Object 提供的 clone()功能很適合,但有些類別必須要覆蓋 clone(),才能提供正確的複製功能National Taiwan UniversityDepartment of Computer Science and
47、 Information EngineeringJava 物件祖先:Object 類別equals()原始宣告:public boolean equals(Object obj);作用:比較兩個物件的內含值是否相等。要求:無hashCode()回傳的 int 數值,代表物件在 hash table 裡對應位置。傳回物件在“雜湊表”(Hash Table)中的索引值。通常配合 java.util.Hashtable 使用National Taiwan UniversityDepartment of Computer Science and Information EngineeringJava
48、物件祖先:Object 類別finalize()原始宣告:protected void finalize()throws Throwable作用:物件離開其有效範圍時,一定會被叫用的函式。用來清除本物件以 new 霸佔的記憶體。系統會自動呼叫 finalize(),因此大部分的類別都不需要覆蓋 finalize()所以在 Java 中,要拋棄一個記憶體,只要:ObjA=null;ObjB=null;National Taiwan UniversityDepartment of Computer Science and Information EngineeringJava 物件祖先:Objec
49、t 類別toString()原始宣告:public String toString();作用:傳回一個此物件的描述字串toString()對除錯(debug)很有幫助System.out.println(new Double(Math.PI).toString();National Taiwan UniversityDepartment of Computer Science and Information EngineeringJava 物件祖先:Object 類別Example:TimeDemo.javaclass Time public String toString()return(h
50、our+:+(minute10?0:)+minute+:+(second10?0:)+second);National Taiwan UniversityDepartment of Computer Science and Information EngineeringJava 物件祖先:Object 類別getClass()原始宣告:public final Class getClass();作用:可取得一個類別的所有資訊。包括類別名稱,父類別名稱,實作介面名稱,所有成員變數及成員函式,甚至於可以由取回的 class 資料個體化一個物件。要求:不准覆寫(Overriding)傳回值:傳回 j
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。