版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Java面向?qū)ο笏枷牒透拍?1JavaClasses and Objects1目標(biāo) 掌握面向?qū)ο缶幊痰母拍钫莆杖绾蝿?chuàng)建類和構(gòu)造對(duì)象掌握對(duì)象的成員變量和方法了解this關(guān)鍵字2面向?qū)ο缶幊谈攀雒嫦驅(qū)ο缶幊蹋∣bject Oriented Programming,簡稱OOP)描述的是對(duì)象之間的相互作用。面向?qū)ο缶幊膛c面向過程編程的區(qū)別過程化程序設(shè)計(jì)先確定算法,再確定數(shù)據(jù)結(jié)構(gòu);面向?qū)ο缶幊滔却_定數(shù)據(jù)結(jié)構(gòu),再確定運(yùn)算。面向過程編程的程序員,習(xí)慣于建立數(shù)據(jù)結(jié)構(gòu)存放數(shù)據(jù)并定義方法(函數(shù))來操作數(shù)據(jù);面向?qū)ο缶幊痰某绦騿T則構(gòu)造一個(gè)對(duì)象模型,將數(shù)據(jù)與方法組織在一起。3對(duì)象 對(duì)象的狀態(tài) 對(duì)象的行為我們可以把現(xiàn)實(shí)
2、世界的事物抽象成對(duì)象 對(duì)象一般都有兩個(gè)特征: 狀態(tài)(state)和行為(behavior)軟件的對(duì)象概念是由現(xiàn)實(shí)世界對(duì)象抽象而來 把現(xiàn)實(shí)世界對(duì)象的狀態(tài)保存在軟件對(duì)象的變量中;現(xiàn)實(shí)世界對(duì)象的行為通過軟件對(duì)象的方法(函數(shù))來實(shí)現(xiàn)。4面向?qū)ο驩OAObject Oriented Analysis 面向?qū)ο蟮姆治鯫ODObject Oriented Design 面向?qū)ο蟮脑O(shè)計(jì)OOIObject Oriented Implementation 面向?qū)ο蟮膶?shí)現(xiàn)5面向?qū)ο缶幊蹋?Object Oriented Programming )class Car int color_number; int doo
3、r_number; int speed; void brake() void speedUp() ; void slowDown() 計(jì)算機(jī)中的對(duì)象的原型現(xiàn)實(shí)生活中的對(duì)象6什么是類(What Is Class)類實(shí)際上是對(duì)某種類型的對(duì)象定義變量和方法的原型。 在現(xiàn)實(shí)世界中,你經(jīng)常看到相同類型的許多對(duì)象。比如 ,你的自行車只是現(xiàn)實(shí)世界中許多自行車的其中一輛。使用面向?qū)ο蠹夹g(shù),我們可以說你的自行車是自行車對(duì)象類的一個(gè)實(shí)例。通常,自行車有一些狀態(tài)(當(dāng)前檔位、兩個(gè)輪子等等)以及行為(改變檔位、剎車等等)。但是,每輛自行車的狀態(tài)都是獨(dú)立的并且跟其它自行車不同。當(dāng)廠家制造自行車的時(shí)候,廠商利用了自行車共有
4、的特性來根據(jù)相同的藍(lán)圖制造許多自行車。如果制造一輛自行車就要產(chǎn)生一個(gè)新藍(lán)圖,那效率就太低了7對(duì)象和類(Objects and Classes)把相似的對(duì)象劃歸成一個(gè)類。在軟件中,類,就是一個(gè)模板,它定義了通用于一個(gè)特定種類的所有對(duì)象的狀態(tài)(變量)和行為(方法)。類是創(chuàng)建對(duì)象的模板,對(duì)象是類的實(shí)例。一個(gè)對(duì)象是類的一個(gè)實(shí)例。有了類,才可以創(chuàng)建對(duì)象。類不能是它們描述的對(duì)象本身,類是同一種對(duì)象的集合的抽象,即,同一類對(duì)象的變量和方法的原型。 variablesmethods8面向?qū)ο蟪绦蛟O(shè)計(jì)( Object Oriented Programming ) 從程序設(shè)計(jì)的角度看,類是面向?qū)ο蟪绦蛑凶罨镜某?/p>
5、序單元。類實(shí)質(zhì)上定義的是一種數(shù)據(jù)類型,這種數(shù)據(jù)類型就是對(duì)象類型 。所以我們可以使用類名稱來聲明對(duì)象變量。聲明對(duì)象變量之后,還不能使用對(duì)象。必須用運(yùn)算符new創(chuàng)建對(duì)象實(shí)體之后,才能使用對(duì)象。9一個(gè)簡單的例子編寫一個(gè)駕駛汽車的方法面向過程的程序設(shè)計(jì): 編寫一個(gè)方法,void drivecar();面向?qū)ο蟮某绦蛟O(shè)計(jì): 將一輛汽車看成一個(gè)對(duì)象,將所有汽車對(duì)象的共性抽取出來,設(shè)計(jì)一個(gè)類Car,類中有一個(gè)方法void drive(),用Car這個(gè)類實(shí)例化一個(gè)具體的對(duì)象car,調(diào)用:car.drive()。10面向?qū)ο蟮娜齻€(gè)特征封裝(Encapsulation)繼承(Inheritance)多態(tài)(Poly
6、morphism)11封裝(Encapsulation)封裝把對(duì)象的所有組成部分組合在一起,封裝定義程序如何引用對(duì)象的數(shù)據(jù),封裝實(shí)際上使用方法將類的數(shù)據(jù)隱藏起來,控制用戶對(duì)類的修改和訪問數(shù)據(jù)的程度私有數(shù)據(jù) 方法 方法數(shù)據(jù)對(duì)象A對(duì)象B公有數(shù)據(jù)12OOP封裝的主要好處13信息隱藏例如,電視內(nèi)有很多復(fù)雜零件,通過各種按鈕將內(nèi)部的復(fù)雜結(jié)構(gòu)給隱藏了。簡化操作只需通過調(diào)頻和音量等少量按鈕,就可以操縱電視。程序的基本封裝單元是類,通過類的封裝,既可以將代碼單元化,又達(dá)到信息隱藏的目的。13類的定義(Declaration)修飾符 class 類名 繼承父類接口成員變量;構(gòu)造方法;成員方法;文件名必須與pub
7、lic類名相同;14創(chuàng)建對(duì)象使用下列語法可創(chuàng)建對(duì)象: new 構(gòu)造函數(shù)關(guān)鍵字 new 通常稱為創(chuàng)建運(yùn)算符,用于分配對(duì)象內(nèi)存,并將該內(nèi)存初始化為缺省值。一旦 new 完成分配和初始化內(nèi)存,它就將調(diào)用構(gòu)造函數(shù)來執(zhí)行對(duì)象初始化。當(dāng)創(chuàng)建一個(gè)類時(shí),只是創(chuàng)建了一種新的數(shù)據(jù)類型。對(duì)象是類的一個(gè)實(shí)例。15new1、第一步,你必須聲明該類類型的一個(gè)變量,這個(gè)變量沒有定義一個(gè)對(duì)象。實(shí)際上,它只是一個(gè)能夠引用對(duì)象的簡單變量。2、第二步,該聲明要?jiǎng)?chuàng)建一個(gè)對(duì)象的實(shí)際的物理拷貝,并把對(duì)于該對(duì)象的引用賦給該變量。這是通過使用new運(yùn)算符實(shí)現(xiàn)的。new運(yùn)算符為對(duì)象動(dòng)態(tài)分配(即在運(yùn)行時(shí)分配)內(nèi)存空間,并返回對(duì)它的一個(gè)引用。這個(gè)
8、引用或多或少的是new分配給對(duì)象的內(nèi)存地址。然后這個(gè)引用被存儲(chǔ)在該變量中。這樣,在Java中,所有的類對(duì)象都必須動(dòng)態(tài)分配。 16示例:public class TestClass int i;float j;TestClass(int m,int n)this.i = m;this.j = n;public static void main(String args) TestClass a;TestClass b = new TestClass(666,99); /new返回對(duì)象引用a = b;System.out.println(a.i);17圖解:18給對(duì)象引用變量賦值例如:下面的程序段是
9、做什么呢? Box b1 = new Box(); Box b2 = b1;b1和b2將引用同樣的對(duì)象。將b1賦值給b2并沒有分配任何內(nèi)存或?qū)υ瓕?duì)象做任何部分的拷貝。由于它們是同一個(gè)對(duì)象,因此通過變量b2對(duì)對(duì)象的改變也將影響b1所對(duì)應(yīng)的對(duì)象b1 = null; /b1被設(shè)置為空,但是b2仍然指向原來的對(duì)象。19構(gòu)造函數(shù)(Constructor)構(gòu)造函數(shù)是類的一種特殊的方法,主要表現(xiàn):(1)構(gòu)造函數(shù)的方法名與類名相同。(2)構(gòu)造函數(shù)沒有返回類型。(3)構(gòu)造函數(shù)的主要作用是完成對(duì)類對(duì)象的初始化工作。20構(gòu)造函數(shù)定義class Box double width; double height; dou
10、ble depth; Box() System.out.println(Constructing Box);width = 10;height = 10;depth = 10; double volume() return width * height * depth; 21默認(rèn)構(gòu)造函數(shù)(Default Constructor)默認(rèn)構(gòu)造函數(shù)指沒有參數(shù)的構(gòu)造函數(shù)如果編寫的類沒有構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)提供一個(gè)默認(rèn)構(gòu)造函數(shù),它把所有的屬性設(shè)為默認(rèn)值不要構(gòu)造函數(shù)?試一試?22帶參數(shù)的構(gòu)造函數(shù)class Box double width; double height; double depth; / 有參
11、數(shù)的構(gòu)造函數(shù) Box(double w,double h,double d) width = w;height = h;depth = d; double volume() return width * height * depth; 調(diào)用:Box mybox1 = new Box(10,20,15);Box mybox2 = new Box(3,6,9);23方法(Methods) 方法是類的主要組成部分。在一個(gè)類中,程序的作用體現(xiàn)在方法中。方法是Java語言的基本構(gòu)件。利用方法可以組成結(jié)構(gòu)良好的程序。本章介紹方法的構(gòu)成規(guī)則和設(shè)計(jì)、使用方法的基本要點(diǎn)。24方法的聲明一般的方法聲明可以具有如下
12、形式: 訪問控制符修飾符 返回類型 方法名(參數(shù)表) throws 異常類名表 /方法體如:Double salery ;Public void addSalery(double sal) / 方法執(zhí)行體salery += sal ;修飾符返回類型方法名參數(shù)列表25方法的調(diào)用(Method Invoking) 方法是類的一個(gè)動(dòng)態(tài)的屬性,先創(chuàng)建類的一個(gè)實(shí)例對(duì)象,通過對(duì)象.方法名來調(diào)用方法如: public class Employee public void show() System.out.println(“ Hello ”); public static void main(String
13、args) Employee e = new Employee(); e.show(); 26this關(guān)鍵字 this是指向調(diào)用對(duì)象本身的引用名。 你可以在當(dāng)前類的類型所允許對(duì)象的任何地方將this作為一個(gè)引用。 This實(shí)際上主要用于2個(gè)方面: 1、引用當(dāng)前對(duì)象。 2、使得類的一個(gè)構(gòu)造函數(shù)可以調(diào)用類的另一個(gè)構(gòu)造函數(shù)。 對(duì)于1,看下面的例子來理解:27public class TestClass int i;float j;TestClass(int m,int n)this.i = m;this.j = n;this.show_Message();/通過this調(diào)用類的普通成員方法了void
14、 show_Message()System.out.println(Hello, everyone!);public static void main(String args) TestClass a;TestClass b = new TestClass(666,99);a = b;System.out.println(a.i);28對(duì)于this的第二種用法(作用),看以下例子public class Test2 int i;float f;double d;public Test2(int i, float f) this.i = i;this.f = f;public Test2(int
15、 m, float n, double dd) this(m,n); /Invoke another constructorthis.d = dd;29this引用 class Boxdouble width, height, depth ; Public Box(double width,double height,double depth) this.width = width ; this.height = height; this.depth = depth ; 注意: 在這樣的環(huán)境下使用this有時(shí)會(huì)引起混淆。有些程序員比較小心,不使用和局部變量、正式的自變量同名的隱藏的實(shí)例變量。當(dāng)
16、然,另外的程序員則相反,相信用this來“揭開”與局部變量、自變量同名的實(shí)例變量是一個(gè)好習(xí)慣。這取決于你的愛好 。30Java面向?qū)ο笏枷牒透拍?231目標(biāo)掌握包的使用掌握類的成員訪問控制符掌握static掌握final掌握對(duì)象的傳遞32包 (package)Java的文件名必須和public的類名相同,為了解決同名的沖突和類的訪問權(quán)限的控制,Java提供包(package)來來管理類名空間package語句必須放在Java源文件的第一條語句,指明該文件中定義的類所在的包,他的格式為: package com.iss.java.base ; public class Test 33導(dǎo)入包 im
17、port 為了能夠使用Java API 中已經(jīng)提供的類或者是我們自己寫的類,需要import語句來導(dǎo)入所需要的類,這樣能更好的解決名字空間的問題,其格式為: package com.iss.example ; import com.iss.java.base.Test ; / 導(dǎo)入Test類 import java.util.* ; / * 導(dǎo)入這個(gè)包 / 下面所有的類 public class ImportDemo34類的訪問控制符在定義類的時(shí)候,可以用訪問控制符類的訪問控制符為 public 或者 默認(rèn)1:public :當(dāng)一個(gè)類被聲明為public時(shí),它就具有了被其他包中的類訪問的可能性
18、,只要這些其他包中的類在程序中使用import語句引入public類,就可以訪問和引用這個(gè)類。 2: (默認(rèn)) :缺省訪問控制權(quán)規(guī)定,該類只能被同一個(gè)包中的類訪問和引用,而不可以被其他包中的類使用,這種訪問特性又稱為包訪問性。3535設(shè)計(jì)一個(gè)程序測試一下類有無public訪問控制符的區(qū)別?36成員訪問控制符除了public和默認(rèn)可見性修飾符,Java還為類成員提供private和protected修飾符。類的成員變量和方法都有訪問權(quán)限的控制,由于類中封裝了數(shù)據(jù)和代碼,包括封裝了其它的類和包,所以java對(duì)類成員提供了四種范圍的訪問控制權(quán)限的控制,這四種范圍包括:同一類中 同一包中 不同包中的子
19、類 不同包中的非子類 訪問權(quán)限則包括: private、默認(rèn)、protected和public37屬性或方法的訪問權(quán)限同一類中同一包中不同包中的子類不同包中的非子類 private Yes 默認(rèn) Yes Yes protected Yes Yes Yes public Yes Yes Yes Yes 訪問權(quán)限(Yes表示可以訪問)38private類中限定為private的成員(屬性或者方法),只能被這個(gè)類本身訪問,即私有訪問控制:它的聲明如下: private String name ; private void showName()注意:不能在方法體內(nèi)聲明的變量前加任何訪問限制符(包括pr
20、ivate) private void display() private int i ; / 錯(cuò)誤39protected類中被限定為 protected 的成員變量和成員方法,可以被這個(gè)類本身以及它的子類訪問(包括同一包和不同包中的子類都可以訪問)聲明如下: protected String stuName ; protected void showStuName() 40public 類中被限定為 public 的成員,都是公共的,可以被所有的類訪問,它的的訪問權(quán)限時(shí)最大的,但同時(shí)也是最不安全的,一般情況下成員變量都是定義成private的。定義 public String name ;
21、public void showName() 41自己寫個(gè)程序測試一下成員變量或成員函數(shù)的訪問權(quán)限?42 setor 和 getor在java中,有一種常見的做法,就是將成員變量用private修飾,從而更好的將信息進(jìn)行封裝和隱藏,在這樣的類中,用getXXX 和setXXX方法對(duì)類的屬性進(jìn)行存取這個(gè)方法有以下優(yōu)點(diǎn):1 屬性用private更好的封裝和隱藏,外部類不能隨意存取和修改2 提供方法來存取對(duì)象的屬性,在方法中可以對(duì)給定的參數(shù)進(jìn)行 合法性檢驗(yàn)3 方法可以用來給出計(jì)算后的值4 方法可以完成其他必要的工作(如:清理資源,設(shè)定狀態(tài)等)5 只提供getXXX而不提供setXXX,保證屬性的只讀
22、性43示例 class person private int age ; public int getAge() return age ; protected void setAge(int age)If(age0 & age200) this.age = age ; 44非訪問控制符 類,屬性,方法可以擁有若干修飾符,包括訪問控制符和非訪問控制符,我們現(xiàn)在來介紹java常用的非訪問控制符 static final 45 static 關(guān)鍵字 static修飾類的成員變量或者方法的時(shí)候,表明類的這些成員時(shí)屬于整個(gè)類的,不屬于任何一個(gè)類的具體的對(duì)象實(shí)例,它不保存在某個(gè)對(duì)象實(shí)例的內(nèi)存區(qū)間中,而是保
23、存在類的內(nèi)存區(qū)域的公共存儲(chǔ)單元。換句話說,對(duì)于該類的任何一個(gè)具體對(duì)象而言,靜態(tài)域是一個(gè)公共的存儲(chǔ)單元,任何一個(gè)對(duì)象訪問它都是取得相同的數(shù)據(jù);同樣,任何一個(gè)對(duì)象去修改它,也都是對(duì)同一個(gè)內(nèi)存單元進(jìn)行修改。46靜態(tài)變量(Static Variable)或類變量(Class Variable) static int age; 聲明為static的變量實(shí)質(zhì)上就是全局變量。不管創(chuàng)建了類的多少實(shí)例,整個(gè)類中靜態(tài)變量的副本只有一個(gè) (static成員與對(duì)象無關(guān))引用靜態(tài)變量的2種方法:1、通過類的任一實(shí)例。2、通過類的名稱。47示例public class StaticDemo static int age
24、;void show() System.out.println(Age:+age); public static void main(String args) StaticDemo s = new StaticDemo(); s.age = 10 ; / 通過實(shí)例訪問不是一個(gè)好方法 s.show(); StaticDemo.age = 20 ; / 通過類訪問 s.show(); /再定義一個(gè)對(duì)象來訪問類變量看看? 48靜態(tài)方法與靜態(tài)方法相關(guān)的幾個(gè)要點(diǎn):類的靜態(tài)方法只能訪問其它的靜態(tài)成員:靜態(tài)變量和靜態(tài)方法既可以在類的實(shí)例方法中使用,也可以在類的靜態(tài)方法中使用。但是,實(shí)例變量和實(shí)例方法(即非靜
25、態(tài)成員)只能在實(shí)例方法中使用,不能在靜態(tài)方法中使用,因?yàn)殪o態(tài)變量和靜態(tài)方法不屬于某個(gè)特定的對(duì)象。 (理解一下這句話的含義)靜態(tài)方法不能被覆蓋為非靜態(tài)方法靜態(tài)方法中也不能使用this和super class staticDemo static int i = 10; int j = 20 ; public void function() i = i +j; public static void main(String args) j = x ; / 錯(cuò)誤,不能訪問非靜態(tài)成員 function(); 常見問題:在main方法中訪問類的靜態(tài)成員變量。 例如上例。49 final 關(guān)鍵字 final變
26、量實(shí)質(zhì)上是一個(gè)常量。 final方法表明子類不能覆蓋此方法。 final類不能被繼承。50final 變量一個(gè)變量可以聲明為final,這樣做的目的是阻止它的內(nèi)容被修改。聲明final變量后,只能被初始化一次,然后就不能對(duì)其值進(jìn)行修改。一個(gè)final變量實(shí)質(zhì)上是一個(gè)常量class FinalDemo public static void main(String args) final int noChange = 20; noChange = 30; / 錯(cuò)誤 51final變量的好處效率:聲明 final 字段有助于優(yōu)化器作出更好的優(yōu)化決定,因?yàn)槿绻幾g器知道字段的值不會(huì)更改,那么它能安全地
27、在寄存器中高速緩存該值。 安全:使其某部分狀態(tài)不變可以大大簡化開發(fā) ,使得程序更加安全。52final 方法 在方法聲明中使用 final 關(guān)鍵字向編譯器表明子類不能覆蓋此方法。class TestFinal final void f() class Further extends TestFinal final void f() / 錯(cuò)誤,final方法不能被覆蓋 53 final方法的好處安全:將方法聲明為final,那就說明你已經(jīng)知道這個(gè)方法提供的功能已經(jīng)滿足你要求,不需要進(jìn)行擴(kuò)展,并且也不允許任何從此類繼承的類來覆寫這個(gè)方法,但是繼承仍然可以繼承這個(gè)方法,也就是說可以直接使用。 效率:
28、有一種被稱為inline的機(jī)制,它會(huì)使你在調(diào)用final方法時(shí),直接將方法主體插入到調(diào)用處,而不是進(jìn)行例行的方法調(diào)用。54final類聲明為final的類不能被繼承。如果一個(gè)類為 final 類,那么它的所有方法都為隱式的 final 方法。final 類示例:final class TestFinal int i = 7; int j = 1; void f() class Further extends TestFinal / 錯(cuò)誤 不能被繼承55 final類的好處1)效率,但是性能并不是將類或方法聲明為final 的好理由。 2)簡化:不變類對(duì)于簡化面向?qū)ο蟪绦虻脑O(shè)計(jì)非常有用不變的對(duì)象
29、只需要較少的防御性編碼。 3)安全:防止類的屬性和方法發(fā)生改變。56類中的常量類中的常量是被該類的所有對(duì)象共享的,因此,常量應(yīng)該聲明為final static。例如,Math類中的常量PI是這樣定義的: final static double PI = 3mmutable Objects and ClassesIf the contents of an object cannot be changed once the object is created, the object is called an immutable object and its class i
30、s called an immutable class. If you delete the set method in the Circle class in the preceding example, the class would be immutable because radius is private and cannot be changed without a set method. A class with all private data fields and without mutators is not necessarily immutable. For examp
31、le, the following class Student has all private data fields and no mutators, but it is mutable.并非所有成員變量為private并且沒有修改器方法的類就是不可變的,例如下例:58Examplepublic class BirthDate private int year; private int month; private int day; public BirthDate(int newYear, int newMonth, int newDay) year = newYear; month =
32、newMonth; day = newDay; public void setYear(int newYear) year = newYear; public class Test public static void main(String args) Student student = new Student(111223333, 1970, 5, 3); BirthDate date = student.getBirthDate(); date.setYear(2010); / Now the student birth year is changed! public class Stu
33、dent private int id; private BirthDate birthDate; public Student(int ssn, int year, int month, int day) id = ssn; birthDate = new BirthDate(year, month, day); public int getId() return id; public BirthDate getBirthDate() return birthDate; 59What Class is Immutable?For a class to be immutable, it mus
34、t mark all data fields private and provide no mutator methods and no accessor methods that would return a reference to a mutable data field object.要使一個(gè)類成為不可變的,它必須滿足以下要求:1、所有數(shù)據(jù)域都是私有的。2、沒有修改器方法。3、沒有一個(gè)訪問器方法,它會(huì)返回一個(gè)指向可變數(shù)據(jù)域的引用。60Java面向?qū)ο笏枷牒透拍?361繼承(Inheritance) 繼承實(shí)際上是存在于面向?qū)ο蟪绦蛑械膬蓚€(gè)類之間的一種關(guān)系。 當(dāng)一個(gè)類擁有另一個(gè)類的所有數(shù)據(jù)
35、和操作時(shí),就稱這兩個(gè)類之間具有繼承關(guān)系,private屬性除外 。 被繼承的類稱為父類(parent class)或超類(super class),繼承了父類的所有數(shù)據(jù)和操作的類稱為子類。 使用繼承的主要優(yōu)點(diǎn)是,使得程序結(jié)構(gòu)清晰,減少編碼,減少維護(hù)的工作量。 62單繼承和多重繼承 單重繼承是指任何一個(gè)類都只有一個(gè)單一的父類;多重繼承是指一個(gè)類可以有一個(gè)以上的父類。支持多重繼承的程序,其結(jié)構(gòu)為復(fù)雜的網(wǎng)狀,能更自然地模擬現(xiàn)實(shí)世界,但設(shè)計(jì)、實(shí)現(xiàn)都比較復(fù)雜。JAVA出于安全、可靠性的考慮,只支持單重繼承。63子類從父類獲得哪些能力?子類繼承父類的屬性(變量)、功能(方法),子類中只 需聲明特有的東西。
36、1)帶private 修飾符的屬性、方法是不能被繼承的。2)帶protected 修飾符的屬性、方法是被繼承的。3)構(gòu)造方法不能被繼承。但子類構(gòu)造方法可以用super()或super(parameters)方法調(diào)用父類的構(gòu)造方法,而且super語句必須放在子類構(gòu)造方法的第一行。 - super 指向該關(guān)鍵字所在類的父類。64Java的繼承類的修飾符 class extends ; ; 在定義子類時(shí)用extends關(guān)鍵字指明新定義類的父類,就在兩個(gè)類之間建立了繼承關(guān)系。新定義的類稱為子類,它可以從父類那里繼承所有非private的域和方法作為自己的屬性。 65繼承示例 class Student
37、 private int age ; protected String name ; public void showName() System.out.println(Name: + name); public class ExtendsDemo_1 extends Student public static void main(String args) Student s = new ExtendsDemo_1();/以基類為類型,去new一個(gè)子類 = “Soft”;/當(dāng)前對(duì)象并沒有定義name屬性, /但通過extends子類繼承了父類的name屬性 s.showName(
38、); 66方法重載(Overloading)由編譯器決定調(diào)用那個(gè)方法public class Demo public void add(int i,int j) System.out.println(i+j); public void add(float i,float j) System.out.println(i+j); public void add(String s1,String s2) System.out.println(s1+s2); public static void main(String args) Demo d = new Demo(); d.add(1, 2); d
39、.add(2.56f, 7.44f); d.add(Hello, World); 67重載兼容在調(diào)用方法時(shí),若沒有找到類型匹配的方法,編譯器會(huì)找可以兼容的類型來進(jìn)行調(diào)用,如:int類型可以找到使用double類型的方法:示例 public class Demo public void add(double i,double j) System.out.println(double : + (i+j); public static void main(String args) Demo d = new Demo(); int i = 10 ; int j = 20 ; d.add(i,j); /
40、 可以兼容 68然而,不好的重載兼容,會(huì)發(fā)生有歧義的重載:public class AmbiguousOverloading public static void main(String args) System.out.println(max(1, 2); public static double max(int num1, double num2) if (num1 num2) return num1; else return num2; public static double max(double num1, int num2) if (num1 num2) return num1;
41、else return num2; 69構(gòu)造函數(shù)重載 Java 為每一個(gè)類自動(dòng)提供缺省構(gòu)造函數(shù) 構(gòu)造函數(shù)也可以重載,要求使用不同的參數(shù)個(gè)數(shù),不同的參數(shù)類型。構(gòu)造函數(shù)的重載,可以讓用戶用不同的參數(shù)來構(gòu)造不同的對(duì)象。70構(gòu)造方法的調(diào)用示例 class Example int age ; String name ;public Example(int age) this.age = age ; public Example(int age,String name) Example(age) ; / 錯(cuò)誤 this(age) ; / 正確 71繼承在開發(fā)中的作用 1、繼承允許代碼重用 2、擴(kuò)展新功能適
42、應(yīng)新情況 72 super 的使用1、使用super可以調(diào)用父類的構(gòu)造方法: super(傳參數(shù)給從父類繼承而來的成員變量)2、使用super來調(diào)用父類的成員方法。 在子類中繼承了父類中的成員方法,一般可以直接通過方法名使用,但是如果在子類中覆蓋了父類的成員方法以后,如果需要在子類內(nèi)部調(diào)用父類中被覆蓋的成員方法時(shí)則不能直接調(diào)用了,這樣就又需要使用super關(guān)鍵字了: super.父類方法(方法參數(shù));3、可使用super來引用父類的成員變量。 在子類中如果引用從父類繼承的成員變量,也可以使用“super.成員變量”來引用,只是一般成員變量的覆蓋是沒有意義的,所以這個(gè)時(shí)候都可以直接使用成員變量名
43、進(jìn)行引用,所以這里的super都可以省略。73 調(diào)用父類的構(gòu)造函數(shù) 子類可通過調(diào)用super()來調(diào)用超類(父類)的構(gòu)造函數(shù),對(duì)從父類繼承而來的成員變量進(jìn)行初始化。而且,super()必須放在子類構(gòu)造函數(shù)中的第一行。class Box Box(double width,double heigth,double depth)public class SuperDemo_1 extends Box public SuperDemo_1(double w,double h,double d) super(w,h,d); 74調(diào)用超類(父類)的方法class People protected int
44、age ; protected void show() System.out.println(父類 Show); public class SuperDemo_2 extends People protected void show() System.out.println(子類 Show); public void testShow() this.show(); super.show(); public static void main(String args) SuperDemo_2 s = new SuperDemo_2(); s.testShow(); 75注意的是,this和supe
45、r都是非靜態(tài)的,所以這兩個(gè)關(guān)鍵字都無法在靜態(tài)方法內(nèi)部進(jìn)行使用。76多態(tài)(Polymorphism)Polymorphism源于希臘文,意思是“多種形式”定義:使用父類對(duì)象的地方都可以使用子類的對(duì)象,這就是所謂的多態(tài)。簡單來說:多態(tài)意味著父類型的變量可以引用子類型的對(duì)象。77父類對(duì)象與子類對(duì)象的轉(zhuǎn)換 1 子類對(duì)象可以視作是一個(gè)父類的對(duì)象 如: Student對(duì)象也是一個(gè)People對(duì)象 2 父類對(duì)象不能被當(dāng)作一個(gè)子類對(duì)象 3 如果一個(gè)方法的形參是父類對(duì)象,調(diào)用這個(gè)方法時(shí) 可以使用子類的對(duì)象作為實(shí)際參數(shù) 4 如果父類對(duì)象指向的實(shí)際上確實(shí)是一個(gè)子類對(duì)象,那么這個(gè) 父類對(duì)象可以用強(qiáng)制類型轉(zhuǎn)換成子類對(duì)象
46、的引用78Polymorphism, Dynamic Binding and Generic Programmingpublic class PolymorphismDemo public static void main(String args) m(new GraduateStudent(); m(new Student(); m(new Person(); m(new Object(); public static void m(Object x) System.out.println(x.toString(); class GraduateStudent extends Student
47、 class Student extends Person public String toString() return Student; class Person extends Object public String toString() return Person; Method m takes a parameter of the Object type. You can invoke it with any object.An object of a subtype can be used wherever its supertype value is required. Thi
48、s feature is known as polymorphism.(多態(tài)的定義)When the method m(Object x) is executed, the argument xs toString method is invoked. x may be an instance of GraduateStudent, Student, Person, or Object. Classes GraduateStudent, Student, Person, and Object have their own implementation of the toString metho
49、d. Which implementation is used will be determined dynamically by the Java Virtual Machine at runtime. This capability is known as dynamic binding. 79Dynamic BindingDynamic binding works as follows: Suppose an object o is an instance of classes C1, C2, ., Cn-1, and Cn, where C1 is a subclass of C2,
50、C2 is a subclass of C3, ., and Cn-1 is a subclass of Cn. That is, Cn is the most general class, and C1 is the most specific class. In Java, Cn is the Object class. If o invokes a method p, the JVM searches the implementation for the method p in C1, C2, ., Cn-1 and Cn, in this order, until it is foun
51、d. Once an implementation is found, the search stops and the first-found implementation is invoked.80Method Matching vs. BindingMatching a method signature and binding a method implementation are two issues. The compiler finds a matching method according to parameter type, number of parameters, and
52、order of the parameters at compilation time. A method may be implemented in several subclasses. The Java Virtual Machine dynamically binds the implementation of the method at runtime. See Review Questions 10.7 and 10.9. 匹配一個(gè)方法簽名與綁定方法實(shí)現(xiàn)是2個(gè)不同的問題:方法匹配:根據(jù)參數(shù)的類型、個(gè)數(shù)以及出現(xiàn)的順序來匹配選擇。綁定方法的實(shí)現(xiàn):由于一個(gè)方法可能被幾個(gè)子類實(shí)現(xiàn)。所以JV
53、M在運(yùn)行時(shí)動(dòng)態(tài)綁定方法的實(shí)現(xiàn)。81Generic Programming(泛型編程)public class PolymorphismDemo public static void main(String args) m(new GraduateStudent(); m(new Student(); m(new Person(); m(new Object(); public static void m(Object x) System.out.println(x.toString(); class GraduateStudent extends Student class Student e
54、xtends Person public String toString() return Student; class Person extends Object public String toString() return Person; Polymorphism allows methods to be used generically for a wide range of object arguments. This is known as generic programming. If a methods parameter type is a superclass (e.g.,
55、 Object), you may pass an object to this method of any of the parameters subclasses (e.g., Student or String). When an object (e.g., a Student object or a String object) is used in the method, the particular implementation of the method of the object that is invoked (e.g., toString) is determined dy
56、namically.82Casting Objects(轉(zhuǎn)換對(duì)象)You have already used the casting operator to convert variables of one primitive type to another. Casting can also be used to convert an object of one class type to another within an inheritance hierarchy. In the preceding section, the statement m(new Student();assig
57、ns the object new Student() to a parameter of the Object type. This statement is equivalent to:Object o = new Student(); / Implicit casting(隱式轉(zhuǎn)換)m(o);The statement Object o = new Student(), known as implicit casting, is legal because an instance of Student is automatically an instance of Object.83Wh
58、y Casting Is Necessary?Suppose you want to assign the object reference o to a variable of the Student type using the following statement:Student b = o; /這種做法會(huì)產(chǎn)生編譯錯(cuò)誤A compilation error would occur. Why does the statement Object o = new Student() work and the statement Student b = o doesnt? This is be
59、cause a Student object is always an instance of Object, but an Object is not necessarily an instance of Student. Even though you can see that o is really a Student object, the compiler is not so clever to know it. To tell the compiler that o is a Student object, use an explicit casting. The syntax i
60、s similar to the one used for casting among primitive data types. Enclose the target object type in parentheses and place it before the object to be cast, as follows:Student b = (Student)o; / Explicit casting84Casting fromSuperclass to Subclass從父類對(duì)象轉(zhuǎn)換為子類對(duì)象時(shí)必須進(jìn)行顯式強(qiáng)制轉(zhuǎn)換。而且未必成功。Explicit casting must be
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度二零二五年度私下房屋買賣及產(chǎn)權(quán)過戶手續(xù)代理合同
- 二零二五年度船舶船員勞動(dòng)合同及職業(yè)健康檢查協(xié)議
- 2025年度高端別墅裝修貸款服務(wù)合同
- 二零二五年度文化節(jié)特邀表演嘉賓合同
- 2025年商標(biāo)轉(zhuǎn)讓合同的對(duì)比研究
- 2025年成立合作社技術(shù)轉(zhuǎn)讓合同
- 杭州市幼兒園租賃合同
- 汽車制造項(xiàng)目合作開發(fā)合同
- 法律事務(wù)與合同管理流程制度
- 影視制作合作合同與知識(shí)產(chǎn)權(quán)免責(zé)協(xié)議
- 2025開工大吉蛇年大吉開門紅模板
- 鍋爐、壓力容器制造質(zhì)量手冊(cè)含程序文件-符合TSG07-2019《許可規(guī)則》
- 邏輯思維訓(xùn)練500題(帶答案)
- 2025年日歷表(A4版含農(nóng)歷可編輯)
- 人工智能大模型
- 極簡統(tǒng)計(jì)學(xué)(中文版)
- 2024年資格考試-對(duì)外漢語教師資格證筆試參考題庫含答案
- 2024年4月自考02382管理信息系統(tǒng)答案及評(píng)分參考
- (蘇版)初三化學(xué)上冊(cè):第2單元課題1空氣
- 2023年12月廣東珠海市軌道交通局公開招聘工作人員1人筆試近6年高頻考題難、易錯(cuò)點(diǎn)薈萃答案帶詳解附后
- 腹腔鏡腎上腺腫瘤切除術(shù)查房護(hù)理課件
評(píng)論
0/150
提交評(píng)論