方法重載的條件(300字)(文書寫作材料素材)_第1頁
方法重載的條件(300字)(文書寫作材料素材)_第2頁
方法重載的條件(300字)(文書寫作材料素材)_第3頁
方法重載的條件(300字)(文書寫作材料素材)_第4頁
方法重載的條件(300字)(文書寫作材料素材)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 方法重載的條件(300字) A在不同class中定義的方法 B在同一類中定義的方法 C方法名必需相同 D返回類型必需相同 E參數(shù)確定不同 F參數(shù)可以相同。 方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數(shù)的類型或參數(shù)的個數(shù)。調用重載方法時,Java編譯器能通過檢查調用的方法的參數(shù)類型和個數(shù)選擇一個恰當?shù)姆椒ā?方法重載通常用于創(chuàng)建完成一組任務相像但參數(shù)的類型或參數(shù)的個數(shù)不同的方法。 方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。 Java的方法重載,就是在類中可以創(chuàng)建多個方法,它們具有相同的名字,但具有不同的參數(shù)和不同的定義。調用方法時通過傳遞給它們的不同個數(shù)和

2、類型的參數(shù)來打算具體使用哪個方法。 java多態(tài)的2種表現(xiàn)形式 方法重載和方法掩蓋 方法重載:同一個類中,方法名相同,參數(shù)列表不同的2個或多個方法構成方法的重載。 方法掩蓋:子類重新實現(xiàn)了父類中的方法。 其次篇:方法重載與重寫 7800字 一、方法的重寫。 1、重寫只能消逝在繼承關系之中。當一個類繼承它的父類方法時,都有機會重寫該父類的方法。一個特例是父類的方法被標識為final。重寫的主要優(yōu)點是能夠定義某個子類型特有的行為。 class Animal public void eat() System.out.println (Animal is eating.); class Horse e

3、xtends Animal public void eat() System.out.println (Horse is eating.); 2、對于從父類繼承來的抽象方法,要么在子類用重寫的方式設計該方法,要么把子類也標識為抽象的。所以抽象方法可以說是必需要被重寫的方法。 3、重寫的意義。 重寫方法可以實現(xiàn)多態(tài),用父類的引用來操縱子類對象,但是在實際運行中對象將運行其自己特有的方法。 public class Test public static void main (String args) Animal h = new Horse(); h.eat(); class Animal pub

4、lic void eat() System.out.println (Animal is eating.); class Horse extends Animal public void eat() System.out.println (Horse is eating.); public void buck() 一個原則是:使用了什么引用,編譯器就會只調用引用類所擁有的方法。假如調用子類特有的方法,如上例的h.buck(); 編譯器會埋怨的。也就是說,編譯器只看引用類型,而不是對象類型。 4、重寫方法的規(guī)章。 若想實現(xiàn)一個合格重寫方法,而不是重載,那么必需同時滿足下面的要求! A、重寫規(guī)章之

5、一:重寫方法不能比被重寫方法限制有更嚴格的訪問級別。 (但是可以更廣泛,比如父類方法是包訪問權限,子類的重寫方法是public訪問權限。) 比如:Object類有個toString()方法,開頭重寫這個方法的時候我們總簡潔遺忘public修飾符,編譯器當然不會放過任何教訓我們的機會。出錯的緣由就是:沒有加任何訪問修飾符的方法具有包訪問權限,包訪問權限比public當然要嚴格了,所以編譯器會報錯的。 B、重寫規(guī)章之二:參數(shù)列表必需與被重寫方法的相同。 重寫有個孿生的弟弟叫重載,也就是后面要出場的。假如子類方法的參數(shù)與父類對應的方法不同,那么就是你認錯人了,那是重載,不是重寫。 C、重寫規(guī)章之三:

6、返回類型必需與被重寫方法的返回類型相同。 父類方法A:void eat() 子類方法B:int eat() 兩者雖然參數(shù)相同,可是返回類型不同,所以不是重寫。 父類方法A:int eat() 子類方法B:long eat() 返回類型雖然兼容父類,但是不同就是不同,所以不是重寫。 D、重寫規(guī)章之四:重寫方法不能拋出新的特殊或者比被重寫方法聲明的檢查特殊更廣的檢查特殊。但是可以拋出更少,更有限或者不拋出特殊。 import java.io.*; public class Test public static void main (String args) Animal h = new Horse

