面向?qū)ο蟾呒?jí)(04)-對象的多態(tài)性,以及對象多態(tài)性在抽象類和接口中的實(shí)際應(yīng)用_第1頁
面向?qū)ο蟾呒?jí)(04)-對象的多態(tài)性,以及對象多態(tài)性在抽象類和接口中的實(shí)際應(yīng)用_第2頁
面向?qū)ο蟾呒?jí)(04)-對象的多態(tài)性,以及對象多態(tài)性在抽象類和接口中的實(shí)際應(yīng)用_第3頁
面向?qū)ο蟾呒?jí)(04)-對象的多態(tài)性,以及對象多態(tài)性在抽象類和接口中的實(shí)際應(yīng)用_第4頁
面向?qū)ο蟾呒?jí)(04)-對象的多態(tài)性,以及對象多態(tài)性在抽象類和接口中的實(shí)際應(yīng)用_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、16. 面向?qū)ο蟾呒?jí)(04) 本季要點(diǎn):對象的都態(tài)性、instanceof關(guān)鍵字、Object類。本季為Java基礎(chǔ)中面向?qū)ο蟮闹匾患?,講解了對象的多態(tài)性,以及對 象多態(tài)性在抽象類和接口中的實(shí)際應(yīng)用。blog: 零基礎(chǔ)學(xué)JAVAJava SE面向?qū)ο蟛糠?16.面向?qū)ο蟾呒?jí)(04) 2009-01-15上季內(nèi)容回顧:1、final關(guān)鍵字 · 修飾類不能被繼承 · 修飾方法不能被覆寫 · 修飾的變量就是一個(gè)常量,全局常量(public static final) 2、抽象類和接口 · 抽象類:只包含一個(gè)抽

2、象方法的類,抽象方法只需聲明而不需要實(shí)現(xiàn),必須有子類 · 接口:只包含抽象方法和全局常量的類接口,也是必須有子類在實(shí)際中一個(gè)類很少會(huì)去繼承一個(gè)已經(jīng)完全實(shí)現(xiàn)好的類,基本上都是繼承抽象類和實(shí)現(xiàn)接口。本季主要知識(shí)點(diǎn):1、對象的多態(tài)性 2、instanceof關(guān)鍵字 3、Object類對象的多態(tài)性注意點(diǎn): 為了清楚的闡述出概念,現(xiàn)在先使用普通類的繼承關(guān)系。向上轉(zhuǎn)型:class A              

3、;  public void fun1()                                System.out.println("A類=>public void fun1()")

4、;                        public void fun2()                     &

5、#160;          /fun2方法調(diào)用的是fun1方法                    this.fun1();              &#

6、160;     class B extends A                /覆寫A類中的fun1()方法            public void fun1()    

7、;                            System.out.println("B類=>public void fun1()");          

8、60;             public void fun3()                                

9、;System.out.println("B類=>public void fun3()");                    public class Demo01             

10、0;  public static void main(String args)                                B b = new B();   &

11、#160;                A a = new A();                    b.fun1();       

12、0;            a.fun2();                    b.fun3();              

13、0; 對象多態(tài)性體現(xiàn)在對象相互轉(zhuǎn)型上面哈class A                public void fun1()                       &

14、#160;        System.out.println("A類=>public void fun1()");                        public void fun2() &

15、#160;                              /fun2方法調(diào)用的是fun1方法                &#

16、160;   this.fun1();                    class B extends A                /覆寫A類中的fun1()方法

17、60;           public void fun1()                                System.out.

18、println("B類=>public void fun1()");                        public void fun3()            

19、;                    System.out.println("B類=>public void fun3()");                  

20、60; public class Demo02                public static void main(String args)                   &

21、#160;            /聲明一個(gè)父類對象                    A a = null;             

22、       /new B()是子類對象向父類對象轉(zhuǎn)換                    a = new B();                

