• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學(xué)習(xí)啦 > 生活課堂 > 生活小常識 > java重載和多態(tài)的區(qū)別

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

    時間: 志峰887 分享

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

      java重載和多態(tài)有什么不同呢?你知道嗎?下面是學(xué)習(xí)啦小編為大家準(zhǔn)備的java重載和多態(tài)的區(qū)別,希望大家喜歡!

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

      多態(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)用方法只要指明其方法所歸屬的類名就可以了.

      例如

      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之間的隨機數(shù).

      寫到這里,我突然想到了方法重載,那么它和多態(tài),覆蓋有什么區(qū)別呢?

      最重要的一點區(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的問題出在訪問權(quán)限上,如果換成public也是可以的

      d是異常的問題.

      解釋2:

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

      解釋3:

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

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

    1720325 主站蜘蛛池模板: 亚洲熟妇无码爱v在线观看| 国产午夜亚洲精品不卡免下载| 亚洲人成色77777在线观看| 久久久精品久久久久三级| 日本强伦姧人妻一区二区| 四虎国产永久免费久久| www.九色视频| 欧美换爱交换乱理伦片免费观看 | 初尝黑人巨砲波多野结衣| a级毛片免费完整视频| 欧美成人免费高清视频| 国产成人亚洲精品无码车a| 中文字幕人妻中文AV不卡专区| 男女一对一免费视频| 国产精品久久久久久久久久免费 | 性高湖久久久久久久久aaaaa| 亚洲色偷偷综合亚洲av78| 69成人免费视频| 新梅瓶1一5集在线观看| 亚洲视频在线观看一区| 四虎最新紧急更新地址| 我被黑人巨大开嫩苞在线观看| 人妻少妇乱子伦精品| 人与禽交免费网站视频| 成人毛片18女人毛片免费| 亚洲精品v天堂中文字幕| 91精品视频免费| 婷婷五月深深久久精品| 亚洲国产精品一区二区第四页| 花季传媒app免费版网站下载安装 花季传媒下载免费安装app | 美女18毛片免费视频| 国产美女牲交视频| 久久久国产99久久国产久| 狠狠色狠狠色综合日日五| 国产成人精品高清免费| 一区二区三区在线| 欧美三级黄视频| 又大又硬又爽免费视频| www一区二区| 少妇人妻偷人精品一区二区| 亚洲中文字幕久久精品无码a|