亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java基礎教程之類型轉換與多態

2019-11-26 15:26:24
字體:
來源:轉載
供稿:網友

我們之前使用類創造新的類型(type),并使用繼承來便利我們創建類的過程。我將在這一講中深入類型,并介紹多態(polymorphism)的概念。

 類型檢查

Java的任意變量和引用經過類型聲明(type declaration),才能使用。我們之前見過對象數據、類數據、方法參數、方法返回值以及方法內部的自動變量,它們都需要聲明其類型。Java是一種強類型(strongly typing)語言,它會對類型進行檢查。如果我們錯誤的使用類型,將造成錯誤。

 類型不符,賣萌無效

 比如在下面的Test類中,我們將一個Cup類對象賦予給aPerson類引用:

public class Test{  public static void main(String[] args)  {    Human aPerson;          aPerson = new Cup();     }}class Human{    /**   * constructor   */  public Human(int h)  {    this.height = h;  }  /**   * accessor   */  public int getHeight()  {    return this.height;  }  /**   * mutator   */  public void growHeight(int h)  {    this.height = this.height + h;  }  private int height;}class Cup {  public void addWater(int w)   {    this.water = this.water + w;  }  public void drinkWater(int w)  {    this.water = this.water - w;  }  private int water = 0;}

javac將返回:

found  : Cuprequired: Human        aPerson = new Cup();                    ^1 error

 基本類型轉換

Java可以對基本類型的變量進行類型轉換。不同的基本類型有不同的長度和存儲范圍。如果我們從一個高精度類型轉換到低精度類型,比如從float轉換到int,那么我們有可能會損失信息。這樣的轉換叫做收縮變換(narrowing conversion)。這種情況下,我們需要顯示的聲明類型轉換,比如:

public class Test{  public static void main(String[] args)  {    int a;    a = (int) 1.23; // narrowing conversion    System.out.println(a);  }}

 如果我們從低精度類型轉換成高精度類型,則不存在信息損失的顧慮。這樣的變換叫做寬松變換(widening conversion)。我們不需要顯示的要求類型轉換,Java可以自動進行:

public class Test{  public static void main(String[] args)  {     int a = 3;    double b;    b = a; // widening conversion    System.out.println(a);  }}

 

基本類型轉換

 upcast與多態

在Java中,引用也可以進行類型轉換,但是有限制。

我們可以將一個衍生類引用轉換為其基類引用,這叫做向上轉換(upcast)或者寬松轉換。下面的BrokenCup類繼承自Cup類,并覆蓋了Cup類中原有的addWater()和drinkWater()方法:

public class Test{  public static void main(String[] args)  {     Cup aCup;    BrokenCup aBrokenCup = new BrokenCup();    aCup = aBrokenCup; // upcast    aCup.addWater(10); // method binding  }}class Cup {  public void addWater(int w)   {    this.water = this.water + w;  }  public void drinkWater(int w)  {    this.water = this.water - w;  }  private int water = 0;}class BrokenCup extends Cup{  public void addWater(int w)   {    System.out.println("shit, broken cup");  }  public void drinkWater(int w)  {    System.out.println("om...num..., no water inside");  }}

程序運行結果:

shit, broken cup

 在上面可以看到,不需要任何顯示說明,我們將衍生類引用aBrokenCup賦予給它的基類引用aCup。類型轉換將由Java自動進行。

我們隨后調用了aCup(我們聲明它為Cup類型)的addWater()方法。盡管aCup是Cup類型的引用,它實際上調用的是BrokenCup的addWater()方法!也就是說,即使我們經過upcast,將引用的類型寬松為其基類,Java依然能正確的識別對象本身的類型,并調用正確的方法。Java可以根據當前狀況,識別對象的真實類型,這叫做多態(polymorphism)。多態是面向對象的一個重要方面。

多態是Java的支持的一種機制,同時也是面向對象的一個重要概念。這提出了一個分類學的問題,既子類對象實際上“是”父類對象。比如一只鳥,也是一個動物;一輛汽車,也必然是一個交通工具。Java告訴我們,一個衍生類對象可以當做一個基類對象使用,而Java會正確的處理這種情況。

比如下面的繼承關系:

 

