Java語言程序設計(第三版,清華)第4章_第1頁
Java語言程序設計(第三版,清華)第4章_第2頁
Java語言程序設計(第三版,清華)第4章_第3頁
Java語言程序設計(第三版,清華)第4章_第4頁
Java語言程序設計(第三版,清華)第4章_第5頁
已閱讀5頁,還剩180頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第四章 類的重用Java 2 實用程序-4.8-4.20(不含4.13)JAVA語言程序設計1目錄4.1 類的繼承4.2 Object類 4.3 終結類與終結方法4.4 抽象類4.5 類的組合 4.6 包的應用4.7 本章小結24.1 類的繼承繼承是一種由已有的類創(chuàng)建新類的機制父類是所有子類的公共屬性及方法的集合,子類則是父類的特殊化, 子類根據(jù)需要增加它自己的新的狀態(tài)和行為。Java只支持類的單繼承,每個子類只能有一個直接父類繼承機制可以提高程序的抽象程度,提高代碼的可重用性在Java中每個類均為Object 的子類。(java.lang)3一、 繼承的概念基類和派生類基類(base cla

2、ss)也稱超類、父類(superclass)是被直接或間接繼承的類派生類(derived-class)也稱子類 (subclass)繼承其他類而得到的類繼承所有祖先的狀態(tài)和行為派生類可以增加變量和方法派生類也可以覆蓋(override)繼承的方法4一、 繼承的概念is_a關系子類對象與父類對象存在“IS A”(或“is kind of”)的關系5動物類層次舉例一、 繼承的概念舉例一般具體動物蛇蜥蜴鯨爬行動物哺乳動物狗巨蜥 壁虎壁虎 是一種 蜥蜴 爬行動物是 動物的 一種6錯誤的基礎關系(HAS A)汽車發(fā)動機制動裝置7二、 子類聲明在類的聲明中,通過使用關鍵字extends來創(chuàng)建一個類的子類,

3、格式如下:class childClass extends parentClass /類體8在一個公司中,有普通員工(Employees)及管理人員(Magagers)兩類人員普通員工對象(Employees)可能有的屬性信息包括員工號(employeeNumber)姓名(name)地址(address)電話號碼(phoneNumber)管理人員(Managers)除具有普通員工的屬性外,還可能具有下面的屬性職責(responsibilities)所管理的職員(listOfEmployees)三、 子類的繼承性 類的設計舉例9Employee與Manager的類圖三、 子類的繼承性 類的設計舉

4、例EmployeeemployeeNumbe : intname : Stringaddress : StringphoneNumber : StringManagerresponsibilities:StringlistOfEmployees:String父類子類10/父類Employeeclass Employee int employeeNumbe ; String name, address, phoneNumber ; public void work();/子類Managerclass Manager extends Employee /子類增加的成員變量 String respo

5、nsibilities, listOfEmployees;11EmployeeemployeeNumbe : intaddress : StringphoneNumber : Stringwork(): voidManagerresponsibilities:Stringmanage():voidpersonName:String12三、 子類的繼承性類可以有兩種重要的成員成員變量成員方法子類的成員中有一部分是子類自己聲明定義的,另一部分是從它的父類繼承的子類繼承父類可分兩種情況子類與父類同在一個包中子類與父類不在同一個包中 13子類和父類在同一包中的繼承性 如果子類和父類在同一個包中,那么,

6、子類自然地繼承了其父類中不是private的成員變量作為自己的成員變量,并且也自然地繼承了父類中不是private的方法作為自己的方法, 繼承的成員變量或方法的訪問權限保持不變。例子:workspace/inherite/Example4_15.java 14public class Father private int money; float weight,height; String head,hand, foot; void speak(String s) System.out.println(s); public class Son extends Father String hob

