![[高等教育]第4章類的重用.ppt_第1頁](http://file2.renrendoc.com/fileroot3/2018-12/27/f5afdf94-9fec-4264-9ebf-5f9c5ecd9112/f5afdf94-9fec-4264-9ebf-5f9c5ecd91121.gif)
![[高等教育]第4章類的重用.ppt_第2頁](http://file2.renrendoc.com/fileroot3/2018-12/27/f5afdf94-9fec-4264-9ebf-5f9c5ecd9112/f5afdf94-9fec-4264-9ebf-5f9c5ecd91122.gif)
![[高等教育]第4章類的重用.ppt_第3頁](http://file2.renrendoc.com/fileroot3/2018-12/27/f5afdf94-9fec-4264-9ebf-5f9c5ecd9112/f5afdf94-9fec-4264-9ebf-5f9c5ecd91123.gif)
![[高等教育]第4章類的重用.ppt_第4頁](http://file2.renrendoc.com/fileroot3/2018-12/27/f5afdf94-9fec-4264-9ebf-5f9c5ecd9112/f5afdf94-9fec-4264-9ebf-5f9c5ecd91124.gif)
![[高等教育]第4章類的重用.ppt_第5頁](http://file2.renrendoc.com/fileroot3/2018-12/27/f5afdf94-9fec-4264-9ebf-5f9c5ecd9112/f5afdf94-9fec-4264-9ebf-5f9c5ecd91125.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第4章 類的重用,Page 2,目錄,4.1 類的繼承 4.2 Object類 4.3 終結(jié)類與終結(jié)方法 4.4 抽象類 4.5 類的組合 4.6 包的應(yīng)用 4.7 本章小結(jié),Page 3,4.1 類的繼承,4.1.1 繼承的概念 1. 繼承的概念 繼承是一種由已有的類創(chuàng)建新類的機(jī)制,是面向?qū)ο蟪绦蛟O(shè)計(jì)的基石之一。 通過繼承,可以根據(jù)已有類來定義新類,新類擁有已有類的所有功能。 基類(base class):也稱超類(superclass)或者父類,是被直接或間接繼承的類。 派生類(derived-class):也稱子類(subclass),是繼承其他類而得到的類。繼承所有父類的狀態(tài)和行為,派
2、生類可以增加變量和方法,派生類也可以覆蓋(override)繼承的方法。,Page 4,父類是所有子類的公共屬性及方法的集合,子類則是父類的特殊化。 子類只需指明新類與現(xiàn)有類的不同,即增加自己的屬性和方法即可。 繼承介于類之間,而不是對象之間。 Java要求每個(gè)類都有父類,當(dāng)沒有顯式指定父類時(shí),父類隱含為java.lang包的Object類。 Java不支持類的多重繼承,只支持類的單繼承,即每個(gè)子類只能有一個(gè)直接父類。一個(gè)父類可以派生出多個(gè)子類。 一個(gè)對象從其所有的父類中繼承屬性及行為。,Page 5,在類層次結(jié)構(gòu)中,子類與父類的關(guān)系是子類對象與父類對象存在“IS A”(或 “is kind
3、of”)的關(guān)系。,Page 6,圖4-1 動物類層次舉例,爬行動物是動物的一種,壁虎是一種蜥蜴,Page 7,又一例子,Page 8,圖4-2 錯(cuò)誤的繼承關(guān)系,汽車與發(fā)動機(jī)、車身的關(guān)系不是“is a”的關(guān)系,而是”has a”的關(guān)系。,Page 9,2. 繼承的意義 采用繼承的機(jī)制來組織、設(shè)計(jì)系統(tǒng)中的類,可以提高程序的抽象程度,使之更接近于人類的思維方式。 采用繼承編寫的程序結(jié)構(gòu)清晰,節(jié)省了編程時(shí)間,因?yàn)榇a的編寫量減少,因此也降低了維護(hù)的工作量。,Page 10,4.1.2 繼承的語法 繼承的語法格式: ClassModifier class childClass extends paren
4、tClass implements interface /類體 說明 關(guān)鍵字extends說明要聲明的類需要繼承的父類; parentClass是被繼承的父類名稱。,Page 11,派生類成員 繼承基類聲明為public 或protected 的成員。 如果基類和派生類在同一個(gè)包中,派生類可以繼承基類沒有訪問權(quán)限標(biāo)志符的(缺省的)成員。 如果派生類某成員名和基類某成員名同名,派生類同名變量成員隱藏基類成員,派生類同名方法成員覆蓋基類成員。,Page 12,例4-1 在一個(gè)公司中,有普通員工(Employees)及管理者(Managers)兩類人員。 職員對象(Employees)可能有的屬性信
5、息包括: 員工號(employeeNumber)、姓名(name)、 地址(address)、電話號碼(phoneNumber)。 管理者(Managers)除具有普通員工的屬性外,還可能具有下面的屬性: 職責(zé)(responsibilities)、所管理的職員(listOfEmployees)。 可設(shè)計(jì)Employee及Manager兩個(gè)類,將Manager類作為Employee類的子類。,Page 13,Employee與Manager的類圖,Page 14,/父類Employee class Employee int employeeNumbe ; String name, address
6、, phoneNumber ; /子類Manager class Manager extends Employee /子類增加的數(shù)據(jù)成員 String responsibilities, listOfEmployees; ,Page 15,例4-2 公有(及保護(hù))屬性及行為成員的繼承。 設(shè)有三個(gè)類:Person, Employee, Manager。 其類層次如圖4-4所示:,圖4-4 類層次,Page 16,public class Person /Person類定義 public String name; public String getName( ) return name; publ
7、ic class Employee extends Person /Employee類定義 public int employeeNumber; public int getEmployeeNumber( ) return employeeNumber; public class Manager extends Employee /Manager類定義 public String responsibilities; public String getResponsibilities( ) return responsibilities; ,Page 17,public class Ex4_2T
8、est /測試類 public static void main(String args) Employee li = new Employee( ); = Li Ming; li.employeeNumber = 123456; System.out.println(li.getName( ); System.out.println(li.getEmployeeNumber( ); Manager he = new Manager( ); = He Xia; he.employeeNumber = 543469; he.responsibilities = I
9、nternet project; System.out.println(he.getName( ); System.out.println(he.getEmployeeNumber( ); System.out.println(he.getResponsibilities( ); ,Page 18,結(jié)論:子類的對象可以使用其父類中聲明為公有(及保護(hù))的屬性和方法,就如同在其自己的類中聲明一樣。,Page 19,例4-3 私有成員的繼承。 public class B public int a = 10; private int b = 20; protected int c = 30; pub
10、lic int getB( ) return b; public class A extends B public int d; public void tryVariables( ) System.out.println(a); /允許 System.out.println(b); /不允許 System.out.println(getB( ); /允許 System.out.println(c); /允許 ,Page 20,對類A進(jìn)行編譯 系統(tǒng)會提示編譯錯(cuò)誤:“A.java:7: b has private access in B” 說明 b是從類繼承來的,由于b是私有屬性,不能在A類中直
11、接存取,但可以使用繼承來的共有方法getB( )取得。 結(jié)論:子類不能直接訪問從父類中繼承的私有屬性及方法,但可使用公有(及保護(hù))方法進(jìn)行訪問。,Page 21,4.1.3 隱藏和覆蓋,隱藏和覆蓋 是指子類對從父類繼承來的屬性變量及方法可以重新加以定義。,class Parent int num; void set(int n) num=n; ,class Child extends Parent int num; void set(int n) num=n; num+=10; ,Page 22,1. 屬性的隱藏(hidden) 子類對從父類繼承來的屬性變量重新加以定義,則從父類繼承的屬性將被
12、隱藏。 子類擁有了兩個(gè)相同名字的變量,一個(gè)繼承自父類,另一個(gè)由自己聲明。 當(dāng)子類執(zhí)行繼承自父類的操作時(shí),處理的是繼承自父類的變量,而當(dāng)子類執(zhí)行它自己聲明的方法時(shí),所操作的就是它自己聲明的變量,而把繼承自父類的變量“隱藏”起來了 。,Page 23,如何訪問被隱藏的父類屬性,兩種方法: 調(diào)用從父類繼承的方法,則操作的是從父類繼承的屬性。 使用super.屬性,Page 24,例4-4 屬性的隱藏舉例。已知三個(gè)類:電話卡類(PhoneCard)、有卡號的電話卡(Number_PhoneCard)、200卡(D200_Card)。,類層次結(jié)構(gòu)圖,Page 25,class PhoneCard /電話
13、卡類 double balance; /余額 boolean performDial( ) ; /撥打電話 double getBalance( ) return balance; /獲取余額 ,Page 26,/有卡號的電話卡類 class Number_PhoneCard extends PhoneCard long cardNumber; /卡號 int password; /密碼 String connectNumber; /連接號碼 boolean connect; /是否連接上 boolean performDial( ) ; /方法覆蓋 double getBalance( )
14、return balance; /方法覆蓋 ,Page 27,class D200_Card extends Number_PhoneCard final double additoryFee=0; /附加費(fèi) double balance; /屬性隱藏,與父類的成員相同 boolean performDial( ) /方法覆蓋 if(balance(0.5+additoryFee) balance-=0.5+additoryFee; return true; else return false; double getBalance( ) return balance; /方法覆蓋 double
15、 getSuperBalance( ) return super.balance; ,Page 28,public class Ex4_4 /測試類 public static void main(String args ) D200_Card d=new D200_Card( ); d.balance=10; d.performDial( ); System.out.println(d.getBalance( ); System.out.println(d.getSuperBalance( ); ,運(yùn)行結(jié)果: 9.5 0.0,Page 29,例4-5 屬性的隱藏舉例2。,class B1 e
16、xtends A1 int x=100; void printb( ) super.x = super.x +10 ; System.out.println (super.x= + super.x+ x= + x); ,class A1 int x = 2; public void setx(int i) x = i; void printa( ) System.out.println(x); ,Page 30,public class Ex4_4Test /測試類 public static void main(String args) A1 a1 = new A1( ); a1.setx(
17、4); a1.printa( ); B1 b1 = new B1( ); b1.printb( ); b1.printa( ); b1.setx(6); / 將繼承來的x值設(shè)置為6 b1.printb( ); b1.printa( ); a1.printa( ); ,輸出結(jié)果: 4,輸出結(jié)果: super.x= 12 x= 100 12,輸出結(jié)果: super.x= 16 x= 100 16 4,Page 31,子類不能繼承父類中的靜態(tài)屬性,但可以對父類中的靜態(tài)屬性進(jìn)行操作。如在上面的例子中,將“int x = 2;”改為“static int x = 2;”,再編譯及運(yùn)行程序,會得到下面的結(jié)
18、果:,4 / a1.printa( );”輸出的結(jié)果 super.x= 14 x= 100 14 super.x= 16 x= 100 16 16 /a1.printa( );”輸出的結(jié)果,Page 32,2.方法覆蓋(重寫): Overriding 如果子類不需使用從父類繼承來的方法的功能,則可以聲明自己的同名方法,稱為方法覆蓋。 覆蓋方法的返回類型、方法名稱、參數(shù)的個(gè)數(shù)及類型必須和被覆蓋的方法一模一樣。 只需在方法名前面使用不同的類名或不同類的對象名即可區(qū)分覆蓋方法和被覆蓋方法。 覆蓋方法的訪問權(quán)限可以比被覆蓋的寬松,但是不能更為嚴(yán)格。,Page 33,方法覆蓋的應(yīng)用場合 (1)子類中實(shí)現(xiàn)
19、與父類相同的功能,但采用不同的算法或公式。,例如,在例4-1中的Employee類中定義以下方法 用于計(jì)算月工資。 public float computePay( ) return (yearSalary/12f); ,在Manager類中重寫computePay方法: public float computePay( ) return (regularHoursWorked*payRate)+(overTimeHoursWorked*1.5f*payRate); ,Page 34,(2)在名字相同的方法中,要做比父類更多的事情。 例如,銀行賬號分為普通賬號BankAccount、存款賬號(
20、SavingAccount)及支票賬號(CheckingAccount) 它們之間的關(guān)系如圖4-6所示。,圖4-6 類層次關(guān)系,Page 35,假設(shè)BankAccount類定義了取款方法如下: public void withdraw(float anAmount) balance-=anAmount; ,現(xiàn)在其子類CheckingAccount重寫該方法如下: public void withdraw(float amount) super.withdraw(amount+1.25f); ,Page 36,(3)在子類中需要取消從父類繼承的方法。 假設(shè)要在SuperSavingAccount
21、類中取消從BankAccount類繼承來的取款方法,則重寫為: public void withdraw(float amount) /Do Nothing,方法體為空 ,Page 37,方法覆蓋的注意事項(xiàng) (1)必須覆蓋的方法 派生類必須覆蓋基類中的抽象的方法,否則派生類自身也成為抽象類。 (2)不能覆蓋的方法 基類中聲明為final的終結(jié)方法。 基類中聲明為static 的靜態(tài)方法。,Page 38,class Super int num; public int getNum( ) return num; ,class Sub extends Super int num; public i
22、nt getSuperNum1( ) return super.num; public int getSuperNum2( ) return super.getNum( ); ,從子類訪問父類被隱藏的成員變量,方法為:super.成員變量名; 例如,super.num 在子類中調(diào)用父類被覆蓋的方法,格式如下: super.overriddenMethodName(params );,super關(guān)鍵字的用法:,Page 39,方法覆蓋(重寫)與方法重載的異同,相同點(diǎn): 1)都要求方法同名。 2)都可以用于抽象方法和非抽象方法之間。 不同點(diǎn): 1)方法覆蓋要求參數(shù)簽名(參數(shù)個(gè)數(shù)、類型、順序)必須一
23、致,而方法重載要求參數(shù)簽名必須不一致。 2)方法覆蓋要求返回類型必須一致,而方法重載對此不做限制。 3)方法覆蓋只能用于子類覆蓋父類的方法,方法重載用于同一個(gè)類的所有方法(包括從父類中繼承而來的方法)。,Page 40,4)方法覆蓋對方法的訪問權(quán)限和拋出的異常有特殊的要求,而方法重載在這方面沒有任何限制。 方法覆蓋要求子類方法的訪問權(quán)限不能小于父類的訪問權(quán)限,一般與父類中聲明的訪問權(quán)限相同。 若父類拋出異常,則子類可以拋出異常,也可以不拋出異常;但若父類未拋出異常,則子類不能拋出異常。 5)父類的一個(gè)方法只能被子類覆蓋一次,而一個(gè)方法在所在的類中可以被重載多次。,Page 41,以下子類Sub
24、覆蓋了父類Base的method(int v) 方法, 并且提供了多種重載方法。 public class Base protected void method(int v) private void method(String s) /重載 public abstract class Sub extends Base public void method(int v) /覆蓋 public int method(int v1,int v2) return 0; /重載 protected void method(String s) throws Exception /重載 abstract
25、void method( ); /重載 ,Page 42,4.1.4 有繼承時(shí)的構(gòu)造方法,有繼承時(shí)的構(gòu)造方法遵循以下的原則: 子類不能從父類繼承構(gòu)造方法。 好的程序設(shè)計(jì)方法是在子類的構(gòu)造方法中調(diào)用某一個(gè)父類構(gòu)造方法,調(diào)用語句必須出現(xiàn)在子類構(gòu)造方法的第一行,可使用super關(guān)鍵字。 如果子類構(gòu)造方法的聲明中沒有明確調(diào)用父類構(gòu)造方法,則系統(tǒng)在執(zhí)行子類的構(gòu)造方法時(shí)會自動調(diào)用父類的缺省構(gòu)造方法(即無參的構(gòu)造方法)。,Page 43,例4-6 有繼承時(shí)的構(gòu)造方法舉例。 public class Person /父類 protected String name, phoneNumber, address;
26、 public Person( ) /無參構(gòu)造方法 this(, , ); public Person(String aName,String aPhoneNumber, String anAddress) /帶參構(gòu)造方法 name=aName; phoneNumber=aPhoneNumber; address=anAddress; ,Page 44,public class Employee extends Person /子類 protected int employeeNumber; protected String workPhoneNumber; public Employee(
27、) /此處隱含調(diào)用父類Person的構(gòu)造方法 Person( ) this(0, ); public Employee(int aNumber, String aPhoneNumber) /此處隱含調(diào)用父類Person的構(gòu)造方法 Person( ) employeeNumber=aNumber; workPhoneNumber = aPhoneNumber; ,Page 45,public class Professor extends Employee protected String research; public Professor( ) super( ); /顯式調(diào)用父類的默認(rèn)構(gòu)造方
28、法 research = ; public Professor(int aNumber, String aPhoneNumber, String aResearch) super(aNumber, aPhoneNumber); research = aResearch; ,Page 46,無參數(shù)的構(gòu)造方法: class Art Art( ) System.out.println(Art constructor); class Drawing extends Art Drawing( ) System.out.println(Drawing constructor); public class
29、Cartoon extends Drawing Cartoon( ) System.out.println(Cartoon constructor); public static void main(Stringargs) Cartoon x = new Cartoon( ); ,輸出結(jié)果: Art constructor Drawing constructor Cartoon constructor,Page 47,有參數(shù)的構(gòu)造方法: class Game Game(int i) System.out.println(Game constructor); class BoardGame ex
30、tends Game BoardGame(int i) super(i); System.out.println(BoardGame constructor); ,問題1:去掉該語句會出現(xiàn)錯(cuò)誤嗎?,Page 48,public class Chess extends BoardGame Chess( ) super(11); System.out.println(Chess constructor); public static void main(String args) Chess x = new Chess( ); ,輸出結(jié)果: Game constructor BoardGame co
31、nstructor Chess constructor,問題2:去掉該語句會出現(xiàn)錯(cuò)誤嗎?,Page 49,4.1.5 應(yīng)用舉例 在一個(gè)公司管理信息系統(tǒng)中,包括 普通員工(Employees),其可能有的屬性信息包括 員工號(employeeNumber) 姓名(name) 地址(address) 電話號碼(phoneNumber) 管理者(Magagers),除具有普通員工所具有的屬性及行為外,還具有下面的屬性和行為 職責(zé)(responsibilities) 所管理的職員(listOfEmployees) 工資的計(jì)算方法與一般員工不同;福利與一般員工不同 顧客(Customers),可能有的屬
32、性信息包括: 姓名(name)、地址(address)、電話號碼(phoneNumber),Page 50,類層次結(jié)構(gòu),Page 51,4.2 Object 類,Object類 在java.lang包 Java程序中所有類的直接或間接父類,類庫中所有類的父類,處在類層次最高點(diǎn)。 包含了所有Java類的公共屬性,其構(gòu)造方法是Object( )。,Page 52,Object類定義了所有對象必須具有的狀態(tài)和行為,較主要的方法如下: public final Class getClass( ) 獲取當(dāng)前對象所屬的類信息,返回Class對象 public String toString( ) 返回當(dāng)前
33、對象本身的有關(guān)信息 public boolean equals(Objectobj) 比較兩個(gè)對象是否是同一對象,是則返回true protected Object clone( ) 生成當(dāng)前對象的一個(gè)拷貝,并返回這個(gè)復(fù)制對象 public int hashCode( ) 返回該對象的哈希代碼值 protected void finalize( ) throws Throwable 定義回收當(dāng)前對象時(shí)所需完成的資源釋放工作,Page 53,1. 相等和同一 如果兩個(gè)對象具有相同的類型及相同的屬性值,則稱二者相等(equal)。 如果兩個(gè)引用變量指向的是同一個(gè)對象,則稱這兩個(gè)變量(對象)同一(i
34、dentical)。 兩個(gè)對象同一,則肯定相等。 兩個(gè)對象相等,不一定同一。 等號“=” 判斷的是這兩個(gè)對象是否同一。,Page 54,例4-8 判斷兩個(gè)對象是否同一。 public class Ex4_7 public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAccount(Bob, 123456, 100.00f); if (a = b) System.out.println(YES); else System.o
35、ut.println(NO); ,運(yùn)行結(jié)果:NO,Page 55,修改例4-7的程序 public class Ex4_7 public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = a; if (a = b) System.out.println(YES); else System.out.println(NO); ,運(yùn)行結(jié)果:YES,Page 56,2. Object類中的equals( ) 方法 由于Object是類層次結(jié)構(gòu)中的樹根節(jié)
36、點(diǎn),因此所有其他類都繼承了equals( )方法。 Object類中的 equals( ) 方法的定義如下,可見,也是判斷兩個(gè)對象是否同一。 public boolean equals(Object x) return this = x; ,Page 57,例4-9 Object類中equals方法的使用舉例。 public class EqualsTest public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAcc
37、ount(Bob, 123456, 100.00f); if (a.equals(b) System.out.println(YES); else System.out.println(NO); ,/等價(jià)于a=b,由于不是同一對象,運(yùn)行結(jié)果仍然是“NO”,Page 58,3. equlas方法的重寫 要判斷兩個(gè)對象各個(gè)屬性域的值是否相同,則不能使用從Object類繼承來的equals方法,而需要在類聲明中對equals方法進(jìn)行重寫。 String類中已經(jīng)重寫了Object類的equals方法,可以判別兩個(gè)字符串是否內(nèi)容相同。,Page 59,在BankAccount類中增加equals方法,由
38、于是對Object類中的equals方法進(jìn)行重寫,因此方法定義頭必須與Object類中的equals方法完全相同。,public boolean equals(Object x) if (this.getClass( ) != x.getClass( ) /類型不同 return false; BankAccount b = (BankAccount) x; return (this.getOwnerName( ).equals(b.getOwnerName( ) ,Page 60,例4-10 equals方法的應(yīng)用舉例。 public class Apple private String c
39、olor; private boolean ripe; public Apple(String aColor, boolean isRipe) color = aColor; ripe = isRipe; public void setColor(String aColor) color = aColor; public void setRipe(boolean isRipe) ripe = isRipe; ,Page 61,public String getColor( ) return color; public boolean getRipe( ) return ripe; public
40、 String toString( ) if (ripe) return(A ripe + color + apple); else return(A not so ripe + color + apple); public boolean equals(Object obj) if (obj instanceof Apple) Apple a = (Apple) obj; return (color.equals(a.getColor() ,Page 62,public class AppleTester public static void main(String args) Apple
41、a = new Apple(red, true); Apple b = new Apple(red, true); System.out.println(a + is equal to + b + : + a.equals(b); System.out.println(a is identical to b: + (a = b); Apple c = a; System.out.println(a + is equal to + c + : + a.equals(c); System.out.println(a is identical to c: + (a = c); ,Page 63,運(yùn)行
42、結(jié)果 A ripe red apple is equal to A ripe red apple: true a is identical to b: false A ripe red apple is equal to A ripe red apple: true a is identical to c: true,Page 64,Clone方法 根據(jù)已存在的對象構(gòu)造一個(gè)新的對象。 在根類Object 中被定義為protected,所以需要覆蓋為protected。,在例4-10的Apple類中增加Clone方法,代碼如下: protected Object clone( ) Apple a
43、napple=new Apple(this.color,this.ripe); return anapple; 另外:在main方法中增加如下代碼: Apple d=(Apple)a.clone( ); System.out.println(a is identical to d: +(a=d); System.out.println(a is equal to d: +(a.equals(d);,輸出: false true,Page 65,若把clone( )方法改為 protected Object clone( ) Apple anapple=this; return anapple;
44、 Apple d=(Apple)a.clone( ); System.out.println(a is identical to d: +(a=d); System.out.println(a is equal to d: +(a.equals(d);,輸出: true true,Page 66,finalize方法 在對象被垃圾回收器回收之前,系統(tǒng)自動調(diào)用對象的finalize方法。該方法類似于C+語言的析構(gòu)函數(shù)。 finalize的方法頭protected void finalize( ) 。 如果要覆蓋finalize方法,覆蓋方法的最后必須調(diào)用super.finalize( )。 tr
45、y super.finalize( ); catch(Throwable e) System.out.println(e); ,Page 67,getClass方法 方法頭:public final Class getClass( ) ,返回一個(gè)Class對象,用來代表對象隸屬的類。 通過Class 對象,可以查詢Class對象的各種信息:比如它的名字、它的基類、它所實(shí)現(xiàn)接口的名字等。 void PrintClassName(Object obj) System.out.println(The Objects class is + obj.getClass( ).getName( ) + nI
46、ts SupperClass is + obj.getClass( ). getSuperclass( ); ,Page 68,notify、notifyAll、wait方法 final方法,不能覆蓋 public final void notify( ) public final void notifyAll( ) public final void wait(longtimeout) throws InterruptedException public final void wait(longtimeout, intnanos) throws InterruptedException pu
47、blic final void wait( ) throws InterruptedException 這三個(gè)方法主要用在多線程程序中,Page 69,4.3 終結(jié)類與終結(jié)方法,終結(jié)類與終結(jié)方法 被final修飾符修飾的類和方法。 終結(jié)類不能被繼承。 終結(jié)方法不能被當(dāng)前類的子類重寫。,Page 70,4.3.1 終結(jié)類,終結(jié)類的特點(diǎn) 不能有派生類。 終結(jié)類存在的理由 安全: 黑客用來攪亂系統(tǒng)的一個(gè)手法是建立一個(gè)類的派生類,然后用他們的類代替原來的類。 設(shè)計(jì): 你認(rèn)為你的類是最好的或從概念上你的類不應(yīng)該有任何派生類。,Page 71,聲明ChessAlgorithm 類為final 類 fina
48、l class ChessAlgorithm . . . 如果編寫如下程序: class BetterChessAlgorithm extends ChessAlgorithm 編譯器將顯示一個(gè)錯(cuò)誤 BetterChessAlgorithm.java:6: Cannot inherit froms final ChessAlgorithm,Page 72,終結(jié)方法的特點(diǎn) 不能被派生類覆蓋(重寫)。 終結(jié)方法存在的理由 對于一些比較重要且不希望子類進(jìn)行更改的方法,可以聲明為終結(jié)方法。可防止子類對父類關(guān)鍵方法的錯(cuò)誤重寫,增加了代碼的安全性和正確性。 提高運(yùn)行效率。對于final方法,Java編譯器
49、可以將該方法的字節(jié)碼直接放到調(diào)用它的程序中。,4.3.2 終結(jié)方法,Page 73,例4-11 final 方法舉例。 class Parent public Parent( ) /構(gòu)造方法 final int getPI( ) return Math.PI; /最終方法 ,class Child extends Parent public Child( ) /構(gòu)造方法 int getPI( ) return 3.14; /重寫父類中的終結(jié)方法,不允許 ,Page 74,4.4 抽象類,4.4.1 抽象類的聲明 抽象類的概念 代表一個(gè)抽象概念的類。 沒有具體實(shí)例對象的類,不能使用new方法進(jìn)行
50、實(shí)例化。 類前需加修飾符abstract。 可包含常規(guī)類能夠包含的任何東西,例如構(gòu)造方法,非抽象方法。 也可包含抽象方法,這種方法只有方法的聲明,而沒有方法的實(shí)現(xiàn)。,Page 75,存在意義 抽象類是類層次中較高層次的概括,抽象類的作用是讓其他類來繼承它的抽象化的特征。 抽象類中可以包括被它的所有子類共享的公共行為。 抽象類可以包括被它的所有子類共享的公共屬性。 在程序中不能用抽象類作為模板來創(chuàng)建對象。 在用戶生成實(shí)例時(shí)強(qiáng)迫用戶生成更具體的實(shí)例,保證代碼的安全性。,Page 76,幾何形狀的例子 將所有圖形的公共屬性及方法抽象到抽象類 Shape。再將2D及3D對象的特性分別抽取出來, 形成兩
51、個(gè)抽象類TwoDimensionalShape及 ThreeDimensionalShape 2D圖形包括Circles、Triangles、Rectangles和Squares。 3D圖形包括Cube、Sphere、或Tetrahedron。 在UML中,抽象類的類名為斜體,以與具體類相區(qū)別。,Page 77,Page 78,抽象類聲明的語法形式為 abstract class className . . . 例如: abstract class Number . . . 如果寫: new Number( ); 編譯器將顯示錯(cuò)誤,Page 79,4.4.2 抽象方法,抽象方法 僅有方法頭,而
52、沒有方法體和操作實(shí)現(xiàn)。 聲明的語法形式為 public abstract (.); 具體實(shí)現(xiàn)由當(dāng)前類的不同子類在它們各自的類聲明中完成。 抽象類可以包含抽象方法。,Page 80,需注意的問題 一個(gè)抽象類的子類如果不是抽象類,則它必須為父類中的所有抽象方法書寫方法體,即重寫父類中的所有抽象方法。 只有抽象類才能具有抽象方法,即如果一個(gè)類中含有抽象方法,則必須將這個(gè)類聲明為抽象類。 除了抽象方法,抽象類中還可以包括非抽象方法。 不可以將abstract與static、native、synchronized合用。,Page 81,抽象方法的優(yōu)點(diǎn) 隱藏具體的細(xì)節(jié)信息,使調(diào)用該方法的程序不必過分關(guān)注該
53、類和它的各子類的內(nèi)部狀況。 所有的子類使用的都是相同的方法頭,而方法頭里實(shí)際包含了調(diào)用該方法的程序語句需要了解的全部信息。 強(qiáng)迫子類完成指定的行為,抽象類的所有非抽象子類都必須完成其父類中聲明的抽象方法,抽象類通常聲明抽象方法規(guī)定其子類需要用到的“標(biāo)準(zhǔn)”行為。,Page 82,一個(gè)繪圖的例子 各種圖形都需要實(shí)現(xiàn)繪圖方法,可在它們的抽象父類 中聲明一個(gè)draw抽象方法。 abstract class GraphicObject int x, y; void moveTo(int newX, int newY) . . . abstract void draw( ); ,Page 83,然后在每一
54、個(gè)子類中重寫draw方法,例如: class Circle extends GraphicObject void draw( ) . . . class Rectangle extends GraphicObject void draw( ) . . . ,Page 84,例4-12:貸款(Loan)分為許多種類,如租借(Lease)、抵押(Mortgage)、房屋貸款(HouseLoan)、汽車貸款(CarLoan)等。,Page 85,public abstract class Loan /抽象方法,計(jì)算月還款值 public abstract float calculateMonthly
55、Payment( ); /抽象方法,還款 public abstract void makePayment(float amount); /非抽象方法,取得客戶信息 public Client getClientInfo( ) ,Page 86,補(bǔ)充例子:抽象的電話卡類,abstract class PhoneCard /自定義抽象類 double balance; abstract void performDial( ); /抽象方法,撥打電話 double TimeLeft( ) double current = balance; int times = 0; do performDial
56、( ); times+; while(balance=0); balance = current; return times-1; ,/非抽象方法, 計(jì)算當(dāng)前余額 能撥打的電話 次數(shù)。,Page 87,/抽象類的子類PhoneCard200 class PhoneCard200 extends PhoneCard static long nextCardNumber; static final String connectNumber = 200; static double additoryFee; long cardNumber; int password; boolean connect
57、ed; static /靜態(tài)初始化器 nextCardNumber = 2001800001; additoryFee = 0.1; ,Page 88,PhoneCard200(double ib) /構(gòu)造方法 cardNumber = nextCardNumber+; balance = ib; void performDial( ) /對父類中抽象方法的實(shí)現(xiàn) balance -= 0.5+additoryFee; / PhoneCard200 類定義結(jié)束,Page 89,/抽象類的子類IC_Card class IC_Card extends PhoneCard IC_Card(doubl
58、e ib) /構(gòu)造方法 balance = ib; void performDial( ) /對父類中抽象方法的實(shí)現(xiàn) balance -= 0.9; ,Page 90,public class PhoneCardTester /主類 public static void main(String args) PhoneCard200 my200 = new PhoneCard200(50.0); IC_Card myIC = new IC_Card(50.0); System.out.println(200卡可以撥打+ my200.TimeLeft( )+次電話。); System.out.pr
59、intln(IC 卡可以撥打+ myIC.TimeLeft( )+ 次電話。); ,運(yùn)行結(jié)果: 200卡可以撥打83.0次電話。 IC 卡可以撥打55.0 次電話。,Page 91,4.5 類的組合,類的組合 面向?qū)ο缶幊痰囊粋€(gè)重要思想就是用軟件對象來模仿現(xiàn)實(shí)世界的對象。 現(xiàn)實(shí)世界中,大多數(shù)對象由更小的對象組成。 與現(xiàn)實(shí)世界的對象一樣,軟件中的對象也常常是由更小的對象組成。 Java的類中可以有其他類的對象作為成員,這便是類的組合。,Page 92,4.5.1 組合的語法,組合的語法很簡單,只要把已存在類的對象放到新類中即可??梢允褂谩癶as a”語句來描述這種關(guān)系。 例如, “my kitc
60、hen has a cooker/refrigerator”,可把對象myCooker和myRefrigerator放在類Kitchen中。 格式如下: class Cooker / 類的語句 class Refrigerator / 類的語句 class Kitchen Cooker myCooker; Refrigerator myRefrigerator; ,Page 93,例4-12 類組合舉例。 一條直線是由兩個(gè)點(diǎn)組成的,代碼如下: public class Point /點(diǎn)類 private int x, y; /coordinate public Point(int x, int
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動合同范本題目
- 農(nóng)村水田租賃承包合同范本
- 企業(yè)汽車銷售合同范本
- 代理買賣二手車合同范本
- 代領(lǐng)購房合同范本
- 一般經(jīng)銷合同范例
- 個(gè)人購貨采購合同范本
- 關(guān)于裝修貸款合同范本
- 升旗臺合同范本
- 前臺勞務(wù)派遣合同范本
- 作品集合同范本
- 保安員綜合理論考試題庫備考500題(含各題型)
- 山泉水公司《質(zhì)量管理手冊》
- X證書失智老年人照護(hù)身體綜合照護(hù)講解
- 2025年1月浙江省高考英語試卷真題(含答案)
- QCT457-2023救護(hù)車技術(shù)規(guī)范
- 部編版高二思想政治下冊選擇性必修2《法律與生活》教學(xué)計(jì)劃(含教學(xué)進(jìn)度安排)
- 金融基礎(chǔ)知識考試題庫300題(含答案)
- 人教版PEP六年級英語下冊課件unit1
- 2023年北京定額及計(jì)算規(guī)則
- 混凝土課程設(shè)計(jì)預(yù)應(yīng)力混凝土簡支梁設(shè)計(jì)
評論
0/150
提交評論