亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Java向下轉(zhuǎn)型的意義

 更新時(shí)間:2020年02月24日 10:25:23   作者:yinhuanxu  
這篇文章主要介紹了淺談Java向下轉(zhuǎn)型的意義,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一開(kāi)始學(xué)習(xí) Java 時(shí)不重視向下轉(zhuǎn)型。一直搞不清楚向下轉(zhuǎn)型的意義和用途,不清楚其實(shí)就是不會(huì),那開(kāi)發(fā)的過(guò)程肯定也想不到用向下轉(zhuǎn)型。

其實(shí)向上轉(zhuǎn)型和向下轉(zhuǎn)型都是很重要的,可能我們平時(shí)見(jiàn)向上轉(zhuǎn)型多一點(diǎn),向上轉(zhuǎn)型也比較好理解。
但是向下轉(zhuǎn)型,會(huì)不會(huì)覺(jué)得很傻,我是要用子類(lèi)實(shí)例對(duì)象,先是生成子類(lèi)實(shí)例賦值給父類(lèi)引用,在將父類(lèi)引用向下強(qiáng)轉(zhuǎn)給子類(lèi)

引用,這不是多此一舉嗎?我不向上轉(zhuǎn)型也不向下轉(zhuǎn)型,直接用子類(lèi)實(shí)例就行了。

我開(kāi)始學(xué)習(xí)Java時(shí)也是這么想的,這誤區(qū)導(dǎo)致我覺(jué)得向下轉(zhuǎn)型就是沒(méi)用的。

隨著技術(shù)的提升,我在看開(kāi)源的項(xiàng)目學(xué)習(xí),發(fā)現(xiàn)很多地方都用了向下轉(zhuǎn)型的技術(shù),這就讓我重視了起來(lái),想要重新來(lái)復(fù)習(xí)(學(xué)習(xí))這個(gè)知識(shí)點(diǎn)。也是搜索了許多博客文章,但都沒(méi)具體說(shuō)明向下轉(zhuǎn)型,只是給了例子演示怎么使用,反而是向上轉(zhuǎn)型講了一堆(可能是我沒(méi)找到)。

這篇博客就是講向下轉(zhuǎn)型的,那我們就來(lái)學(xué)習(xí)下向下轉(zhuǎn)型,了解下這種特性的意義和使用場(chǎng)景

新建一個(gè)電子產(chǎn)品接口,如下:

public interface Electronics{

}

很簡(jiǎn)單,什么方法都沒(méi)有。

新建一個(gè)Thinkpad筆記本類(lèi),并實(shí)現(xiàn)電子產(chǎn)品接口:

public class Thinkpad implements Electronics{

  //Thinkpad引導(dǎo)方法
  public void boot(){
    System.out.println("welcome,I am Thinkpad");    
  }

  //使用Thinkpad編程 
  public void program(){
    System.out.println("using Thinkpad program");
  }

}

新建一個(gè)Mouse鼠標(biāo)類(lèi),并實(shí)現(xiàn)電子產(chǎn)品接口:

public class Mouse implements Electronics{

  //鼠標(biāo)移動(dòng)
  public void move(){
    System.out.println("move the mouse");    
  }

  //鼠標(biāo)點(diǎn)擊 
  public void onClick(){
    System.out.println("a click of the mouse");
  }
}

新建一個(gè)Keyboard鍵盤(pán)類(lèi),并實(shí)現(xiàn)電子產(chǎn)品接口:

public class Keyboard implements Electronics{

  //使用鍵盤(pán)輸入  
  public void input(){
    System.out.println("using Keyboard input");
  }

}

這里子類(lèi)比較多,是為了更好的理解。每個(gè)類(lèi)的方法的邏輯實(shí)現(xiàn)也很簡(jiǎn)單。打印了一行信息

接下來(lái),我們想象一個(gè)情景:我們?nèi)ド坛琴I(mǎi)電子產(chǎn)品,電子產(chǎn)品很多吧,比如筆記本電腦,鼠標(biāo),鍵盤(pán),步步高點(diǎn)讀機(jī)哪里不會(huì)點(diǎn)哪里,我們用的手機(jī),等等,這些都屬于電子產(chǎn)品。電子產(chǎn)品是抽象的。好,那么我們決定買(mǎi)一臺(tái)Thinkpad,一個(gè)鼠標(biāo)和一個(gè)鍵盤(pán)。

這時(shí),我們需要一個(gè)購(gòu)物車(chē)來(lái)裝這些電子產(chǎn)品吧。我們可以添加進(jìn)購(gòu)物車(chē),然后通過(guò)購(gòu)物車(chē)還能知道存放的電子產(chǎn)品數(shù)量,能拿到對(duì)應(yīng)的電子產(chǎn)品。

那么,一個(gè)購(gòu)物車(chē)類(lèi)就出來(lái)了,如下:

import java.util.ArrayList;
import java.util.List;

public class ShopCar{

  private List<Electronics> mlist = new ArrayList<Electronics>();

  public void add(Electronics electronics){

    mlist.add(electronics);

  }

