第三章節(jié)對(duì)象與類_第1頁
第三章節(jié)對(duì)象與類_第2頁
第三章節(jié)對(duì)象與類_第3頁
第三章節(jié)對(duì)象與類_第4頁
第三章節(jié)對(duì)象與類_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第三章節(jié)對(duì)象與類 第三章第三章 對(duì)象與類對(duì)象與類 n3.1 類與對(duì)象類與對(duì)象 n3.2 定義類定義類 n3.3 成員變量的作用域成員變量的作用域 n3.4 方法重載方法重載 n3.5 創(chuàng)建對(duì)象創(chuàng)建對(duì)象 n3.6 構(gòu)造方法構(gòu)造方法 n3.7 this n3.8 初始化問題初始化問題 n3.9 static n3.10 對(duì)象的清理對(duì)象的清理 n3.11 訪問控制修飾符訪問控制修飾符 n3.12 具體隱藏實(shí)現(xiàn)具體隱藏實(shí)現(xiàn) n3.13 參數(shù)傳遞參數(shù)傳遞 n3.14 總結(jié)總結(jié) 第三章節(jié)對(duì)象與類 3.1 3.1 定義類定義類 n傳統(tǒng)程序設(shè)計(jì)語言的不足 數(shù)據(jù)和對(duì)數(shù)據(jù)的操作相分離 n面向?qū)ο笤O(shè)計(jì)的思想 n什么

2、是對(duì)象 一切都是對(duì)象 n對(duì)象與類的關(guān)系 類是對(duì)象的模版,對(duì)象是類的實(shí)例 第三章節(jié)對(duì)象與類 3.2 3.2 定義類定義類 類是組成程序的基本單元,定義了自己的類就是定 義了要使用的對(duì)象的類型。 例:定義一個(gè)汽車類:例:定義一個(gè)汽車類: class Car int color; int door; int speed; void start() void brake() 聲明一個(gè)汽車類的引用變量: Car myCar; 聲明類的語法: 修飾符 class 類名稱 /成員變量 /方法 第三章節(jié)對(duì)象與類 JavaJava基本數(shù)據(jù)類型基本數(shù)據(jù)類型 Java數(shù)據(jù)類型包括基本數(shù)據(jù)類型和引用類型 第三章節(jié)對(duì)象

3、與類 包裝器類型把基本數(shù)據(jù)類型數(shù)據(jù)“包裝”成對(duì)象 從 int類型創(chuàng)建一個(gè)Integer對(duì)象: int myInt; Integer myInteger = new Integer(myInt); 從包裝對(duì)象中取出基本類型值: myInt = myIValue(); JavaJava基本數(shù)據(jù)類型基本數(shù)據(jù)類型 第三章節(jié)對(duì)象與類 第一個(gè)第一個(gè)JavaJava程序程序 程序3.1 Rectangle.java class Rectangle int a,b; int getArea() return a*b; void locate(int x,int y) System.out.

4、println(The position s(+x+,+y+); public static void main(String args) Rectangle r1=new Rectangle(); r1.locate(3,4); r1.a=2; r1.b=3; int area=r1.getArea(); System.out.println(Area of r1 is:+area); 第三章節(jié)對(duì)象與類 第一個(gè)第一個(gè)JavaJava程序程序 nmain方法是程序的入口 n包含main方法的類是Java應(yīng)用程序的主類 n一個(gè)Java源文件可以包含多個(gè)類,但同一個(gè) Java源文件只有主類可以聲明

5、為public nJava源文件的命名必須與主類同名 第三章節(jié)對(duì)象與類 3.33.3成員變量的作用域成員變量的作用域 n在Java中變量的作用域是由大括號(hào)組成的程序 塊決定 n在不嵌套的程序塊中可以多次聲明相同變量 n在嵌套的程序塊中不允許重復(fù)聲明同名的變量 n聲明在方法中的變量為局部變量,與實(shí)例變量 重名的局部變量會(huì)覆蓋實(shí)例變量,其作用域?yàn)?整個(gè)方法體。 見程序3.2 TestScoping.java 第三章節(jié)對(duì)象與類 作用域舉例作用域舉例 int x= 1; int y=2 /xy可用 / x可用y超出作用域 合法的聲明: int x=1; int x=2; 不合法的嵌套聲明: int x

