亚洲色影视在线播放_国产一区+欧美+综合_久久精品少妇视频_制服丝袜国产网站

學(xué)習(xí)方法

方法重載和方法覆蓋

時(shí)間:2022-10-01 00:55:38 學(xué)習(xí)方法 我要投稿
  • 相關(guān)推薦

方法重載和方法覆蓋

  重載與覆蓋的區(qū)別【一】

  1、方法的覆蓋是子類(lèi)和父類(lèi)之間的關(guān)系,是垂直關(guān)系;方法的重載是同一個(gè)類(lèi)中方法之間的關(guān)系,是水平關(guān)系。

  2、覆蓋只能由一個(gè)方法,或只能由一對(duì)方法產(chǎn)生關(guān)系;方法的重載是多個(gè)方法之間的關(guān)系。

  3、覆蓋要求參數(shù)列表相同;重載要求參數(shù)列表不同。

  4、覆蓋關(guān)系中,調(diào)用那個(gè)方法體,是根據(jù)對(duì)象的類(lèi)型(對(duì)象對(duì)應(yīng)存儲(chǔ)空間類(lèi)型)來(lái)決定;重載關(guān)系,是根據(jù)調(diào)用時(shí)的實(shí)參表與形參表來(lái)選擇方法體的。

  override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個(gè)方法并且對(duì)其重寫(xiě),以求達(dá)到不同的作用。對(duì)我們來(lái)說(shuō)最熟悉的覆蓋就是對(duì)接口方法的實(shí)現(xiàn),在接口中一般只是對(duì)方法進(jìn)行了聲明,而我們?cè)趯?shí)現(xiàn)時(shí),就需要實(shí)現(xiàn)接口聲明的所有方法。除了這個(gè)典型的用法以外,我們?cè)诶^承中也可能會(huì)在子類(lèi)覆蓋父類(lèi)中的方法。在覆蓋要注意以下的幾點(diǎn):

  1、覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配,才能達(dá)到覆蓋的效果;

  2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

  3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類(lèi);

  4、被覆蓋的方法不能為private,否則在其子類(lèi)中只是新定義了一個(gè)方法,并沒(méi)有對(duì)其進(jìn)行覆蓋。

  overload對(duì)我們來(lái)說(shuō)可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過(guò)定義不同的輸入?yún)?shù)來(lái)區(qū)分這些方法,然后再調(diào)用時(shí),VM就會(huì)根據(jù)不同的參數(shù)樣式,來(lái)選擇合適的方法執(zhí)行。在使用重載要注意以下的幾點(diǎn):

  1、在使用重載時(shí)只能通過(guò)不同的參數(shù)樣式。例如,不同的參數(shù)類(lèi)型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個(gè)參數(shù)類(lèi)型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));

  2、不能通過(guò)訪問(wèn)權(quán)限、返回類(lèi)型、拋出的異常進(jìn)行重載;

  3、方法的異常類(lèi)型和數(shù)目不會(huì)對(duì)重載造成影響;

  4、對(duì)于繼承來(lái)說(shuō),如果某一方法在父類(lèi)中是訪問(wèn)權(quán)限是priavte,那么就不能在子類(lèi)對(duì)其進(jìn)行重載,如果定義的話,也只是定義了一個(gè)新方法,而不會(huì)達(dá)到重載的效果

  class A {

  protected int method1(int a, int b) { return 0; }

  }

  public class B extends A{

  public int method1(int a, int b) { return 0; } //正確,重寫(xiě)父類(lèi)方法,可以擴(kuò)大訪問(wèn)權(quán)限

  //private int method1(int a, int b) { return 0; } //錯(cuò)誤,重寫(xiě)父類(lèi)方法,不能降低了訪問(wèn)權(quán)限

  //private long method1(int a, int b) { return 0; } //錯(cuò)誤,重寫(xiě)父類(lèi)方法,不能改變返回值類(lèi)型

  public short method1(int a, long b) { return 0; }//正確,重載自身的方法,可以有不同的訪問(wèn)權(quán)限和返回值類(lèi)型

  private int method1(int a, long b) { return 0; }//正確,重載自身的方法,可以有不同的訪問(wèn)權(quán)限和返回值類(lèi)型

  }

  方法覆蓋(overwrite)與方法重載(overload)詳解【二】

  方法重載(Overload)

  有時(shí)候,類(lèi)的同一種功能有多種實(shí)現(xiàn)方式,到底采用哪種實(shí)現(xiàn)方式,取決于調(diào)用者給定的參數(shù)。例如雜技師能訓(xùn)練動(dòng)物,對(duì)于不同的動(dòng)物有不同的訓(xùn)練方式。

  public void train(Dog dog){

  //訓(xùn)練小狗站立、排隊(duì)、做算術(shù)

  …

  }

  public void train(Monkey monkey){

  //訓(xùn)練小猴敬禮、翻筋斗、騎自行車(chē)

  …

  }

  再例如某個(gè)類(lèi)的一個(gè)功能是比較兩個(gè)城市是否相同,一種方式是按兩個(gè)城市的名字進(jìn)行比較,另一種方式是按兩個(gè)城市的名字,以及城市所在國(guó)家的名字進(jìn)行比較。

  public boolean isSameCity (String city1,String city2){

  return city1.equals(city2);

  }

  public boolean isSameCity(String city1,String city2,String country1,String country2){

  return isSameCity(city1, city2) && country1.equals(country2);

  }

  再例如java.lang.Math類(lèi)的max()方法能夠從兩個(gè)數(shù)字中取出最大值,它有多種實(shí)現(xiàn)方式。

  public static int max(int a,int b)

  public static int max(long a,long b)

  public static int max(float a,float b)

  public static int max(double a,double b)

  以下程序多次調(diào)用Math類(lèi)的max()方法,運(yùn)行時(shí),Java虛擬機(jī)先判斷給定參數(shù)的類(lèi)型,然后決定到底執(zhí)行哪個(gè)max()方法。

  //參數(shù)均為int類(lèi)型,因此執(zhí)行max(int a,int b)方法

  Math.max(1,2);

  //參數(shù)均為float類(lèi)型,因此執(zhí)行max(float a,float b)方法

  Math.max(1.0F, 2.0F);

  //參數(shù)中有一個(gè)是double類(lèi)型,自動(dòng)把另一個(gè)參數(shù)2轉(zhuǎn)換為double類(lèi)型,

  //執(zhí)行max(double a,double b)方法

  Math.max(1.0,2);

  對(duì)于類(lèi)的方法(包括從父類(lèi)中繼承的方法),如果有兩個(gè)方法的方法名相同,但參數(shù)不一致,那么可以說(shuō),一個(gè)方法是另一個(gè)方法的重載方法。

  重載方法必須滿足以下條件:

  l 方法名相同。

  l 方法的參數(shù)類(lèi)型、個(gè)數(shù)、順序至少有一項(xiàng)不相同。

  l 方法的返回類(lèi)型可以不相同。

  l 方法的修飾符可以不相同。

  在一個(gè)類(lèi)中不允許定義兩個(gè)方法名相同,并且參數(shù)簽名也完全相同的方法。因?yàn)榧偃绱嬖谶@樣的兩個(gè)方法,Java虛擬機(jī)在運(yùn)行時(shí)就無(wú)法決定到底執(zhí)行哪個(gè)方法。參數(shù)簽名是指參數(shù)的類(lèi)型、個(gè)數(shù)和順序。

  例如以下Sample類(lèi)中已經(jīng)定義了一個(gè)amethod()方法。

  public class Sample{

  public void amethod(int i, String s){}

  //加入其他方法

  }

  下面哪些方法可以加入到Sample類(lèi)中,并且保證編譯正確呢?

  A)public void amethod(String s, int i){} (可以)

  B)public int amethod(int i, String s){return 0;} (不可以)

  C)private void amethod(int i, String mystring){} (不可以)

  D)public void Amethod(int i, String s) {} (可以)

  E)abstract void amethod(int i); (不可以)

  選項(xiàng)A的amethod()方法的參數(shù)順序和已有的不一樣,所以能作為重載方法加入到Sample類(lèi)中。

  選項(xiàng)B和選項(xiàng)C的amethod()方法的參數(shù)簽名和已有的一樣,所以不能加入到Sample類(lèi)中。對(duì)于選項(xiàng)C,盡管String類(lèi)型的參數(shù)的名字和已有的不一樣,但比較參數(shù)簽名無(wú)須考慮參數(shù)的具體名字。

  選項(xiàng)D的方法名為Amethod,與已有的不一樣,所以能加入到Sample類(lèi)中。

  選項(xiàng)E的方法的參數(shù)數(shù)目和已有的不一樣,因此是一種重載方法。但由于此處的Sample類(lèi)不是抽象類(lèi),所以不能包含這個(gè)抽象方法。假如把Sample類(lèi)改為抽象類(lèi),就能把這個(gè)方法加入到Sample類(lèi)中了。

  再例如,以下Sample類(lèi)中已經(jīng)定義了一個(gè)作為程序入口的main()方法。

  abstract public class Sample{

  public static void main( String[] s){}

  //加入其他方法

  }

  下面哪些方法可以加入到Sample類(lèi)中,并且保證編譯正確呢?

  A)abstract public void main(String s, int i); (可以)

  B)public final static int main( String[] s){} (不可以)

  C)private void main(int i, String mystring){} (可以)

  D)public void main( String s) throws Exception{} (可以)

  作為程序入口的main()方法也可以被重載。以上選項(xiàng)A、C和D都可以被加入到Sample類(lèi)中。選項(xiàng)B與已有的main()方法有相同的方法簽名,因此不允許再加入到Sample類(lèi)中。

  方法覆蓋(Override)

  假如有100個(gè)類(lèi),分別為Sub1,Sub2…Sub100,它們的一個(gè)共同行為是寫(xiě)字,除了Sub1類(lèi)用腳寫(xiě)字 外,其余的類(lèi)都用手寫(xiě)字?梢猿橄蟪鲆粋(gè)父類(lèi)Base,它有一個(gè)表示寫(xiě)字的方法write(),那么這個(gè)方法到底如何實(shí)現(xiàn)呢?從盡可能提高代碼可重用性的 角度看,write()方法應(yīng)該采用適用于大多數(shù)子類(lèi)的實(shí)現(xiàn)方式,這樣就可以避免在大多數(shù)子類(lèi)中重復(fù)定義write()方法。因此Base類(lèi)的 write()方法的定義如下:

  public void write(){ //Base類(lèi)的write()方法

  //用手寫(xiě)字

  …

  }

  由于Sub1類(lèi)的寫(xiě)字的實(shí)現(xiàn)方式與Base類(lèi)不一樣,因此在Sub1類(lèi)中必須重新定義write()方法。

  public void write(){ //Sub1類(lèi)的write()方法

  //用腳寫(xiě)字

  …

  }

  如果在子類(lèi)中定義的一個(gè)方法,其名稱、返回類(lèi)型及參數(shù)簽名正好與父類(lèi)中某個(gè)方法的名稱、返回類(lèi)型及參數(shù)簽名相匹配,那么可以說(shuō),子類(lèi)的方法覆蓋了父類(lèi)的方法。

  覆蓋方法必須滿足多種約束,下面分別介紹。

  (1)子類(lèi)方法的名稱、參數(shù)簽名和返回類(lèi)型必須與父類(lèi)方法的名稱、參數(shù)簽名和返回類(lèi)型一致。例如以下代碼將導(dǎo)致編譯錯(cuò)誤。

  public class Base {

  public void method() {…}

  }

  public class Sub extends Base{

  public int method() { //編譯錯(cuò)誤,返回類(lèi)型不一致

  return 0;

  }

  }

  Java編譯器首先判斷Sub類(lèi)的method()方法與Base類(lèi)的method()方法的參數(shù)簽名,由于兩者一 致,因此Java編譯器認(rèn)為Sub類(lèi)的method()方法試圖覆蓋父類(lèi)的方法,既然如此,Sub類(lèi)的method()方法就必須和被覆蓋的方法具有相同 的返回類(lèi)型。

  以下代碼中子類(lèi)覆蓋了父類(lèi)的一個(gè)方法,然后又定義了一個(gè)重載方法,這是合法的。

  public class Base {

  public void method() {…}

  }

  public class Sub extends Base {

  public void method(){…} //覆蓋Base類(lèi)的method()方法

  public int method(int a) { //重載method()方法

  return 0;

  }

  }

  (2)子類(lèi)方法不能縮小父類(lèi)方法的訪問(wèn)權(quán)限。例如以下代碼中子類(lèi)的method()方法是私有的,父類(lèi)的method()方法是公共的,子類(lèi)縮小了父類(lèi)方法的訪問(wèn)權(quán)限,這是無(wú)效的方法覆蓋,將導(dǎo)致編譯錯(cuò)誤。

  public class Base {

  public void method() {…}

  }

  public class Sub extends Base {

  private void method() {…} //編譯錯(cuò)誤,子類(lèi)方法縮小了父類(lèi)方法的訪問(wèn)權(quán)限

  }

  為什么子類(lèi)方法不允許縮小父類(lèi)方法的訪問(wèn)權(quán)限呢?這是因?yàn)榧偃鐩](méi)有這個(gè)限制,將會(huì)與Java語(yǔ)言的多態(tài)機(jī)制發(fā)生沖突。例如對(duì)于以下代碼:

  Base base=new Sub(); //base變量被定義為Base類(lèi)型,但引用Sub類(lèi)的實(shí)例

  base.method();

  Java編譯器認(rèn)為以上是合法的代碼。但在運(yùn)行時(shí),根據(jù)動(dòng)態(tài)綁定規(guī)則,Java虛擬機(jī)會(huì)調(diào)用base變量所引用的 Sub實(shí)例的method()方法,如果這個(gè)方法為private類(lèi)型,Java虛擬機(jī)就無(wú)法訪問(wèn)它。所以為了避免這樣的矛盾,Java語(yǔ)言不允許子類(lèi)方 法縮小父類(lèi)中被覆蓋方法的訪問(wèn)權(quán)限。本章第6.6節(jié)(多態(tài))對(duì)多態(tài)做了進(jìn)一步的闡述。

  (3)子類(lèi)方法不能拋出比父類(lèi)方法更多的異常,關(guān)于異常的概念參見(jiàn)第9章(異常處理)。子類(lèi)方法拋出的異常必須和父類(lèi)方法拋出的異常相同,或者子類(lèi)方法拋出的異常類(lèi)是父類(lèi)方法拋出的異常類(lèi)的子類(lèi)。

  例如,假設(shè)異常類(lèi)ExceptionSub1和ExceptionSub2是ExceptionBase類(lèi)的子類(lèi),則以下的代碼是合法的:

  public class Base {

  void method()throws ExceptionBase{}

  }

  public class Sub1 extends Base {

  void method()throws ExceptionSub1{}

  }

  public class Sub2 extends Base {

  void method()throws ExceptionSub1,ExceptionSub2{}

  }

  public class Sub3 extends Base {

  void method()throws ExceptionBase{}

  }

  以下代碼不合法:

  public class Base {

  void method() throws ExceptionSub1{ }

  }

  public class Sub1 extends Base {

  void method()throws ExceptionBase {} //編譯出錯(cuò)

  }

  public class Sub2 extends Base {

  void method()throws ExceptionSub1,ExceptionSub2 {} //編譯出錯(cuò)

  }

  為什么子類(lèi)方法不允許拋出比父類(lèi)方法更多的異常呢?這是因?yàn)榧偃鐩](méi)有這個(gè)限制,將會(huì)與Java語(yǔ)言的多態(tài)機(jī)制發(fā)生沖突。例如對(duì)于以下代碼:

  Base base=new Sub2(); //base變量被定義為Base類(lèi)型,但引用Sub2類(lèi)的實(shí)例

  try{

  base.method();

  }catch(ExceptionSub1 e){ … } //僅僅捕獲ExceptionSub1異常

  Java編譯器認(rèn)為以上是合法的代碼。但在運(yùn)行時(shí),根據(jù)動(dòng)態(tài)綁定規(guī)則,Java虛擬機(jī)會(huì)調(diào)用base變量所引用的 Sub2實(shí)例的method()方法。假如Sub2實(shí)例的method()方法拋出ExceptionSub2異常,由于該異常沒(méi)有被捕獲,將導(dǎo)致程序異 常終止。

  (4)方法覆蓋只存在于子類(lèi)和父類(lèi)(包括直接父類(lèi)和間接父類(lèi))之間。在同一個(gè)類(lèi)中方法只能被重載,不能被覆蓋。

  (5)父類(lèi)的靜態(tài)方法不能被子類(lèi)覆蓋為非靜態(tài)方法。例如以下的代碼將導(dǎo)致編譯錯(cuò)誤:

  public class Base {

  public static void method() { }

  }

  public class Sub extends Base {

  public void method() { } //編譯出錯(cuò)

  }

  (6)子類(lèi)可以定義與父類(lèi)的靜態(tài)方法同名的靜態(tài)方法,以便在子類(lèi)中隱藏父類(lèi)的靜態(tài)方法。在編譯時(shí),子類(lèi)定義的靜態(tài)方法也必須滿足與方法覆蓋類(lèi)似的約束:方法的參數(shù)簽名一致,返回類(lèi)型一致,不能縮小父類(lèi)方法的訪問(wèn)權(quán)限,不能拋出更多的異常。例如以下代碼是合法的:

  public class Base {

  static int method(int a) throws BaseException{ return 0; }

  }

  public class Sub extends Base{

  public static int method(int a) throws SubException { return 0; }

  }

  子類(lèi)隱藏父類(lèi)的靜態(tài)方法和子類(lèi)覆蓋父類(lèi)的實(shí)例方法,這兩者的區(qū)別在于:運(yùn)行時(shí),Java虛擬機(jī)把靜態(tài)方法和所屬的類(lèi)綁定,而把實(shí)例方法和所屬的實(shí)例綁定。下面舉例來(lái)解釋這一區(qū)別。在例程6-1中,Base類(lèi)和它的子類(lèi)即Sub類(lèi)中都定義了實(shí)例方法method()和靜 態(tài)方法staticMethod()。

  例程6-1 Sub.java

  package hidestatic;

  class Base{

  void method(){ //實(shí)例方法

  System.out.println("method of Base");

  }

  static void staticMethod(){ //靜態(tài)方法

  System.out.println("static method of Base");

  }

  }

  public class Sub extends Base{

  void method(){ //覆蓋父類(lèi)的實(shí)例方法method()

  System.out.println("method of Sub");

  }

  static void staticMethod(){ //隱藏父類(lèi)的靜態(tài)方法staticMethod()

  System.out.println("static method of Sub");

  }

  public static void main(String args[]){

  Base sub1=new Sub(); //sub1變量被聲明為Base類(lèi)型,引用Sub實(shí)例

  sub1.method(); //打印 method of Sub

  sub1.staticMethod(); //打印 static method of Base

  Sub sub2=new Sub(); //sub2變量被聲明為Sub類(lèi)型,引用Sub實(shí)例

  sub2.method(); //打印 method of Sub

  sub2.staticMethod(); //打印 static method of Sub

  }

  }

  運(yùn)行Sub類(lèi)的main()方法,程序?qū)⑤敵觯?/p>

  method of Sub

  static method of Base

  method of Sub

  static method of Sub

  引用變量sub1和sub2都引用Sub類(lèi)的實(shí)例,Java虛擬機(jī)在執(zhí)行sub1.method()和sub2.method()時(shí),都調(diào)用Sub實(shí)例的method()方法,此時(shí)父類(lèi)Base的實(shí)例方法method()被子類(lèi)覆蓋。

  引用變量sub1被聲明為Base類(lèi)型,Java虛擬機(jī)在執(zhí)行sub1. staticMethod()時(shí),調(diào)用Base類(lèi)的staticMethod()方法,可見(jiàn)父類(lèi)Base的靜態(tài)方法staticMehtod()不能被子類(lèi)覆蓋。

  引用變量sub2被聲明為Sub類(lèi)型,Java虛擬機(jī)在執(zhí)行sub2. staticMethod()時(shí),調(diào)用Sub類(lèi)的staticMethod()方法,Base類(lèi)的staticMehtod()方法被Sub類(lèi)的staticMehtod()方法隱藏。

  (7)父類(lèi)的非靜態(tài)方法不能被子類(lèi)覆蓋為靜態(tài)方法。例如以下代碼是不合法的:

  public class Base {

  void method() { }

  }

  public class Sub extends Base {

  static void method() { } //編譯出錯(cuò)

  }

  (8)父類(lèi)的私有方法不能被子類(lèi)覆蓋。例如在例程6-2中,子類(lèi)Sub中定義了一個(gè)和父類(lèi)Base中的方法同名、參 數(shù)簽名和返回類(lèi)型一致,但訪問(wèn)權(quán)限不一致的方法showMe(),父類(lèi)中showMe()的訪問(wèn)權(quán)限為private,而子類(lèi)中showMe()的訪問(wèn)權(quán) 限為public。盡管這在形式上和覆蓋很相似,但Java虛擬機(jī)對(duì)此有不同的處理機(jī)制。子類(lèi)方法覆蓋父類(lèi)方法的前提是,子類(lèi)必須能繼承父類(lèi)的特定方法, 由于Base類(lèi)的private類(lèi)型的showMe()方法不能被Sub類(lèi)繼承,因此Base類(lèi)的showMe()方法和Sub類(lèi)的showMe()方法 之間并沒(méi)有覆蓋關(guān)系。

  例程6-2 Sub.java

  package privatetest;

  class Base {

  private String showMe() {

  return "Base";

  }

  public void print(){

  System.out.println(showMe()); //到底調(diào)用Base類(lèi)的showMe()還是Sub類(lèi)的showMe()?

  }

  }

  public class Sub extends Base {

  public String showMe(){

  return "Sub";

  }

  public static void main(String args[]){

  Sub sub=new Sub();

  sub.print();

  }

  }

  執(zhí)行以上Sub類(lèi)的main()方法,會(huì)打印出結(jié)果“Base”,這是因?yàn)閜rint()方法在Base類(lèi)中定義,因此print()方法會(huì)調(diào)用在Base類(lèi)中定義的private類(lèi)型的showMe()方法。

  但是如果把Base類(lèi)的showMe()方法改為public類(lèi)型,其他代碼不變:

  public class Base {

  public String showMe() {

  return "Base";

  }

  …

  }

  再執(zhí)行以上Sub類(lèi)的main()方法的代碼,會(huì)打印出結(jié)果“Sub”,這是因?yàn)榇藭r(shí)Sub類(lèi)的showMe()方 法覆蓋了Base類(lèi)的showMe()方法。因此盡管print()方法在Base類(lèi)中定義,Java虛擬機(jī)還是會(huì)調(diào)用當(dāng)前Sub實(shí)例的showMe() 方法。

  (9)父類(lèi)的抽象方法可以被子類(lèi)通過(guò)兩種途徑覆蓋:一是子類(lèi)實(shí)現(xiàn)父類(lèi)的抽象方法;二是子類(lèi)重新聲明父類(lèi)的抽象方法。例如以下代碼合法:

  public abstract class Base {

  abstract void method1();

  abstract void method2();

  }

  public abstract class Sub extends Base {

  public void method1(){…} //實(shí)現(xiàn)method1()方法,并且擴(kuò)大訪問(wèn)權(quán)限

  public abstract void method2(); //重新聲明method2()方法,僅僅擴(kuò)大訪問(wèn)權(quán)限,但不實(shí)現(xiàn)

  Tips

  狹義的理解,覆蓋僅指子類(lèi)覆蓋父類(lèi)的具體方法,即非抽象方法,在父類(lèi)中提供了方法的默認(rèn)實(shí)現(xiàn)方式,而子類(lèi)采用不同的實(shí)現(xiàn)方式。在本書(shū)中,為了敘述方便,把子類(lèi)實(shí)現(xiàn)父類(lèi)的抽象方法也看做方法覆蓋。

  例如以下代碼不合法:

  public abstract class Base {

  abstract void method1();

  abstract void method2();

  }

  public abstract class Sub extends Base {

  private void method1(){…} //編譯出錯(cuò),不能縮小訪問(wèn)權(quán)限

  private abstract void method2(); //編譯出錯(cuò),不能縮小訪問(wèn)權(quán)限

  }

  (10)父類(lèi)的非抽象方法可以被覆蓋為抽象方法。例如以下代碼合法:

  public class Base {

  void method(){ }

  }

  public abstract class Sub extends Base {

  public abstract void method(); //合法

  }

  圖6-2 Sub類(lèi)繼承Base類(lèi)

  在本書(shū)提供的UML類(lèi)框圖中,在子類(lèi)中只會(huì)顯示子類(lèi)特有的方法及覆蓋父類(lèi)的方法,而不會(huì)顯示直接從父類(lèi)中繼承的方 法。例如,圖6-2表明Base類(lèi)是抽象類(lèi)(Base名字用斜體字表示),method1()為抽象方法(method1名字用斜體字表 示),method2()和method3()為具體方法。Sub類(lèi)是Base類(lèi)的子類(lèi),Sub類(lèi)實(shí)現(xiàn)了Base類(lèi)的method1()方法,覆蓋了 Base類(lèi)的method2()方法,直接繼承Base類(lèi)的method3()方法,此外Sub類(lèi)還有自己的method4()方法。

  方法覆蓋與方法重載的異同

  方法覆蓋和方法重載具有以下相同點(diǎn):

  ·都要求方法同名。

  ·都可以用于抽象方法和非抽象方法之間。

  ·方法覆蓋和方法重載具有以下不同點(diǎn):

  ·方法覆蓋要求參數(shù)簽名必須一致,而方法重載要求參數(shù)簽名必須不一致。

  · 方法覆蓋要求返回類(lèi)型必須一致,而方法重載對(duì)此不做限制。

  ·方法覆蓋只能用于子類(lèi)覆蓋父類(lèi)的方法,方法重載用于同一個(gè)類(lèi)的所有方法(包括從父類(lèi)中繼承而來(lái)的方法)。

  ·方法覆蓋對(duì)方法的訪問(wèn)權(quán)限和拋出的異常有特殊的要求,而方法重載在這方面沒(méi)有任何限制。

  ·父類(lèi)的一個(gè)方法只能被子類(lèi)覆蓋一次,而一個(gè)方法在所在的類(lèi)中可以被重載多次。

  以下子類(lèi)Sub覆蓋了父類(lèi)Base的method(int v)方法,并且提供了多種重載方法。

  public class Base{

  protected void method(int v){}

  private void method(String s){} //重載

  }

  public abstract class Sub extends Base {

  public void method(int v){} //覆蓋

  public int method(int v1,int v2){return 0;} //重載

  protected void method(String s) throws Exception{} //重載

  abstract void method(); //重載

【方法重載和方法覆蓋】相關(guān)文章:

方法重載與覆蓋的區(qū)別11-04

方法重載和方法重寫(xiě)的概念和區(qū)別09-06

方法重載的條件09-23

什么是方法重載11-15

方法重載和方法重寫(xiě)的區(qū)別是什么11-16

預(yù)習(xí)方法和學(xué)期預(yù)習(xí)方法10-26

汽車(chē)覆蓋件模具數(shù)控加工方法論文10-13

讀書(shū)方法和心得03-14

讀書(shū)的方法和技巧07-27

預(yù)習(xí)的策略和方法04-23