 我們可以說用杯子(Cup)喝水(drinkWater)。實際上,喝水這個動作具體含義會在衍生類中發生很大變換。比如用吸管喝水,和從一個破杯子喝水,這兩個動作差別會很大,雖然我們抽象中都講“喝水”。我們當然可以針對每個衍生類分別編程,調用不同的drinkWater方法。然而,作為程序員,我們可以對杯子編程,調用Cup的drinkWater()方法,而無論這個杯子是什么樣的衍生類杯子。Java會調用相應的正確方法,正如我們在上面程序中看到的。

看一個更加有意義的例子,我們給Human類增加一個drink()方法,這個方法接收一個杯子對象和一個整數作為參數。整數表示喝水的水量:

public class Test{  public static void main(String[] args)  {    Human guest = new Human();    BrokenCup hisCup = new BrokenCup();    guest.drink(hisCup, 10);  }}class Human {  void drink(Cup aCup, int w)  {    aCup.drinkWater(w);  }}

程序運行結果:

shit, no water inside

 我們在Human類的drink()的定義中,要求第一個參量為Cup類型的引用。但在實際運用時(Test類),將Cup的BrokenCup衍生類對象。這實際上是將hisCup向上轉型稱為Cup類,傳遞給drink()方法。在方法中,我們調用了drinkWater()方法。Java發現這個對象實際上是BrokenCup對象,所以實際調用了BrokenCup的相應方法。

 downcast

我們可以將一個基類引用向下轉型(downcast)成為衍生類的引用,但要求該基類引用所指向的對象,已經是所要downcast的衍生類對象。比如可以將上面的hisCup向上轉型為Cup類引用后,再向下轉型成為BrokenCup類引用。

 Object類型

Java中,所有的類實際上都有一個共同的繼承祖先,即Object類。Object類提供了一些方法,比如toString()。我們可以在自己的類定義中覆蓋這些方法。

Object: 祖先

 我們可以編寫一個操作Object對象的程序,就可以通過upcast,將任意對象傳遞給該程序。

我將在以后深入Object類。

 (多態的實現是依靠RTTI的支持。我將在以后深入。)

