




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、大外軟件學(xué)院繼承與多態(tài)計(jì)算機(jī)教研室大外軟件學(xué)院主要內(nèi)容 類(lèi)的繼承類(lèi)的繼承 父類(lèi)子類(lèi)父類(lèi)子類(lèi) 方法的覆蓋方法的覆蓋 finalfinal關(guān)鍵字關(guān)鍵字 對(duì)象的上轉(zhuǎn)型對(duì)象的上轉(zhuǎn)型 多態(tài)多態(tài) abstractabstract類(lèi)和方法類(lèi)和方法 supersuper關(guān)鍵字關(guān)鍵字 接口接口大外軟件學(xué)院類(lèi)的繼承繼承繼承是一種由是一種由已有類(lèi)已有類(lèi)創(chuàng)建創(chuàng)建新類(lèi)新類(lèi)的機(jī)制,是面向?qū)ο蟮臋C(jī)制,是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心特點(diǎn)和重要方法。程序設(shè)計(jì)的核心特點(diǎn)和重要方法。先創(chuàng)建一個(gè)具有共有屬性的一般類(lèi)(父類(lèi))先創(chuàng)建一個(gè)具有共有屬性的一般類(lèi)(父類(lèi))再根據(jù)一般類(lèi)創(chuàng)建具有特殊屬性的新類(lèi),新類(lèi)繼承一般再根據(jù)一般類(lèi)創(chuàng)建具有特殊屬性的新
2、類(lèi),新類(lèi)繼承一般類(lèi)的狀態(tài)和行為,并根據(jù)需要增加他自己的新的狀態(tài)和類(lèi)的狀態(tài)和行為,并根據(jù)需要增加他自己的新的狀態(tài)和行為(子類(lèi))行為(子類(lèi))由繼承而得到的類(lèi)稱(chēng)為子類(lèi),被繼承的類(lèi)稱(chēng)為父類(lèi)由繼承而得到的類(lèi)稱(chēng)為子類(lèi),被繼承的類(lèi)稱(chēng)為父類(lèi)( (超類(lèi)超類(lèi)) )JavaJava只支持單一繼承,即一個(gè)類(lèi)只能有一個(gè)父類(lèi)只支持單一繼承,即一個(gè)類(lèi)只能有一個(gè)父類(lèi)JavaJava支持多層繼承支持多層繼承大外軟件學(xué)院子類(lèi) 在在JavaJava類(lèi)的聲明中,使用關(guān)鍵字類(lèi)的聲明中,使用關(guān)鍵字extendsextends實(shí)現(xiàn)繼承。實(shí)現(xiàn)繼承。由已有的父類(lèi)派生新的子類(lèi),格式如下:由已有的父類(lèi)派生新的子類(lèi),格式如下:class class
3、 extends extends 子類(lèi)類(lèi)體;子類(lèi)類(lèi)體; 例如:例如:注:注:ObjectObject類(lèi)類(lèi)是是java.langjava.lang包中的一個(gè)類(lèi):如果一個(gè)類(lèi)的聲包中的一個(gè)類(lèi):如果一個(gè)類(lèi)的聲明中沒(méi)有使用明中沒(méi)有使用extendsextends關(guān)鍵字,該類(lèi)就被系統(tǒng)默認(rèn)為是關(guān)鍵字,該類(lèi)就被系統(tǒng)默認(rèn)為是ObObjectject類(lèi)的直接子類(lèi)。類(lèi)的直接子類(lèi)。大外軟件學(xué)院ObjectObject類(lèi)中常用的方法類(lèi)中常用的方法 1. public final Class getClass( )2. public boolean equals (Object obj) 3. public String
4、 toString() 4. public int hashCode()大外軟件學(xué)院【例例】子類(lèi)繼承父類(lèi)的成員變量子類(lèi)繼承父類(lèi)的成員變量 源程序Person1.java中定義類(lèi)Person與Student,程序如下public class Person String name; /姓名姓名 int age; /年齡年齡class Student String name; /姓名姓名 int age; /年齡年齡 String school; /學(xué)校學(xué)校這樣的定義有大量的重復(fù),利這樣的定義有大量的重復(fù),利用繼承原則,重新定義這兩個(gè)類(lèi)用繼承原則,重新定義這兩個(gè)類(lèi)public class Perso
5、n String name; /姓名姓名 int age; /年齡年齡class Student extends Person String school; /學(xué)校學(xué)校利用繼承原則:子類(lèi)從父類(lèi)繼承了利用繼承原則:子類(lèi)從父類(lèi)繼承了非私有成員變量非私有成員變量name、age,同時(shí),同時(shí)增加了新的成員變量增加了新的成員變量school大外軟件學(xué)院繼承的目的類(lèi)之間的繼承關(guān)系是現(xiàn)實(shí)世界中遺傳關(guān)系的直類(lèi)之間的繼承關(guān)系是現(xiàn)實(shí)世界中遺傳關(guān)系的直接模擬,它表示類(lèi)之間的內(nèi)在聯(lián)系以及對(duì)屬性接模擬,它表示類(lèi)之間的內(nèi)在聯(lián)系以及對(duì)屬性和行為的共享:和行為的共享:子類(lèi)可以沿用父類(lèi)的某些特征。子類(lèi)可以沿用父類(lèi)的某些特征。子
6、類(lèi)也可以具有自己獨(dú)立的屬性和操作。子類(lèi)也可以具有自己獨(dú)立的屬性和操作。通過(guò)繼承可以更有效地組織程序結(jié)構(gòu),通過(guò)繼承可以更有效地組織程序結(jié)構(gòu),利用已利用已有的類(lèi)來(lái)完成更復(fù)雜的新類(lèi)的設(shè)計(jì)與開(kāi)發(fā)有的類(lèi)來(lái)完成更復(fù)雜的新類(lèi)的設(shè)計(jì)與開(kāi)發(fā),充,充分實(shí)現(xiàn)代碼重用。分實(shí)現(xiàn)代碼重用。大外軟件學(xué)院子類(lèi) extendsextends實(shí)現(xiàn)實(shí)現(xiàn)繼承關(guān)系繼承關(guān)系 子類(lèi)繼承父子類(lèi)繼承父類(lèi)的成員變類(lèi)的成員變量和方法量和方法 子類(lèi)是否子類(lèi)是否可以繼承可以繼承父類(lèi)的全父類(lèi)的全部成員?部成員?大外軟件學(xué)院子類(lèi)的繼承性(1) 當(dāng)子類(lèi)和父類(lèi)當(dāng)子類(lèi)和父類(lèi)在同一個(gè)包在同一個(gè)包中,子類(lèi)繼承父類(lèi)中中,子類(lèi)繼承父類(lèi)中不是不是privatepriva
7、te修飾的變量和方法修飾的變量和方法 繼承的成員變量和方法的訪(fǎng)問(wèn)權(quán)限不變。繼承的成員變量和方法的訪(fǎng)問(wèn)權(quán)限不變。大外軟件學(xué)院子類(lèi)的繼承性(2) 當(dāng)子類(lèi)父類(lèi)當(dāng)子類(lèi)父類(lèi)不在同一個(gè)包不在同一個(gè)包中,子類(lèi)繼承父類(lèi)的中,子類(lèi)繼承父類(lèi)的受保護(hù)受保護(hù)(protected)(protected)成員和公有成員和公有(public)(public)成員,成員,不能繼承不能繼承友好成員友好成員和私有成員和私有成員privateprivate大外軟件學(xué)院子類(lèi)的繼承性(3) protectedprotected的補(bǔ)充說(shuō)明:的補(bǔ)充說(shuō)明: D D類(lèi)中創(chuàng)建一個(gè)類(lèi)中創(chuàng)建一個(gè)D D類(lèi)的對(duì)象,能夠訪(fǎng)問(wèn)成員變量類(lèi)的對(duì)象,能夠訪(fǎng)問(wèn)成員
8、變量x x和和y y; OtherOther類(lèi)中創(chuàng)建一個(gè)類(lèi)中創(chuàng)建一個(gè)D D類(lèi)的對(duì)象:類(lèi)的對(duì)象: 和和D D類(lèi)同一個(gè)包:能夠訪(fǎng)問(wèn)類(lèi)同一個(gè)包:能夠訪(fǎng)問(wèn)D D類(lèi)中定義的受保護(hù)的成員類(lèi)中定義的受保護(hù)的成員y y 和和A A類(lèi)同一個(gè)包:能夠訪(fǎng)問(wèn)類(lèi)同一個(gè)包:能夠訪(fǎng)問(wèn)D D類(lèi)中繼承的受保護(hù)的成員類(lèi)中繼承的受保護(hù)的成員x xOther D d = new D();同一個(gè)包同一個(gè)包A protected int xBD protected int yc大外軟件學(xué)院訪(fǎng)問(wèn)權(quán)限練習(xí) 要求設(shè)計(jì)一個(gè)類(lèi),它擁有一個(gè)特殊的成員變量,要求設(shè)計(jì)一個(gè)類(lèi),它擁有一個(gè)特殊的成員變量,該成員變量必須能夠被該類(lèi)的子類(lèi)訪(fǎng)問(wèn)到,但是該成員變量
9、必須能夠被該類(lèi)的子類(lèi)訪(fǎng)問(wèn)到,但是不能被不在同一個(gè)包內(nèi)的其他類(lèi)訪(fǎng)問(wèn)到。下面哪不能被不在同一個(gè)包內(nèi)的其他類(lèi)訪(fǎng)問(wèn)到。下面哪個(gè)設(shè)計(jì)可以滿(mǎn)足上述要求?個(gè)設(shè)計(jì)可以滿(mǎn)足上述要求?A. 用public 修飾該成員變量B. 用private修飾該成員變量C. 用protected修飾該成員變量D. 不需要任何訪(fǎng)問(wèn)權(quán)限修飾該成員變量C C大外軟件學(xué)院訪(fǎng)問(wèn)權(quán)限練習(xí) 假設(shè)在假設(shè)在JavaJava源文件源文件MyClass.javaMyClass.java中只包含一中只包含一個(gè)類(lèi),而且這個(gè)類(lèi)必須能夠被位于一個(gè)龐大的個(gè)類(lèi),而且這個(gè)類(lèi)必須能夠被位于一個(gè)龐大的軟件系統(tǒng)中的所有軟件系統(tǒng)中的所有JavaJava類(lèi)訪(fǎng)問(wèn)到,那么下面
10、哪類(lèi)訪(fǎng)問(wèn)到,那么下面哪些聲明有可能符合要求?些聲明有可能符合要求?A. private class MyClass extends ObjectB. class Myclass extends ObjectC. public class MyClassD. protected class MyClass E. public class MyClass extends ObjectC,EC,E大外軟件學(xué)院【例例】 子類(lèi)繼承父類(lèi)的成員方法子類(lèi)繼承父類(lèi)的成員方法源程序Person.java中定義類(lèi)Person與Studentpublic class Person protected String n
11、ame; protected int age; void setdata(String n1,int a1) name = n1; age = a1; public void print() System.out.println(name+, +age); /受保護(hù)的數(shù)據(jù)成員受保護(hù)的數(shù)據(jù)成員 /友好成員方法友好成員方法 /公有成員方法公有成員方法大外軟件學(xué)院【例例】 子類(lèi)繼承父類(lèi)的成員方法子類(lèi)繼承父類(lèi)的成員方法 Student繼承父類(lèi)Person的成員,并增加了自己的成員schoolclass Student extends Person protected String school; pu
12、blic static void main(String args) Person p1 = new Person(); p1.setdata(李大廣李大廣,21) ; p1.print(); Student s1 = new Student() ; s1.setdata(陳小瑞陳小瑞,19); s1.school=“大外大外; s1.print(); 繼承父類(lèi)數(shù)據(jù)成員繼承父類(lèi)數(shù)據(jù)成員age、name成員方法:成員方法:setdata()、print()/調(diào)用父類(lèi)的成員方法調(diào)用父類(lèi)的成員方法/訪(fǎng)問(wèn)本類(lèi)的成員變量訪(fǎng)問(wèn)本類(lèi)的成員變量存在兩個(gè)問(wèn)題:存在兩個(gè)問(wèn)題:1. s1.setdata( )無(wú)法為
13、子類(lèi)的無(wú)法為子類(lèi)的school賦值賦值改進(jìn)方法是創(chuàng)建構(gòu)造方法改進(jìn)方法是創(chuàng)建構(gòu)造方法2. s1.print()無(wú)法輸出的無(wú)法輸出的school的值的值改進(jìn)方法是重新定義改進(jìn)方法是重新定義print方法,方法,稱(chēng)之為稱(chēng)之為方法的重寫(xiě)方法的重寫(xiě)大外軟件學(xué)院成員變量的隱藏和方法的重寫(xiě)(1)class Animal class Animal String lable = String lable = AnimalAnimal ; ; public void cry() public void cry() System.out.println(System.out.println( );); class
14、Dog extends Animal class Dog extends Animal String lable = String lable = DogDog ; ; public void cry() public void cry() System.out.println(System.out.println( 汪汪汪汪 );); class Cat extends Animal class Cat extends Animal String lable = String lable = CatCat ; ; public void cry() public void cry() Sys
15、tem.out.println(System.out.println( 喵喵喵喵 );); 隱藏:隱藏:子類(lèi)中定義的子類(lèi)中定義的成員變量和父類(lèi)中的成員變量和父類(lèi)中的成員變量重名成員變量重名 重寫(xiě):重寫(xiě):子類(lèi)中定義的子類(lèi)中定義的方法和父類(lèi)中方法的方法和父類(lèi)中方法的名字、返回值類(lèi)型、名字、返回值類(lèi)型、形式參數(shù)的個(gè)數(shù)及類(lèi)形式參數(shù)的個(gè)數(shù)及類(lèi)型必須完全相同型必須完全相同 重寫(xiě)發(fā)生在父子之間重寫(xiě)發(fā)生在父子之間大外軟件學(xué)院成員變量的隱藏和方法的重寫(xiě)(2)class Chengji float f (float x,float y) return x*y; class Xiangjia extends Che
16、ngji float f (float x,float y) return x+y ; public class Example public static void main(String args)Xiangjia sum; sum = new Xiangjia(); float c = sum.f(4,6); System.out.println(c); 10.0大外軟件學(xué)院成員變量的隱藏和方法的重寫(xiě)(3)class Chengji float f (float x, float y) return x*y; class Xiangjia extends Chengji float f
17、(int x, int y) return (float)(x+y) ; public class Example4_16 public static void main(String args)Xiangjia sum; sum = new Xiangjia();System.out.println(sum.f(4, 6);System.out.println(sum.f(4.0f, 6.0f); 若父類(lèi)與子類(lèi)同若父類(lèi)與子類(lèi)同名方法的形參不名方法的形參不同,則視為重載同,則視為重載10.024.0大外軟件學(xué)院成員變量的隱藏和方法的重寫(xiě)(4)class Chengji float f (flo
18、at x,float y) return x*y; class Xiangjia extends Chengji int f (float x,float y) return (int)(x+y) ; public class Example4_16 public class Example4_16 public static void main(String args) public static void main(String args)Xiangjia sum;Xiangjia sum; sum = new Xiangjia();sum = new Xiangjia();System.
19、out.println(System.out.println(sum.f(4, 6)sum.f(4, 6); );System.out.println(System.out.println(sum.f(4.0f, 6.0f)sum.f(4.0f, 6.0f); ); 編譯錯(cuò)誤!編譯錯(cuò)誤!若父類(lèi)與子類(lèi)同若父類(lèi)與子類(lèi)同名方法的形參相名方法的形參相同,而返回類(lèi)型同,而返回類(lèi)型不同,編譯出錯(cuò)不同,編譯出錯(cuò)大外軟件學(xué)院成員變量的隱藏和方法的重寫(xiě)(5) 重寫(xiě)父類(lèi)的方法時(shí),不能降低方法的訪(fǎng)問(wèn)權(quán)限重寫(xiě)父類(lèi)的方法時(shí),不能降低方法的訪(fǎng)問(wèn)權(quán)限合法合法非法非法大外軟件學(xué)院成員變量的隱藏和方法的重寫(xiě)(6) 子類(lèi)的實(shí)例方
20、法不能重寫(xiě)父類(lèi)的靜態(tài)方法子類(lèi)的實(shí)例方法不能重寫(xiě)父類(lèi)的靜態(tài)方法合法合法非法非法大外軟件學(xué)院成員變量的隱藏和方法的重寫(xiě)(7) 子類(lèi)的靜態(tài)方法不能重寫(xiě)父類(lèi)的實(shí)例方法子類(lèi)的靜態(tài)方法不能重寫(xiě)父類(lèi)的實(shí)例方法合法合法非法非法大外軟件學(xué)院小結(jié):子類(lèi)的三種成員:子類(lèi)的三種成員:繼承父類(lèi)的成員變量和成員方法;繼承父類(lèi)的成員變量和成員方法;增加新的成員變量和成員方法;增加新的成員變量和成員方法;隱藏父類(lèi)的成員變量,重寫(xiě)(或重載)父隱藏父類(lèi)的成員變量,重寫(xiě)(或重載)父類(lèi)的成員方法類(lèi)的成員方法大外軟件學(xué)院課堂練習(xí)class Apublic int getNumber(int a)return a+1;class B e
21、xtends Apublic int getNumber(int a)return a + 2;public static void main(String args)B b = new B();System.out.println(b.getNumber(0);編譯成功并輸出編譯成功并輸出2 2大外軟件學(xué)院課堂練習(xí)class Apublic int getNumber(int a)return a+1;class B extends Apublic int getNumber(int a, char c)return a + 2;public static void main(String
22、args)B b = new B();System.out.println(b.getNumber(0);編譯成功并輸出編譯成功并輸出1 1大外軟件學(xué)院課堂練習(xí)class A public int getNumber()return 1;class B extends Apublic short getNumber()return 2; public static void main(String args)B b = new B();System.out.println(b.getNumber();編譯第編譯第8 8行出現(xiàn)行出現(xiàn)語(yǔ)法錯(cuò)誤語(yǔ)法錯(cuò)誤大外軟件學(xué)院課堂練習(xí)class BaseClas
23、sprivate float x = 1.0f;protected float getVar()return x;class SubClass extends BaseClassprivate float x = 2.0f;/此處插入代碼下面哪些方法是對(duì)父類(lèi)方法的有效覆蓋(或重寫(xiě))?A. float getVar()return x;B. public float getVar()return x;C. double getVar()return x;D. protected float getVar()return x + 1;E. public float getVar(float f)r
24、eturn f;B,D大外軟件學(xué)院final關(guān)鍵字 finalfinal修飾的變量是常量,必須賦初值,而且不能再修改修飾的變量是常量,必須賦初值,而且不能再修改 finalfinal修飾的方法不能被重寫(xiě)修飾的方法不能被重寫(xiě)class class CircleCircle final double PI; final double PI; /非法非法 final double PI = 3.1415926;final double PI = 3.1415926; public double getArea(final double r) public double getArea(final d
25、ouble r) r r 9 9; /非法非法 return PIreturn PI* *r r* *r;r; public class Example4_18 public class Example4_18 public static void main(String args) public static void main(String args) Circle a = new Circle();Circle a = new Circle(); System.out.println( System.out.println(面面積積: + a.getArea(10); + a.getAr
26、ea(10); 大外軟件學(xué)院final關(guān)鍵字 finalfinal修飾的類(lèi)不能被繼承修飾的類(lèi)不能被繼承 出于安全考慮,某些類(lèi)不能輕易被繼承或修改,因此必須定義出于安全考慮,某些類(lèi)不能輕易被繼承或修改,因此必須定義為為fianlfianl類(lèi),例如:類(lèi),例如:StringString類(lèi)類(lèi)大外軟件學(xué)院final課堂練習(xí) 下面哪些方法能夠防止被重寫(xiě)下面哪些方法能夠防止被重寫(xiě)( (覆蓋覆蓋) )? A. final void methoda()A. final void methoda() B. void final methoda()B. void final methoda() C. static
27、void mehtoda()C. static void mehtoda() D. static final void methoda()D. static final void methoda()A,D大外軟件學(xué)院super關(guān)鍵字 如果在子類(lèi)中子類(lèi)中想使用被子類(lèi)隱藏的成員變量或重寫(xiě)的成員方法可以使用關(guān)鍵字superExample4_24.java大外軟件學(xué)院super關(guān)鍵字 子類(lèi)沒(méi)有繼承父類(lèi)的構(gòu)造方法。子類(lèi)沒(méi)有繼承父類(lèi)的構(gòu)造方法。 子類(lèi)若想調(diào)用父類(lèi)的構(gòu)造方法:子類(lèi)若想調(diào)用父類(lèi)的構(gòu)造方法: 必須在子類(lèi)的構(gòu)造方法中使用必須在子類(lèi)的構(gòu)造方法中使用 必須使用必須使用supersuper關(guān)鍵字表示:關(guān)
28、鍵字表示:super(super(參數(shù)列表參數(shù)列表) ) supersuper必須是子類(lèi)構(gòu)造方法的頭一條語(yǔ)句必須是子類(lèi)構(gòu)造方法的頭一條語(yǔ)句 若子類(lèi)構(gòu)造方法沒(méi)有使用若子類(lèi)構(gòu)造方法沒(méi)有使用supersuper語(yǔ)句:系統(tǒng)在子語(yǔ)句:系統(tǒng)在子類(lèi)構(gòu)造方法的第一句,默認(rèn)添加了一個(gè)類(lèi)構(gòu)造方法的第一句,默認(rèn)添加了一個(gè)super();super(); 為避免出錯(cuò),當(dāng)父類(lèi)中定義多個(gè)構(gòu)造方法時(shí),為避免出錯(cuò),當(dāng)父類(lèi)中定義多個(gè)構(gòu)造方法時(shí),其中應(yīng)當(dāng)包含一個(gè)不帶參數(shù)的構(gòu)造方法其中應(yīng)當(dāng)包含一個(gè)不帶參數(shù)的構(gòu)造方法Example4_23.java大外軟件學(xué)院課堂練習(xí)class Father Father()System.out.p
29、rintln( Father );class Son extends Father Son()super();System.out.println( Son );public class J_Testpublic static void main(String args)new Father();new Son();FatherFatherSon大外軟件學(xué)院課堂練習(xí)class FatherFather()System.out.println( Father );class Son extends Fathervoid Son()System.out.println( Son );Son()su
30、per();public class J_Testpublic static void main(String args)new Father();new Son();FatherFather大外軟件學(xué)院/父類(lèi)定義帶參構(gòu)造方法父類(lèi)定義帶參構(gòu)造方法/方法覆蓋方法覆蓋【例例】 子類(lèi)構(gòu)造方法的定義子類(lèi)構(gòu)造方法的定義/隱式地調(diào)用父類(lèi)的無(wú)參構(gòu)造方法隱式地調(diào)用父類(lèi)的無(wú)參構(gòu)造方法u說(shuō)明:說(shuō)明:由于超類(lèi)由于超類(lèi)AnimalAnimal已顯式定義了帶參數(shù)的已顯式定義了帶參數(shù)的 構(gòu)造方法,構(gòu)造方法,JavaJava運(yùn)行時(shí)系統(tǒng)不會(huì)再自動(dòng)運(yùn)行時(shí)系統(tǒng)不會(huì)再自動(dòng) 生成默認(rèn)的無(wú)參數(shù)構(gòu)造方法;生成默認(rèn)的無(wú)參數(shù)構(gòu)造方法;子類(lèi)構(gòu)
31、造方法又隱式調(diào)用父類(lèi)的無(wú)參數(shù)子類(lèi)構(gòu)造方法又隱式調(diào)用父類(lèi)的無(wú)參數(shù) 構(gòu)造方法,構(gòu)造方法,編譯時(shí)會(huì)出錯(cuò)編譯時(shí)會(huì)出錯(cuò);問(wèn)題在于超類(lèi)沒(méi)有可供子類(lèi)構(gòu)造方法問(wèn)題在于超類(lèi)沒(méi)有可供子類(lèi)構(gòu)造方法 調(diào)用的無(wú)參數(shù)構(gòu)造方法調(diào)用的無(wú)參數(shù)構(gòu)造方法 Animal()Animal()大外軟件學(xué)院/父類(lèi)定義帶參構(gòu)造方法父類(lèi)定義帶參構(gòu)造方法/顯式地調(diào)用顯式地調(diào)用父父類(lèi)的構(gòu)造方法類(lèi)的構(gòu)造方法【例例】 子類(lèi)構(gòu)造方法的定義子類(lèi)構(gòu)造方法的定義1 1、修改說(shuō)明:、修改說(shuō)明:在子類(lèi)構(gòu)造方法第一條語(yǔ)句顯式在子類(lèi)構(gòu)造方法第一條語(yǔ)句顯式加上對(duì)父類(lèi)構(gòu)造方法的調(diào)用加上對(duì)父類(lèi)構(gòu)造方法的調(diào)用大外軟件學(xué)院/注釋掉注釋掉超類(lèi)定義帶參構(gòu)造方法超類(lèi)定義帶參構(gòu)造方法
32、/隱式地調(diào)用超類(lèi)的無(wú)參構(gòu)造方法隱式地調(diào)用超類(lèi)的無(wú)參構(gòu)造方法【例例】 子類(lèi)構(gòu)造方法的定義子類(lèi)構(gòu)造方法的定義2 2、修改說(shuō)明、修改說(shuō)明:在父類(lèi)在父類(lèi)AnimalAnimal中去掉帶參構(gòu)造中去掉帶參構(gòu)造方法的定義,這時(shí)方法的定義,這時(shí)系統(tǒng)會(huì)自動(dòng)系統(tǒng)會(huì)自動(dòng)生成生成無(wú)參數(shù)的構(gòu)造方法;無(wú)參數(shù)的構(gòu)造方法; 大外軟件學(xué)院/超類(lèi)定義帶參構(gòu)造方法超類(lèi)定義帶參構(gòu)造方法/隱式地調(diào)用超類(lèi)的無(wú)參構(gòu)造方法隱式地調(diào)用超類(lèi)的無(wú)參構(gòu)造方法/方法覆蓋方法覆蓋【例例】 子類(lèi)構(gòu)造方法的定義子類(lèi)構(gòu)造方法的定義3 3、修改說(shuō)明:、修改說(shuō)明:在超類(lèi)添加一個(gè)無(wú)參的構(gòu)造方法在超類(lèi)添加一個(gè)無(wú)參的構(gòu)造方法, , 程序體為空程序體為空大外軟件學(xué)院課堂
33、練習(xí)class Test extends TTpublic Test()this(Tom);public Test(String s)super(s);System.out.println(How do you do?);public static void main(String args) Test t = new Test(“Jerry);class TT public TT() System.out.println(“Hello!); public TT(String s) this(); System.out.println(I am +s); Hello!I am JerryHow
34、 do you do?大外軟件學(xué)院課堂練習(xí)添加哪句可以使實(shí)例引用添加哪句可以使實(shí)例引用a a訪(fǎng)問(wèn)訪(fǎng)問(wèn)J_BaseJ_Base的的mb_method()mb_method()方法?方法?class J_Basepublic void mb_method()System.out.println(Base);class J_SubClass extends J_Basepublic void mb_method()System.out.println(Sub);public class J_Testpublic static void main(String args)J_SubClass a =
35、new J_SubClass();/添加語(yǔ)句處(A) a. mb_method(); (B) a.super.mb_method(); (C) a.super.super.mb_method(); (D)以上都不對(duì)D大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象 如果如果動(dòng)物動(dòng)物(Animal)(Animal)是是老虎老虎(Tiger)(Tiger)的父類(lèi),則我們的父類(lèi),則我們可以說(shuō)可以說(shuō)“老虎是動(dòng)物老虎是動(dòng)物”,但不能說(shuō),但不能說(shuō)“動(dòng)物是老動(dòng)物是老虎虎”; 當(dāng)說(shuō)當(dāng)說(shuō)“老虎是動(dòng)物老虎是動(dòng)物”時(shí),老虎將失去其所獨(dú)有的時(shí),老虎將失去其所獨(dú)有的屬性和功能;屬性和功能; 如果如果人人(Person)(Person)是是
36、學(xué)生學(xué)生(Student)(Student)的父類(lèi),則我們的父類(lèi),則我們可以說(shuō)可以說(shuō)“學(xué)生是人學(xué)生是人”,但不能說(shuō),但不能說(shuō)“人是學(xué)生人是學(xué)生”; 當(dāng)說(shuō)當(dāng)說(shuō)“學(xué)生是人學(xué)生是人”時(shí),學(xué)生將失去其所獨(dú)有的屬時(shí),學(xué)生將失去其所獨(dú)有的屬性和功能;性和功能; 結(jié)論:子類(lèi)的對(duì)象也是父類(lèi)的對(duì)象,反之不成立結(jié)論:子類(lèi)的對(duì)象也是父類(lèi)的對(duì)象,反之不成立 上轉(zhuǎn)型:上轉(zhuǎn)型:將子類(lèi)對(duì)象的引用賦值給父類(lèi)的對(duì)象將子類(lèi)對(duì)象的引用賦值給父類(lèi)的對(duì)象有機(jī)物為食有機(jī)物為食, ,能感覺(jué)能感覺(jué), ,有神經(jīng)有神經(jīng), ,可運(yùn)動(dòng)可運(yùn)動(dòng)有姓名、年齡和性別,有姓名、年齡和性別,能吃飯,睡覺(jué)和思考能吃飯,睡覺(jué)和思考大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象 上轉(zhuǎn)
37、型:傳給父類(lèi)對(duì)象一個(gè)子類(lèi)對(duì)象上轉(zhuǎn)型:傳給父類(lèi)對(duì)象一個(gè)子類(lèi)對(duì)象AnimalTigerAnimal a;a = new Tiger();Animal a;Tiger t = new Tiger();a = t;稱(chēng)稱(chēng)a a是子類(lèi)對(duì)象是子類(lèi)對(duì)象t t的上轉(zhuǎn)型對(duì)象的上轉(zhuǎn)型對(duì)象對(duì)象新增的變量新增的方法繼承的變量繼承的方法對(duì)象的上轉(zhuǎn)型對(duì)象賦值給賦值給父類(lèi)對(duì)象父類(lèi)對(duì)象隱藏前隱藏前重寫(xiě)后重寫(xiě)后大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象(2)class class 類(lèi)人猿 private int n=100; private int n=100;int age = 10;int age = 10; void crySpeak(
38、String s) void crySpeak(String s) System.out.println(s); System.out.println(s); void sleep() void sleep() System.out.println( System.out.println(呼呼呼呼); ); class People extends class People extends 類(lèi)人猿 String name = String name = 張三張三; int age = 18; int age = 18; void crySpeak(String s) void crySpeak
39、(String s) System.out.println( System.out.println(* *+s+s+* *); ); void computer(int a,int b) void computer(int a,int b) System.out.println(a System.out.println(a* *b); b); class Example4_19 class Example4_19 public static void main(String args) public static void main(String args) 類(lèi)人猿類(lèi)人猿 monkey1 =
40、new monkey1 = new 類(lèi)人猿類(lèi)人猿();();/父類(lèi)創(chuàng)建的對(duì)象父類(lèi)創(chuàng)建的對(duì)象People p1 = new People();People p1 = new People();/子類(lèi)創(chuàng)建的對(duì)象子類(lèi)創(chuàng)建的對(duì)象類(lèi)人猿 monkey2monkey2 = p1; = p1; /子類(lèi)的上轉(zhuǎn)型對(duì)象子類(lèi)的上轉(zhuǎn)型對(duì)象 大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象(2) 父類(lèi)創(chuàng)建的對(duì)象與子類(lèi)上轉(zhuǎn)型對(duì)象之間的區(qū)別父類(lèi)創(chuàng)建的對(duì)象與子類(lèi)上轉(zhuǎn)型對(duì)象之間的區(qū)別 父類(lèi)創(chuàng)建的對(duì)象和子類(lèi)上轉(zhuǎn)型對(duì)象具有相同的成員變量父類(lèi)創(chuàng)建的對(duì)象和子類(lèi)上轉(zhuǎn)型對(duì)象具有相同的成員變量 如果某方法在子類(lèi)中被重寫(xiě),則子類(lèi)上轉(zhuǎn)型對(duì)象的該方法如果某方法在子類(lèi)
41、中被重寫(xiě),則子類(lèi)上轉(zhuǎn)型對(duì)象的該方法是重寫(xiě)后的方法,這是父類(lèi)創(chuàng)建的對(duì)象和子類(lèi)上轉(zhuǎn)型對(duì)象是重寫(xiě)后的方法,這是父類(lèi)創(chuàng)建的對(duì)象和子類(lèi)上轉(zhuǎn)型對(duì)象之間唯一的差別之間唯一的差別 monkey1(monkey1(父類(lèi)創(chuàng)建的對(duì)象父類(lèi)創(chuàng)建的對(duì)象) ) 成員變量:成員變量: int n;(int n;(私有私有) ) int age;int age; 成員方法:成員方法: crySpeak(String s);crySpeak(String s); sleep();sleep(); monkey2(monkey2(子類(lèi)上轉(zhuǎn)型對(duì)象子類(lèi)上轉(zhuǎn)型對(duì)象) ) 成員變量:成員變量: int n;int n;(私有)(私有) i
42、nt age;int age; 成員方法:成員方法: crySpeak(String s);crySpeak(String s); sleep();sleep();class class 類(lèi)人猿 private int n=100; private int n=100;int age = 10;int age = 10; void crySpeak(String s) void crySpeak(String s) System.out.println(s); System.out.println(s); void sleep() void sleep() System.out.println
43、( System.out.println(呼呼呼呼); ); class People extends class People extends 類(lèi)人猿 String name = String name = 張三張三; int age = 18; int age = 18; void crySpeak(String s) void crySpeak(String s) System.out.println( System.out.println(* *+s+s+* *); ); void computer(int a,int b) void computer(int a,int b) Sys
44、tem.out.println(a System.out.println(a* *b); b); p1(p1(子類(lèi)創(chuàng)建的對(duì)象子類(lèi)創(chuàng)建的對(duì)象) ) 成員變量:成員變量: String name;String name; int age;int age; 成員方法:成員方法: crySpeak(String s);crySpeak(String s); sleep();sleep(); computer(int a,int b);computer(int a,int b);大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象(2)class class 類(lèi)人猿 private int n=100; private int
45、 n=100;int age = 10;int age = 10; void crySpeak(String s) void crySpeak(String s) System.out.println(s); System.out.println(s); void sleep() void sleep() System.out.println( System.out.println(呼呼呼呼); ); class Example4_19 class Example4_19 public static void main(String args) public static void main(
46、String args) People p1 = new People();People p1 = new People();類(lèi)人猿 monkey2monkey2 = p1; = p1;monkey2monkey2.age = 12;.age = 12;/從從1010到到1212 monkey2.monkey2.crySpeak(Hello); crySpeak(Hello); /帶帶* *monkey2.monkey2.sleep();sleep(); People p2 = (People)People p2 = (People)monkey2monkey2; ; puter(10,10)
47、;puter(10,10); monkey2.n = 100; = “李四;puter(10,10)class People extends class People extends 類(lèi)人猿 String name = String name = 張三張三; int age = 18; int age = 18; void crySpeak(String s) void crySpeak(String s) System.out.println( System.out.println(* *+s+s+* *); ); void computer(int a,int b)
48、 void computer(int a,int b) System.out.println(a System.out.println(a* *b); b); 大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象(2) 可以將對(duì)象的上轉(zhuǎn)型對(duì)象再?gòu)?qiáng)制轉(zhuǎn)換為子類(lèi)對(duì)象,可以將對(duì)象的上轉(zhuǎn)型對(duì)象再?gòu)?qiáng)制轉(zhuǎn)換為子類(lèi)對(duì)象,此時(shí)該對(duì)象又具備子類(lèi)的所有屬性和方法。此時(shí)該對(duì)象又具備子類(lèi)的所有屬性和方法。 People p1 = new People();People p1 = new People(); 類(lèi)人猿類(lèi)人猿 monkey = p1; monkey = p1; People p2 = (People)monkey;People p
49、2 = (People)monkey; / /下轉(zhuǎn)型下轉(zhuǎn)型 對(duì)象可以向下轉(zhuǎn)型而不出錯(cuò)的充要條件是:該對(duì)象對(duì)象可以向下轉(zhuǎn)型而不出錯(cuò)的充要條件是:該對(duì)象是由向上轉(zhuǎn)型而來(lái)的是由向上轉(zhuǎn)型而來(lái)的( (不能將父類(lèi)創(chuàng)建的對(duì)象賦值不能將父類(lèi)創(chuàng)建的對(duì)象賦值給子類(lèi)對(duì)象給子類(lèi)對(duì)象) ) 類(lèi)人猿類(lèi)人猿 monkey = new monkey = new 類(lèi)人猿類(lèi)人猿();(); People p2 = monkey;People p2 = monkey;/下轉(zhuǎn)型非法,編譯時(shí)出錯(cuò)下轉(zhuǎn)型非法,編譯時(shí)出錯(cuò) People p2 = (People)monkey;People p2 = (People)monkey;/非法,運(yùn)
50、行時(shí)出錯(cuò)非法,運(yùn)行時(shí)出錯(cuò)= new People();= new People();大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象(3)class InstrumentString label=instrument;public void play()System.out.println(Instrument.play();public void play2()System.out.println(Instrument.play2();class Wind extends Instrument String label = wind; public void play() System.out.println(
51、Wind.play(); public void play3()System.out.println(Wind.play3(); public class Music public static void main(String args) Wind w = new Wind(); Instrument i = w; i.play();/重寫(xiě)后的方法重寫(xiě)后的方法 i.play2();/繼承的方法繼承的方法 System.out.println(i.label); 隱藏前的父類(lèi)成員變量隱藏前的父類(lèi)成員變量大外軟件學(xué)院對(duì)象的上轉(zhuǎn)型對(duì)象(3)class Instrumentprivate Strin
52、g label=instrument;public void play()System.out.println(Instrument.play();private void play2()System.out.println(Instrument.play2();class Wind extends Instrument String label = wind; public void play() System.out.println(Wind.play(); public void play3()System.out.println(Wind.play3(); public class M
53、usic public static void main(String args) Wind w = new Wind(); Instrument i = w; i.play();/重寫(xiě)后的方法重寫(xiě)后的方法 i.play2();/非法非法 System.out.println(i.label); 非法非法大外軟件學(xué)院課堂練習(xí)class J_SuperClassclass J_SubClass extends J_SuperClasspublic class J_Testpublic static void main(String args)J_SuperClass a = new J_Supe
54、rClass();J_SubClass b = new J_SubClass();a = b;(A)(A)無(wú)法編譯無(wú)法編譯 (B)(B)可以編譯,但是運(yùn)行出錯(cuò)可以編譯,但是運(yùn)行出錯(cuò) (C)(C)可以編譯,可以運(yùn)行可以編譯,可以運(yùn)行C大外軟件學(xué)院課堂練習(xí)class J_SuperClassclass J_SubClass extends J_SuperClasspublic class J_Testpublic static void main(String args)J_SuperClass a = new J_SuperClass();J_SubClass b = new J_SubClas
55、s();b = a;(A)無(wú)法編譯 (B)可以編譯,但是運(yùn)行出錯(cuò) (C) 可以編譯,可以運(yùn)行A大外軟件學(xué)院課堂練習(xí)class J_SuperClassclass J_SubClass extends J_SuperClasspublic class J_Testpublic static void main(String args)J_SuperClass a = new J_SuperClass();J_SubClass b = new J_SubClass();b = (J_SubClass)a;(A)(A)無(wú)法編譯無(wú)法編譯 (B)(B)可以編譯,但是運(yùn)行出錯(cuò)可以編譯,但是運(yùn)行出錯(cuò) (C)
56、(C)可以編譯,可以運(yùn)行可以編譯,可以運(yùn)行B大外軟件學(xué)院課堂練習(xí)class J_SuperClassclass J_SubClass extends J_SuperClasspublic class J_Testpublic static void main(String args)J_SuperClass a = new J_SubClass();J_SubClass b = new J_SubClass();b = (J_SubClass)a;(A)(A)無(wú)法編譯無(wú)法編譯 (B)(B)可以編譯,但是運(yùn)行出錯(cuò)可以編譯,但是運(yùn)行出錯(cuò) (C)(C)可以編譯,可以運(yùn)行可以編譯,可以運(yùn)行C大外軟件學(xué)
57、院課堂練習(xí)添加哪一個(gè)會(huì)導(dǎo)致程序輸出添加哪一個(gè)會(huì)導(dǎo)致程序輸出“sub”sub”class J_Base class J_SubClass extends J_Basepublic String mb_getString()return Sub;class J_Test extends J_Basepublic static void main(String args)J_Base app = new J_SubClass();System.out.println(_ _);(A) app.mb_getString()(B) (J_Base)app.mb_getString()(C) (J_Sub
58、Class)app.mb_getString() (D) (J_SubClass)app).mb_getString() D大外軟件學(xué)院課堂練習(xí)下面程序輸出結(jié)果:下面程序輸出結(jié)果:class J_Base class J_SubClass extends J_Basepublic String mb_getString()return Sub;class J_Test extends J_Basepublic static void main(String args)J_SubClass app = (J_SubClass)new J_Base();System.out.println( ap
59、p.mb_getString() );運(yùn)行報(bào)錯(cuò)運(yùn)行報(bào)錯(cuò)大外軟件學(xué)院多態(tài) 定義:定義:程序中多個(gè)名字相同的方法共存的現(xiàn)象,程序中多個(gè)名字相同的方法共存的現(xiàn)象,多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心特性;多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心特性; 優(yōu)點(diǎn):優(yōu)點(diǎn):提提高了程序的抽象性,突出高了程序的抽象性,突出JavaJava語(yǔ)言的繼語(yǔ)言的繼承性承性 分類(lèi):分類(lèi): 重載:重載:一個(gè)類(lèi)中存在多個(gè)同名方法一個(gè)類(lèi)中存在多個(gè)同名方法 方法名字相同,形式參數(shù)方法名字相同,形式參數(shù)( (類(lèi)型或個(gè)數(shù)類(lèi)型或個(gè)數(shù)) )不同不同 與返回值類(lèi)型是否相同沒(méi)關(guān)系與返回值類(lèi)型是否相同沒(méi)關(guān)系 重寫(xiě):重寫(xiě):子類(lèi)覆蓋父類(lèi)的同名方法子類(lèi)覆蓋父類(lèi)的同名方法
60、 返回值類(lèi)型、方法名字和形式參數(shù)必須全都相同返回值類(lèi)型、方法名字和形式參數(shù)必須全都相同大外軟件學(xué)院多態(tài)(方法的重載)class Computeclass Compute void add( ) void add( ) System.out.println(No parameters); System.out.println(No parameters); void add(int a, int b) void add(int a, int b) int result = a + b; int result = a + b; System.out.println(Int: + result);
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)廠(chǎng)房購(gòu)買(mǎi)協(xié)議3篇
- 墊資施工合同中的工程安全3篇
- 家電購(gòu)銷(xiāo)合同模板
- 山塘管護(hù)協(xié)議書(shū)3篇
- 錄用合同范本版2篇
- 倉(cāng)庫(kù)租賃續(xù)租3篇
- 動(dòng)遷房買(mǎi)賣(mài)合同中的權(quán)利義務(wù)3篇
- 電氣機(jī)械電動(dòng)車(chē)充電服務(wù)與維護(hù)考核試卷
- 電子白板交互功能維修考核試卷
- 稀有金屬回收與再利用技術(shù)考核試卷
- 福建省龍巖市一級(jí)校2024-2025學(xué)年高二下學(xué)期4月期中聯(lián)考 數(shù)學(xué)試題(含答案)
- 2025年街道全面加強(qiáng)鄉(xiāng)村治理工作實(shí)施方案
- 明股實(shí)債協(xié)議合同
- 2025“十五五”金融規(guī)劃研究白皮書(shū)
- 9.2法律保障生活(教案) -2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 2025年江西上饒鉛山城投控股集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 建筑工程結(jié)算審核現(xiàn)場(chǎng)踏勘
- 加油站防汛抗洪應(yīng)急預(yù)案范本
- 融資崗專(zhuān)業(yè)考試題及答案
- 2025年高考物理模擬試卷1(貴州卷)及答案
- 胃癌課件完整版本
評(píng)論
0/150
提交評(píng)論