23、    a.fun1();                 現(xiàn)在我們來看下a.fun1()調(diào)用的是哪個(gè)類的方法哈class A                public void fun1()

24、60;                               System.out.println("A類=>public void fun1()");       &

25、#160;                public void fun2()                            

26、60;   /fun2方法調(diào)用的是fun1方法                    this.fun1();                    class 

27、;B extends A                /覆寫A類中的fun1()方法            public void fun1()           &

28、#160;                    System.out.println("B類=>public void fun1()");                  

29、;      public void fun3()                                System.out.println("B類=>public 

30、;void fun3()");                    public class Demo02                public static void&#

31、160;main(String args)                                /聲明一個(gè)父類對象             

32、       A a = null;                    /new B()是子類對象向父類對象轉(zhuǎn)換                 

33、   /子類對象向父類對象轉(zhuǎn)型之后,所調(diào)用的方法一定是被覆寫過的方法                    a = new B();                    

34、;a.fun1();                    a.fun2();                子類對象向父類對象轉(zhuǎn)型之后,所調(diào)用的方法一定是被覆寫過的方法,這就是對象的向上轉(zhuǎn)型哈向下轉(zhuǎn)型:class A 

35、               public void fun1()                              &#

36、160; System.out.println("A類=>public void fun1()");                        public void fun2()        &#

37、160;                       /fun2方法調(diào)用的是fun1方法                    this.fun1(); 

38、60;                  class B extends A                /覆寫A類中的fun1()方法       

39、0;    public void fun1()                                System.out.println("B類=>public void 

40、fun1()");                        public void fun3()                   

41、             System.out.println("B類=>public void fun3()");                    public class Demo03 

42、;               public static void main(String args)                          &#

43、160;     /聲明一個(gè)父類對象                    A a = null;                    /

44、new B()是子類對象向父類對象轉(zhuǎn)換                    /子類對象向父類對象轉(zhuǎn)型之后,所調(diào)用的方法一定是被覆寫過的方法                    a = n

45、ew B();                    a.fun1();                    a.fun2();     

46、               a.fun3();                現(xiàn)在我們來看下能否調(diào)用a.fun3()哈程序提示找不到fun3()方法,A類中沒有fun3()方法哈,如果我們一定要調(diào)用的話,我們就要使用向下轉(zhuǎn)型哈class A   &

47、#160;            public void fun1()                                Sys

48、tem.out.println("A類=>public void fun1()");                        public void fun2()          

49、60;                     /fun2方法調(diào)用的是fun1方法                    this.fun1();   

50、0;                class B extends A                /覆寫A類中的fun1()方法          

51、;  public void fun1()                                System.out.println("B類=>public void fun1()")

52、;                        public void fun3()                     &

53、#160;          System.out.println("B類=>public void fun3()");                    public class Demo03   

54、             public static void main(String args)                            

55、60;   /聲明一個(gè)父類對象                    A a = null;                    /new B()是子類對象向

56、父類對象轉(zhuǎn)換                    /子類對象向父類對象轉(zhuǎn)型之后,所調(diào)用的方法一定是被覆寫過的方法                    a = new B();&

57、#160;                   /可以進(jìn)行向下轉(zhuǎn)型,需要使用強(qiáng)制性手段哈                    B b = (B)a;     

58、               b.fun3();                驗(yàn)證下效果:這就是對象向下轉(zhuǎn)型哈觀察以下一種代碼,檢查下有沒問題哈:class A          

59、;      public void fun1()                                System.out.println("A類=>public 

60、;void fun1()");                        public void fun2()                 &

61、#160;              /fun2方法調(diào)用的是fun1方法                    this.fun1();          &#

62、160;         class B extends A                /現(xiàn)在我們不覆寫A類中的fun1()方法            public void 

63、funX()                                System.out.println("B類=>public void fun1()");     

64、0;                  public void fun3()                           

65、     System.out.println("B類=>public void fun3()");                    public class Demo04         

66、;       public static void main(String args)                                A a = new

67、 B();                    a.fun1();                程序找不到B類中被覆寫的fun1()方法,所以去查找父類A中的fun1()方法了哈class A  

68、              public void fun1()                               &#

69、160;System.out.println("A類=>public void fun1()");                        public void fun2()         &#

70、160;                      /fun2方法調(diào)用的是fun1方法                    this.fun1();  

71、60;                 class B extends A                /覆寫A類中的fun1()方法        

72、0;   public void fun1()                                System.out.println("B類=>public void fun1()

73、");                        public void fun3()                    

74、            System.out.println("B類=>public void fun3()");                    public class Demo04  

75、;              public static void main(String args)                           &#

76、160;    A a = new A();                    a.fun1();                現(xiàn)在對象實(shí)例化時(shí)沒有子類哈,所以a.fun1(

77、)調(diào)用的是父類A中本身的fun1()方法如果現(xiàn)在我們要調(diào)用fun3()方法呢?現(xiàn)在使用向下轉(zhuǎn)型可以嗎?class A                public void fun1()                   

78、;             System.out.println("A類=>public void fun1()");                        public

79、60;void fun2()                                /fun2方法調(diào)用的是fun1方法            

80、        this.fun1();                    class B extends A              

81、0; /覆寫A類中的fun1()方法            public void fun1()                             

82、60;  System.out.println("B類=>public void fun1()");                        public void fun3()       

83、60;                        System.out.println("B類=>public void fun3()");              &

84、#160;     public class Demo04                public static void main(String args)               

85、;                 A a = new A();                    /如果我們要調(diào)用fun3()方法呢?現(xiàn)在使用向下轉(zhuǎn)型可以嗎?     

86、60;              B b = (B)a;                    b.fun3();            &

87、#160;   這樣修改的話,我們看下有沒問題哈,驗(yàn)證一下,發(fā)現(xiàn)編譯時(shí)沒有錯(cuò)誤,但執(zhí)行時(shí)卻出現(xiàn)ClassCastException錯(cuò)誤了哈在程序開發(fā)中有兩大錯(cuò)誤是比較常見的: · NullPointerException:表示空指向異常,如果沒有開辟堆內(nèi)存空間,則出現(xiàn)此異常 · ClassCastException:表示類轉(zhuǎn)換異常,兩個(gè)不相關(guān)的類的對象進(jìn)行向下轉(zhuǎn)型操作。上面一個(gè)解釋比較難理解哈,我們光看A類的話,我們不能知道A類有什么子類哈,但是如果我們光看B類的話,我們可以看出B類是繼承A類的話,所以得

88、出了下面一個(gè)結(jié)論。結(jié)論: 在進(jìn)行向下轉(zhuǎn)型之前,兩個(gè)對象必然先發(fā)生向上轉(zhuǎn)型關(guān)系,這樣好建立起關(guān)系,否則兩個(gè)沒有關(guān)系的對象是不能相互轉(zhuǎn)型的。對象多態(tài)性到底有那些用處呢?如果不知道多態(tài)性的時(shí)候應(yīng)該使用以下的方式編寫代碼,利用方法的重載完成。class A                public void fun1()       

89、                         System.out.println("A類=>public void fun1()");             

90、0;          public void fun2()                                /fun2方法調(diào)用的是fun1方法&

91、#160;                   this.fun1();                    class B extends A   

92、;             /覆寫A類中的fun1()方法            public void fun1()                 

93、0;              System.out.println("B類=>public void fun1()");                        pu

94、blic void fun3()                                System.out.println("B類=>public void fun3()");  &#

95、160;                 class C extends A                /覆寫A類中的fun1()方法        

96、60;   public void fun1()                                System.out.println("C類=>public void fun1(

97、)");                        public void fun4()                    

98、;            System.out.println("C類=>public void fun4()");                    public class Demo05 

99、0;              public static void main(String args)                           &

100、#160;    fun(new B();                    fun(new C();                   

101、60;    /現(xiàn)在要求定義幾個(gè)方法,可以接收父類A的子類對象            /如果不知道多態(tài)性的時(shí)候應(yīng)該使用以下的方式編寫代碼            public static void fun(B b)         

102、;                       b.fun2();                        public s

103、tatic void fun(C c)                                c.fun2();             &#

104、160;  如果按此做法,就會(huì)面臨一個(gè)很嚴(yán)重的問題: · 如果現(xiàn)在A類有30個(gè)子類,則方法要重寫30遍。 所以此時(shí)就可以利用對象的多態(tài)性完成,因?yàn)樗械淖宇悓ο蠖伎梢韵蚋割悓ο筠D(zhuǎn)換。class A                public void fun1()        

105、                        System.out.println("A類=>public void fun1()");              

106、0;         public void fun2()                                /fun2方法調(diào)用的是fun1方法 &

107、#160;                  this.fun1();                    class B extends A    

108、;            /覆寫A類中的fun1()方法            public void fun1()                  

109、0;             System.out.println("B類=>public void fun1()");                        public&#

110、160;void fun3()                                System.out.println("B類=>public void fun3()");   &#

111、160;                class C extends A                /覆寫A類中的fun1()方法         

112、60;  public void fun1()                                System.out.println("C類=>public void fun1()"

113、;);                        public void fun4()                     

114、;           System.out.println("C類=>public void fun4()");                    public class Demo06  

115、0;             public static void main(String args)                            &

116、#160;   fun(new B();                    fun(new C();                    

117、60;   /現(xiàn)在要求定義幾個(gè)方法,可以接收父類A的子類對象            /現(xiàn)在使用多態(tài)性編寫代碼            public static void fun(A a)         

118、60;                      a.fun2();                現(xiàn)在我們就只留一個(gè)fun()方法,new B(),new C()都是A類的子類哈,所以現(xiàn)在不管調(diào)用時(shí)傳什么子類,都調(diào)用所

119、傳子類被覆寫的fun1()方法哈這就是對象多態(tài)性帶來的好處,誰被其實(shí)例化就具備這樣的功能哈如果父類設(shè)計(jì)的非常的完善,則方法中會(huì)非常的好寫。要求: 如果傳入的是B類的對象,則要求再調(diào)用fun3()方法,如果傳入的是C類的對象,則要求再調(diào)用fun4() 方法。問題: 如何去判斷一個(gè)對象是否是某個(gè)類的實(shí)例呢?這就需要instanceof關(guān)鍵字支持哈。instanceof關(guān)鍵字class A              

120、60; public void fun1()                                System.out.println("A類=>public void fun1()");

121、60;                       public void fun2()                      

122、;          /fun2方法調(diào)用的是fun1方法                    this.fun1();               

123、     class B extends A                /覆寫A類中的fun1()方法            public void fun1()    

124、60;                           System.out.println("B類=>public void fun1()");           &

125、#160;            public void fun3()                                Sys

126、tem.out.println("B類=>public void fun3()");                    class C extends A              

127、;  /覆寫A類中的fun1()方法            public void fun1()                            

128、0;   System.out.println("C類=>public void fun1()");                        public void fun4()      

129、0;                         System.out.println("C類=>public void fun4()");             &#

130、160;      public class Demo07                public static void main(String args)              

131、                  B b = new B();                    System.out.println(b instanceof A);

132、60;               我們來判斷下對象b是否是A類的實(shí)例哈,我們分析下哈,子類B可以直接向父類A轉(zhuǎn)型哈,說明父類A可以接收子類B的實(shí)例,那兩者必然有關(guān)系哈,我們驗(yàn)證一下,結(jié)果返回true哈,證明對象b是A類的實(shí)例哈class A                pub

133、lic void fun1()                                System.out.println("A類=>public void fun1()");  

134、60;                     public void fun2()                        

135、;        /fun2方法調(diào)用的是fun1方法                    this.fun1();                 

136、   class B extends A                /覆寫A類中的fun1()方法            public void fun1()      

137、60;                         System.out.println("B類=>public void fun1()");             &

138、#160;          public void fun3()                                System.out.prin

139、tln("B類=>public void fun3()");                    class C extends A                

140、;/覆寫A類中的fun1()方法            public void fun1()                              

141、0; System.out.println("C類=>public void fun1()");                        public void fun4()        

142、0;                       System.out.println("C類=>public void fun4()");               &#

143、160;    public class Demo07                public static void main(String args)                

144、                B b = new B();                    System.out.println(b instanceof A);  

145、60;                 System.out.println(b instanceof B);                 對象b也肯定是B類的實(shí)例哈class A    

146、;            public void fun1()                                System.

147、out.println("A類=>public void fun1()");                        public void fun2()           &

148、#160;                    /fun2方法調(diào)用的是fun1方法                    this.fun1();    &#

149、160;               class B extends A                /覆寫A類中的fun1()方法          

150、60; public void fun1()                                System.out.println("B類=>public void fun1()");

151、60;                       public void fun3()                      

152、;          System.out.println("B類=>public void fun3()");                    class C extends A   &

153、#160;            /覆寫A類中的fun1()方法            public void fun1()                  

154、              System.out.println("C類=>public void fun1()");                        publ

155、ic void fun4()                                System.out.println("C類=>public void fun4()");  

156、0;                 public class Demo07                public static void main(String args)   &#

157、160;                            A a = new A();                 &#

158、160;  System.out.println(a instanceof A);                    System.out.println(a instanceof B);            &#

159、160;   那相反對象a是B類的實(shí)例嗎?驗(yàn)證顯示不是哈說明不能向子類轉(zhuǎn)換哈class A                public void fun1()                  

160、60;             System.out.println("A類=>public void fun1()");                        public&

161、#160;void fun2()                                /fun2方法調(diào)用的是fun1方法           

162、0;        this.fun1();                    class B extends A              &#

163、160; /覆寫A類中的fun1()方法            public void fun1()                             &

164、#160;  System.out.println("B類=>public void fun1()");                        public void fun3()       &

165、#160;                        System.out.println("B類=>public void fun3()");              

166、;      class C extends A                /覆寫A類中的fun1()方法            public void fun1()   &#

167、160;                            System.out.println("C類=>public void fun1()");          

168、              public void fun4()                               &#

169、160;System.out.println("C類=>public void fun4()");                    public class Demo08             &

170、#160;  public static void main(String args)                                fun(new B();    

171、;                System.out.println("#");                    fun(new C();     &#

172、160;                  public static void fun(A a)                        &#

173、160;       a.fun2();                    if (a instanceof B)               &

174、#160;                                B b = (B)a;               &#

175、160;            b.fun3();                                    

176、;    if (a instanceof C)                                        &

177、#160;       C c = (C)a;                            c.fun4();           

178、;                         這就是instanceof關(guān)鍵字的作用哈Instanceof的使用時(shí)機(jī): 一般情況下都是在轉(zhuǎn)型之前進(jìn)行一下判斷,這樣就可以進(jìn)行比較安全的轉(zhuǎn)型操作。Object類在Java中用戶所編寫的一切類都是一個(gè)類的子類,稱為Object類。實(shí)際上此類默認(rèn)繼承了Object類,以上代碼等價(jià)于以下代碼:

179、Object類的作用: · 如果一個(gè)好的類需要覆寫Object類中的三個(gè)方法: |- public String toString():對象輸出時(shí)的操作 |- public boolean equals(Object obj):對象比較時(shí)的操作 |- public int hashCode(): 返回該對象的哈希碼值。class Student /extends Object            

180、;    private String name;            private int age;            public Student(String name,int age)      

181、;                           = name;                    this.age = age;          

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論