版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、面向?qū)ο蟮暮诵奶匦?面向?qū)ο笏枷?抽象 所有的程序設(shè)計(jì)語(yǔ)言都實(shí)現(xiàn)了某種程度上的抽象. 抽象是把問(wèn)題領(lǐng)域的問(wèn)題變成計(jì)算機(jī)解決領(lǐng)域內(nèi)的解決方法. 用計(jì)算機(jī)的思想來(lái)解釋問(wèn)題. 面向?qū)ο蠓椒ㄊ翘峁┝耸侄蝸?lái)直接描述問(wèn)題領(lǐng)域內(nèi)的成分。 我們將問(wèn)題領(lǐng)域內(nèi)的成分在解決領(lǐng)域內(nèi)表現(xiàn)為對(duì)象。 當(dāng)你閱讀OOP的程序時(shí),你即是在閱讀相應(yīng)問(wèn)題的描述。 OOP允許你以問(wèn)題本身的術(shù)語(yǔ)來(lái)描述問(wèn)題,而不是解決領(lǐng)域的術(shù)語(yǔ)。,面向?qū)ο蟪绦蛟O(shè)計(jì),面向?qū)ο蟮某绦蛟O(shè)計(jì)(o
2、bject_oriented programming):面向?qū)ο蠓椒ǖ幕竟ぷ魇莿澐趾投x對(duì)象。 對(duì)對(duì)象的判斷和劃分與實(shí)際問(wèn)題的領(lǐng)域有關(guān)。,Alan Kay的OOP五大原則,(1) 所有東西都是對(duì)象。 (2) 程序是一大堆對(duì)象的組合;通過(guò)消息傳遞,各對(duì)象知道自己該做些什么。 (3) 每個(gè)對(duì)象都有自己的存儲(chǔ)空間,可容納其他對(duì)象。 (4) 每個(gè)對(duì)象都有一種類(lèi)型。(5) 同一類(lèi)所有對(duì)象都能接收相同的消息。,封裝(訪問(wèn)控制 ):隱藏
3、的實(shí)現(xiàn),不妨把程序設(shè)計(jì)過(guò)程分成class creators 和client programmers兩個(gè)部門(mén). class creators的目的就是制造類(lèi),只把必須的部分向client programmer公開(kāi),而把其他部分隱藏起來(lái)。有兩個(gè)理由要控制類(lèi)中成員的存取權(quán)限. 不讓client programmer隨心所欲地直接使用應(yīng)該隱藏的部分來(lái)改變對(duì)象的行為 讓class creator能隨心所欲地改變隱藏的部分,只要這種改變不會(huì)
4、影響公開(kāi)的部分,繼承:重用實(shí)現(xiàn),最簡(jiǎn)單的重用一個(gè)類(lèi)的方法是直接使用這個(gè)類(lèi)的一個(gè)對(duì)象來(lái)構(gòu)筑新的對(duì)象或程序組織composition:用現(xiàn)有對(duì)象構(gòu)筑一個(gè)新的對(duì)象 在一個(gè)對(duì)象內(nèi)部的對(duì)象通常是私有的,繼承: 重用接口,使用繼承時(shí),相當(dāng)于創(chuàng)建了一個(gè)新類(lèi)。這個(gè)新類(lèi)不僅包含現(xiàn)有類(lèi)型的所有成員,但更重要的是,它復(fù)制了基礎(chǔ)類(lèi)的接口。 可以向基礎(chǔ)類(lèi)的對(duì)象發(fā)送的所有消息可以同樣地發(fā)給衍生類(lèi)的對(duì)象: 即新的衍生類(lèi)具有與基礎(chǔ)類(lèi)相同的類(lèi)型 衍生類(lèi)與基礎(chǔ)類(lèi)有兩
5、種關(guān)系: 盡管具有相同的接口,但是通常具有不同的行為 -- IS-A 或者在基礎(chǔ)類(lèi)的界面的基礎(chǔ)上增加新的接口(extend) -- IS-LIKE-A,多態(tài)性,對(duì)于右邊這個(gè)類(lèi)族關(guān)系,我們要進(jìn)行的一項(xiàng)重要工作是將衍生類(lèi)的對(duì)象當(dāng)作基礎(chǔ)類(lèi)的對(duì)象對(duì)待。它意味著我們只須編寫(xiě)單一的代碼,令其忽略類(lèi)型的特定細(xì)節(jié),只與基礎(chǔ)類(lèi)的對(duì)象打交道。,多態(tài)性(續(xù)),Upcasting -- 把衍生類(lèi)的對(duì)象當(dāng)作其基礎(chǔ)類(lèi)的對(duì)象對(duì)待void doStuff(Sh
6、ape s) { s.erase(); // ... s.draw();}Circle c = new Circle();Triangle t = new Triangle();Line l = new Line();doStuff(c);doStuff(t);doStuff(l);你是一種Shape,我知道你能將自己刪掉,即erase();請(qǐng)自己采取那個(gè)行動(dòng),并自己去控制所有的細(xì)節(jié)吧。,多態(tài)性(續(xù)),動(dòng)態(tài)綁
7、定為Cirle調(diào)用draw()時(shí)執(zhí)行的代碼與為一個(gè)Square或Line調(diào)用draw()時(shí)執(zhí)行的代碼是不同的。但在將draw()消息發(fā)給一個(gè)不知道確切類(lèi)型的Shape對(duì)象時(shí),根據(jù)Shape引用當(dāng)時(shí)連接的實(shí)際類(lèi)型,會(huì)采取相應(yīng)的正確的操作。 多態(tài)性:將一條消息發(fā)給對(duì)象時(shí),如果不知道對(duì)方的具體類(lèi)型是什么,但采取的行動(dòng)同樣是正確的。 在Java中,所有的函數(shù)調(diào)用都是動(dòng)態(tài)綁定的。,類(lèi)(Class),類(lèi)是具有共同屬性和行為的對(duì)象的抽象。類(lèi)可
8、以定義為數(shù)據(jù)和方法的集合。類(lèi)也稱為模板,因?yàn)樗鼈兲峁┝藢?duì)象的基本框架。,Class,對(duì)象,類(lèi)的實(shí)例:每個(gè)實(shí)例有自己的存儲(chǔ)空間(數(shù)據(jù)類(lèi)型和變量的關(guān)系)動(dòng)態(tài)性,每個(gè)對(duì)象有自己的生存周期,會(huì)經(jīng)歷創(chuàng)建、運(yùn)行到消亡的變化過(guò)程,類(lèi)和對(duì)象的關(guān)系,類(lèi),對(duì)象,,抽象,實(shí)例化,,,,屬性或狀態(tài),操作或行為,數(shù)據(jù)或變量,方法,封裝的實(shí)體=數(shù)據(jù)+方法,抽象,具體實(shí)例化一個(gè)實(shí)物,模具,類(lèi)的封裝性、繼承性和多態(tài)性,封裝性為類(lèi)中的成員變量和成員方法提供多級(jí)訪問(wèn)
9、權(quán)限繼承性從已存在的類(lèi)創(chuàng)建新類(lèi),使得新類(lèi)自動(dòng)擁有被繼承類(lèi)的全部成員多態(tài)性提供類(lèi)中方法執(zhí)行的多樣性,重載(overload)和覆蓋(overwrite),類(lèi)的定義,聲明類(lèi)類(lèi)聲明{ 成員變量的聲明; 成員方法的聲明及實(shí)現(xiàn);}類(lèi)聲明的格式[修飾符] class 類(lèi) [extends 父類(lèi)] [implements 接口列表]public class Date1//類(lèi)聲明{ int
10、 year, month, day;//聲明成員變量},類(lèi)的定義(續(xù)),聲明成員變量成員變量聲明語(yǔ)法[修飾符] [static][final][transient] 數(shù)據(jù)類(lèi)型 變量;public class Date1//類(lèi)聲明{ public int year, month, day;//聲明成員變量},類(lèi)的定義(續(xù)),聲明成員方法方法聲明語(yǔ)法[修飾符] 返回值類(lèi)型
11、方法([參數(shù)列表]) [throws 異常類(lèi)]{ 語(yǔ)句序列; [return [返回值]];}方法體中的局部變量方法體中用return語(yǔ)句返回值聲明main方法 public static void main(String args[])case:Date1.java,使用對(duì)象,聲明對(duì)象對(duì)象實(shí)例化引用對(duì)象的成員變量和調(diào)用對(duì)象方法對(duì)象的引用模型方法調(diào)用的參數(shù)傳遞原則釋放對(duì)象,聲明對(duì)象,聲明
12、對(duì)象的語(yǔ)法格式類(lèi) 對(duì)象句柄;Date1 aday;//聲明aday是Date1類(lèi)的一個(gè)對(duì)象句柄聲明對(duì)象僅僅說(shuō)明了對(duì)象所屬的類(lèi),對(duì)象并沒(méi)有獲得值。,對(duì)象的創(chuàng)建( 實(shí)例化),對(duì)象的創(chuàng)建new關(guān)鍵字用于創(chuàng)建對(duì)象,對(duì)象句柄 = new 類(lèi)的構(gòu)造方法([參數(shù)列表]) Person p1=new Person();,同類(lèi)多個(gè)對(duì)象的內(nèi)存分配,成員變量:各對(duì)象獨(dú)有成員方法:各對(duì)象共享,,,棧內(nèi)存,,,,..,..,..,
13、..,..,,p1,p2,堆內(nèi)存,,,P1的成員變量,P2的成員變量,Shout()方法,0x300,0x302,30 age,0 age,,,對(duì)象的使用,對(duì)象中成員變量和成員方法的使用:對(duì)象句柄.成員變量對(duì)象句柄.成員方法([參數(shù)列表])aday.year = 2006; //引用對(duì)象的成員變量aday.setDate(2006,1,28) /
14、/引用對(duì)象的成員方法,對(duì)象的引用模型,類(lèi)的封裝性,構(gòu)造方法與析構(gòu)方法方法的重載this引用和instanceof對(duì)象運(yùn)算符類(lèi)及其成員的訪問(wèn)權(quán)限實(shí)例成員與類(lèi)成員,初始化和清除,As the computer revolution progresses, "unsafe" programming has become one of the major culprits that makes programming
15、 expensive. 初始化和清除是程序設(shè)計(jì)安全性的兩個(gè)最重要的問(wèn)題。 C++為我們引入了構(gòu)造函數(shù)和析構(gòu)函數(shù)的概念,Java也沿用構(gòu)造函數(shù)這個(gè)概念,但新增了自己的垃圾收集器。,構(gòu)造方法(構(gòu)造函數(shù)),構(gòu)造方法:是一個(gè)在創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用的特殊函數(shù)。構(gòu)造方法的特征方法名與類(lèi)名相同;不含返回類(lèi)型;不能在方法中用return語(yǔ)句返回一個(gè)值;在類(lèi)實(shí)例化時(shí),它會(huì)由系統(tǒng)自動(dòng)調(diào)用;,用構(gòu)造函數(shù)自動(dòng)初始化,如果某個(gè)類(lèi)有一個(gè)構(gòu)造函數(shù),那么
16、在創(chuàng)建對(duì)象的時(shí)候,Java會(huì)自動(dòng)調(diào)用那個(gè)構(gòu)造函數(shù)。Case: SimpleConstructor.java,缺省構(gòu)造函數(shù),如果一個(gè)類(lèi)沒(méi)有定義構(gòu)造函數(shù),則編譯程序會(huì)幫我們自動(dòng)創(chuàng)建一個(gè)缺省構(gòu)造函數(shù)。然而一旦定義了一個(gè)構(gòu)造函數(shù),就不會(huì)幫我們自動(dòng)生成一個(gè)。Case:DefaultCons.java,清除:收尾和垃圾收集,垃圾收集機(jī)制只知道怎樣釋放由new分配的內(nèi)存,所以它不知道如何釋放對(duì)象的 “特殊”內(nèi)存。析構(gòu)方法 public
17、 void finalize(){語(yǔ)句序列;}一旦垃圾收集機(jī)制準(zhǔn)備好釋放對(duì)象占用的存儲(chǔ)空間,它首先調(diào)用finalize()。所以使用 finalize(),就可以在垃圾收集期間進(jìn)行一些重要的清除工作。 但是finalize()和C++的析構(gòu)函數(shù)截然不同。 1、垃圾收集不等于析構(gòu)函數(shù),在我們不再需要一個(gè)對(duì)象之前,有些行動(dòng)是必須采取的,那么這些行動(dòng)必須由程序員自己來(lái)采取。 2、對(duì)象可能不會(huì)被當(dāng)作垃圾被收集掉。 3、垃圾收集
18、只跟內(nèi)存有關(guān)。,方法重載(Methods overloading),重載的含義:One of the important features in any programming language is the use of names. 我們用名字引用或描述所有對(duì)象與方法。 在日常生活中,我們用相同的詞表達(dá)多種不同的含義,即詞的“重載”。 大多數(shù)程序設(shè)計(jì)語(yǔ)言要求我們?yōu)槊總€(gè)函數(shù)都設(shè)定一個(gè)獨(dú)一無(wú)二的標(biāo)識(shí)符。 但是構(gòu)造函數(shù)的出現(xiàn)要求
19、函數(shù)名也能夠“重載”。 Often, the same word expresses a number of different meanings -- it's overloaded. Case: Overloading.java,函數(shù)重載(續(xù)),成員方法重載參數(shù)列表必須不同,即以不同的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型、參數(shù)的次序來(lái)區(qū)別重載方法返回值可以相同也可以不同,不能通過(guò)返回類(lèi)型的不同來(lái)區(qū)分重載函數(shù)。 public s
20、etDate(int y ,int m , int d)public setDate(int m, int d)public setDate(int d)public setDate(Date1 aday) 構(gòu)造方法重載Date2 aday1 = new Date2();Date2 aday2 = new Date2(2006,2,28);,關(guān)鍵字this,this引用:this1.java指代對(duì)象本身thi
21、sCase: Leaf.java訪問(wèn)本類(lèi)的成員變量和成員方法this.成員變量this.成員方法([參數(shù)列表])調(diào)用本類(lèi)重載的構(gòu)造方法this([參數(shù)列表])Case:Flower.java 構(gòu)造函數(shù)調(diào)用必須是構(gòu)造函數(shù)中的第一條語(yǔ)句,并且不能在一個(gè)構(gòu)造函數(shù)調(diào)用兩個(gè)以上的構(gòu)造函數(shù)。instanceof對(duì)象運(yùn)算符aday instanceof Date2,類(lèi)及其成員的訪問(wèn)權(quán)限,A primary consideration
22、 in object-oriented design is "separating the things that change from the things that stay the same." 每個(gè)庫(kù)的用戶(client programmer)必須能依賴自己使用的庫(kù),并知道一旦新版本的庫(kù)推出,自己不需要改寫(xiě)代碼。 為解決這個(gè)問(wèn)題,Java推出了“訪問(wèn)權(quán)限”的概念,允許庫(kù)創(chuàng)建者聲明哪些是客戶程序員可以是
23、使用的,哪些是不可以使用的。Java中為類(lèi)中成員設(shè)置了4種訪問(wèn)權(quán)限,為類(lèi)設(shè)置了2種訪問(wèn)權(quán)限,類(lèi)中成員的訪問(wèn)權(quán)限 (續(xù)),針對(duì)類(lèi)內(nèi)的每個(gè)成員的每個(gè)定義,Java訪問(wèn)權(quán)限friendly,public, protected和private都放在它們的前面—無(wú)論是數(shù)據(jù)成員還是方法。,類(lèi)中成員的訪問(wèn)屬性(續(xù)),public:接口訪問(wèn)使用public關(guān)鍵字時(shí),它意味著緊隨在public后面的成員聲明適用于所有人,特別是適用于使用庫(kù)的客戶程序
24、員。Dinner.javaFriendly默認(rèn)包:位于相同的目錄中,而且沒(méi)有明確的包名的類(lèi)也是被認(rèn)為是默認(rèn)友好的 Cake.javaprivate:不能接觸!private關(guān)鍵字意味著除非那個(gè)特定的類(lèi),而且從那個(gè)類(lèi)的方法里,否則沒(méi)有人能訪問(wèn)那個(gè)成員. IceCream.javaprotected:“友好的一種”. ChocolateChip.java,類(lèi)的訪問(wèn)權(quán)限,在Java中,也可用訪問(wèn)權(quán)限控制著客戶程序員是否能夠創(chuàng)建屬于
25、這個(gè)類(lèi)的一個(gè)對(duì)象。聲明一個(gè)類(lèi)可使用的權(quán)限修飾符只有public和缺?。╢riendly)兩種,不能使用protected和private。public class Date1 //公有的類(lèi){}class Date1_ex //默認(rèn)的類(lèi){},類(lèi)的訪問(wèn)權(quán)限(續(xù)),然而,我們同時(shí)還要注意到一些額外的限制:(1) 每個(gè)編譯單元(文件)都只能有一個(gè)public類(lèi)。每個(gè)編譯單元有一個(gè)公共接口的概念是由那個(gè)
26、公共類(lèi)表達(dá)出來(lái)的。根據(jù)自己的需要,它可擁有任意多個(gè)提供支撐的“友好”類(lèi)。但若在一個(gè)編譯單元里使用了多個(gè)public類(lèi),編譯器就會(huì)向我們提示一條出錯(cuò)消息。(2) public類(lèi)的名字必須與包含了編譯單元的那個(gè)文件的名字完全相符,甚至包括它的大小寫(xiě)形式。如果出現(xiàn)不符,就會(huì)報(bào)告一個(gè)編譯期錯(cuò)誤(3) 可能(但并常見(jiàn))有一個(gè)編譯單元根本沒(méi)有任何公共類(lèi)。此時(shí),可按自己的意愿任意指定文件名。CASE: Lunch.java.,實(shí)例成員與
27、類(lèi)成員(靜態(tài)成員static),兩者區(qū)別:實(shí)例成員(包括成員變量和成員方法)屬于對(duì)象,只有創(chuàng)建了對(duì)象才能通過(guò)對(duì)象訪問(wèn)實(shí)例成員靜態(tài)成員(包括靜態(tài)成員變量和成員方法,前面有關(guān)鍵字static)屬于類(lèi),通過(guò)類(lèi)名就可以直接訪問(wèn)類(lèi)成員變量和調(diào)用類(lèi)成員方法,即使沒(méi)有創(chuàng)建對(duì)象,也可以通過(guò)對(duì)象引用。,實(shí)例成員變量與靜態(tài)成員變量,兩者聲明時(shí)的差別public class Person1{ String name;
28、 //姓名,實(shí)例成員變量 int age; //年齡 static int count; //人數(shù),類(lèi)成員變量}Math類(lèi)中:Public satic final double PI;,實(shí)例成員變量與靜態(tài)成員變量(續(xù)),兩者存儲(chǔ)結(jié)構(gòu)的差別Person p1 = new Person1(“
29、李小明”,21);Person p2 = new Person1(“王大偉”,19);,實(shí)例成員變量與靜態(tài)成員變量(續(xù)),兩者引用方式的差別實(shí)例成員變量屬于對(duì)象,要通過(guò)對(duì)象引用,類(lèi)成員屬于類(lèi),既可以通過(guò)對(duì)象,也可以通過(guò)類(lèi)訪問(wèn)p1.name // 通過(guò)對(duì)象訪問(wèn)實(shí)例成員變量p1.count //通過(guò)對(duì)象訪問(wèn)靜態(tài)成員變量Person1.count // 通過(guò)類(lèi)訪問(wèn)靜態(tài)成員變量,實(shí)例成員方法與靜態(tài)成員方法,
30、兩者聲明時(shí)的差別public static int howMany()//靜態(tài)成員方法{ return count; //靜態(tài)成員方法只能訪問(wèn)類(lèi)成員變量}public static void main(String args[])//main方法也是類(lèi)成員方法兩者方法體中語(yǔ)句的差別在類(lèi)成員方法體中,不能使用this引用。 兩者調(diào)用方式的差別Person1.
31、howMany(); //通過(guò)類(lèi)名調(diào)用類(lèi)成員方法p1.howMany(); //通過(guò)對(duì)象調(diào)用,Static 靜態(tài)成員方法的幾點(diǎn)說(shuō)明,在靜態(tài)方法里只能直接調(diào)用同類(lèi)中其他的靜態(tài)成員(包括變量和方法),而不能直接訪問(wèn)類(lèi)中的非靜態(tài)成員。(為什么?)靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字Main()方法是靜態(tài)的,所以jvm在執(zhí)行main方法時(shí)不創(chuàng)建main方法所在類(lèi)的實(shí)例
32、對(duì)象,所以,我們 不能在main方法中使用該類(lèi)的成員變量和成員函數(shù),只有實(shí)例化后才能使用。,成員初始化,Java goes out of its way to guarantee that any variable is properly initialized before it is used. 由于任何方法都可以初始化或使用那個(gè)數(shù)據(jù),所以在正式使用數(shù)據(jù)前,若還是強(qiáng)迫程序員將其一一初始化成一個(gè)適當(dāng)?shù)闹?,就可能不夠?qū)嶋H。因此,一個(gè)類(lèi)
33、的所有primitive數(shù)據(jù)成員都會(huì)保證獲得一個(gè)缺省值。當(dāng)然,句柄會(huì)獲得null值。InitValues.java,成員初始化,對(duì)象的成員變量在創(chuàng)建時(shí)自動(dòng)進(jìn)行初始化,定義初始化和構(gòu)造初始化,定義初始化一個(gè)直接的做法是在定義數(shù)據(jù)成員的同時(shí)也為其賦值。 class Measurement { boolean b=true;char c='x';int i=47; };也可以用相同的方法初始化對(duì)象。
34、 class Measurement { Depth o = new Depth(); };,定義初始化和構(gòu)造初始化(續(xù)),當(dāng)然這個(gè)方法也可以使用參數(shù),但是那些參數(shù)不能是尚未初始化的其它數(shù)據(jù)成員。 class CInit { int i = f(); int k = g(i); // ... }; class CInitWrong { int j = g(i); int
35、i = f(); // ... }; 構(gòu)造函數(shù)初始化可以在構(gòu)造函數(shù)中對(duì)數(shù)據(jù)成員初始化。,定義初始化順序,在一個(gè)類(lèi)里,定義初始化的順序是由變量在類(lèi)內(nèi)的定義順序決定的。即使變量定義大量遍布于方法定義的中間,那些變量仍然會(huì)在調(diào)用任何方法之前得到初始化——當(dāng)然在構(gòu)造函數(shù)之前。 Case: OrderOfInitialization.java,靜態(tài)數(shù)據(jù)初始化,靜態(tài)數(shù)據(jù)成員只在這個(gè)類(lèi)的第一個(gè)對(duì)象要?jiǎng)?chuàng)建的時(shí)候初始化。 Case: St
36、aticInitialization.java,初始化順序,我們總結(jié)一下對(duì)象的創(chuàng)建過(guò)程??紤]一個(gè)叫做Dog的類(lèi): 1、類(lèi)型為Dog的一個(gè)對(duì)象首次創(chuàng)建時(shí),或者Dog類(lèi)的靜態(tài)方法/數(shù)據(jù)首次訪問(wèn)時(shí),Java解釋器必須找到Dog.class。 2、找到Dog.class后,它的所有的靜態(tài)初始化模塊都會(huì)運(yùn)行。因此,靜態(tài)初始化僅發(fā)生一次。 3、創(chuàng)建一個(gè)new Dog( )時(shí),new語(yǔ)句首先會(huì)在堆里分配一個(gè)足夠的空間。 4、這個(gè)空間將
37、會(huì)被清除為零,因此Dog中所有的數(shù)據(jù)成員都得到了缺省值。 5、執(zhí)行定義初始化。 6、執(zhí)行構(gòu)造函數(shù)。,類(lèi)的重用,One of the most compelling features about Java is code reuse. But to be revolutionary, you' ve got to be able to do a lot more than copy code and change it.
38、兩種方法合成:在新類(lèi)里簡(jiǎn)單地創(chuàng)建原有類(lèi)的對(duì)象繼承:創(chuàng)建一個(gè)新類(lèi),這個(gè)新類(lèi)基于一個(gè)存在的基礎(chǔ)類(lèi)而定義出來(lái)。,類(lèi)的繼承性,繼承的概念由一個(gè)已有的類(lèi)定義一個(gè)新類(lèi),稱為新類(lèi)繼承已有的類(lèi)。 繼承的作用繼承原則子類(lèi)繼承父類(lèi)的成員變量,包括實(shí)例成員變量和類(lèi)成員變量。子類(lèi)繼承父類(lèi)除構(gòu)造方法以外的成員方法,包括實(shí)例成員方法和類(lèi)成員方法。子類(lèi)不能繼承父類(lèi)的構(gòu)造方法。因?yàn)楦割?lèi)構(gòu)造方法創(chuàng)建的是父類(lèi)對(duì)象,子類(lèi)必須聲明自己的構(gòu)造方法,創(chuàng)建子類(lèi)自己
39、的對(duì)象。子類(lèi)能夠繼承父類(lèi)的析構(gòu)方法。子類(lèi)不能刪除父類(lèi)成員。子類(lèi)可以增加自己的成員變量和成員方法。子類(lèi)可以重定義父類(lèi)成員。,定義繼承的類(lèi),繼承類(lèi)的語(yǔ)法:關(guān)鍵字(extends)[修飾符] class 類(lèi) [extends 父類(lèi)] [implements 接口列表]public class Student1 extends Person1 { String speciality;
40、 //專業(yè)}Case:Persion1.java Student1.java,定義繼承的類(lèi),單根結(jié)構(gòu):Java中的類(lèi)都是Object的子類(lèi)public class Person1 extends Object類(lèi)的賦值相容性子類(lèi)對(duì)象即是父類(lèi)對(duì)象。 子類(lèi)對(duì)象對(duì)父類(lèi)成員的訪問(wèn)權(quán)限子類(lèi)對(duì)父類(lèi)的私有成員(private)沒(méi)有訪問(wèn)權(quán)限;子類(lèi)對(duì)父類(lèi)的公有成員(public)和保護(hù)成員(protected)具有訪問(wèn)權(quán)限。子
41、類(lèi)對(duì)父類(lèi)中缺省權(quán)限成員的訪問(wèn)分兩種情況,對(duì)同一包中父類(lèi)的缺省權(quán)限成員具有訪問(wèn)權(quán)限,而對(duì)不同包中父類(lèi)的缺省權(quán)限成員則沒(méi)有訪問(wèn)權(quán)限。,定義繼承的類(lèi),子類(lèi)重定義從父類(lèi)繼承來(lái)的成員子類(lèi)隱藏父類(lèi)成員變量Case: TestAB.java子類(lèi)覆蓋父類(lèi)成員方法子類(lèi)繼承并重載父類(lèi)成員方法Case : Detergent.java Super引用:調(diào)用父類(lèi)的構(gòu)造方法super([參數(shù)列表])引用父類(lèi)同名成員子類(lèi)隱藏父類(lèi)成員變量
42、super.成員變量子類(lèi)覆蓋父類(lèi)成員方法super.成員方法([參數(shù)列表])Case:Student1.java,初始化和參數(shù)傳遞,構(gòu)造一個(gè)子類(lèi)時(shí),父類(lèi)的構(gòu)造方法在子類(lèi)的構(gòu)造方法之前被調(diào)用。在子類(lèi)的構(gòu)造方法中可用super(參數(shù)列表)調(diào)用父類(lèi)的構(gòu)造方法。如果子類(lèi)的構(gòu)造方法中沒(méi)有顯示的調(diào)用父類(lèi)構(gòu)造方法,也沒(méi)有使用this關(guān)鍵字調(diào)用自己的其他構(gòu)造方法,那么在產(chǎn)生子類(lèi)實(shí)例對(duì)象時(shí)JVM自動(dòng)調(diào)用父類(lèi)無(wú)參數(shù)的構(gòu)造方法。Chess.ja
43、va,類(lèi)的多態(tài)性,什么是多態(tài)一個(gè)方法可以有多種實(shí)現(xiàn)版本,即“一種定義,多種實(shí)現(xiàn)”,類(lèi)的多態(tài)性表現(xiàn)為方法的多態(tài)性:方法的重載和方法的覆蓋(重寫(xiě))方法的重載重載(overload)是指同一個(gè)類(lèi)中的多個(gè)方法可以同名但參數(shù)列表必須不同。方法的覆蓋覆蓋(override)是指子類(lèi)聲明并實(shí)現(xiàn)父類(lèi)中的同名方法并且參數(shù)列表也完全相同。,上溯造型(upcasting),取得一個(gè)子類(lèi)的對(duì)象句柄,可以將其作為基礎(chǔ)類(lèi)型句柄使用的行為就叫作“上溯造型”
44、 Case:Music.java為什么要上溯造型?Case:Music2.java上溯造型是安全的(為什么?),方法調(diào)用的綁定,將一個(gè)方法調(diào)用同一個(gè)方法主體連接到一起就稱為“綁定”(Binding)。早期綁定和后期綁定(動(dòng)態(tài)綁定)Java中綁定的所有方法都采用后期綁定技術(shù),除非一個(gè)方法已被聲明成final子類(lèi)正確的調(diào)用自己的實(shí)現(xiàn)函數(shù)shapes, shapes.java,擴(kuò)展性music,music3.java,抽象
45、類(lèi)和最終類(lèi),抽象類(lèi)聲明抽象類(lèi)與抽象方法public abstract class PlaneGraphics1 //平面圖形類(lèi),抽象類(lèi){ public abstract double area(); //計(jì)算面積,抽象方法,分號(hào)";"必不可少}抽象類(lèi)不能被實(shí)例化PlaneGraphics1 p = new PlaneGraphiic1() 錯(cuò)誤抽象類(lèi)與
46、抽象方法的作用抽象方法必須被子類(lèi)覆蓋,例:PlaneGraphics1,設(shè)計(jì)抽象的平面圖形類(lèi)PlaneGraphics1Case: PlaneGraphics1.java設(shè)計(jì)長(zhǎng)方形類(lèi)Rectangle1,繼承平面圖形類(lèi)。Case:Rectangle1.java設(shè)計(jì)橢圓類(lèi)Ellipse1,繼承平面圖形類(lèi)。Case: Ellipse1.java使用平面圖形類(lèi)及其子類(lèi)Case:PlaneGraphics1_ex.java,fi
47、nal 關(guān)鍵字,final : 一旦賦值后就不能改變了在java中聲明類(lèi)、屬性和方法時(shí),可以使用關(guān)鍵字final來(lái)修飾 final for data final for methods final for a class,最終類(lèi)(final),聲明最終類(lèi)public final class Math extends Object //數(shù)學(xué)類(lèi),最終類(lèi) // 不能被繼承聲明最終方法public class
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 面向?qū)ο蠛兔嫦驅(qū)ο蟮母呒?jí)概念
- 05_面向?qū)ο蟾呒?jí)特性一
- 05_面向?qū)ο蟾呒?jí)特性一
- 壽險(xiǎn)核心業(yè)務(wù)系統(tǒng)中的面向?qū)ο蠹夹g(shù)和RUP的實(shí)踐.pdf
- 操作系統(tǒng)核心的設(shè)計(jì)與實(shí)現(xiàn)使用面向?qū)ο蟮姆椒?pdf
- 面向?qū)ο笤O(shè)計(jì)類(lèi)和對(duì)象
- 面向?qū)ο笤O(shè)計(jì)
- 面向?qū)ο蟮母呒?jí)編程
- 面向?qū)ο筌浖臏y(cè)試
- 面向控制的直流鍋爐汽溫對(duì)象特性分析與辨識(shí).pdf
- 基于面向?qū)ο筌浖鄳B(tài)特性的MM路徑自動(dòng)生成.pdf
- java面向?qū)ο罂偨Y(jié)
- 面向?qū)ο笤O(shè)計(jì)原則
- 并發(fā)對(duì)象模型和面向?qū)ο蟮膒etri網(wǎng).pdf
- 面向?qū)ο蟮慕<夹g(shù)omt
評(píng)論
0/150
提交評(píng)論