6、=1; int x=2; 第三章節(jié)對(duì)象與類 3.43.4方法重載方法重載 方法重載(Overload)是指一個(gè)類中可以定義參數(shù)列表不 同但名字相同的多個(gè)方法,調(diào)用時(shí),會(huì)根據(jù)不同的參數(shù)列 表來選擇對(duì)應(yīng)的方法 。 n重載的方法名字必須相同 n重載的方法參數(shù)必須不同 當(dāng)一個(gè)重載方法被調(diào)用時(shí),Java 用參數(shù)的類型和(或)數(shù)量來表明 實(shí)際調(diào)用的重載方法的版本。每個(gè)重載方法的參數(shù)的類型和(或) 數(shù)量必須是不同的。雖然每個(gè)重載方法可以有不同的返回 類型,但 返回類型并不足以區(qū)分所使用的是哪個(gè)方法。當(dāng)Java 調(diào)用一個(gè)重載 方法時(shí),參數(shù)與調(diào)用參數(shù)匹配的方法被執(zhí)行。 見程序3.3 TestOverload.j

7、ava 程序3.4 TestOverload1.java 第三章節(jié)對(duì)象與類 被重載的方法必須有不同的參數(shù)列表,前面例子區(qū)分重載方法的參數(shù)采用 了或者數(shù)量不同,或者類型不同,參數(shù)順序不同雖然也可以重載,但是容 易產(chǎn)生歧義 。例: 程序3.5 TestOverload2.java public class TestOverload2 void print(int a,float b) System.out.println(Print int a and float b: + a + + b); void print(float a,int b) System.out.println(Print f

8、loat a and int b: + a + + b); public static void main(String args) TestOverload2 obj = new TestOverload2(); obj.print(1,2); 第三章節(jié)對(duì)象與類 3.53.5創(chuàng)建對(duì)象創(chuàng)建對(duì)象 n先聲名引用變量 Rectangle r1; 然后創(chuàng)建對(duì)象賦值給r1: r1= new rectangle(); n聲明引用變量的同時(shí)產(chǎn)生一個(gè)對(duì)象賦給它: Rectangle r1=new Rectangle(); 引用變量r1“代表”了一個(gè)矩形對(duì)象,我們就可以使用引用變量加 句點(diǎn)形式訪問對(duì)象的成員了

9、第三章節(jié)對(duì)象與類 在Java中基本類型變量存儲(chǔ)在棧的內(nèi)存結(jié)構(gòu)中 int x=10; boolean y=true; 第三章節(jié)對(duì)象與類 引用型變量內(nèi)儲(chǔ)存著對(duì)象實(shí)例的地址 聲明兩個(gè)矩形類引用變量r1、r2 :Rectangle r1,r2; r1、r2沒有指向任何對(duì)象實(shí)例,系統(tǒng)默認(rèn)賦初值null 第三章節(jié)對(duì)象與類 產(chǎn)生一個(gè)新對(duì)象實(shí)例并賦值給r1: r1= new rectangle(); r2=r1; 第三章節(jié)對(duì)象與類 n在java中字符串類型數(shù)據(jù)是按照對(duì)象來處理的 n兩種方式 顯式和隱式創(chuàng)建 nJava為了加快程序的執(zhí)行速度,把隱式創(chuàng)建的字符串 對(duì)象放在棧中一個(gè)特殊區(qū)域字符串池(String P

10、ool) 中,相同內(nèi)容的字符串對(duì)象只保留一份 。 String str1=new String(“Hello java!”); String str2=”Hello Java!” 第三章節(jié)對(duì)象與類 程序3.6 TestString.java public class TestString public static void main(String args) String str1=new String(Hello Java!); String str2=str1; String str3=Hello Java!; String str4=Hello Java!; System.out.pr

11、intln(str1= =str2); System.out.println(str1= =str3); System.out.println(str3= =str4); 輸出結(jié)果: true false true 第三章節(jié)對(duì)象與類 3.63.6構(gòu)造方法構(gòu)造方法 n構(gòu)造方法是創(chuàng)建對(duì)象時(shí)調(diào)用的特殊方法 n方法名必須與要?jiǎng)?chuàng)建對(duì)象的類名相同 n不允許聲明返回類型,即使聲明為void也是不 正確的 n如果類中并沒有定義構(gòu)造方法,Java會(huì)自動(dòng)地 給你添加一個(gè)無參的缺省構(gòu)造方法 n可以自定義重載的多個(gè)構(gòu)造方法,在創(chuàng)建對(duì)象 時(shí)使實(shí)例多樣化。(重載) 例:程序3.7 Student.java 第三章節(jié)對(duì)象與