7、by;public class Example4_15 public static void main(String args) Son boy; boy=new Son(); boy.weight=1.80f; boy.height=120f; boy.head=一個頭; boy.hand=兩只手 ; boy.foot=兩只腳; boy.hobby=喜歡上網(wǎng),有時上課還睡覺:); boy.speak(我是兒子); System.out.println(boy.hand+n+boy.foot+ “n”+boy.head+“n”+“身高: +boy.weight+boy.height+n+boy

8、.hobby); 子類不能繼承子類新增屬性我是兒子兩只手 兩只腳一個頭身高:1.8120喜歡上網(wǎng),有時上課還睡覺:)15子類和父類不在同一包中的繼承性 如果子類和父類不在同一個包中,子類可繼承父類的protected、public成員變量做為子類的成員變量,并且可繼承父類的protected、public方法為子類的方法, 繼承的成員變量或方法的訪問權限保持不變。如果子類和父類不在同一個包中,子類不能繼承父類的友好變量和友好方法。16例子:Example4/inherite/ABC.java Example4/DEF.javapackage inherite;public class ABC

9、protected int pro_i=5; protected void show() System.out.println(pro_i= +pro_i); import inherite.ABC; class DEF extends ABC public static void main(String agrs) DEF def=new DEF(); System.out.println(_i); _i=10; def.show(); 如果變量pro_i不加訪問權限,會出現(xiàn)什么情況?Error:pro_i在ABC.java中不是公共的,無法從外部軟件包中進行訪問17public class

10、 Person public String name; public String getName() return name; public class Employee extends Person public int employeeNumber; public int getEmployeeNumber() return employeeNumber; public class Manager extends Employee public String responsibilities; public String getResponsibilities() return resp

11、onsibilities; 4.1.2 繼承的語法(續(xù))例4_2 類的繼承18public class Exam4_2Test 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.employeeNumbe

