




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、大外軟件學院繼承與多態(tài)計算機教研室大外軟件學院主要內(nèi)容 類的繼承類的繼承 父類子類父類子類 方法的覆蓋方法的覆蓋 finalfinal關鍵字關鍵字 對象的上轉型對象的上轉型 多態(tài)多態(tài) abstractabstract類和方法類和方法 supersuper關鍵字關鍵字 接口接口大外軟件學院類的繼承繼承繼承是一種由是一種由已有類已有類創(chuàng)建創(chuàng)建新類新類的機制,是面向對象的機制,是面向對象程序設計的核心特點和重要方法。程序設計的核心特點和重要方法。先創(chuàng)建一個具有共有屬性的一般類(父類)先創(chuàng)建一個具有共有屬性的一般類(父類)再根據(jù)一般類創(chuàng)建具有特殊屬性的新類,新類繼承一般再根據(jù)一般類創(chuàng)建具有特殊屬性的新
2、類,新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增加他自己的新的狀態(tài)和類的狀態(tài)和行為,并根據(jù)需要增加他自己的新的狀態(tài)和行為(子類)行為(子類)由繼承而得到的類稱為子類,被繼承的類稱為父類由繼承而得到的類稱為子類,被繼承的類稱為父類( (超類超類) )JavaJava只支持單一繼承,即一個類只能有一個父類只支持單一繼承,即一個類只能有一個父類JavaJava支持多層繼承支持多層繼承大外軟件學院子類 在在JavaJava類的聲明中,使用關鍵字類的聲明中,使用關鍵字extendsextends實現(xiàn)繼承。實現(xiàn)繼承。由已有的父類派生新的子類,格式如下:由已有的父類派生新的子類,格式如下:class class
3、 extends extends 子類類體;子類類體; 例如:例如:注:注:ObjectObject類類是是java.langjava.lang包中的一個類:如果一個類的聲包中的一個類:如果一個類的聲明中沒有使用明中沒有使用extendsextends關鍵字,該類就被系統(tǒng)默認為是關鍵字,該類就被系統(tǒng)默認為是ObObjectject類的直接子類。類的直接子類。大外軟件學院ObjectObject類中常用的方法類中常用的方法 1. public final Class getClass( )2. public boolean equals (Object obj) 3. public String
4、 toString() 4. public int hashCode()大外軟件學院【例例】子類繼承父類的成員變量子類繼承父類的成員變量 源程序Person1.java中定義類Person與Student,程序如下public class Person String name; /姓名姓名 int age; /年齡年齡class Student String name; /姓名姓名 int age; /年齡年齡 String school; /學校學校這樣的定義有大量的重復,利這樣的定義有大量的重復,利用繼承原則,重新定義這兩個類用繼承原則,重新定義這兩個類public class Perso
5、n String name; /姓名姓名 int age; /年齡年齡class Student extends Person String school; /學校學校利用繼承原則:子類從父類繼承了利用繼承原則:子類從父類繼承了非私有成員變量非私有成員變量name、age,同時,同時增加了新的成員變量增加了新的成員變量school大外軟件學院繼承的目的類之間的繼承關系是現(xiàn)實世界中遺傳關系的直類之間的繼承關系是現(xiàn)實世界中遺傳關系的直接模擬,它表示類之間的內(nèi)在聯(lián)系以及對屬性接模擬,它表示類之間的內(nèi)在聯(lián)系以及對屬性和行為的共享:和行為的共享:子類可以沿用父類的某些特征。子類可以沿用父類的某些特征。子
6、類也可以具有自己獨立的屬性和操作。子類也可以具有自己獨立的屬性和操作。通過繼承可以更有效地組織程序結構,通過繼承可以更有效地組織程序結構,利用已利用已有的類來完成更復雜的新類的設計與開發(fā)有的類來完成更復雜的新類的設計與開發(fā),充,充分實現(xiàn)代碼重用。分實現(xiàn)代碼重用。大外軟件學院子類 extendsextends實現(xiàn)實現(xiàn)繼承關系繼承關系 子類繼承父子類繼承父類的成員變類的成員變量和方法量和方法 子類是否子類是否可以繼承可以繼承父類的全父類的全部成員?部成員?大外軟件學院子類的繼承性(1) 當子類和父類當子類和父類在同一個包在同一個包中,子類繼承父類中中,子類繼承父類中不是不是privatepriva
7、te修飾的變量和方法修飾的變量和方法 繼承的成員變量和方法的訪問權限不變。繼承的成員變量和方法的訪問權限不變。大外軟件學院子類的繼承性(2) 當子類父類當子類父類不在同一個包不在同一個包中,子類繼承父類的中,子類繼承父類的受保護受保護(protected)(protected)成員和公有成員和公有(public)(public)成員,成員,不能繼承不能繼承友好成員友好成員和私有成員和私有成員privateprivate大外軟件學院子類的繼承性(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大外軟件學院訪問權限練習 要求設計一個類,它擁有一個特殊的成員變量,要求設計一個類,它擁有一個特殊的成員變量,該成員變量必須能夠被該類的子類訪問到,但是該成員變量
9、必須能夠被該類的子類訪問到,但是不能被不在同一個包內(nèi)的其他類訪問到。下面哪不能被不在同一個包內(nèi)的其他類訪問到。下面哪個設計可以滿足上述要求?個設計可以滿足上述要求?A. 用public 修飾該成員變量B. 用private修飾該成員變量C. 用protected修飾該成員變量D. 不需要任何訪問權限修飾該成員變量C C大外軟件學院訪問權限練習 假設在假設在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大外軟件學院【例例】 子類繼承父類的成員方法子類繼承父類的成員方法源程序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ù)成員 /友好成員方法友好成員方法 /公有成員方法公有成員方法大外軟件學院【例例】 子類繼承父類的成員方法子類繼承父類的成員方法 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)建構造方法改進方法是創(chuàng)建構造方法2. s1.print()無法輸出的無法輸出的school的值的值改進方法是重新定義改進方法是重新定義print方法,方法,稱之為稱之為方法的重寫方法的重寫大外軟件學院成員變量的隱藏和方法的重寫(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ā)生在父子之間大外軟件學院成員變量的隱藏和方法的重寫(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大外軟件學院成員變量的隱藏和方法的重寫(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大外軟件學院成員變量的隱藏和方法的重寫(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); ); 編譯錯誤!編譯錯誤!若父類與子類同若父類與子類同名方法的形參相名方法的形參相同,而返回類型同,而返回類型不同,編譯出錯不同,編譯出錯大外軟件學院成員變量的隱藏和方法的重寫(5) 重寫父類的方法時,不能降低方法的訪問權限重寫父類的方法時,不能降低方法的訪問權限合法合法非法非法大外軟件學院成員變量的隱藏和方法的重寫(6) 子類的實例方
20、法不能重寫父類的靜態(tài)方法子類的實例方法不能重寫父類的靜態(tài)方法合法合法非法非法大外軟件學院成員變量的隱藏和方法的重寫(7) 子類的靜態(tài)方法不能重寫父類的實例方法子類的靜態(tài)方法不能重寫父類的實例方法合法合法非法非法大外軟件學院小結:子類的三種成員:子類的三種成員:繼承父類的成員變量和成員方法;繼承父類的成員變量和成員方法;增加新的成員變量和成員方法;增加新的成員變量和成員方法;隱藏父類的成員變量,重寫(或重載)父隱藏父類的成員變量,重寫(或重載)父類的成員方法類的成員方法大外軟件學院課堂練習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大外軟件學院課堂練習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大外軟件學院課堂練習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)語法錯誤語法錯誤大外軟件學院課堂練習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大外軟件學院final關鍵字 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); 大外軟件學院final關鍵字 finalfinal修飾的類不能被繼承修飾的類不能被繼承 出于安全考慮,某些類不能輕易被繼承或修改,因此必須定義出于安全考慮,某些類不能輕易被繼承或修改,因此必須定義為為fianlfianl類,例如:類,例如:StringString類類大外軟件學院final課堂練習 下面哪些方法能夠防止被重寫下面哪些方法能夠防止被重寫( (覆蓋覆蓋) )? 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大外軟件學院super關鍵字 如果在子類中子類中想使用被子類隱藏的成員變量或重寫的成員方法可以使用關鍵字superExample4_24.java大外軟件學院super關鍵字 子類沒有繼承父類的構造方法。子類沒有繼承父類的構造方法。 子類若想調(diào)用父類的構造方法:子類若想調(diào)用父類的構造方法: 必須在子類的構造方法中使用必須在子類的構造方法中使用 必須使用必須使用supersuper關鍵字表示:關
28、鍵字表示:super(super(參數(shù)列表參數(shù)列表) ) supersuper必須是子類構造方法的頭一條語句必須是子類構造方法的頭一條語句 若子類構造方法沒有使用若子類構造方法沒有使用supersuper語句:系統(tǒng)在子語句:系統(tǒng)在子類構造方法的第一句,默認添加了一個類構造方法的第一句,默認添加了一個super();super(); 為避免出錯,當父類中定義多個構造方法時,為避免出錯,當父類中定義多個構造方法時,其中應當包含一個不帶參數(shù)的構造方法其中應當包含一個不帶參數(shù)的構造方法Example4_23.java大外軟件學院課堂練習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大外軟件學院課堂練習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大外軟件學院/父類定義帶參構造方法父類定義帶參構造方法/方法覆蓋方法覆蓋【例例】 子類構造方法的定義子類構造方法的定義/隱式地調(diào)用父類的無參構造方法隱式地調(diào)用父類的無參構造方法u說明:說明:由于超類由于超類AnimalAnimal已顯式定義了帶參數(shù)的已顯式定義了帶參數(shù)的 構造方法,構造方法,JavaJava運行時系統(tǒng)不會再自動運行時系統(tǒng)不會再自動 生成默認的無參數(shù)構造方法;生成默認的無參數(shù)構造方法;子類構
31、造方法又隱式調(diào)用父類的無參數(shù)子類構造方法又隱式調(diào)用父類的無參數(shù) 構造方法,構造方法,編譯時會出錯編譯時會出錯;問題在于超類沒有可供子類構造方法問題在于超類沒有可供子類構造方法 調(diào)用的無參數(shù)構造方法調(diào)用的無參數(shù)構造方法 Animal()Animal()大外軟件學院/父類定義帶參構造方法父類定義帶參構造方法/顯式地調(diào)用顯式地調(diào)用父父類的構造方法類的構造方法【例例】 子類構造方法的定義子類構造方法的定義1 1、修改說明:、修改說明:在子類構造方法第一條語句顯式在子類構造方法第一條語句顯式加上對父類構造方法的調(diào)用加上對父類構造方法的調(diào)用大外軟件學院/注釋掉注釋掉超類定義帶參構造方法超類定義帶參構造方法
32、/隱式地調(diào)用超類的無參構造方法隱式地調(diào)用超類的無參構造方法【例例】 子類構造方法的定義子類構造方法的定義2 2、修改說明、修改說明:在父類在父類AnimalAnimal中去掉帶參構造中去掉帶參構造方法的定義,這時方法的定義,這時系統(tǒng)會自動系統(tǒng)會自動生成生成無參數(shù)的構造方法;無參數(shù)的構造方法; 大外軟件學院/超類定義帶參構造方法超類定義帶參構造方法/隱式地調(diào)用超類的無參構造方法隱式地調(diào)用超類的無參構造方法/方法覆蓋方法覆蓋【例例】 子類構造方法的定義子類構造方法的定義3 3、修改說明:、修改說明:在超類添加一個無參的構造方法在超類添加一個無參的構造方法, , 程序體為空程序體為空大外軟件學院課堂
33、練習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?大外軟件學院課堂練習添加哪句可以使實例引用添加哪句可以使實例引用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大外軟件學院對象的上轉型對象 如果如果動物動物(Animal)(Animal)是是老虎老虎(Tiger)(Tiger)的父類,則我們的父類,則我們可以說可以說“老虎是動物老虎是動物”,但不能說,但不能說“動物是老動物是老虎虎”; 當說當說“老虎是動物老虎是動物”時,老虎將失去其所獨有的時,老虎將失去其所獨有的屬性和功能;屬性和功能; 如果如果人人(Person)(Person)是是
36、學生學生(Student)(Student)的父類,則我們的父類,則我們可以說可以說“學生是人學生是人”,但不能說,但不能說“人是學生人是學生”; 當說當說“學生是人學生是人”時,學生將失去其所獨有的屬時,學生將失去其所獨有的屬性和功能;性和功能; 結論:子類的對象也是父類的對象,反之不成立結論:子類的對象也是父類的對象,反之不成立 上轉型:上轉型:將子類對象的引用賦值給父類的對象將子類對象的引用賦值給父類的對象有機物為食有機物為食, ,能感覺能感覺, ,有神經(jīng)有神經(jīng), ,可運動可運動有姓名、年齡和性別,有姓名、年齡和性別,能吃飯,睡覺和思考能吃飯,睡覺和思考大外軟件學院對象的上轉型對象 上轉
37、型:傳給父類對象一個子類對象上轉型:傳給父類對象一個子類對象AnimalTigerAnimal a;a = new Tiger();Animal a;Tiger t = new Tiger();a = t;稱稱a a是子類對象是子類對象t t的上轉型對象的上轉型對象對象新增的變量新增的方法繼承的變量繼承的方法對象的上轉型對象賦值給賦值給父類對象父類對象隱藏前隱藏前重寫后重寫后大外軟件學院對象的上轉型對象(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; /子類的上轉型對象子類的上轉型對象 大外軟件學院對象的上轉型對象(2) 父類創(chuàng)建的對象與子類上轉型對象之間的區(qū)別父類創(chuàng)建的對象與子類上轉型對象之間的區(qū)別 父類創(chuàng)建的對象和子類上轉型對象具有相同的成員變量父類創(chuàng)建的對象和子類上轉型對象具有相同的成員變量 如果某方法在子類中被重寫,則子類上轉型對象的該方法如果某方法在子類
41、中被重寫,則子類上轉型對象的該方法是重寫后的方法,這是父類創(chuàng)建的對象和子類上轉型對象是重寫后的方法,這是父類創(chuàng)建的對象和子類上轉型對象之間唯一的差別之間唯一的差別 monkey1(monkey1(父類創(chuàng)建的對象父類創(chuàng)建的對象) ) 成員變量:成員變量: int n;(int n;(私有私有) ) int age;int age; 成員方法:成員方法: crySpeak(String s);crySpeak(String s); sleep();sleep(); monkey2(monkey2(子類上轉型對象子類上轉型對象) ) 成員變量:成員變量: 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);大外軟件學院對象的上轉型對象(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); 大外軟件學院對象的上轉型對象(2) 可以將對象的上轉型對象再強制轉換為子類對象,可以將對象的上轉型對象再強制轉換為子類對象,此時該對象又具備子類的所有屬性和方法。此時該對象又具備子類的所有屬性和方法。 People p1 = new People();People p1 = new People(); 類人猿類人猿 monkey = p1; monkey = p1; People p2 = (People)monkey;People p
49、2 = (People)monkey; / /下轉型下轉型 對象可以向下轉型而不出錯的充要條件是:該對象對象可以向下轉型而不出錯的充要條件是:該對象是由向上轉型而來的是由向上轉型而來的( (不能將父類創(chuàng)建的對象賦值不能將父類創(chuàng)建的對象賦值給子類對象給子類對象) ) 類人猿類人猿 monkey = new monkey = new 類人猿類人猿();(); People p2 = monkey;People p2 = monkey;/下轉型非法,編譯時出錯下轉型非法,編譯時出錯 People p2 = (People)monkey;People p2 = (People)monkey;/非法,運
50、行時出錯非法,運行時出錯= new People();= new People();大外軟件學院對象的上轉型對象(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); 隱藏前的父類成員變量隱藏前的父類成員變量大外軟件學院對象的上轉型對象(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); 非法非法大外軟件學院課堂練習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大外軟件學院課堂練習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大外軟件學院課堂練習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大外軟件學院課堂練習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大外軟件學
57、院課堂練習添加哪一個會導致程序輸出添加哪一個會導致程序輸出“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大外軟件學院課堂練習下面程序輸出結果:下面程序輸出結果: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() );運行報錯運行報錯大外軟件學院多態(tài) 定義:定義:程序中多個名字相同的方法共存的現(xiàn)象,程序中多個名字相同的方法共存的現(xiàn)象,多態(tài)是面向對象程序設計的核心特性;多態(tài)是面向對象程序設計的核心特性; 優(yōu)點:優(yōu)點:提提高了程序的抽象性,突出高了程序的抽象性,突出JavaJava語言的繼語言的繼承性承性 分類:分類: 重載:重載:一個類中存在多個同名方法一個類中存在多個同名方法 方法名字相同,形式參數(shù)方法名字相同,形式參數(shù)( (類型或個數(shù)類型或個數(shù)) )不同不同 與返回值類型是否相同沒關系與返回值類型是否相同沒關系 重寫:重寫:子類覆蓋父類的同名方法子類覆蓋父類的同名方法
60、 返回值類型、方法名字和形式參數(shù)必須全都相同返回值類型、方法名字和形式參數(shù)必須全都相同大外軟件學院多態(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年綠色出行的新能源汽車試題及答案
- 減數(shù)分裂試題及答案
- 專升本哲學考試題及答案
- 樂理考試曲式表現(xiàn)形式試題及答案
- 國際商務英語的核心知識試題及答案
- 中國衣帽柜行業(yè)市場發(fā)展現(xiàn)狀及前景趨勢與投資分析研究報告2025-2028版
- 中國綠色蔬菜行業(yè)發(fā)展分析及市場競爭格局與發(fā)展前景預測研究報告2025-2028版
- 商務英語交際試題及答案
- 商務英語用戶需求挖掘能力試題及答案
- 中國直流蒸汽鍋爐行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告2025-2028版
- 開挖作業(yè)安全培訓課件
- 產(chǎn)房靜脈留置針護理
- 2024-2030年中國硅酸鈉行業(yè)發(fā)展策略分析與投資風險評估報告
- 【MOOC】藥物與健康-浙江大學 中國大學慕課MOOC答案
- 新增現(xiàn)澆樓板結構加固施工方案
- 2024年遼寧省第二屆職業(yè)技能大賽(健康照護賽項)理論參考試題庫(含答案)
- 初中主題班會《與不良的行為習慣告別》課件
- 北京工業(yè)大學《環(huán)境微生物學》2023-2024學年第一學期期末試卷
- 2024新版《藥品管理法》培訓課件
- 美術環(huán)保課件教學課件
- 更換閥門施工方案
評論
0/150
提交評論