  public int getSize(){

    return mlist.size();
  }


  public Electronics getListItem(int position){
    return mlist.get(position);

  }
}

List 集合是用來(lái)存放電子產(chǎn)品的,add 方法用來(lái)添加電子產(chǎn)品到購(gòu)物車(chē),getSize 方法用來(lái)獲取存放的電子產(chǎn)品數(shù)量,getListItem 方法用來(lái)獲取相應(yīng)的電子產(chǎn)品。

可以看到 List<Electronics> 用了泛型的知識(shí),至于為什么要用泛型?這個(gè)不做介紹了,泛型很重要的。

而我覺(jué)得比較疑惑的是為什么是放 Electronics 的泛型,而不是放Thinkpad,Mouse,Keyboard,Phone等?

那么如果是List<Thinkpad>,肯定是放不進(jìn)鼠標(biāo)Mouse的吧,難道要生成3個(gè)集合?這里是定義了3個(gè)電子產(chǎn)品類(lèi),但是我如果有100種電子產(chǎn)品呢,要定義100個(gè)集合?

這太可怕了。所以之前,我們寫(xiě)了一個(gè)Electronics接口,提供了一個(gè)Electronics的標(biāo)準(zhǔn),然后讓每一個(gè)Electronics子類(lèi)都去實(shí)現(xiàn)這個(gè)接口。

實(shí)際上這里又涉及到了向上轉(zhuǎn)型的知識(shí)點(diǎn),我們雖然在add 方法將子類(lèi)實(shí)例傳了進(jìn)來(lái)存放,但子類(lèi)實(shí)例在傳進(jìn)去的過(guò)程中也進(jìn)行了向上轉(zhuǎn)型

所以,此時(shí)購(gòu)物車(chē)?yán)锎娣诺淖宇?lèi)實(shí)例對(duì)象,由于向上轉(zhuǎn)型成Electronics,已經(jīng)丟失了子類(lèi)獨(dú)有的方法,以上述例子來(lái)分析,Thinkpad實(shí)例就是丟失了boot() 和program() 這兩個(gè)方法,而Mouse實(shí)例就是丟失了move()和onClick()這兩個(gè)方法

但是實(shí)際使用Thinkpad或Mouse或Keyboard時(shí),這種情況肯定不是我們想要的

接著我們寫(xiě)一個(gè)測(cè)試類(lèi) Test 去測(cè)試購(gòu)物車(chē)?yán)锏碾娮赢a(chǎn)品。

測(cè)試類(lèi) Test 如下:

public class Test{

  public static final int THINKPAD = 0;
  public static final int MOUSE = 1;
  public static final int KEYBOARD = 2;

  public static void main(String[] args){

    //添加進(jìn)購(gòu)物車(chē)
    ShopCar shopcar = new ShopCar();
    shopcar.add(new Thinkpad());
    shopcar.add(new Mouse());
    shopcar.add(new Keyboard());

    //獲取大小
    System.out.println("購(gòu)物車(chē)存放的電子產(chǎn)品數(shù)量為 ——> "+shopcar.getSize());


    //開(kāi)始測(cè)試thinkpad電腦
    Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
    thinkpad.boot();
    thinkpad.program();

    System.out.println("-------------------");

    //開(kāi)始測(cè)試Mouse鼠標(biāo)
    Mouse mouse = (Mouse)shopcar.getListItem(MOUSE);
    mouse.move();
    mouse.onClick();

    System.out.println("-------------------");

    //開(kāi)始測(cè)試Keyboard鍵盤(pán)
    Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD);
    keyboard.input();
  }
}

運(yùn)行截圖:

舉個(gè)例子分析就好

//開(kāi)始測(cè)試thinkpad電腦
Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
thinkpad.boot();
thinkpad.program();

shopcar.getListItem(THINKPAD)這句代碼是獲取到Electronics類(lèi)型的實(shí)例。不是Thinkpad的實(shí)例

通過(guò)向下轉(zhuǎn)型,賦值給子類(lèi)引用

Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);

這樣子類(lèi)實(shí)例又重新獲得了因?yàn)橄蛏限D(zhuǎn)型而丟失的方法(boot 和program)

總結(jié)一下吧,很多時(shí)候,我們需要把很多種類(lèi)的實(shí)例對(duì)象,全部扔到一個(gè)集合。(這句話(huà)很重要)
在這個(gè)例子里就是把Thinkpad筆記本,Mouse鼠標(biāo),KeyBoard鍵盤(pán)等實(shí)例對(duì)象,全部扔到一個(gè)Shopcar購(gòu)物車(chē)集合。
但是肯定不可能給他們每個(gè)種類(lèi)都用一個(gè)獨(dú)立的集合去存放吧,這個(gè)時(shí)候我們應(yīng)該尋找到一個(gè)標(biāo)準(zhǔn),接口就是一個(gè)標(biāo)準(zhǔn)。這些都是各種電子產(chǎn)品,抽象成電子產(chǎn)品。然后一個(gè)Electronics接口就出來(lái)了。
在回到剛才,我們把很多種類(lèi)的實(shí)例對(duì)象全部扔到一個(gè)集合?;蛟S這樣比較好理解:把很多種類(lèi)的子類(lèi)實(shí)例對(duì)象全部扔到存放父類(lèi)實(shí)例的集合。
經(jīng)過(guò)了這個(gè)過(guò)程,子類(lèi)實(shí)例已經(jīng)賦值給了父類(lèi)引用(即完成了向上轉(zhuǎn)型),但很遺憾的丟失了子類(lèi)擴(kuò)展的方法。
很好的是Java語(yǔ)言有個(gè)向下轉(zhuǎn)型的特性,讓我們可以重新獲得丟失的方法,即強(qiáng)轉(zhuǎn)回子類(lèi)
所以我們需要用到子類(lèi)實(shí)例的時(shí)候,就從那個(gè)父類(lèi)集合里拿出來(lái)向下轉(zhuǎn)型就可以了,一樣可以使用子類(lèi)實(shí)例對(duì)象

