版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、第三章 對象與類,3.1 類與對象 3.2 定義類 3.3 成員變量的作用域 3.4 方法重載 3.5 創(chuàng)建對象 3.6 構(gòu)造方法 3.7 this關鍵字 3.8 初始化問題 3.9 static 關鍵字 3.10 對象的清理 3.11 訪問控制修飾符 3.12 具體隱藏實現(xiàn) 3.13 參數(shù)傳遞 3.14 總結(jié),3.1 定義類,傳統(tǒng)程序設計語言的不足 數(shù)據(jù)和對數(shù)據(jù)的操作相分離 面向?qū)ο笤O計的思想 什么是對象 一切都是對象 對象與類的關系 類是對象的模版,對象是類的實例,3.2 定義類,類是組成程序的基本單元,定義了自己的類就是定義了要使用的對象的類型。,例:定義一個汽車類: class Car
2、 int color; int door; int speed; void start() void brake() 聲明一個汽車類的引用變量: Car myCar;,聲明類的語法: 修飾符 class 類名稱 /成員變量 /方法 ,Java基本數(shù)據(jù)類型,Java數(shù)據(jù)類型包括基本數(shù)據(jù)類型和引用類型,包裝器類型把基本數(shù)據(jù)類型數(shù)據(jù)“包裝”成對象,從 int類型創(chuàng)建一個Integer對象:int myInt; Integer myInteger = new Integer(myInt); 從包裝對象中取出基本類型值: myInt = myIValue();,Java基本數(shù)據(jù)類型,
3、第一個Java程序,程序3.1 Rectangle.java class Rectangle int a,b; int getArea() return a*b; void locate(int x,int y) System.out.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
4、r1 is:+area); ,第一個Java程序,main方法是程序的入口 包含main方法的類是Java應用程序的主類 一個Java源文件可以包含多個類,但同一個Java源文件只有主類可以聲明為public Java源文件的命名必須與主類同名,3.3成員變量的作用域,在Java中變量的作用域是由大括號組成的程序塊決定 在不嵌套的程序塊中可以多次聲明相同變量 在嵌套的程序塊中不允許重復聲明同名的變量 聲明在方法中的變量為局部變量,與實例變量重名的局部變量會覆蓋實例變量,其作用域為整個方法體。 見程序3.2 TestScoping.java,作用域舉例, int x= 1; int y=2 /x
5、y可用 / x可用y超出作用域 ,合法的聲明: int x=1; int x=2; ,不合法的嵌套聲明: int x=1; int x=2; ,3.4方法重載,方法重載(Overload)是指一個類中可以定義參數(shù)列表不同但名字相同的多個方法,調(diào)用時,會根據(jù)不同的參數(shù)列表來選擇對應的方法 。,重載的方法名字必須相同 重載的方法參數(shù)必須不同 當一個重載方法被調(diào)用時,Java 用參數(shù)的類型和(或)數(shù)量來表明實際調(diào)用的重載方法的版本。每個重載方法的參數(shù)的類型和(或)數(shù)量必須是不同的。雖然每個重載方法可以有不同的返回 類型,但返回類型并不足以區(qū)分所使用的是哪個方法。當Java 調(diào)用一個重載方法時,參數(shù)與
6、調(diào)用參數(shù)匹配的方法被執(zhí)行。 見程序3.3 TestOverload.java 程序3.4 TestOverload1.java,被重載的方法必須有不同的參數(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) Sy
7、stem.out.println(Print float a and int b: + a + + b); public static void main(String args) TestOverload2 obj = new TestOverload2(); obj.print(1,2); ,3.5創(chuàng)建對象,先聲名引用變量 Rectangle r1; 然后創(chuàng)建對象賦值給r1: r1= new rectangle(); 聲明引用變量的同時產(chǎn)生一個對象賦給它: Rectangle r1=new Rectangle(); 引用變量r1“代表”了一個矩形對象,我們就可以使用引用變量加句點形式訪問對
8、象的成員了,在Java中基本類型變量存儲在棧的內(nèi)存結(jié)構(gòu)中 int x=10; boolean y=true;,引用型變量內(nèi)儲存著對象實例的地址 聲明兩個矩形類引用變量r1、r2 :Rectangle r1,r2; r1、r2沒有指向任何對象實例,系統(tǒng)默認賦初值null,產(chǎn)生一個新對象實例并賦值給r1: r1= new rectangle(); r2=r1;,在java中字符串類型數(shù)據(jù)是按照對象來處理的 兩種方式 顯式和隱式創(chuàng)建 Java為了加快程序的執(zhí)行速度,把隱式創(chuàng)建的字符串對象放在棧中一個特殊區(qū)域字符串池(String Pool)中,相同內(nèi)容的字符串對象只保留一份 。,String str
9、1=new String(“Hello java!”); String str2=”Hello Java!”,程序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.println(str1= =str2); System.out.println(str1=
10、 =str3); System.out.println(str3= =str4); 輸出結(jié)果: true false true,3.6構(gòu)造方法,構(gòu)造方法是創(chuàng)建對象時調(diào)用的特殊方法 方法名必須與要創(chuàng)建對象的類名相同 不允許聲明返回類型,即使聲明為void也是不正確的 如果類中并沒有定義構(gòu)造方法,Java會自動地給你添加一個無參的缺省構(gòu)造方法 可以自定義重載的多個構(gòu)造方法,在創(chuàng)建對象時使實例多樣化。 例:程序3.7 Student.java,3.7 this關鍵字,public Student(int age ) System.out.println(Invoke constructor with
11、 age.); age=age; ,以上構(gòu)造方法中出現(xiàn)age=age的奇怪語句,this關鍵字用來解決這個問題。 this引用指向的是其本身所在方法的當前對象。以上構(gòu)造方法若采用this關鍵字則修改為: public Student(int age ) System.out.println(Invoke constructor with age.); this.age=age; this.age=age意指把參數(shù)age的值賦給類成員變量age。,3.8初始化問題,如果程序員使用了缺省的構(gòu)造方法并且沒有在類中初始化成員變量,創(chuàng)建對象時系統(tǒng)會對各種類型的成員變量按表3.3自動進行初始化賦予一個默認
12、值。,用構(gòu)造方法完成初始化,可以使用自定義的構(gòu)造方法在方法體內(nèi)初始化成員 可以在構(gòu)造方法中使用this()調(diào)用其它構(gòu)造方法以減少代碼冗余 構(gòu)造方法內(nèi)this必須在第一行 只能調(diào)用一次this()不允許調(diào)用兩次 this()只能在構(gòu)造器中使用,其他成員方法不得調(diào)用。,class Student int age; String name; public Student() System.out.println(Creating default student.); System.out.println(Default age=+age); System.out.println(Default na
13、me=+name); public Student(int a,String n ) this(a); /必須在第一句 name=n; System.out.println(Initialize student with name and age.); public Student(int age ) this.age=age; System.out.println(Initialize student with age.); ,public Student(String name ) =name; System.out.println(Initialize student
14、with name.); public class TestThis public static void main(String args) Student st1= new Student(); new Student(24,Jacky); ,程序3.8 TestThis.java,用構(gòu)造方法完成初始化,可以使用自定義的構(gòu)造方法在方法體內(nèi)初始化成員 可以在構(gòu)造方法中使用this()調(diào)用其它構(gòu)造方法以減少代碼冗余 構(gòu)造方法內(nèi)this必須在第一行 只能調(diào)用一次this()不允許調(diào)用兩次 this()只能在構(gòu)造器中使用,其他成員方法不得調(diào)用。,3.9 static 關鍵字,聲明為static的成
15、員方法和變量在內(nèi)存中固定只存在一份,也就是說所有類都可以共享使用的 聲明為靜態(tài)的成員變量和成員方法在類內(nèi)部可以直接使用,在類外部可以通過類名加句點的方式直接訪問,而不必實例化再使用 靜態(tài)方法內(nèi)部不能調(diào)用非靜態(tài)方法,因為靜態(tài)方法本身是不會實例化的 ;this在靜態(tài)方法中沒有意義,3.10 對象的清理,C語言和c+是通過程序員自己定義對象的生命周期,你必須在適當?shù)臅r候自己寫程序清除不再使用的對象空間 Java將釋放無用內(nèi)存空間的任務交給了Java虛擬機,通過垃圾回收器來回收無用對象的內(nèi)存空間 程序員無需強制垃圾回收器立即執(zhí)行進行清除工作,只有當內(nèi)存資源不夠用時垃圾回收器才開始真正回收空間 ,所以整
16、個程序過程中垃圾回收器可能不需要工作。,什么樣的對象將被垃圾回收 ?,class Student int age; String name; public Student(String n ) name=n; public static void p() Student st1=new Student(Peter); Student st2=new Student(Julie); st1=st2; st2=null; public class TestGc public static void main(String args) Student.p(); 程序3.9 TestGc.java,靜
17、態(tài)方法p中首先創(chuàng)建了兩個學生Peter和Julie,然后引用st1指向st2,這時st1和st2同時指向Julie,對象Peter沒有引用變量引用,所以處于待回收狀態(tài),st2賦空值后仍然有st1指向Julie所以Julie這時還不是垃圾,當方法p()執(zhí)行完成返回main方法時,局部變量st1和st2超出作用域,結(jié)束生命。內(nèi)存堆中的Peter和Julie都變成了垃圾,處于待回收狀態(tài) 。 處于待回收狀態(tài)只是告訴虛擬機哪些對象是垃圾,并不不知道垃圾回收器什么時候回收他們 。當內(nèi)存資源緊張時,垃圾回收器會及時工作清理這些垃圾。,finalize(),在某些情況下回收垃圾對象時需要結(jié)束與這個對象相關的一
18、些工作,比如說某個對象打開了一個文件,那么清除這個對象時就需要關閉這個文件,否則這個文件在垃圾對象被回收以后就無法再編輯和關閉了 finalize方法可以完成這些工作。 finalize方法在垃圾回收發(fā)生之前調(diào)用,用來驗證回收條件是否成熟,比如你的對象可能還與其他對象聯(lián)系在一起,這時在finalize方法中設定條件,阻止垃圾回收,使垃圾對象“復活” 。,3.11訪問控制修飾符,類成員修飾符 public 指定類成員為public時,該類成員在任何類中都可以通過一個該類對象的引用來進行訪問,當然該類內(nèi)部可直接訪問。 private即聲明說這是私有的,指定成員變量或方法為private時,該類成員
19、變?yōu)榇祟惖?“私有財產(chǎn)”,只能在該類中訪問。 defualt即缺省,修飾符為隱含的package,可以在該類中訪問,也能夠在同一包中的類訪問。但在不同包中即使是其子類也無法訪問。 protected 說明該成員是受保護的,可以在該類中訪問。同時同一包中的類也可以對其進行訪問,不同包的子類也可以進行訪問。 類修飾符:public、default 指定為public時,可以通過import指令對該類進行復用。如果缺省則是隱含的package訪問修飾語,這時只有在相同包里的類才能調(diào)用該類。,3.12具體隱藏實現(xiàn),具體隱藏實現(xiàn)是面向?qū)ο笤O計中一個非常重要的概念,通過使用訪問控制修飾符,把類中的無須公開
20、的數(shù)據(jù)與方法封裝起來,對外隱藏了類功能的具體實現(xiàn)過程。改變類的功能時不會影響類的使用者,并且提高了程序的安全性與可維護性。,通過添加訪問器和修改器修改Rectangle類,class Rectangle private int a,b; public int getArea() return a*b; public int setAB(int a,int b) if(a=0|b=0) System.out.println(“Erro input!”); this.a=a; this.b=b; ,3.13參數(shù)傳遞,Java的參數(shù)傳遞都是值傳遞 Java參數(shù)傳遞分為基本類型參數(shù)傳遞與對象類型(即引
21、用類型)參數(shù)傳遞。 基本類型參數(shù)值傳遞意味著當將一個實參值傳遞給一個方法時,如果方法修改了該參數(shù),改變的是形參,而原始的實參的值保持不變。 引用類型變量傳遞將一個參數(shù)傳遞給一個方法后,方法接收的是一個引用變量的值,這個值某個對象的內(nèi)存地址值。引用變量的參數(shù)傳遞仍然是值傳遞。,程序3.10 TestPass.java class Student int age; String name; public Student(int a,String n ) age=a; name=n; public class TestPass public static void changeAge(int fro
22、mAge, int toAge ) fromAge=toAge; System.out.println(After invoke method changeAge fromAge is:+toAge); ,public static void changeObjAge(Student st, int toAge ) st.age=toAge; public static void main(String args) Student st1=new Student(19,Jacky); changeAge(st1.age,20); System.out.println(After invoke method changeAge student age is: +st1.age); changeObjAge(st1,20); System.out.println(After invoke method changeObjAge student age is: +st1.age); ,changeObjAge方法通過接受引用變量參數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力安裝行業(yè)財務制度
- 就業(yè)資金管理財務制度
- 企業(yè)注冊財務制度
- 煤礦工會財務制度
- 餐飲服務公司財務制度
- 農(nóng)藥經(jīng)營八個制度
- 關于急危重患者搶救制度
- 公司報銷流程制度
- 養(yǎng)老院老人健康監(jiān)測人員職業(yè)發(fā)展規(guī)劃制度
- 富士康夜班管理制度(3篇)
- 2026新疆阿合奇縣公益性崗位(鄉(xiāng)村振興專干)招聘44人筆試參考題庫及答案解析
- 北京中央廣播電視總臺2025年招聘124人筆試歷年參考題庫附帶答案詳解
- 紀委監(jiān)委辦案安全課件
- 兒科pbl小兒肺炎教案
- 腹部手術(shù)圍手術(shù)期疼痛管理指南(2025版)
- JJG(吉) 145-2025 無創(chuàng)非自動電子血壓計檢定規(guī)程
- 2025年學校領導干部民主生活會“五個帶頭”對照檢查發(fā)言材料
- 顱內(nèi)壓監(jiān)測與護理
- 浙江省紹興市上虞區(qū)2024-2025學年七年級上學期語文期末教學質(zhì)量調(diào)測試卷(含答案)
- 廣州自來水公司招聘考試題
- GB/T 26332.6-2022光學和光子學光學薄膜第6部分:反射膜基本要求
評論
0/150
提交評論