 總結

基本類型轉換

polymorphism

downcast

Object

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精国产精品| 久久久精品一区二区| 97精品国产97久久久久久| 精品综合久久久久久97| 91经典在线视频| 国产成+人+综合+亚洲欧洲| 好吊成人免视频| 久久成人精品视频| 91免费高清视频| 欧美性猛交视频| 91精品国产91久久久久久最新| 日本高清不卡在线| 中文字幕精品—区二区| 中文字幕亚洲欧美日韩高清| 国产成人高潮免费观看精品| 国产成人精品电影久久久| 久久久999成人| 色老头一区二区三区在线观看| 久久久久久91香蕉国产| 日韩视频免费在线观看| 国产成人小视频在线观看| 精品福利樱桃av导航| 高跟丝袜一区二区三区| 亚洲高清av在线| 中文字幕亚洲图片| 伊人亚洲福利一区二区三区| 亚洲www视频| 成人写真福利网| 欧美激情一级二级| 成人精品视频在线| 欧美亚洲国产另类| 欧美日韩激情视频8区| 最好看的2019的中文字幕视频| 成人中心免费视频| 欧美在线视频观看免费网站| 国产亚洲欧洲高清| 久久精品国产v日韩v亚洲| 欧美激情高清视频| 91日韩在线视频| 国产精品高潮在线| 亚洲国产一区二区三区在线观看| 亚洲欧美日韩国产中文| 亚洲美女精品成人在线视频| 自拍亚洲一区欧美另类| 欧美极品少妇全裸体| 一区二区成人av| 色与欲影视天天看综合网| 中文字幕久热精品在线视频| 亚洲色图校园春色| 欧美裸体男粗大视频在线观看| 欧美在线亚洲一区| 精品福利一区二区| 国产视频在线观看一区二区| 久久天天躁夜夜躁狠狠躁2022| 2019中文字幕免费视频| 欧美重口另类videos人妖| 免费成人高清视频| 少妇精69xxtheporn| 精品久久久999| 国产综合久久久久| 精品久久久久久久久久久久| 国产狼人综合免费视频| 亚洲国产成人91精品| 亚洲第一在线视频| 欧美美女操人视频| 日韩欧美在线视频| 成人欧美一区二区三区黑人孕妇| 日本在线精品视频| 日韩精品中文在线观看| 日韩av一卡二卡| 精品高清美女精品国产区| 亚洲精品视频网上网址在线观看| 久久精品成人欧美大片古装| 中文国产成人精品久久一| 成人免费在线网址| 日韩精品一区二区三区第95| 在线日韩日本国产亚洲| 久久亚洲精品成人| 国产精品免费福利| 久久这里有精品视频| 久久久精品一区二区三区| 亚洲一区二区久久久久久| 亚洲欧美日韩图片| 亚洲日本成人女熟在线观看| 亚洲欧美日韩高清| 亚洲精品视频在线观看视频| 国产一区二区av| 少妇av一区二区三区| 欧美老女人在线视频| 亚洲午夜小视频| 成人午夜一级二级三级| 视频在线观看一区二区| 国产精品扒开腿做| 伊人青青综合网站| 午夜精品久久久久久99热软件| 97精品国产97久久久久久免费| 国产日韩欧美中文| 国产精品igao视频| 成人国产精品免费视频| 亚洲欧美另类中文字幕| 亚洲最大的免费| 久久久亚洲天堂| 色yeye香蕉凹凸一区二区av| 国产精品成人观看视频国产奇米| 91成品人片a无限观看| 一区二区三区在线播放欧美| 国产精品入口尤物| 亚洲欧美精品伊人久久| 欧美日在线观看| 国产福利精品av综合导导航| 成人精品在线观看| 91系列在线播放| 亚洲电影第1页| 国产成人高潮免费观看精品| 欧美极品美女视频网站在线观看免费| 97国产精品视频人人做人人爱| 亚洲va久久久噜噜噜| 懂色av中文一区二区三区天美| 色噜噜狠狠狠综合曰曰曰| 日韩欧美国产一区二区| 欧洲中文字幕国产精品| 亚洲黄色av网站| 精品少妇v888av| 日韩最新中文字幕电影免费看| 亚洲美女性生活视频| 一本色道久久88亚洲综合88| 98精品国产高清在线xxxx天堂| 在线视频免费一区二区| 欧美大人香蕉在线| 成人www视频在线观看| 亚洲电影成人av99爱色| 欧美精品制服第一页| 日韩欧美aaa| 久久影院模特热| 亚洲xxx自由成熟| 欧美性极品xxxx做受| 日韩欧美在线第一页| 亚州精品天堂中文字幕| 亚洲第一中文字幕| 色婷婷av一区二区三区在线观看| 日韩精品亚洲元码| 久久亚洲欧美日韩精品专区| 91精品久久久久久久久不口人| 亚洲高清一二三区| 国产精品一区二区久久久| 精品动漫一区二区| 久久成人精品视频| 亚洲国产欧美一区二区三区同亚洲| 国产精品热视频| 久久精品视频在线播放| 97超级碰在线看视频免费在线看| 久久久国产一区| 国产不卡精品视男人的天堂| 国产成人精品a视频一区www| 欧美影院在线播放| 色综合久久精品亚洲国产| 亚洲毛片在线免费观看| 精品成人av一区| 日韩成人网免费视频| 久久久国产成人精品| 国产精品影片在线观看| 美日韩在线视频| 亚洲精品免费一区二区三区| 久久久99免费视频|