12、r = 543469; he.responsibilities = Internet project; System.out.println(he.getName(); System.out.println(he.getEmployeeNumber(); System.out.println(he.getResponsibilities(); 4.1.2 繼承的語法(續(xù))例4_2測試 類的繼承19運行結果Li Ming123456He Xia543469Internet project說明子類不能直接訪問從父類中繼承的私有屬性及方法,但可使用公有(及保護)方法進行訪問4.1.2 繼承的語法(續(xù)

13、)例4_2測試結果 類的繼承20public class B public int a = 10; private int b = 20; protected int c = 30; public 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); 4.1.2 繼承的語法(續(xù))例4_3

14、 類的繼承是否有問題?214.1.3 隱藏和覆蓋隱藏和覆蓋子類對從父類繼承來的屬性變量及方法可以重新定義類的繼承22屬性的隱藏子類中聲明了與父類中相同的成員變量名,則從父類繼承的變量將被隱藏子類擁有了兩個相同名字的變量,一個繼承至父類,另一個由自己聲明當子類執(zhí)行繼承至父類的操作時,處理的是繼承至父類的變量,而當子類執(zhí)行它自己聲明的方法時,所操作的就是它自己聲明的變量4.1.3 隱藏和覆蓋(續(xù))屬性的隱藏 class Parent int aNumber;class Child extends Parent float aNumber;類的繼承23如何訪問被隱藏的父類屬性調(diào)用從父類繼承的方法,則

15、操作的是從父類繼承的屬性使用super.屬性4.1.3 隱藏和覆蓋(續(xù))訪問被隱藏的父類屬性類的繼承24屬性的隱藏舉例class A1 int x = 2; public void setx(int i) x = i; void printa() System.out.println(x); 4.1.3 隱藏和覆蓋(續(xù))例4_4class B1 extends A1 int x=100; void printb() super.x = super.x +10 ; System.out.println (super.x= + super.x + x= + x); 類的繼承 A1 a1 = new

16、 A1(); a1.setx(4); a1.printa(); B1 b1 = new B1(); b1.printb(); b1.printa(); b1.setx(6); / 將繼承來的x值設置為6 b1.printb(); b1.printa(); a1.printa();25public class Exam4_4Test public static void main(String args) A1 a1 = new A1(); a1.setx(4); a1.printa(); B1 b1 = new B1(); b1.printb(); b1.printa(); b1.setx(6

17、); / 將繼承來的x值設置為6 b1.printb(); b1.printa(); a1.printa(); 4.1.3 隱藏和覆蓋(續(xù))例4_4測試類的繼承26運行結果4super.x= 12 x= 10012super.x= 16 x= 1001644.1.3 隱藏和覆蓋(續(xù))例4_4運行結果類的繼承27 注意:子類不能繼承父類中的靜態(tài)屬性,但可以對父類中的靜態(tài)屬性進行操作。在上面的例子中,將“int x = 2;”改為“static int x = 2;”,再編譯及運行程序,會得到什么結果?隱藏和覆蓋(續(xù))舉例4super.x= 14 x= 10014super.x= 16 x= 10

18、01616所有對象的類變量分配相同的內(nèi)存空間改變其中一個對象的這個類變量將會影響其它對象的這個類變量返回28使用super調(diào)用父類的構造方法子類不繼承父類的構造方法,因此,子類如果想使用父類的構造方法,必須在子類的構造方法中使用,并且必須使用關鍵字super來表示,而且super必須是子類構造方法中的頭一條語句。 注意:如果在子類的構造方法中沒有使用super調(diào)用父類的某個構造方法,默認為調(diào)用父類不帶參數(shù)的構造方法如果父類定義了多個構造方法,那么Java不提供默認構造方法。因此,當在父類中定義多個構造方法時,應包括一個無參構造方法例子:Example4_2329方法覆蓋如果子類不需使用從父類繼

19、承來的方法的功能,則可以聲明自己的同名方法,稱為方法覆蓋覆蓋方法的返回類型、方法名稱、參數(shù)的個數(shù)及類型必須和被覆蓋的方法一樣只需在方法名前面使用不同的類名或不同類的對象名即可區(qū)分覆蓋方法和被覆蓋方法SuperTest(見后)方法覆蓋時,不能降低方法的訪問權限。4.1.3隱藏和覆蓋(續(xù))方法覆蓋 Class Chengji protected float f(float x, float y) return x*y; Class Xiangjia extends Chengji float f(float x, float y) return x+y; 訪問權限降低,錯誤30方法覆蓋的應用場合子

20、類中實現(xiàn)與父類相同的功能,但采用不同的算法或公式 在名字相同的方法中,要做比父類更多的事情 在子類中需要取消從父類繼承的方法隱藏和覆蓋(續(xù))方法覆蓋的應用場合31容易混淆的概念方法的重載(method overloading)方法的覆蓋(method overriding)方法覆蓋(override):如果子類不需使用從父類繼承來的方法的功能,則可以聲明自己的同名方法,稱為方法覆蓋。覆蓋方法的返回類型,方法名稱,參數(shù)的個數(shù)及類型必須和 被覆蓋的方法一樣。子類方法不能縮小父類方法的訪問權限 。不能拋出比subclass(父類)更多的異常 。方法重載(overload):一個類中可以有多個方法具有

21、相同的名字,但這些方法的參數(shù)必須不同,或者是參數(shù)的個數(shù)不同,或者是參數(shù)的類型不同, 或者方法的返回類型不相同、訪問修飾不同 。重載的目的是允許通過使用一個方法名來訪問多個方法。32必須覆蓋的方法派生類必須覆蓋基類中的抽象的方法,否則派生類自身也成為抽象類.不能覆蓋的方法基類中聲明為final的終結方法(保持操作的穩(wěn)定性)基類中聲明為static 的靜態(tài)方法調(diào)用被覆蓋的方法super.overriddenMethodName();4.1.3 隱藏和覆蓋(續(xù))方法覆蓋的注意事項類的繼承334.1.4 有繼承時的構造方法有繼承時的構造方法遵循以下的原則子類不能從父類繼承構造方法好的程序設計方法是在子

22、類的構造方法中調(diào)用某一個父類構造方法,調(diào)用語句必須出現(xiàn)在子類構造方法的第一行,可使用super關鍵字如子類構造方法的聲明中沒有明確調(diào)用父類構造方法,則系統(tǒng)在執(zhí)行子類的構造方法時會自動調(diào)用父類的默認構造方法(即無參的構造方法)類的繼承34public class Person protected String name, phoneNumber, address; public Person() this(, , ); public Person(String aName, String aPhoneNumber, String anAddress) name=aName; phoneNumbe

23、r=aPhoneNumber; address=anAddress; 4.1.4 有繼承時的構造方法(續(xù))例4_5 類的繼承35public class Employee extends Person protected int employeeNumber; protected String workPhoneNumber; public Employee() /此處隱含調(diào)用構造方法 Person() this(0, ); public Employee(int aNumber, String aPhoneNumber) /此處隱含調(diào)用構造方法 Person() employeeNumber

24、=aNumber; workPhoneNumber = aPhoneNumber; 4.1.4 有繼承時的構造方法(續(xù))例4_5 類的繼承36Super關鍵字如果我們在子類中想使用被子類隱藏了的父類的成員變量或方法就可以使用關鍵字super。比如:super.x、super.play(),就是被子類隱藏的父類的成員變量x和方法play()。 37public class Professor extends Employee protected String research; public Professor() super(); research = ; public Professor(i

25、nt aNumber, String aPhoneNumber, String aResearch) super(aNumber, aPhoneNumber); research = aResearch; 4.1.4 有繼承時的構造方法(續(xù))例4_5 類的繼承38public class Professor extends Employee protected String research; public Professor() super(); research = ; public Professor(int aNumber, String aPhoneNumber, String aR

26、esearch) super(aNumber, aPhoneNumber); research = aResearch; 4.1.4 有繼承時的構造方法(續(xù))例4_5 類的繼承39在一個公司管理信息系統(tǒng)中,包括普通員工(Employees),其可能有的屬性信息包括員工號(employeeNumber)姓名(name)地址(address)電話號碼(phoneNumber)管理者(Magagers),除具有普通員工所具有的屬性及行為外,還具有下面的屬性和行為職責(responsibilities)所管理的職員(listOfEmployees)工資的計算方法與一般員工不同;福利與一般員工不同顧客(

27、Customers),可能有的屬性信息包括姓名(name)地址(address)電話號碼(phoneNumber)4.1.5 應用舉例例4_6 類的繼承40類層次結構4.1.5 應用舉例(續(xù))例4_6 PersonEmployeeManagerCustomer類的繼承414.2 Object 類Object類Java庫類是系統(tǒng)提供的已實現(xiàn)的標準類的集合,是Java的APIObject類是Java程序中所有類的直接或間接父類,類庫中所有類的父類,處在類層次最高點包含了所有Java類的公共屬性,其構造方法是Object( )42Object類定義了所有對象必須具有的狀態(tài)和行為,較主要的方法如下pu

28、blic final Class getClass() 獲取當前對象所屬的類信息,返回Class對象public String toString() 返回當前對象本身的有關信息,按字符串對象返回public boolean equals(Objectobj) 比較兩個對象是否是同一對象,是則返回trueprotected Object clone( ) 生成當前對象的一個拷貝,并返回這個復制對象Public int hashCode() 返回該對象的哈希代碼值protected void finalize() throws Throwable 定義回收當前對象時所需完成的資源釋放工作4.2 O

29、bject類(續(xù))包含的主要方法 Object類43相等與同一補充1:equals()和“”的區(qū)別“”可用于比較基本數(shù)據(jù)類型和引用型比較兩個基本數(shù)據(jù)類型時,如果兩個的值相同,則返回true比較兩個引用類型時,如果兩個引用的地址相同,則返回trueequals()用于比較兩個對象的值是否相同44 補充2: String str1=“aaa”; String str1=new String(“aaa”); 的區(qū)別?常量池(constant pool)指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。它包括了關于類、方法、接口等中的常量,也包括字符串常量。 str1 屬于字符串常

30、量,被創(chuàng)建時的地址為常量池中,如果常量池中已有相同字符串常量,則新創(chuàng)建的常量將指向已有的引用;如果沒有,則使用String中的intern()在常量池中增加一個Unicode等于str的字符串,并返回它的引用。(注:于String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值 )使用new String()創(chuàng)建的是對象,不同對象指向不同的內(nèi)存地址。45舉例String str1=“aaa”;String str2=“aaa”;str1 = str2 ; str1.equals(str2);地址同,true值相同,true46String str3 = ne

31、w String(“aaa”); str1=str3; str1.equals(str3); 地址不同,false值相同,true47public class strTest public static void main(String args) String str1=aaa;String str2=“aaa”;String str3 = new String(aaa);if(str1=str2)System.out.println(str1=str2); if(str1.equals(str2)System.out.println(str1.equals(str2);if(str1=st

32、r3)System.out.println(true); elseSystem.out.println(false); if(str1.equals(str3) System.out.println(true); elseSystem.out.println(false); 48先看兩個例子public class Exam4_7public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAccount(Bob, 12345

33、6, 100.00f); if (a = b) System.out.println(YES); else System.out.println(NO); NO49public class EqualsTestpublic static void main(String args)BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAccount(Bob, 123456, 100.00f); if (a.equals(b) System.out.println(YES); else Sys

34、tem.out.println(NO); NO50這兩個例子equals()和前面的String類有何不同,到底是什么原因?51相等和同一的概念兩個對象具有相同的類型,及相同的屬性值,則稱二者相等(equal)如果兩個引用變量指向的是同一個對象,則稱這兩個變量(對象)同一(identical=)兩個對象同一,則肯定相等兩個對象相等,不一定同一比較運算符“=” 判斷的是這兩個對象是否同一(即對象地址是否相同)4.2 Object類(續(xù))相等和同一 Object類52判斷兩個對象是否同一public class Exam4_7public static void main(String args)

35、 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.out.println(NO); BankAccount類在2.5.1中聲明,此程序運行的結果為“NO”,原因是使用等號“=”判斷的是兩個對象是否同一,顯然a和b是兩個對象4.2 Object類(續(xù))例4_7 Object類53修改剛才的程序public class Exam4_7

36、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); 將a所指對象的引用賦給b,因此a與b指向的是同一個對象,a與b同一。輸出結果為“YES”4.2 Object類(續(xù))例4_7 Object類54equals 方法由于Object是類層次結構中的樹根節(jié)點,因此所有其他類都繼承了equals()方法O

37、bject類中的 equals() 方法的定義如下,public boolean equals(Object x) return this = x; 4.2 Object類(續(xù))equals方法 Object類比較接收對象與參數(shù)對象是否是同一個對象,即對象地址是否相同。因此,Object中的equals()方法判斷的是兩個對象是否同一,而不是屬性值是否相同。可見,也是判斷兩個對象是否同一55Object類中equals方法的使用舉例public class EqualsTestpublic static void main(String args)BankAccount a = new Ban

38、kAccount(Bob, 123456, 100.00f); BankAccount b = new BankAccount(Bob, 123456, 100.00f); if (a.equals(b) System.out.println(YES); else System.out.println(NO); 由于不是同一對象,運行結果仍然是“NO”4.2 Object類(續(xù))例4_8 56equlas方法的重寫要判斷兩個對象各個屬性域的值是否相同,則不能使用從Object類繼承來的equals方法,而需要在類聲明中對equals方法進行重寫答案:String類中已經(jīng)重寫了Object類的e

39、quals方法,可以判別兩個字符串是否內(nèi)容相同4.2 Object類(續(xù))equals方法 的重寫Object類57在BankAccount類中增加equals方法,由于是對Object類中的equals方法進行重寫,因此方法定義頭必須與Object類中的equals方法完全相同public boolean equals(Object x) if (this.getClass() != x.getClass() return false; BankAccount b = (BankAccount) x; return (this.getOwnerName().equals(b.getOwner

40、Name() &(this.getAccountNumber() = b.getAccountNumber() &(this.getBalance() = b.getBalance(); 4.2 Object類(續(xù))equals方法 的重寫Object類58equals方法的應用舉例public class Apple private String color; private boolean ripe; public Apple(String aColor, boolean isRipe) color = aColor; ripe = isRipe; public void setColor

41、(String aColor) color = aColor; public void setRipe(boolean isRipe) ripe = isRipe; public String getColor() return color; public boolean getRipe() return ripe; public String toString() if (ripe) return(A ripe + color + apple); else return(A not so ripe + color + apple); Object類4.2 Object類(續(xù))例4_959pu

42、blic boolean equals(Object obj) if (obj instanceof Apple) Apple a = (Apple) obj; return (color.equals(a.getColor() & (ripe = a.getRipe(); return false; public class AppleTester public static void main(String args) Apple a = new Apple(red, true); Apple b = new Apple(red, true); System.out.println(a +

43、 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); 4.2 Object類(續(xù))例4_9Object類60運行結果A ripe red apple is equal to A ripe red apple: truea is iden

44、tical to b: falseA ripe red apple is equal to A ripe red apple: truea is identical to c: true4.2 Object類(續(xù))例4_9運行結果Object類61Clone方法根據(jù)已存在的對象構造一個新的對象在根類Object 中被定義為protected,所以需要覆蓋為public實現(xiàn)Cloneable 接口,賦予一個對象被克隆的能力(cloneability) class MyObject implements Cloneable /Object類4.2 Object類(續(xù))Clone方法 62getCl

45、ass方法final 方法,返回一個Class對象,用來代表對象隸屬的類通過Class 對象,你可以查詢Class對象的各種信息:比如它的名字,它的基類,它所實現(xiàn)接口的名字等。void PrintClassName(Object obj) System.out.println(The Objects class is + obj.getClass().getName();4.2 Object類(續(xù))getClass方法 Object類63notify、notifyAll、wait方法 final方法,不能覆蓋這三個方法主要用在多線程程序中4.2 Object類(續(xù)) notify、notify

46、All、wait方法 Object類644.3 終結類與終結方法終結類與終結方法被final修飾符修飾的類和方法終結類不能被繼承終結方法不能被當前類的子類重寫654.3.1 終結類終結類的特點不能有派生類終結類存在的理由安全: 黑客用來攪亂系統(tǒng)的一個手法是建立一個類的派生類,然后用他們的類代替原來的類設計: 你認為你的類是最好的或從概念上你的類不應該有任何派生類終結類與終結方法66聲明ChessAlgorithm 類為final 類final class ChessAlgorithm . . . 如果寫下如下程序:class BetterChessAlgorithm extends Chess

47、Algorithm 編譯器將顯示一個錯誤Chess.java:6: Cant subclass final classes: class ChessAlgorithmclass BetterChessAlgorithm extends ChessAlgorithm 1 error4.3.1 終結類(續(xù))一個例子 終結類與終結方法final類不能被繼承67終結方法不能被當前類的子類所重載的方法終結方法的特點當前類的子類不能再重新聲明與此方法同名的方法子類只能繼承該方法終結方法存在的理由防止子類對父類重要方法的錯誤重寫4.3.2 終結方法終結類與終結方法684.3.1 終結方法(續(xù))例4_10fi

48、nal 方法舉例class Parent public Parent() /構造方法 final int getPI() return Math.PI; /終結方法說明getPI()是用final修飾符聲明的終結方法,不能在子類中對該方法進行重載,因而如下聲明是錯的Class Child extends Parent public Child() /構造方法 int getPI() return 3.14; /重寫父類中的終結方法,不允許終結類與終結方法694.4 抽象類抽象類代表一個抽象概念的類沒有具體實例對象的類,不能使用new方法進行實例化類前需加修飾符abstract可包含常規(guī)類能夠包

49、含的任何東西,例如構造方法,非抽象方法;也可包含抽象方法,這種方法只有方法的聲明,而沒有方法的實現(xiàn)70存在意義抽象類是類層次中較高層次的概括,抽象類的作用是讓其他類來繼承它的抽象化的特征抽象類中可以包括被它的所有子類共享的公共行為抽象類可以包括被它的所有子類共享的公共屬性在程序中不能用抽象類作為模板來創(chuàng)建對象;在用戶生成實例時強迫用戶生成更具體的實例,保證代碼的安全性抽象類4.4 抽象類(續(xù))存在意義71將所有圖形的公共屬性及方法抽象到抽象類Shape。再將2D及3D對象的特性分別抽取出來,形成兩個抽象類TwoDimensionalShape及ThreeDimensionalShape2D圖形

50、包括Circles、Triangles、Rectangles和Squares3D圖形包括Cube、Sphere、或Tetrahedron在UML中,抽象類的類名為斜體,以與具體類相區(qū)別4.4 抽象類(續(xù))幾何形狀的例子ShapeCircleTriangleRectangleSquareTwoDimensionalShapeThreeDimensionalShapeCubeSphereTetrahedron抽象類72例4-6中,如果在應用系統(tǒng)中涉及到的人員只包括:Customers,Employees 及 Managers。則Person 類的子類對象覆蓋了應用中的對象,可以將Person 類聲

51、明為抽象類4.4 抽象類(續(xù))人員的例子PersonEmployeeManagerCustomer抽象類734.4.1 抽象類的聲明抽象類聲明的語法形式為abstract class Number . . .如果寫: new Number();抽象類不能用抽象類創(chuàng)建對象744.4.2 抽象方法抽象方法聲明的語法形式為public abstract (.);僅有方法頭,而沒有方法體和操作實現(xiàn)具體實現(xiàn)由當前類的不同子類在它們各自的類聲明中完成抽象類可以包含抽象方法抽象類75abstract class A public abstract int min(int x,int y); int max(

52、int x,int y) return xy?x:y; 使用final修飾abstract方法,為什么? 76abstract class A abstract int min(int x,int y); int max(int x,int y) return xy?x:y; class B extends A int min(int x,int y) return xy?x:y; public class Example4_21 public static void main(String args) A a; B b=new B(); int max=b.max(12,34); int m

53、in=b.min(12,34); System.out.println(max=+max+“ min=+min); a=b; max=a.max(12,34); System.out.println(max=+max); 運行結果max=34 min=12max=3477需注意的問題一個抽象類的子類如果不是抽象類,則它必須為父類中的所有抽象方法書寫方法體,即重寫父類中的所有抽象方法只有抽象類才能具有抽象方法,即如果一個類中含有抽象方法,則必須將這個類聲明為抽象類除了抽象方法,抽象類中還可以包括非抽象方法 4.4.2 抽象方法(續(xù))需注意的問題抽象類78抽象方法的優(yōu)點隱藏具體的細節(jié)信息,所有的子

54、類使用的都是相同的方法頭,其中包含了調(diào)用該方法時需要了解的全部信息強迫子類完成指定的行為,規(guī)定其子類需要用到的“標準”行為4.4.2 抽象方法(續(xù))抽象方法的優(yōu)點抽象類79總結final類: 表示該類不能被繼承,沒有子類; final類中的方法也無法被繼承; final方法: 不能被子類的方法重載, 但可以被繼承(使用); 抽象類中可以有具體的實現(xiàn)方法,也可以沒有抽象方法; 抽象類中的抽象方法必須被它的子類實現(xiàn),如果子類 沒有實現(xiàn),則該子類繼續(xù)為抽象類 抽象類不能被實例化 要使用抽象類中的方法,必須有一個子類繼承于這個 抽象類,并實現(xiàn)抽象類中的抽象方法80各種圖形都需要實現(xiàn)繪圖方法,可在它們的

55、抽象父類中聲明一個draw抽象方法abstract class GraphicObject int x, y; void moveTo(int newX, int newY) . . . abstract void draw();4.4.2 抽象方法(續(xù))一個繪圖的例子抽象類81然后在每一個子類中重寫draw方法,例如:class Circle extends GraphicObject void draw() . . . class Rectangle extends GraphicObject void draw() . . . 4.4.2 抽象方法(續(xù))一個繪圖的例子抽象類82LoanL

56、easeMortgageHouseLoanCarLoan貸款(Loan)分為許多種類,如租借(Lease)、抵押(Mortgage)、房屋貸款(HouseLoan)、汽車貸款(CarLoan)等將Loan聲明為抽象類,并指定所有的子類對象都應具有的行為,如計算月還款值(calculateMonthlyPayment),還款(makePayment),取得客戶信息(getClientInfo),其中前兩個因貸款種類不同計算方法也不同,可聲明為抽象方法,Loan的所有子類都必須對這兩個抽象方法進行重寫public abstract class Loan public abstract float

57、calculateMonthlyPayment(); public abstract void makePayment(float amount); public Client getClientInfo() 4.4.2 抽象方法(續(xù))例4_11抽象類834.6 包的應用包為了解決類名沖突,Java提供包來管理類名空間Java利用包來組織相關的類,并控制訪問權限包是一種松散的類的集合,利用包來管理類,可實現(xiàn)類的共享與復用同一包中的類在默認情況下可以互相訪問,通常把需要在一起工作的類放在一個包里844.6.1 Java 基礎類庫簡介(Java2實用教程-4.18、第5、6章)Java基礎類庫Ja

58、va提供了用于語言開發(fā)的類庫,稱為Java基礎類庫(JFC,Java Foundational Class) ,也稱應用程序編程接口(API,Application Programming Interface),分別放在不同的包中Java提供的包主要有java.lang,java.io,java.math,java.utiljava.applet,java.awt,java.awt.datatransferjava.awt.event,java.awt.image,java.beans,java.rmi,java.security,java.sql等包的應用85語言包(java.lang)實用

59、包(java.util)文件包(java.text)86語言包(java.lang)語言包java.lang提供了Java語言最基礎的類,包括Object類數(shù)據(jù)類型包裹類(the Data Type Wrapper)字符串類(String、StringBuffer)數(shù)學類(Math)系統(tǒng)和運行時類(System、Runtime)類操作類4.6.1 Java基礎類庫簡介(續(xù)) 語言包包的應用87數(shù)據(jù)包裹類對應Java的每一個基本數(shù)據(jù)類型(primitive data type)都有一個數(shù)據(jù)包裹類每個包裹類都只有一個類型為對應的基本數(shù)據(jù)類型的屬性域4.6.1 Java基礎類庫簡介(續(xù))數(shù)據(jù)類型包裹

60、類基本數(shù)據(jù)類型數(shù)據(jù)包裹類booleanBooleanbyteBytecharCharactershortShortintIntegerlongLongfloatFloatdoubleDouble包的應用88問題:基本礎數(shù)據(jù)類型和數(shù)據(jù)包裹類的不同用處在哪? 如: int x=100 和 Integer.valueOf(“100”) 他們有什么區(qū)別?什么時候使用? 使用原始數(shù)據(jù)類型聲明的變量,如: int x = 10; 這里的x只是一個變量,而不是對象; 在某些必須操作對象的場合,這樣的變量就不能使用了; Java提供一系列包裹類,以便將原始數(shù)據(jù)類型當作對象進行操作; 89生成數(shù)據(jù)類型包裹類對象

溫馨提示

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

評論

0/150

提交評論