




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、大外軟件學(xué)院繼承與多態(tài)計算機教研室大外軟件學(xué)院主要內(nèi)容 類的繼承類的繼承 父類子類父類子類 方法的覆蓋方法的覆蓋 finalfinal關(guān)鍵字關(guān)鍵字 對象的上轉(zhuǎn)型對象的上轉(zhuǎn)型 多態(tài)多態(tài) abstractabstract類和方法類和方法 supersuper關(guān)鍵字關(guān)鍵字 接口接口大外軟件學(xué)院類的繼承繼承繼承是一種由是一種由已有類已有類創(chuàng)建創(chuàng)建新類新類的機制,是面向?qū)ο蟮臋C制,是面向?qū)ο蟪绦蛟O(shè)計的核心特點和重要方法。程序設(shè)計的核心特點和重要方法。先創(chuàng)建一個具有共有屬性的一般類(父類)先創(chuàng)建一個具有共有屬性的一般類(父類)再根據(jù)一般類創(chuàng)建具有特殊屬性的新類,新類繼承一般再根據(jù)一般類創(chuàng)建具有特殊屬性的新
2、類,新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增加他自己的新的狀態(tài)和類的狀態(tài)和行為,并根據(jù)需要增加他自己的新的狀態(tài)和行為(子類)行為(子類)由繼承而得到的類稱為子類,被繼承的類稱為父類由繼承而得到的類稱為子類,被繼承的類稱為父類( (超類超類) )JavaJava只支持單一繼承,即一個類只能有一個父類只支持單一繼承,即一個類只能有一個父類JavaJava支持多層繼承支持多層繼承大外軟件學(xué)院子類 在在JavaJava類的聲明中,使用關(guān)鍵字類的聲明中,使用關(guān)鍵字extendsextends實現(xiàn)繼承。實現(xiàn)繼承。由已有的父類派生新的子類,格式如下:由已有的父類派生新的子類,格式如下:class class
3、 extends extends 子類類體;子類類體; 例如:例如:注:注:ObjectObject類類是是java.langjava.lang包中的一個類:如果一個類的聲包中的一個類:如果一個類的聲明中沒有使用明中沒有使用extendsextends關(guān)鍵字,該類就被系統(tǒng)默認為是關(guān)鍵字,該類就被系統(tǒng)默認為是ObObjectject類的直接子類。類的直接子類。大外軟件學(xué)院ObjectObject類中常用的方法類中常用的方法 1. public final Class getClass( )2. public boolean equals (Object obj) 3. public String
4、 toString() 4. public int hashCode()大外軟件學(xué)院【例例】子類繼承父類的成員變量子類繼承父類的成員變量 源程序Person1.java中定義類Person與Student,程序如下public class Person String name; /姓名姓名 int age; /年齡年齡class Student String name; /姓名姓名 int age; /年齡年齡 String school; /學(xué)校學(xué)校這樣的定義有大量的重復(fù),利這樣的定義有大量的重復(fù),利用繼承原則,重新定義這兩個類用繼承原則,重新定義這兩個類public class Perso
5、n String name; /姓名姓名 int age; /年齡年齡class Student extends Person String school; /學(xué)校學(xué)校利用繼承原則:子類從父類繼承了利用繼承原則:子類從父類繼承了非私有成員變量非私有成員變量name、age,同時,同時增加了新的成員變量增加了新的成員變量school大外軟件學(xué)院繼承的目的類之間的繼承關(guān)系是現(xiàn)實世界中遺傳關(guān)系的直類之間的繼承關(guān)系是現(xiàn)實世界中遺傳關(guān)系的直接模擬,它表示類之間的內(nèi)在聯(lián)系以及對屬性接模擬,它表示類之間的內(nèi)在聯(lián)系以及對屬性和行為的共享:和行為的共享:子類可以沿用父類的某些特征。子類可以沿用父類的某些特征。子
6、類也可以具有自己獨立的屬性和操作。子類也可以具有自己獨立的屬性和操作。通過繼承可以更有效地組織程序結(jié)構(gòu),通過繼承可以更有效地組織程序結(jié)構(gòu),利用已利用已有的類來完成更復(fù)雜的新類的設(shè)計與開發(fā)有的類來完成更復(fù)雜的新類的設(shè)計與開發(fā),充,充分實現(xiàn)代碼重用。分實現(xiàn)代碼重用。大外軟件學(xué)院子類 extendsextends實現(xiàn)實現(xiàn)繼承關(guān)系繼承關(guān)系 子類繼承父子類繼承父類的成員變類的成員變量和方法量和方法 子類是否子類是否可以繼承可以繼承父類的全父類的全部成員?部成員?大外軟件學(xué)院子類的繼承性(1) 當子類和父類當子類和父類在同一個包在同一個包中,子類繼承父類中中,子類繼承父類中不是不是privatepriva
7、te修飾的變量和方法修飾的變量和方法 繼承的成員變量和方法的訪問權(quán)限不變。繼承的成員變量和方法的訪問權(quán)限不變。大外軟件學(xué)院子類的繼承性(2) 當子類父類當子類父類不在同一個包不在同一個包中,子類繼承父類的中,子類繼承父類的受保護受保護(protected)(protected)成員和公有成員和公有(public)(public)成員,成員,不能繼承不能繼承友好成員友好成員和私有成員和私有成員privateprivate大外軟件學(xué)院子類的繼承性(3) protectedprotected的補充說明:的補充說明: D D類中創(chuàng)建一個類中創(chuàng)建一個D D類的對象,能夠訪問成員變量類的對象,能夠訪問成員
8、變量x x和和y y; OtherOther類中創(chuàng)建一個類中創(chuàng)建一個D D類的對象:類的對象: 和和D D類同一個包:能夠訪問類同一個包:能夠訪問D D類中定義的受保護的成員類中定義的受保護的成員y y 和和A A類同一個包:能夠訪問類同一個包:能夠訪問D D類中繼承的受保護的成員類中繼承的受保護的成員x xOther D d = new D();同一個包同一個包A protected int xBD protected int yc大外軟件學(xué)院訪問權(quán)限練習(xí) 要求設(shè)計一個類,它擁有一個特殊的成員變量,要求設(shè)計一個類,它擁有一個特殊的成員變量,該成員變量必須能夠被該類的子類訪問到,但是該成員變量
9、必須能夠被該類的子類訪問到,但是不能被不在同一個包內(nèi)的其他類訪問到。下面哪不能被不在同一個包內(nèi)的其他類訪問到。下面哪個設(shè)計可以滿足上述要求?個設(shè)計可以滿足上述要求?A. 用public 修飾該成員變量B. 用private修飾該成員變量C. 用protected修飾該成員變量D. 不需要任何訪問權(quán)限修飾該成員變量C C大外軟件學(xué)院訪問權(quán)限練習(xí) 假設(shè)在假設(shè)在JavaJava源文件源文件MyClass.javaMyClass.java中只包含一中只包含一個類,而且這個類必須能夠被位于一個龐大的個類,而且這個類必須能夠被位于一個龐大的軟件系統(tǒng)中的所有軟件系統(tǒng)中的所有JavaJava類訪問到,那么下面
10、哪類訪問到,那么下面哪些聲明有可能符合要求?些聲明有可能符合要求?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é)院【例例】 子類繼承父類的成員方法子類繼承父類的成員方法源程序Person.java中定義類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); /受保護的數(shù)據(jù)成員受保護的數(shù)據(jù)成員 /友好成員方法友好成員方法 /公有成員方法公有成員方法大外軟件學(xué)院【例例】 子類繼承父類的成員方法子類繼承父類的成員方法 Student繼承父類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(); 繼承父類數(shù)據(jù)成員繼承父類數(shù)據(jù)成員age、name成員方法:成員方法:setdata()、print()/調(diào)用父類的成員方法調(diào)用父類的成員方法/訪問本類的成員變量訪問本類的成員變量存在兩個問題:存在兩個問題:1. s1.setdata( )無法為
13、子類的無法為子類的school賦值賦值改進方法是創(chuàng)建構(gòu)造方法改進方法是創(chuàng)建構(gòu)造方法2. s1.print()無法輸出的無法輸出的school的值的值改進方法是重新定義改進方法是重新定義print方法,方法,稱之為稱之為方法的重寫方法的重寫大外軟件學(xué)院成員變量的隱藏和方法的重寫(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( 喵喵喵喵 );); 隱藏:隱藏:子類中定義的子類中定義的成員變量和父類中的成員變量和父類中的成員變量重名成員變量重名 重寫:重寫:子類中定義的子類中定義的方法和父類中方法的方法和父類中方法的名字、返回值類型、名字、返回值類型、形式參數(shù)的個數(shù)及類形式參數(shù)的個數(shù)及類型必須完全相同型必須完全相同 重寫發(fā)生在父子之間重寫發(fā)生在父子之間大外軟件學(xué)院成員變量的隱藏和方法的重寫(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é)院成員變量的隱藏和方法的重寫(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); 若父類與子類同若父類與子類同名方法的形參不名方法的形參不同,則視為重載同,則視為重載10.024.0大外軟件學(xué)院成員變量的隱藏和方法的重寫(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); ); 編譯錯誤!編譯錯誤!若父類與子類同若父類與子類同名方法的形參相名方法的形參相同,而返回類型同,而返回類型不同,編譯出錯不同,編譯出錯大外軟件學(xué)院成員變量的隱藏和方法的重寫(5) 重寫父類的方法時,不能降低方法的訪問權(quán)限重寫父類的方法時,不能降低方法的訪問權(quán)限合法合法非法非法大外軟件學(xué)院成員變量的隱藏和方法的重寫(6) 子類的實例方
20、法不能重寫父類的靜態(tài)方法子類的實例方法不能重寫父類的靜態(tài)方法合法合法非法非法大外軟件學(xué)院成員變量的隱藏和方法的重寫(7) 子類的靜態(tài)方法不能重寫父類的實例方法子類的靜態(tài)方法不能重寫父類的實例方法合法合法非法非法大外軟件學(xué)院小結(jié):子類的三種成員:子類的三種成員:繼承父類的成員變量和成員方法;繼承父類的成員變量和成員方法;增加新的成員變量和成員方法;增加新的成員變量和成員方法;隱藏父類的成員變量,重寫(或重載)父隱藏父類的成員變量,重寫(或重載)父類的成員方法類的成員方法大外軟件學(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)語法錯誤語法錯誤大外軟件學(xué)院課堂練習(xí)class BaseClas
23、sprivate float x = 1.0f;protected float getVar()return x;class SubClass extends BaseClassprivate float x = 2.0f;/此處插入代碼下面哪些方法是對父類方法的有效覆蓋(或重寫)?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修飾的方法不能被重寫修飾的方法不能被重寫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修飾的類不能被繼承修飾的類不能被繼承 出于安全考慮,某些類不能輕易被繼承或修改,因此必須定義出于安全考慮,某些類不能輕易被繼承或修改,因此必須定義為為fianlfianl類,例如:類,例如:StringString類類大外軟件學(xué)院final課堂練習(xí) 下面哪些方法能夠防止被重寫下面哪些方法能夠防止被重寫( (覆蓋覆蓋) )? 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)鍵字 如果在子類中子類中想使用被子類隱藏的成員變量或重寫的成員方法可以使用關(guān)鍵字superExample4_24.java大外軟件學(xué)院super關(guān)鍵字 子類沒有繼承父類的構(gòu)造方法。子類沒有繼承父類的構(gòu)造方法。 子類若想調(diào)用父類的構(gòu)造方法:子類若想調(diào)用父類的構(gòu)造方法: 必須在子類的構(gòu)造方法中使用必須在子類的構(gòu)造方法中使用 必須使用必須使用supersuper關(guān)鍵字表示:關(guān)
28、鍵字表示:super(super(參數(shù)列表參數(shù)列表) ) supersuper必須是子類構(gòu)造方法的頭一條語句必須是子類構(gòu)造方法的頭一條語句 若子類構(gòu)造方法沒有使用若子類構(gòu)造方法沒有使用supersuper語句:系統(tǒng)在子語句:系統(tǒng)在子類構(gòu)造方法的第一句,默認添加了一個類構(gòu)造方法的第一句,默認添加了一個super();super(); 為避免出錯,當父類中定義多個構(gòu)造方法時,為避免出錯,當父類中定義多個構(gòu)造方法時,其中應(yīng)當包含一個不帶參數(shù)的構(gòu)造方法其中應(yīng)當包含一個不帶參數(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é)院/父類定義帶參構(gòu)造方法父類定義帶參構(gòu)造方法/方法覆蓋方法覆蓋【例例】 子類構(gòu)造方法的定義子類構(gòu)造方法的定義/隱式地調(diào)用父類的無參構(gòu)造方法隱式地調(diào)用父類的無參構(gòu)造方法u說明:說明:由于超類由于超類AnimalAnimal已顯式定義了帶參數(shù)的已顯式定義了帶參數(shù)的 構(gòu)造方法,構(gòu)造方法,JavaJava運行時系統(tǒng)不會再自動運行時系統(tǒng)不會再自動 生成默認的無參數(shù)構(gòu)造方法;生成默認的無參數(shù)構(gòu)造方法;子類構(gòu)
31、造方法又隱式調(diào)用父類的無參數(shù)子類構(gòu)造方法又隱式調(diào)用父類的無參數(shù) 構(gòu)造方法,構(gòu)造方法,編譯時會出錯編譯時會出錯;問題在于超類沒有可供子類構(gòu)造方法問題在于超類沒有可供子類構(gòu)造方法 調(diào)用的無參數(shù)構(gòu)造方法調(diào)用的無參數(shù)構(gòu)造方法 Animal()Animal()大外軟件學(xué)院/父類定義帶參構(gòu)造方法父類定義帶參構(gòu)造方法/顯式地調(diào)用顯式地調(diào)用父父類的構(gòu)造方法類的構(gòu)造方法【例例】 子類構(gòu)造方法的定義子類構(gòu)造方法的定義1 1、修改說明:、修改說明:在子類構(gòu)造方法第一條語句顯式在子類構(gòu)造方法第一條語句顯式加上對父類構(gòu)造方法的調(diào)用加上對父類構(gòu)造方法的調(diào)用大外軟件學(xué)院/注釋掉注釋掉超類定義帶參構(gòu)造方法超類定義帶參構(gòu)造方法
32、/隱式地調(diào)用超類的無參構(gòu)造方法隱式地調(diào)用超類的無參構(gòu)造方法【例例】 子類構(gòu)造方法的定義子類構(gòu)造方法的定義2 2、修改說明、修改說明:在父類在父類AnimalAnimal中去掉帶參構(gòu)造中去掉帶參構(gòu)造方法的定義,這時方法的定義,這時系統(tǒng)會自動系統(tǒng)會自動生成生成無參數(shù)的構(gòu)造方法;無參數(shù)的構(gòu)造方法; 大外軟件學(xué)院/超類定義帶參構(gòu)造方法超類定義帶參構(gòu)造方法/隱式地調(diào)用超類的無參構(gòu)造方法隱式地調(diào)用超類的無參構(gòu)造方法/方法覆蓋方法覆蓋【例例】 子類構(gòu)造方法的定義子類構(gòu)造方法的定義3 3、修改說明:、修改說明:在超類添加一個無參的構(gòu)造方法在超類添加一個無參的構(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í)添加哪句可以使實例引用添加哪句可以使實例引用a a訪問訪問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();/添加語句處(A) a. mb_method(); (B) a.super.mb_method(); (C) a.super.super.mb_method(); (D)以上都不對D大外軟件學(xué)院對象的上轉(zhuǎn)型對象 如果如果動物動物(Animal)(Animal)是是老虎老虎(Tiger)(Tiger)的父類,則我們的父類,則我們可以說可以說“老虎是動物老虎是動物”,但不能說,但不能說“動物是老動物是老虎虎”; 當說當說“老虎是動物老虎是動物”時,老虎將失去其所獨有的時,老虎將失去其所獨有的屬性和功能;屬性和功能; 如果如果人人(Person)(Person)是是
36、學(xué)生學(xué)生(Student)(Student)的父類,則我們的父類,則我們可以說可以說“學(xué)生是人學(xué)生是人”,但不能說,但不能說“人是學(xué)生人是學(xué)生”; 當說當說“學(xué)生是人學(xué)生是人”時,學(xué)生將失去其所獨有的屬時,學(xué)生將失去其所獨有的屬性和功能;性和功能; 結(jié)論:子類的對象也是父類的對象,反之不成立結(jié)論:子類的對象也是父類的對象,反之不成立 上轉(zhuǎn)型:上轉(zhuǎn)型:將子類對象的引用賦值給父類的對象將子類對象的引用賦值給父類的對象有機物為食有機物為食, ,能感覺能感覺, ,有神經(jīng)有神經(jīng), ,可運動可運動有姓名、年齡和性別,有姓名、年齡和性別,能吃飯,睡覺和思考能吃飯,睡覺和思考大外軟件學(xué)院對象的上轉(zhuǎn)型對象 上轉(zhuǎn)
37、型:傳給父類對象一個子類對象上轉(zhuǎn)型:傳給父類對象一個子類對象AnimalTigerAnimal a;a = new Tiger();Animal a;Tiger t = new Tiger();a = t;稱稱a a是子類對象是子類對象t t的上轉(zhuǎn)型對象的上轉(zhuǎn)型對象對象新增的變量新增的方法繼承的變量繼承的方法對象的上轉(zhuǎn)型對象賦值給賦值給父類對象父類對象隱藏前隱藏前重寫后重寫后大外軟件學(xué)院對象的上轉(zhuǎn)型對象(2)class class 類人猿 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 類人猿 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) 類人猿類人猿 monkey1 =
40、new monkey1 = new 類人猿類人猿();();/父類創(chuàng)建的對象父類創(chuàng)建的對象People p1 = new People();People p1 = new People();/子類創(chuàng)建的對象子類創(chuàng)建的對象類人猿 monkey2monkey2 = p1; = p1; /子類的上轉(zhuǎn)型對象子類的上轉(zhuǎn)型對象 大外軟件學(xué)院對象的上轉(zhuǎn)型對象(2) 父類創(chuàng)建的對象與子類上轉(zhuǎn)型對象之間的區(qū)別父類創(chuàng)建的對象與子類上轉(zhuǎn)型對象之間的區(qū)別 父類創(chuàng)建的對象和子類上轉(zhuǎn)型對象具有相同的成員變量父類創(chuàng)建的對象和子類上轉(zhuǎn)型對象具有相同的成員變量 如果某方法在子類中被重寫,則子類上轉(zhuǎn)型對象的該方法如果某方法在子類
41、中被重寫,則子類上轉(zhuǎn)型對象的該方法是重寫后的方法,這是父類創(chuàng)建的對象和子類上轉(zhuǎn)型對象是重寫后的方法,這是父類創(chuàng)建的對象和子類上轉(zhuǎn)型對象之間唯一的差別之間唯一的差別 monkey1(monkey1(父類創(chuàng)建的對象父類創(chuàng)建的對象) ) 成員變量:成員變量: int n;(int n;(私有私有) ) int age;int age; 成員方法:成員方法: crySpeak(String s);crySpeak(String s); sleep();sleep(); monkey2(monkey2(子類上轉(zhuǎn)型對象子類上轉(zhuǎn)型對象) ) 成員變量:成員變量: int n;int n;(私有)(私有) i
42、nt age;int age; 成員方法:成員方法: crySpeak(String s);crySpeak(String s); sleep();sleep();class class 類人猿 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 類人猿 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(子類創(chuàng)建的對象子類創(chuàng)建的對象) ) 成員變量:成員變量: 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é)院對象的上轉(zhuǎn)型對象(2)class class 類人猿 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();類人猿 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 類人猿 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é)院對象的上轉(zhuǎn)型對象(2) 可以將對象的上轉(zhuǎn)型對象再強制轉(zhuǎn)換為子類對象,可以將對象的上轉(zhuǎn)型對象再強制轉(zhuǎn)換為子類對象,此時該對象又具備子類的所有屬性和方法。此時該對象又具備子類的所有屬性和方法。 People p1 = new People();People p1 = new People(); 類人猿類人猿 monkey = p1; monkey = p1; People p2 = (People)monkey;People p
49、2 = (People)monkey; / /下轉(zhuǎn)型下轉(zhuǎn)型 對象可以向下轉(zhuǎn)型而不出錯的充要條件是:該對象對象可以向下轉(zhuǎn)型而不出錯的充要條件是:該對象是由向上轉(zhuǎn)型而來的是由向上轉(zhuǎn)型而來的( (不能將父類創(chuàng)建的對象賦值不能將父類創(chuàng)建的對象賦值給子類對象給子類對象) ) 類人猿類人猿 monkey = new monkey = new 類人猿類人猿();(); People p2 = monkey;People p2 = monkey;/下轉(zhuǎn)型非法,編譯時出錯下轉(zhuǎn)型非法,編譯時出錯 People p2 = (People)monkey;People p2 = (People)monkey;/非法,運
50、行時出錯非法,運行時出錯= new People();= new People();大外軟件學(xué)院對象的上轉(zhuǎn)型對象(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();/重寫后的方法重寫后的方法 i.play2();/繼承的方法繼承的方法 System.out.println(i.label); 隱藏前的父類成員變量隱藏前的父類成員變量大外軟件學(xué)院對象的上轉(zhuǎn)型對象(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();/重寫后的方法重寫后的方法 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)無法編譯無法編譯 (B)(B)可以編譯,但是運行出錯可以編譯,但是運行出錯 (C)(C)可以編譯,可以運行可以編譯,可以運行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)無法編譯 (B)可以編譯,但是運行出錯 (C) 可以編譯,可以運行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)無法編譯無法編譯 (B)(B)可以編譯,但是運行出錯可以編譯,但是運行出錯 (C)
56、(C)可以編譯,可以運行可以編譯,可以運行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)無法編譯無法編譯 (B)(B)可以編譯,但是運行出錯可以編譯,但是運行出錯 (C)(C)可以編譯,可以運行可以編譯,可以運行C大外軟件學(xué)
57、院課堂練習(xí)添加哪一個會導(dǎo)致程序輸出添加哪一個會導(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() );運行報錯運行報錯大外軟件學(xué)院多態(tài) 定義:定義:程序中多個名字相同的方法共存的現(xiàn)象,程序中多個名字相同的方法共存的現(xiàn)象,多態(tài)是面向?qū)ο蟪绦蛟O(shè)計的核心特性;多態(tài)是面向?qū)ο蟪绦蛟O(shè)計的核心特性; 優(yōu)點:優(yōu)點:提提高了程序的抽象性,突出高了程序的抽象性,突出JavaJava語言的繼語言的繼承性承性 分類:分類: 重載:重載:一個類中存在多個同名方法一個類中存在多個同名方法 方法名字相同,形式參數(shù)方法名字相同,形式參數(shù)( (類型或個數(shù)類型或個數(shù)) )不同不同 與返回值類型是否相同沒關(guān)系與返回值類型是否相同沒關(guān)系 重寫:重寫:子類覆蓋父類的同名方法子類覆蓋父類的同名方法
60、 返回值類型、方法名字和形式參數(shù)必須全都相同返回值類型、方法名字和形式參數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車制造業(yè)2025年供應(yīng)鏈風險管理數(shù)字化解決方案報告
- 2025屆廣東省梅州市梅江實驗中學(xué)英語八年級第二學(xué)期期末質(zhì)量檢測模擬試題含答案
- 2025年元宇宙社交平臺虛擬現(xiàn)實社交平臺運營模式研究報告
- 城市污水處理廠智能化升級改造中的智能化水質(zhì)處理技術(shù)研究報告
- 2025年醫(yī)院電子病歷系統(tǒng)在醫(yī)院信息化建設(shè)中的邊緣計算應(yīng)用報告
- 2025年醫(yī)藥行業(yè)未來趨勢:仿制藥一致性評價下的醫(yī)藥電商發(fā)展報告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)與企業(yè)核心競爭力提升報告
- 能源行業(yè)2025年儲能技術(shù)多元化儲能電池材料研發(fā)與創(chuàng)新報告
- 禮儀培訓(xùn)課件標題
- 安全轉(zhuǎn)運試題及答案
- 七年級下冊英語語法填空專項訓(xùn)練100題含答案5篇
- 衛(wèi)生院“服務(wù)基層行”支撐材料(3.7放射防護管理)
- 2024年xx中學(xué)學(xué)生校服選用采購實施方案
- 英語閱讀5篇(難度較高)
- 煤礦防滅火細則
- DL∕T 2622-2023 1000kV高壓并聯(lián)電抗器局部放電現(xiàn)場測量技術(shù)導(dǎo)則
- 農(nóng)村社區(qū)基礎(chǔ)設(shè)施和公共服務(wù)建設(shè)項目可行性研究報告
- ISO9001-ISO14001-ISO45001三體系內(nèi)部審核檢查表
- JT-T-1270.3-2019公路橋梁梳齒板伸縮裝置第3部分:整體錨固式伸縮裝置
- 【8物(人教版)】淮北市二中聯(lián)考2023-2024學(xué)年八年級下學(xué)期期末考試物理試題
- 2024年05月山東濰坊市中心血站招考聘用3人筆試歷年高頻考點(難、易錯點)附帶答案詳解
評論
0/150
提交評論