最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java中向上造型向下造型和接口回調(diào)中的問題

 更新時(shí)間:2020年08月20日 16:16:19   作者:The best are water  
這篇文章主要介紹了淺談Java中向上造型向下造型和接口回調(diào)中的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

最近回顧了一下java繼承中的問題,下面貼代碼:

public class Base {

 protected String temp = "base";
 public void fun(){
 System.out.print("BASE fun()");
 }

 public static void main(String[] args) {
 Base b =new Base();//實(shí)例化Base對象
 b.fun();   //調(diào)用父類中fun()的方法
 System.out.println(b.temp);//訪問父類中的成員變量temp 
 
    /*****************************************************/ 
 System.out.println("/***************/");
 Son son = new Son();//實(shí)例化Son對象
 son.fun();  //調(diào)用son的fun方法
 System.out.println(son.temp);//訪問son的成員變量temp
 
 Son S_son=new Son();    //實(shí)例化Son對象
 Base B_s =(Base)S_son;   //向上造型-----------相當(dāng)于Base s =new Son();
 B_s.fun();      //調(diào)用子類的fun()方法
 System.out.println(B_s.temp);//訪問父類的成員變量temp 
 
    /******************************************************/
 System.out.println("/***************/");
 Base s =new Son();//向上造型
 s.fun();     //調(diào)用子類的方法
 System.out.println(s.temp);//調(diào)用父類的成員變量temp
 
 Base ba =new Son();
 Son so = (Son)ba;      //向下造型
 so.fun();       //調(diào)用子類的fun()方法
 System.out.println(so.temp);//訪問子類的成員變量temp 
 }
}
class Son extends Base{
 protected String temp = "Son";
 public void fun(){
 System.out.print("SON fun()");
 }
}

運(yùn)行結(jié)果:

BASE fun()base
/***************/
SON fun()Son
SON fun()base
/***************/
SON fun()base
SON fun()Son

結(jié)論總結(jié):

1、父類的引用變量可以指向子類對象,子類的引用變量不能指向父類對象。

2、向上造型(upcasting):把子類對象直接賦給父類引用,向上轉(zhuǎn)型不用強(qiáng)制轉(zhuǎn)型。如:

Base base = new Son(); 向上造型–隱式

3、向下造型(downcasting):把指向子類對象的父類引用賦給子類引用,要強(qiáng)制轉(zhuǎn)型。

Base b= new Son();

Son s = (Son)base;----------向下造型–必須強(qiáng)制轉(zhuǎn)換,且必須有繼承關(guān)系

4、upcasting 會丟失子類特有的方法,但是子類overriding 父類的方法,子類對象去 調(diào)用方法有效

5、調(diào)用方法或成員變量的規(guī)律:

前提:子類存在重寫方法,父類和子類中同時(shí)有相同名稱的成員變量。

(1)當(dāng)進(jìn)行了向上造型的引用型變量—父類引用變量只能調(diào)用子類的重寫方法,但父類的引用變量只能訪問父類中的成員變量

(2)當(dāng)進(jìn)行了向下造型的引用型變量—子類引用變量只調(diào)用子類重寫方法,子類的引用變量只能訪問子類的成員變量。

(3)自己想了個(gè)通俗的說法,調(diào)用方法,得當(dāng)前的引用變量指向的對象;調(diào)用變量,得看當(dāng)前引用變量的類型。

即,調(diào)方法,看對象,調(diào)變量,看類型。(可以試驗(yàn)一下)

接口回調(diào)與向上造型

/**
 * 接口回調(diào),和向上造型的對比
 * @author Character_Painter
 *
 */
public class Inter extends Father implements Person,Teacher{
 public void study(){
 System.out.println("學(xué)習(xí)");
 }
 public void sleep(){
 System.out.println("子類sleep()方法");
 }
 
public static void main(String[] args) {
 Father f = new Inter();
 f.sleep();//向上轉(zhuǎn)型---調(diào)用
 
 Person p=new Inter();
 p.eat(); //接口回調(diào)方法
 
 Teacher t = new Inter();
 t.teach(); //接口回調(diào)方法

}

@Override
public void eat() {
 System.out.println("重寫eat()方法"); 
}

@Override
public void teach() {
 System.out.println("重寫teache()方法"); 
 
}

}
 