12、類 3.7 this3.7 this關(guān)鍵字關(guān)鍵字 public Student(int age ) System.out.println(Invoke constructor with age.); age=age; 以上構(gòu)造方法中出現(xiàn)age=age的奇怪語句,this關(guān)鍵字用 來解決這個(gè)問題。 this引用指向的是其本身所在方法的當(dāng)前對(duì)象。以上構(gòu)造 方法若采用this關(guān)鍵字則修改為: public Student(int age ) System.out.println(Invoke constructor with age.); this.age=age; this.age=age意指把參

13、數(shù)age的值賦給類成員變量age。 第三章節(jié)對(duì)象與類 3.83.8初始化問題初始化問題 n如果程序員使用了缺省的構(gòu)造方法并且沒有在類中初始化成員變 量,創(chuàng)建對(duì)象時(shí)系統(tǒng)會(huì)對(duì)各種類型的成員變量按表3.3自動(dòng)進(jìn)行初 始化賦予一個(gè)默認(rèn)值。 第三章節(jié)對(duì)象與類 用構(gòu)造方法完成初始化用構(gòu)造方法完成初始化 n可以使用自定義的構(gòu)造方法在方法體內(nèi) 初始化成員 n可以在構(gòu)造方法中使用this()調(diào)用其它構(gòu) 造方法以減少代碼冗余 n構(gòu)造方法內(nèi)this必須在第一行 n只能調(diào)用一次this()不允許調(diào)用兩次 nthis()只能在構(gòu)造器中使用,其他成員 方法不得調(diào)用。 第三章節(jié)對(duì)象與類 classStudent intag

14、e; Stringname; publicStudent() System.out.println(Creating defaultstudent.); System.out.println(Default age=+age); System.out.println(Default name=+name); publicStudent(inta,Stringn) this(a);/必須在第一句 name=n; System.out.println(Initialize studentwithnameandage.); publicStudent(intage) this.age=age; Sy

15、stem.out.println(Initialize studentwithage.); publicStudent(Stringname) =name; System.out.println(Initialize studentwithname.); publicclassTestThis publicstaticvoidmain(Stringargs) Studentst1=newStudent(); newStudent(24,Jacky); 程序3.8TestThis.java 第三章節(jié)對(duì)象與類 3.9 static 3.9 static 關(guān)鍵字關(guān)鍵字 n聲明為st

16、atic的成員方法和變量在內(nèi)存中固定只存在一 份,也就是說所有類都可以共享使用的 n聲明為靜態(tài)的成員變量和成員方法在類內(nèi)部可以直接 使用,在類外部可以通過類名加句點(diǎn)的方式直接訪問, 而不必實(shí)例化再使用 n靜態(tài)方法內(nèi)部不能調(diào)用非靜態(tài)方法,因?yàn)殪o態(tài)方法本 身是不會(huì)實(shí)例化的 ;this在靜態(tài)方法中沒有意義 第三章節(jié)對(duì)象與類 3.10 3.10 對(duì)象的清理對(duì)象的清理 nC語言和c+是通過程序員自己定義對(duì)象的生命周期, 你必須在適當(dāng)?shù)臅r(shí)候自己寫程序清除不再使用的對(duì)象 空間 nJava將釋放無用內(nèi)存空間的任務(wù)交給了Java虛擬機(jī), 通過垃圾回收器來回收無用對(duì)象的內(nèi)存空間 n程序員無需強(qiáng)制垃圾回收器立即執(zhí)行

17、進(jìn)行清除工作, 只有當(dāng)內(nèi)存資源不夠用時(shí)垃圾回收器才開始真正回收 空間 ,所以整個(gè)程序過程中垃圾回收器可能不需要工 作。 第三章節(jié)對(duì)象與類 什么樣的對(duì)象將被垃圾回收什么樣的對(duì)象將被垃圾回收 ? classStudent intage; Stringname; publicStudent(Stringn) name=n; publicstaticvoidp() Studentst1=newStudent(Peter); Studentst2=newStudent(Julie); st1=st2; st2=null; publicclassTestGc publicstaticvoidmain(St

18、ringargs) Student.p(); 程序3.9TestGc.java 第三章節(jié)對(duì)象與類 靜態(tài)方法p中首先創(chuàng)建了兩個(gè)學(xué)生Peter和Julie,然后引用st1指向st2,這 時(shí)st1和st2同時(shí)指向Julie,對(duì)象Peter沒有引用變量引用,所以處于待回收狀 態(tài),st2賦空值后仍然有st1指向Julie所以Julie這時(shí)還不是垃圾,當(dāng)方法p()執(zhí) 行完成返回main方法時(shí),局部變量st1和st2超出作用域,結(jié)束生命。內(nèi)存堆中 的Peter和Julie都變成了垃圾,處于待回收狀態(tài)。 處于待回收狀態(tài)只是告訴虛擬機(jī)哪些對(duì)象是垃圾,并不不知道垃圾回收 器什么時(shí)候回收他們。當(dāng)內(nèi)存資源緊張時(shí),垃圾

