學(xué)習(xí)啦>知識大全>知識百科>百科知識>

重載和覆蓋的區(qū)別都有哪些

時間: 映芳735 分享

  重載和覆蓋是多態(tài)性的兩大主要表現(xiàn),學(xué)習(xí)代碼的朋友對此可能會有所了解,但是可能理解不深,下面是小編帶來的關(guān)于重載和覆蓋的區(qū)別的內(nèi)容,歡迎大家閱讀!

  重載和覆蓋的區(qū)別

  在同一個類中方法成員的名稱相同,但參數(shù)的類型和個數(shù)不同,這稱為重載。

  在存在繼承關(guān)系的兩個話,子類與父類的方法成員名稱相同、參數(shù)的類型和個數(shù)相同的話,子類的方法覆蓋父類的方法,這稱為覆蓋。

  下面舉個例子說明一下。例如:

  class Shape {

  void draw() {}

  void erase() {}

  }

  class Circle extends Shape {

  void draw() {

  System.out.println("Circle.draw()");

  }

  void erase() {

  System.out.println("Circle.erase()"); }

  }

  class Square extends Shape {

  void draw() {

  System.out.println("Square.draw()");

  }

  void erase() {

  System.out.println("Square.erase()");

  }

  }

  class Triangle extends Shape {

  void draw() {

  System.out.println("Triangle.draw()");

  }

  void erase() {

  System.out.println("Triangle.erase()");

  }

  }

  public class Test {

  public static Shape randShape() {

  switch((int)(Math.random() * 3)) {

  default:

  case 0: return new Circle();

  case 1: return new Square();

  case 2: return new Triangle();

  } }

  public static void main(String[] args) {

  Shape[] s = new Shape[9];

  for(int i = 0; i < s.length; i++)

  s[i] = randShape();

  for(int i = 0; i < s.length; i++)

  s[i].draw();

  }

  }

  輸出結(jié)果

  Triangle.draw()

  Circle.draw()

  Triangle.draw()

  Triangle.draw()

  Triangle.draw()

  Square.draw()

  Square.draw()

  Triangle.draw()

  Circle.draw()

  Triangle.erase()

  Circle.erase()

  Triangle.erase()

  Triangle.erase()

  Triangle.erase()

  Square.erase()

  Square.erase()

  Triangle.erase()

  Circle.erase()

  Press any key to continue...

  又一次執(zhí)行

  Triangle.draw()

  Triangle.draw()

  Circle.draw()

  Circle.draw()

  Circle.draw()

  Triangle.draw()

  Triangle.draw()

  Square.draw()

  Circle.draw()

  Triangle.erase()

  Triangle.erase()

  Circle.erase()

  Circle.erase()

  Circle.erase()

  Triangle.erase()

  Triangle.erase()

  Square.erase()

  Circle.erase()

  Press any key to continue...

  兩次執(zhí)行結(jié)果不同的原因是其中的Math.random()這個類導(dǎo)致的,math.random()得到的數(shù)是0-1之間的隨機(jī)數(shù)。

  不過,最重要的一點區(qū)別是:通過方法重載進(jìn)而實現(xiàn)對象的多態(tài)性。

  方法重載是指功能相同的多個方法使用同一個方法名。同名的多個方法的參數(shù)要有所不同,即在參數(shù)類型,參數(shù)個數(shù)和參數(shù)順序上要有所區(qū)別,以便作為選擇某個方法的根據(jù)。通常只有功能相同的方法進(jìn)行重載才有意義。

  例如:計算兩個數(shù)之和的重載方法定義如下:

  int add(int i,int j)

  {retrun i+j;}

  float add(float i,float j)

  {retrun i+j;}

  double add(double i,double j)

  {retrun i+j;}

  重載方法的選擇通常是在編譯時進(jìn)行。系統(tǒng)根據(jù)不同的參數(shù)類型,個數(shù)或順序,尋找最佳匹配方法.方法類型不參與匹配。

  重載和覆蓋的介紹

  多態(tài)性也是面向?qū)ο蠓椒ǖ囊粋€重要特性.多態(tài)性是指在在程序中出現(xiàn)的"重名"現(xiàn)象,即在一個程序中相同的名字可以表示不同的實現(xiàn).

  在JAVA中,多態(tài)性主要表現(xiàn)在如下兩個方面:

  (1)方法重載.通常指在同一個類中,相同的方法名對應(yīng)著不同的方法實現(xiàn),但是方法的參數(shù)不同.

  (2)成員覆蓋.通常指在不同類(父類和子類)中,允許有相同的變量名,但是數(shù)據(jù)類型不同;也允許有相同的方法名,但是對應(yīng)的方法實現(xiàn)不同.

  在重載的情況下,同一類中具有相同的名字的方法.如何選擇它的方法體呢?不能使用類名來區(qū)分,通常采用不同的方法形參表,區(qū)分重載要求形參在類型,個數(shù)和順序的不同,在定義重載方法時,應(yīng)在方法的形參的類型,個數(shù)和順序有所不同,以便在選擇時能夠區(qū)別開來.

  在覆蓋的情況下,同名的方法存在于不同的類中,在調(diào)用方法只要指明其方法所歸屬的類名就可以了.

  重載與覆蓋的具體例子

  public class Base{

  int a,b;

  public Base(int x,int y){

  a = x;

  b = y;

  }

  public int add(){

  return (a + b);

  }

  public void add(int x,int y){

  int z;

  z = x + y;

  }

  }

  上面這段代碼就是重載的三個特征 :

  1:方法名必須一樣 “add()“。

  2:返回類型可以不一樣 就象是 ”int “和”void“.

  3:參數(shù)可以不一樣 就是add() 和add(int x,int y)這樣的。

  public class Base{

  int x,y;

  public void add(){

  int z;

  z = x + y;

  }

  }

  public class Child extends Base{

  int x,y;

  public void add(){

  int z;

  z = x + y;

  }

  public static void main(string [] args){

  Base b = new Child();

  b.add();

  }

  }

  下面這個例子就是重寫,他實現(xiàn)了多態(tài)。

  重寫的要求是,方法名必須一樣,返回類型必須一樣,傳入的參數(shù)必須一樣。

  在main函數(shù)中定義父類的對象,但是用子類去實例化他,這樣就可以通過父類的對象調(diào)用到子類的方法。

  下面舉個例子,例如:

  public class Parent {

  public int addValue( int a, int b) {

  int s;s = a+b;return s;

  }

  }

  class Child extends Parent {

  }

  Which methods can be added into class Child?

  a int addValue( int a, int b ){// do something...}

  b public void addValue (){// do something...}

  c public int addValue( int a ){// do something...}

  d public int addValue( int a, int b )throws MyException {//do something...}

  答案為B.C

  解釋1:

  a是覆蓋,b ,c是重載。

  a的問題出在訪問權(quán)限上,如果換成public也是可以的。

  d是異常的問題。

  解釋2:

  a的訪問權(quán)限小于父類,所以錯誤,d是異常錯誤,b和c中的addValue方法和父類的方法參數(shù)不同,所以是重載。


猜你感興趣:

1.亞信科技面試題及參考答案

2.C++基礎(chǔ)筆試題及答案

3.重載和覆蓋的區(qū)別

4.C/C++筆試題目

5.Java中覆蓋和重載的區(qū)別

6.java中重寫和重載的區(qū)別

重載和覆蓋的區(qū)別都有哪些

重載和覆蓋是多態(tài)性的兩大主要表現(xiàn),學(xué)習(xí)代碼的朋友對此可能會有所了解,但是可能理解不深,下面是小編帶來的關(guān)于重載和覆蓋的區(qū)別的內(nèi)容,歡迎大家閱讀! 重載和覆蓋的區(qū)別 在同一個類中方法成員的名稱相同,但參數(shù)的類型和個數(shù)不同,這
推薦度:
點擊下載文檔文檔為doc格式

精選文章

  • Java中覆蓋和重載的區(qū)別
    Java中覆蓋和重載的區(qū)別

    對于Java中重載和覆蓋的概念,很多人到現(xiàn)在都是搞不清楚,下面小編舉例給大家講講這兩者的區(qū)別。 一、覆蓋 1 override可以翻譯為覆蓋,從字面就可以知道

  • 重寫和重載的區(qū)別_重寫和重載的不同之處
    重寫和重載的區(qū)別_重寫和重載的不同之處

    在Java中,重寫和重載都是Java多態(tài)性的兩種不同表現(xiàn)形式,這兩者之間的區(qū)別是人們好奇的。下面,小編跟大家講一講重寫和重載的不同之處吧。 重寫的定

  • Java中HashMap和Hashtable之間的區(qū)別
    Java中HashMap和Hashtable之間的區(qū)別

    HashMap和Hashtable是 Java Collection Framework 的兩個重要成員,它們之間存在什么樣的區(qū)別呢?下面學(xué)習(xí)啦小編帶你去了解了解一下。 1、 繼承和實現(xiàn)的區(qū)別 Hashta

  • Java中抽象類與接口的區(qū)別
    Java中抽象類與接口的區(qū)別

    抽象類和接口是Java語言中對于抽象類定義進(jìn)行支持的兩種機(jī)制,正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的面向?qū)ο竽芰?。抽象類和接口之間在對于

537743