……

我在搜索java向下轉(zhuǎn)型的意義時(shí),得到一個(gè)比較好的答案是這樣的:
最大的用處是java的泛型編程,用處很大,Java的集合類(lèi)都是這樣的。

而在Android開(kāi)發(fā)中,我們?cè)贚ayout文件夾,用xml寫(xiě)的控件。為什么能在Activity等組件中通過(guò) findViewById() 方法找到呢?為什么 findViewById(R.id.textview) 方法傳入TextView的id后,還要轉(zhuǎn)型為T(mén)extView呢?這就是 Java 向下轉(zhuǎn)型的一個(gè)應(yīng)用

到此這篇關(guān)于淺談Java向下轉(zhuǎn)型的意義的文章就介紹到這了,更多相關(guān)Java 向下轉(zhuǎn)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 利用反射獲取內(nèi)部類(lèi)靜態(tài)成員變量的值操作

    java 利用反射獲取內(nèi)部類(lèi)靜態(tài)成員變量的值操作

    這篇文章主要介紹了java 利用反射獲取內(nèi)部類(lèi)靜態(tài)成員變量的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Spring 中如何根據(jù)環(huán)境切換配置 @Profile

    Spring 中如何根據(jù)環(huán)境切換配置 @Profile

    這篇文章主要介紹了Spring中如何根據(jù)環(huán)境切換配置@Profile的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java線程同步問(wèn)題--哲學(xué)家就餐

    Java線程同步問(wèn)題--哲學(xué)家就餐

    這篇文章主要介紹了Java線程同步問(wèn)題,線程的同步是保證多線程安全訪問(wèn)競(jìng)爭(zhēng)資源的一種手段。線程的同步是Java多線程編程的難點(diǎn),下面文章舉例的方式講解Java線程同步,具有一定的參考價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 關(guān)于Java中HashCode方法的深入理解

    關(guān)于Java中HashCode方法的深入理解

    這篇文章主要給大家介紹了關(guān)于Java中HashCode方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 關(guān)于Java中String類(lèi)字符串的解析

    關(guān)于Java中String類(lèi)字符串的解析

    這篇文章主要介紹有關(guān)Java中String類(lèi)字符串的解析,在java中,和C語(yǔ)言一樣,也有關(guān)于字符串的定義,并且有他自己特有的功能,下面就進(jìn)入主題一起學(xué)習(xí)下面文章內(nèi)容吧
    2021-10-10
  • 200行java代碼實(shí)現(xiàn)2048小游戲

    200行java代碼實(shí)現(xiàn)2048小游戲

    這篇文章主要為大家詳細(xì)介紹了200行java代碼實(shí)現(xiàn)2048小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 詳解Java中兩種分頁(yè)遍歷的使用姿勢(shì)

    詳解Java中兩種分頁(yè)遍歷的使用姿勢(shì)

    這篇文章主要介紹了詳解Java中兩種分頁(yè)遍歷的使用姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java動(dòng)態(tài)替換properties文件中鍵值方式

    Java動(dòng)態(tài)替換properties文件中鍵值方式

    這篇文章主要介紹了Java動(dòng)態(tài)替換properties文件中鍵值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java中final、static關(guān)鍵字與方法的重寫(xiě)和繼承易錯(cuò)點(diǎn)整理

    Java中final、static關(guān)鍵字與方法的重寫(xiě)和繼承易錯(cuò)點(diǎn)整理

    這篇文章主要給大家介紹了關(guān)于Java中final、static關(guān)鍵字與方法的重寫(xiě)和繼承易錯(cuò)點(diǎn)的相關(guān)資料,在Java編程中final關(guān)鍵字用于限制方法或類(lèi)的進(jìn)一步修改,final方法不能被子類(lèi)重寫(xiě),而static方法不可被重寫(xiě),只能被遮蔽,需要的朋友可以參考下
    2024-10-10
  • 基于jstl 標(biāo)簽的使用介紹

    基于jstl 標(biāo)簽的使用介紹

    本篇文章小編為大家介紹,基于jstl 標(biāo)簽的使用介紹,需要的朋友參考下
    2013-04-04

最新評(píng)論