interface Person{
 public void eat();
}
interface Teacher{
 public void teach();
}
class Father{
 public void sleep(){
 System.out.println("父類sleep()方法");
 }
}

運(yùn)行結(jié)果

子類sleep()方法

重寫eat()方法

重寫teache()方法

總結(jié):

使用接口方式,其目的應(yīng)該是實(shí)現(xiàn)多個(gè)父類型的方法實(shí)現(xiàn),強(qiáng)調(diào)一個(gè)多種實(shí)現(xiàn),而向上造型,針對的是一對一的繼承關(guān)系,向上造型后,可以調(diào)用子類的重寫的方法。這就是我認(rèn)為他們的區(qū)別。

補(bǔ)充知識:Java向下轉(zhuǎn)型的意義與塑型的三個(gè)方面

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

其實(shí)向上轉(zhuǎn)型和向下轉(zhuǎn)型都是很重要的,可能我們平時(shí)見向上轉(zhuǎn)型多一點(diǎn),向上轉(zhuǎn)型也比較好理解。

但是向下轉(zhuǎn)型,會不會覺得很傻,我是要用子類實(shí)例對象,先是生成子類實(shí)例賦值給父類引用,在將父類引用向下強(qiáng)轉(zhuǎn)給子類引用,這不是多此一舉嗎?我不向上轉(zhuǎn)型也不向下轉(zhuǎn)型,直接用子類實(shí)例就行了。

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

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

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

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

public interface Electronics{

}

很簡單,什么方法都沒有。

新建一個(gè)Thinkpad筆記本類,并實(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)類,并實(shí)現(xiàn)電子產(chǎn)品接口:

public class Mouse implements Electronics{

  //鼠標(biāo)移動
  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鍵盤類,并實(shí)現(xiàn)電子產(chǎn)品接口:

public class Keyboard implements Electronics{

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

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

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

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

那么,一個(gè)購物車類就出來了,如下:

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 集合是用來存放電子產(chǎn)品的,add 方法用來添加電子產(chǎn)品到購物車,getSize 方法用來獲取存放的電子產(chǎn)品數(shù)量,getListItem 方法用來獲取相應(yīng)的電子產(chǎn)品。

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

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

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

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

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

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

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

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

測試類 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)購物車
    ShopCar shopcar = new ShopCar();
    shopcar.add(new Thinkpad());
    shopcar.add(new Mouse());
    shopcar.add(new Keyboard());

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


    //開始測試thinkpad電腦
    Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
    thinkpad.boot();
    thinkpad.program();

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

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

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

    //開始測試Keyboard鍵盤
    Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD);
    keyboard.input();
  }

}

運(yùn)行截圖:

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

//開始測試thinkpad電腦
Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
thinkpad.boot();
thinkpad.program();

shopcar.getListItem(THINKPAD)

這句代碼是獲取到Electronics類型的實(shí)例。不是Thinkpad的實(shí)例

通過向下轉(zhuǎn)型,賦值給子類引用

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

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

總結(jié)一下吧,很多時(shí)候,我們需要把很多種類的實(shí)例對象,全部扔到一個(gè)集合。(這句話很重要)

在這個(gè)例子里就是把Thinkpad筆記本,Mouse鼠標(biāo),KeyBoard鍵盤等實(shí)例對象,全部扔到一個(gè)Shopcar購物車集合。

但是肯定不可能給他們每個(gè)種類都用一個(gè)獨(dú)立的集合去存放吧,這個(gè)時(shí)候我們應(yīng)該尋找到一個(gè)標(biāo)準(zhǔn),接口就是一個(gè)標(biāo)準(zhǔn)。這些都是各種電子產(chǎn)品,抽象成電子產(chǎn)品。然后一個(gè)Electronics接口就出來了。

在回到剛才,我們把很多種類的實(shí)例對象全部扔到一個(gè)集合。或許這樣比較好理解:把很多種類的子類實(shí)例對象全部扔到存放父類實(shí)例的集合。

