輕工學(xué)院java語言程序設(shè)計(jì)第五講_第1頁
輕工學(xué)院java語言程序設(shè)計(jì)第五講_第2頁
輕工學(xué)院java語言程序設(shè)計(jì)第五講_第3頁
輕工學(xué)院java語言程序設(shè)計(jì)第五講_第4頁
輕工學(xué)院java語言程序設(shè)計(jì)第五講_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Java程序設(shè)計(jì) 第五講Java面向?qū)ο蟮奶卣?二)1構(gòu)造方法(constructor)問題的提出Java試圖在每個對象一誕生時,就給它一個指定的狀態(tài)(即成員變量的初值),但有時系統(tǒng)的缺省初值并不合適;所以在創(chuàng)建一個新對象時,需用構(gòu)造方法完成合法的初始化,使成員變量的初始化工作不依賴于外界(系統(tǒng))完成。構(gòu)造方法是一種特殊的成員方法,構(gòu)造方法與類同名。在創(chuàng)建每個新對象時自動執(zhí)行,以保證新對象的各成員都有合法、確定的初值。2構(gòu)造方法(例)class Dog private int weight ;public Dog() / Dog類的構(gòu)造方法weight = 42 ; /實(shí)現(xiàn)對象狀態(tài)(成員變量)

2、的初始化public int getWeight() return weight;public void setWeight(int myWeight) weight = myWeight;public class UseDogpublic static void main(String args)Dog d = new Dog(); /用構(gòu)造方法創(chuàng)建對象System.out.println(The dogs weight is + d.getWeight();The dogs weight is 42運(yùn)算結(jié)果:3構(gòu)造方法的特點(diǎn)構(gòu)造方法與成員方法不同,不能被直接調(diào)用,必須通過new調(diào)用; 創(chuàng)建

3、對象時,利用運(yùn)算符 new 在內(nèi)存中開辟專用空間,存放指定的類的實(shí)例(即對象),這時會自動執(zhí)行類的構(gòu)造方法,初始化新對象的成員變量. 例:Date d = new Date (22, 5, 2003);4構(gòu)造方法的特點(diǎn)(續(xù))構(gòu)造方法沒有返回類型,但聲明時也不加void。構(gòu)造方法可以完成更多的操作,而不僅僅局限于變量的初始化。(如在構(gòu)造方法中調(diào)用其他方法等。)5一個類可創(chuàng)建多個構(gòu)造方法:構(gòu)造方法的重載。例: class Date( ) Date( ) Date(int x, int y ) Date(int x, char y ) Date d1=new Date( ) Date d2=new

4、Date(5,A ) Date d3=new Date(5,12) /分加調(diào)用不同的構(gòu)造方法6構(gòu)造方法的缺省每一個類至少有一個構(gòu)造方法。當(dāng)未定義任何構(gòu)造方法時,系統(tǒng)在編譯時,會提供一個缺省構(gòu)造方法:無參數(shù),方法體中沒有內(nèi)容缺省構(gòu)造方法的初始化數(shù)據(jù)初值: 數(shù)值型:0; 布爾型:false; 引用型:null; 字符串型:null;一旦定義了構(gòu)造方法,則缺省構(gòu)造方法自動失效7構(gòu)造方法的缺?。豪齝lass Dog /程序員未定義構(gòu)造方法private int weight ;public int getWeight() return weight;public void setWeight(int

5、myWeight) weight = myWeight;public class UseDogpublic static void main(String args)Dog d = new Dog(); /用缺省的構(gòu)造方法創(chuàng)建對象System.out.println(The dogs weight is + d.getWeight();The dogs weight is 0運(yùn)算結(jié)果:8以“this” 調(diào)用構(gòu)造方法this(參數(shù)列表) 表示調(diào)用本類的構(gòu)造方法在一個構(gòu)造方法中,當(dāng)使用this 并給它一個參數(shù)列表時,this顯式調(diào)用參數(shù)匹配的另一個構(gòu)造方法。使用this調(diào)用本類的其他構(gòu)造方法時,t

6、his應(yīng)是第一個可執(zhí)行語句9Java中對象的生命周期對象是某一個類的實(shí)例,是運(yùn)行時動態(tài)生成的。對象如何創(chuàng)建、使用、回收?10Java中對象的創(chuàng)建對象的聲明 Point p1,p2;對象的實(shí)例化 p1 = new Point(); p2 = new Point(); new 返回類對象的一個引用 Point p3 = p2;對象的聲明和實(shí)例化可寫在同一條命令中 Point p4 = new Point();p1 0 xabcdxy 0.00.00 xabcd11對象的使用訪問對象的成員變量 對象.成員變量調(diào)用對象的方法 對象.方法注意對象中成員變量和方法的訪問權(quán)限管理。12對象的回收一個對象在沒

7、有引用指向它時,可作為垃圾收集。垃圾收集器:Java運(yùn)行環(huán)境中的垃圾收集器周期性地釋放不用對象所占用的空間,自動實(shí)現(xiàn)內(nèi)存回收。13子類表示類之間一種“屬于”( is a )關(guān)系。例:public class Employee String name ;Date hireDate ;Date dateofBirth ;String jobTitle ;int grade ;public class Manager String name ;Date hireDate ;Date dateofBirth ;String jobTitle ;int grade ;String department

8、;類的繼承:子類14 語法:Java中用 extends 關(guān)鍵字定義子類。public class Employee String name ;Date hireDate ;Date dateofBirth ;String jobTitle ;int grade ;子類是從已有的類創(chuàng)建新類的一種方法。 父類 來自系統(tǒng)類庫或者是用戶自定義類 。public class Manager extends Employee String department ;類的繼承:extends 關(guān)鍵字15類的繼承 子類將繼承除 private外所有父類成員,(帶private 修飾符的屬性、方法是不能被繼承的

9、) Java是單繼承的,不支持多重繼承(但可用接口實(shí)現(xiàn)),extends后的類名只能有一個。16類的繼承:擴(kuò)展 子類對父類可做擴(kuò)展和特殊化。子類繼承父類的屬性,方法,子類中只需聲明特有的東西。創(chuàng)建新的成員:變量和方法 重新定義父類中已有的變量:父類變量被隱藏重新定義父類中已有的方法 :重寫 or 覆蓋(override ) 子類中的方法應(yīng)與父類中的被重寫的方法有完全相同的參數(shù)列表、返回值 17方法重寫例子18類的繼承:this , super引用類的成員變量或方法時的前綴this: 當(dāng)前類的方法或變量 super: 直接父類的成員(只能上溯一層) 例:Employee父類 Manager子類t

10、his.getDetails():調(diào)用子類的方法super.getDetails():調(diào)用父類的方法19this指向該關(guān)鍵字所在的類。Super指向該關(guān)鍵字所在類的父類。Public class Empolyee private String name ;private int salary;public String getDetails( )return “Name: ”+name+“nSalary:”+salary;public class Manager extends Empolyee private String department ;public String getDetai

11、ls( ) /子類重寫方法return super.getDetailes( )+nDepartment: “+department;this super關(guān)鍵字20構(gòu)造方法的繼承子類沒有定義構(gòu)造方法時,自動繼承父類不含參參數(shù)的構(gòu)造方法,并在創(chuàng)建新子類對象時自動執(zhí)行子類有自己的構(gòu)造方法時,創(chuàng)建新子類對象時也要先執(zhí)行父類不含參數(shù)的構(gòu)造方法,再執(zhí)行自己的構(gòu)造方法子類的構(gòu)造方法定義中,如要調(diào)用父類的含參數(shù)的構(gòu)造方法,需用super關(guān)鍵字,且該調(diào)用語句必須是子類構(gòu)造方法的第一個可執(zhí)行語句。21缺省是不帶參數(shù)的構(gòu)造方法。如果需要調(diào)用特殊的父類構(gòu)造方法,則需在子類構(gòu)造方法中第一行通過super( )調(diào)用。

12、class Employee .public Employee( String n)name=n;class Manager entends Emplyeepublic Manager( String s, String d)super(s);. 調(diào)用父類構(gòu)造方法22子類可以改變從父類繼承的行為。子類可以重寫父類的方法,被重寫方法的返回值、 方法名、參數(shù)列表要與父類中的方法完全一樣。類的繼承:方法重寫(Overriding覆蓋)23例子24必須返回與原來方法完全相同的返回值類型。方法的訪問權(quán)限不能縮小。不能拋出新的異常。在子類中,若要使用父類中被隱藏的方法,可以使用super關(guān)鍵字。方法重寫的

13、規(guī)則25例子:class A protected int method1(int a, int b). public class B extends A public int method1(int a, int b) . /正確,重寫父類方法,可以擴(kuò)大訪問權(quán)限 private int method1(int a, int b) . /錯誤,重寫父類方法,不能降低了訪問權(quán)限 private long method1(int a, int b) . /錯誤,重寫父類方法,不能改變返回值類型 26示例class Point void print() System.out.println(This

14、is the superclass!);public static void main(String args)Point superp = new Point ();superp.print();Point3d subp = new Point3d(); subp.print();class Point3d extends Point void print() System.out.println(This is the subclass!); 運(yùn)行結(jié)果:(This is the superclass!);(This is the subclass!);27示例public class Em

15、ployee String name; int salary; public String getDetails() return Name: +name +“n + Salary: +salary;public class Manager extends Employee String departemnt; public String getDetails() return Name: +name +“n + Manager of +department; 假定說明了如下兩個實(shí)例: Employee e = new Employee(); Manager m = new Manager()

16、;此時,e.getDetails()與m.getDetails()將執(zhí)行不同的代碼28方法重載(overloading)用同一個名字來表示不同的方法。這些方法同名的原因,是因?yàn)樗鼈兊淖罱K功能和目的都相同,但由于在完成同一功能時,可能遇到不同的具體情況,所以需要定義不同的具體內(nèi)容的方法。 是多態(tài)的一種體現(xiàn)。(多態(tài)包括方法的重載和覆蓋)29例子public class A public void showTime () System.out.println (空重載);public void showTime (int l) System.out.println (整形參數(shù)重載);public v

17、oid showTime (char l) System.out.println (字符參數(shù)重載);30例:public class SC public double area(float a) return (int)(Math.PI*a*a*100)/100.0 ; public double area(float a, float b) return a*b ; public double area(float a, float b, float c) float d;d=(a+b+c)/2 ; return Math.sqrt(d*(d-a)*(d-b)*(d-c) ; public

18、static void main(String args) SC sh=new SC(); System.out.println(圓面積是: +sh.area(3); System.out.println(矩形面積是: +sh.area(7,4); System.out.println(“三角形面積是: +sh.area(3,4,5); 運(yùn)行結(jié)果:圓面積是: 28.27 矩形面積是: 28.0 三角形面積是: 6.031同類中的方法重載:例要打印不同類型的數(shù)據(jù),如int, float, String等,實(shí)現(xiàn)手段有2種:分別定義不同名的多個方法,如: printInt(int); printFl

19、oat(float); printString(String)等 但這樣給程序開發(fā)、使用和維護(hù)都帶來很多麻煩。使用一個方法名print (),通過區(qū)別不同的參數(shù),來分別定義和調(diào)用不同方法:即,方法重載。如:print (int i); print (float f); print (String s);32方法重載的條件方法名必須相同方法的參數(shù)必須不同同名不同方法是靠不同形式的參數(shù)列表來區(qū)分參數(shù)列表包括形參的個數(shù)、類型、順序的不同static void print(String s, int i) static void print(int i, String s) /注意,以上二者參數(shù)的順序

20、不同33方法重載的特點(diǎn)返回類型、修飾符可相同或不相同。(返回類型可以不同,但不是重載的標(biāo)志。)效果:利用“重名”現(xiàn)象提高程序的抽象度和簡潔性。方法重載具有編譯時多態(tài)。(由編譯器在編譯時根據(jù)參數(shù)的區(qū)別,來調(diào)用相應(yīng)的方法體)34一個方法如果只聲明方法而沒有方法的實(shí)現(xiàn)(方法體),則稱為抽象方法。抽象類必須在類聲明中增加 abstract 關(guān)鍵字,在無方法體的方法(抽象方法)前也要加上abstract。public abstract class Drawing /抽象類public abstract void drawDot( int x, int y);/抽象方法public void drawLi

21、ne(int x1, int y1, int x2, int y2) /非抽象方法 抽象類一個abstract 類可以包含有非抽象方法和變量,但至少包含一個抽象方法。35抽象類不能直接用來生成實(shí)例。一般通過定義子類進(jìn)行實(shí)例化??梢陨沙橄箢惖淖兞浚撟兞靠梢灾赶蛞粋€子類的實(shí)例。abstract class Employeeabstract void raiseSalary(int i) ;class Manager extends Employee /抽象類的子類void raiseSalary(int i ) ./實(shí)現(xiàn)抽象方法Employee e = new Manager( ) ;/指向子

22、類實(shí)例抽象類36interface 是在抽象類概念的基礎(chǔ)上演變而來的。一個interface所有成員方法都是抽象的,并且只能定義 static final 成員變量(常量)。接口 interface37接口的含義 interface 不屬于類層次結(jié)構(gòu),不相關(guān)的類可以實(shí)現(xiàn)相同的接口。接口:可看作一種“特殊的類”,是作為一個整體聲明的抽象方法和常量的集合;方法:隱含為abstract 和public的 常量:隱含為final和static的 創(chuàng)建接口 public interface 接口名 extends 接口列表 方法名(); /注意:沒有方法體 常 量 名=. . . ;. . . . .

23、.38Interface FlyertakeOff( )land( )fly( )Class Airplanebrake( ) takeOff( )land( )fly( )Class Birdeat( )layEggs( )takeOff( )land( )fly( )Class Supermaneat( )stopBullet( )takeOff( )land( )fly( )interface 示例:接口與繼承Class Animaleat( )Class Vehiclebrake( )39接口 interface使用接口當(dāng)一個類聲明 implements 某一 interface 時,

24、必須具體實(shí)現(xiàn)該 interface 中定義的抽象方法,并把此方法定義為public的。用implements代替extends聲明子類,該子類中必須實(shí)現(xiàn)接口及該接口超類中的所有方法。利用接口可實(shí)現(xiàn)多重繼承便于設(shè)計(jì)更合理的類層次,代碼更靈活40interface 程序示例例:樂器族譜Music.javaInstrumentWindPercussionStringed管樂器打擊樂器弦樂器41interface 程序示例interface Instrument int A=5 ; / 常量定義,默認(rèn)為static & final / 以下為方法聲明,不能定義方法體void play( ); / 默認(rèn)

25、為public & abstractString type( );void adjust( );class Wind implements Instrument public void play( ) System.out.println(Wind.play( ); / 不能省略public public String type ( ) return Wind; public void adjust( ) /注意 “adjust( ) ;” 與 “adjust( ); ” 的區(qū)別42interface 中要注意的問題不能向interface定義中隨意增加方法。public interface

26、shape void draw( ); void erase( ); double area( ); /直接在接口中增加方法,會帶來所有該接口的子類的維護(hù)問題。public interface ShapeWithArea extends Shape /通過子接口來新增方法 double area( ); 43可以通過實(shí)現(xiàn)接口來實(shí)現(xiàn)多重繼承:一個類可只繼承一個父類,并實(shí)現(xiàn)多個接口。例如:interface I1 ;interface I2 ;class Father . ;class Son extends Father implements I1,I2 接口 interface44interface:多態(tài)性例子/定義接口InterA interfaceInterA voidfun(); /實(shí)現(xiàn)接口InterA的類B

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論