19、回收器會(huì)及時(shí)工作清理這些 垃圾。 第三章節(jié)對(duì)象與類 finalizefinalize()() 在某些情況下回收垃圾對(duì)象時(shí)需要結(jié)束與這個(gè)對(duì)象相關(guān)的一些工作, 比如說某個(gè)對(duì)象打開了一個(gè)文件,那么清除這個(gè)對(duì)象時(shí)就需要關(guān)閉這個(gè) 文件,否則這個(gè)文件在垃圾對(duì)象被回收以后就無法再編輯和關(guān)閉了 finalize方法可以完成這些工作。 finalize方法在垃圾回收發(fā)生之前調(diào)用,用來驗(yàn)證回收條件是否成熟, 比如你的對(duì)象可能還與其他對(duì)象聯(lián)系在一起,這時(shí)在finalize方法中設(shè)定 條件,阻止垃圾回收,使垃圾對(duì)象“復(fù)活”。 第三章節(jié)對(duì)象與類 3.113.11訪問控制修飾符訪問控制修飾符 類成員修飾符 npublic

20、 指定類成員為public時(shí),該類成員在任何類中都可以通過一 個(gè)該類對(duì)象的引用來進(jìn)行訪問,當(dāng)然該類內(nèi)部可直接訪問。 nprivate即聲明說這是私有的,指定成員變量或方法為private時(shí), 該類成員變?yōu)榇祟惖?“私有財(cái)產(chǎn)”,只能在該類中訪問。 ndefualt即缺省,修飾符為隱含的package,可以在該類中訪問, 也能夠在同一包中的類訪問。但在不同包中即使是其子類也無法 訪問。 nprotected 說明該成員是受保護(hù)的,可以在該類中訪問。同時(shí)同一 包中的類也可以對(duì)其進(jìn)行訪問,不同包的子類也可以進(jìn)行訪問。 類修飾符:public、default n指定為public時(shí),可以通過import

21、指令對(duì)該類進(jìn)行復(fù)用。如果缺省 則是隱含的package訪問修飾語,這時(shí)只有在相同包里的類才能 調(diào)用該類。 第三章節(jié)對(duì)象與類 3.123.12具體隱藏實(shí)現(xiàn)具體隱藏實(shí)現(xiàn) 具體隱藏實(shí)現(xiàn)是面向?qū)ο笤O(shè)計(jì)中一個(gè)非常重 要的概念,通過使用訪問控制修飾符,把類中 的無須公開的數(shù)據(jù)與方法封裝起來,對(duì)外隱藏 了類功能的具體實(shí)現(xiàn)過程。改變類的功能時(shí)不 會(huì)影響類的使用者,并且提高了程序的安全性 與可維護(hù)性。 第三章節(jié)對(duì)象與類 通過添加訪問器和修改器修改Rectangle類 classRectangle privateinta,b; publicintgetArea() returna*b; publicintsetA

22、B(inta,intb) if(a=0|b=0) System.out.println(“Erroinput!”); this.a=a; this.b=b; 第三章節(jié)對(duì)象與類 3.133.13參數(shù)傳遞參數(shù)傳遞 nJava的參數(shù)傳遞都是值傳遞 nJava參數(shù)傳遞分為基本類型參數(shù)傳遞與對(duì)象類 型(即引用類型)參數(shù)傳遞。 n基本類型參數(shù)值傳遞意味著當(dāng)將一個(gè)實(shí)參值傳 遞給一個(gè)方法時(shí),如果方法修改了該參數(shù),改 變的是形參,而原始的實(shí)參的值保持不變。 n引用類型變量傳遞將一個(gè)參數(shù)傳遞給一個(gè)方法 后,方法接收的是一個(gè)引用變量的值,這個(gè)值 某個(gè)對(duì)象的內(nèi)存地址值。引用變量的參數(shù)傳遞 仍然是值傳遞。 第三章節(jié)對(duì)象與類 程序3.10TestPass.java classStudent intage; Stringname; publicStudent(inta,Stringn) age=a; name=n;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論