7、(); try h.eat(); catch (Exception e) class Animal public void eat() throws Exception System.out.println (Animal is eating.); throw new Exception(); class Horse extends Animal public void eat() throws IOException System.out.println (Horse is eating.); throw new IOException(); 這個例子中,父類拋出了檢查特殊Exception

8、,子類拋出的IOException是Exception的子類,也即是比被重寫的方法拋出了更有限的特殊,這是可以的。假如反過來,父類拋出IOException,子類拋出更為寬泛的Exception,那么不會通過編譯的。 留意:這種限制只是針對檢查特殊,至于運行時特殊RuntimeException及其子類不再這個限制之中。 E、重寫規(guī)章之五:不能重寫被標識為final的方法。 F、重寫規(guī)章之六:假如一個方法不能被繼承,則不能重寫它。 比較典型的就是父類的private方法。下例會產(chǎn)生一個好玩的現(xiàn)象。 public class Test public static void main (Strin

9、g args) /Animal h = new Horse(); Horse h = new Horse(); h.eat(); class Animal private void eat() System.out.println (Animal is eating.); class Horse extends Animal public void eat() System.out.println (Horse is eating.); 這段代碼是能通過編譯的。表面上看來違反了第六條規(guī)章,但實際上那是一點巧合。Animal類的eat()方法不能被繼承,因此Horse類中的eat()方法是一個全

10、新的方法,不是重寫也不是重載,只是一個只屬于Horse類的全新的方法!這點讓很多人迷惑了,但是也不是那么難以理解。 main()方法假如是這樣: Animal h = new Horse(); /Horse h = new Horse(); h.eat(); 編譯器會報錯,為什么呢?Horse類的eat()方法是public的啊!應當可以調用啊!請牢記,多態(tài)只看父類引用的方法,而不看子類對象的方法! 二、方法的重載。 重載是有好的,它不要求你在調用一個方法之前轉換數(shù)據(jù)類型,它會自動地查找匹配的方法。方法的重載是在編譯時刻就打算調用哪個方法了,和重寫不同。最最常用的地方就是構造器的重載。 1、基

11、本數(shù)據(jù)類型參數(shù)的重載。 public class Test static void method(byte b) System.out.println (method:byte); static void method(short s) System.out.println (method:short); static void method(int i) System.out.println (method:int); static void method(float f) System.out.println (method:float); static void method(doubl

12、e d) System.out.println (method:double); public static void main (String args) method(byte)1); method(c); method(1); method(1L); method(1.1); method(1.1f); 輸出結果: method:byte method:int method:int method:float method:double method:float 可以看出:首先要查找的是數(shù)據(jù)類型正好匹配方法。假如找不到,那么就提升為表達力氣更強的數(shù)據(jù)類型,如上例沒有正好容納long的整數(shù)類

13、型,那么就轉換為float類型的。假如通過提升也不能找到合適的兼容類型,那么編譯器就會報錯。反正是不會自動轉換為較小的數(shù)據(jù)類型的,必需自己強制轉換,自己來擔當轉變后果。 char類型比較特殊,假如找不到正好匹配的類型,它會轉化為int而不是short,雖然char是16位的。 2、重載方法的規(guī)章。 A、被重載的方法必需轉變參數(shù)列表。 參數(shù)必需不同,這是最重要的!不同有兩個方面,參數(shù)的個數(shù),參數(shù)的類型,參數(shù)的挨次。 B、被重載的方法與返回類型無關。 也就是說,不能通過返回類型來區(qū)分重載方法。 C、被重載的方法可以轉變訪問修飾符。 沒有重寫方法那樣嚴格的限制。 D、被重載的方法可以聲明新的或者更廣

14、的檢查特殊。 沒有重寫方法那樣嚴格的限制。 E、方法能夠在一個類中或者在一個子類中被重載。 3、帶對象引用參數(shù)的方法重載。 class Animal class Horse extends Animal public class Test static void method(Animal a) System.out.println (Animal is called.); static void method(Horse h) System.out.println (Horse is called.); public static void main (String args) Animal

15、 a = new Animal(); Horse h = new Horse(); Animal ah = new Horse(); method(a); method(h); method(ah); 輸出結果是: Animal is called. Horse is called. Animal is called. 前兩個輸出沒有任何問題。第三個方法為什么不是輸出Horse is called.呢?還是那句老話,要看引用類型而不是對象類型,方法重載是在編譯時刻就打算的了,引用類型打算了調用哪個版本的重載方法。 4、重載和重寫方法區(qū)分的小結。 假如能徹底弄明白下面的例子,說明你對重載和重寫特