經(jīng)過了這個(gè)過程,子類實(shí)例已經(jīng)賦值給了父類引用(即完成了向上轉(zhuǎn)型),但很遺憾的丟失了子類擴(kuò)展的方法。

很好的是Java語言有個(gè)向下轉(zhuǎn)型的特性,讓我們可以重新獲得丟失的方法,即強(qiáng)轉(zhuǎn)回子類

所以我們需要用到子類實(shí)例的時(shí)候,就從那個(gè)父類集合里拿出來向下轉(zhuǎn)型就可以了,一樣可以使用子類實(shí)例對象

……

我在搜索java向下轉(zhuǎn)型的意義時(shí),得到一個(gè)比較好的答案是這樣的:

最大的用處是java的泛型編程,用處很大,Java的集合類都是這樣的。

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

以上這篇淺談Java中向上造型向下造型和接口回調(diào)中的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)例精煉掌握語法

    Java實(shí)例精煉掌握語法

    本章節(jié)我們將為大家介紹?Java?實(shí)現(xiàn)幾大基礎(chǔ)問題,通過實(shí)例學(xué)習(xí)我們可以更快的掌握?Java?的應(yīng)用,感興趣的朋友來看看吧
    2022-04-04
  • java文件下載代碼實(shí)例(單文件下載和多文件打包下載)

    java文件下載代碼實(shí)例(單文件下載和多文件打包下載)

    這篇文章主要介紹了java文件下載代碼實(shí)例(單文件下載和多文件打包下載),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Springboot線程池并發(fā)處理數(shù)據(jù)優(yōu)化方式

    Springboot線程池并發(fā)處理數(shù)據(jù)優(yōu)化方式

    這篇文章主要介紹了Springboot線程池并發(fā)處理數(shù)據(jù)優(yōu)化方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JSON Web Token(JWT)原理入門教程詳解

    JSON Web Token(JWT)原理入門教程詳解

    這篇文章主要為大家介紹了JSON Web Token(JWT)原理入門教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Java JConsole遠(yuǎn)程連接配置案例詳解

    Java JConsole遠(yuǎn)程連接配置案例詳解

    這篇文章主要介紹了Java JConsole遠(yuǎn)程連接配置案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用

    舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用,裝飾者模式就是給一個(gè)對象動態(tài)的添加新的功能,裝飾者和被裝飾者實(shí)現(xiàn)同一個(gè)接口,裝飾者持有被裝飾者的實(shí)例,需要的朋友可以參考下
    2016-05-05
  • 詳解java接口基礎(chǔ)知識附思維導(dǎo)圖

    詳解java接口基礎(chǔ)知識附思維導(dǎo)圖

    這篇文章主要介紹了java接口基礎(chǔ)知識,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • springboot tomcat最大線程數(shù)與最大連接數(shù)解析

    springboot tomcat最大線程數(shù)與最大連接數(shù)解析

    這篇文章主要介紹了springboot tomcat最大線程數(shù)與最大連接數(shù)解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記

    Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記

    這篇文章主要介紹了Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記,SSH是指Struts和Spring以及Hibernate的框架搭配,需要的朋友可以參考下
    2015-12-12
  • Spring@Value使用獲取配置信息為null的操作

    Spring@Value使用獲取配置信息為null的操作

    這篇文章主要介紹了Spring@Value使用獲取配置信息為null的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

泉州市| 吴桥县| 景东| 项城市| 达尔| 芦山县| 龙胜| 太和县| 三穗县| 东乌珠穆沁旗| 海淀区| 绥江县| 石棉县| 宜州市| 蒲江县| 台前县| 宣恩县| 商河县| 铜鼓县| 工布江达县| 光山县| 南通市| 黄大仙区| 霍林郭勒市| 集贤县| 威宁| 彰化市| 岑巩县| 锡林浩特市| 巴彦淖尔市| 丹巴县| 洪洞县| 松滋市| 绥德县| 汉沽区| 莱阳市| 吉首市| 绥江县| 钟山县| 泸定县| 怀集县|