六月丁香五月婷婷,丁香五月婷婷网,欧美激情网站,日本护士xxxx,禁止18岁天天操夜夜操,18岁禁止1000免费,国产福利无码一区色费

學習啦>生活課堂>生活小常識>

重載和多態(tài)的區(qū)別

時間: 志峰887 分享

  重載和多態(tài)一直是不同的,對于剛學java的人來說會比較容易混淆。下面是學習啦小編為大家準備的重載和多態(tài)的區(qū)別,希望大家喜歡!

  重載和多態(tài)的區(qū)別

  多態(tài)性也是面向對象方法的一個重要特性.多態(tài)性是指在在程序中出現(xiàn)的"重名"現(xiàn)象,即在一個程序中相同的名字可以表示不同的實現(xiàn).

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

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

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

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

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

  例如

  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();

  }

  }

  輸出結果

  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í)行結果不同的原因是其中的Math.random()這個類導致的,math.random()得到的數(shù)是0-1之間的隨機數(shù).

  寫到這里,我突然想到了方法重載,那么它和多態(tài),覆蓋有什么區(qū)別呢?到GOOGLE是搜素了一下,不少.

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

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

  例如:計算兩個數(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;}

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

  下面是搜到的一些例子.

  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的問題出在訪問權限上,如果換成public也是可以的

  d是異常的問題.

  解釋2:

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

  解釋3:

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

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

1747674