16、殊了解了,可以結束這節(jié)的復習了。 class Animal public void eat() System.out.println (Animal is eating.); class Horse extends Animal public void eat() System.out.println (Horse is eating.); public void eat(String food) System.out.println (Horse is eating + food); public class Test public static void main (String args

17、) Animal a = new Animal(); Horse h = new Horse(); Animal ah = new Horse(); a.eat(); h.eat(); h.eat(apple); ah.eat(); /a.eat(apple); /ah.eat(apple); 四個輸出分別是什么?被解釋的兩條語句為什么不能通過編譯? 第一條:a.eat(); 一般的方法調用,沒有多態(tài),沒什么技術含量。調用了Animal類的eat()方法,輸出:Animal is eating. 其次條:h.eat(); 一般的方法調用,也沒什么技術含量。調用了Horse類的eat()方法,輸

18、出:Horse is eating. 第三條:h.eat(apple); 重載。Horse類的兩個eat()方法重載。調用了Horse類的eat(String food)方法,輸出:Horse is eating apple 第四條:ah.eat(); 多態(tài)。前面有例子了,不難理解。輸出:Horse is eating. 第五條:a.eat(apple); 低級的錯誤,Animal類中沒有eat(String food)方法。因此不能通過編譯。 第六條:ah.eat(apple); 關鍵點就在這里。解決的方法還是那句老話,不能看對象類型,要看引用類型。Animal類中沒有eat(String

19、food)方法。因此不能通過編譯。 小結一下:多態(tài)不打算調用哪個重載版本;多態(tài)只有在打算哪個重寫版本時才起作用。 重載對應編譯時,重寫對應運行時。夠簡潔的了吧! 三、構造方法。 構造方法是一種特殊的方法,沒有構造方法就不能創(chuàng)建一個新對象。實際上,不僅要調用對象實際類型的構造方法,還要調用其父類的構造方法,向上追溯,直到Object類。構造方法不必顯式地調用,當使用new關鍵字時,相應的構造方法會自動被調用。 1、構造方法的規(guī)章。 A、構造方法能使用任何訪問修飾符。包括private,事實上java類庫有很多都是這樣的,設計者不期望使用者創(chuàng)建該類的對象。 B、構造方法的名稱必需與類名相同。這樣使

20、得構造方法與眾不同,假如我們遵守sun的編碼規(guī)范,好像只有構造方法的首字母是大寫的。 C、構造方法不能有返回類型。 反過來說,有返回類型的不是構造方法 public class Test int Test() return 1; 這個方法是什么東西?一個冒充李逵的李鬼而已,int Test()和其他任何一般方法沒什么兩樣,就是一般的方法!只不過看起來很惡心,類似惡心的東西在考試卷子里比較多。 D、假如不在類中創(chuàng)建自己的構造方法,編譯器會自動生成默認的不帶參數(shù)的構造函數(shù)。 這點很簡潔驗證!寫一個這樣簡潔的類,編譯。 class Test 對生成的Test.class文件反編譯:javap Tes

21、t,可以看到: D:JavaCodebinjavap Test Compiled from Test.java class Test extends java.lang.Object Test(); 看到編譯器自動添加的默認構造函數(shù)了吧! E、假如只創(chuàng)建了帶參數(shù)的構造方法,那么編譯器不會自動添加無參的構造方法的! F、在每個構造方法中,假如使用了重載構造函數(shù)this()方法,或者父類的構造方法super()方法,那么this()方法或者super()方法必需放在第一行。而且這兩個方法只能選擇一個,因此它們之間沒有挨次問題。 G、除了編譯器生成的構造方法,而且沒有顯式地調用super()方法,那

22、么編譯器會插入一個super()無參調用。 H、抽象類有構造方法。 四、靜態(tài)方法的重載與重寫(掩蓋)。 1、靜態(tài)方法是不能被掩蓋的??梢苑謨煞N狀況爭辯: A、子類的非靜態(tài)方法掩蓋父類的靜態(tài)方法。 這種狀況下,是不能通過編譯的。 class Father static void print() System.out.println (in father method); class Child extends Father void print() System.out.println (in child method); static方法表示該方法不關聯(lián)具體的類的對象,可以通過類名直接調用,也就是編譯的前期就綁定了,不存在后期動態(tài)綁定,也就是不能實現(xiàn)多態(tài)。子

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論