电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:43日期:2022-08-26 15:12:54

最近回顧了一下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();//實例化Base對象 b.fun(); //調(diào)用父類中fun()的方法 System.out.println(b.temp);//訪問父類中的成員變量temp /*****************************************************/ System.out.println('/***************/'); Son son = new Son();//實例化Son對象 son.fun(); //調(diào)用son的fun方法 System.out.println(son.temp);//訪問son的成員變量temp Son S_son=new Son(); //實例化Son對象 Base B_s =(Base)S_son; //向上造型-----------相當于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()'); }}

運行結果:

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

結論總結:

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

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

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

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

Base b= new Son();

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

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

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

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

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

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

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

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

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

/** * 接口回調(diào),和向上造型的對比 * @author Character_Painter * */public class Inter extends Father implements Person,Teacher{ public void study(){ System.out.println('學習'); } 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)方法}@Overridepublic void eat() { System.out.println('重寫eat()方法'); }@Overridepublic 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()方法'); }}

運行結果

子類sleep()方法

重寫eat()方法

重寫teache()方法

總結:

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

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

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

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

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

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

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

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

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

public interface Electronics{

}

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

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

public class Thinkpad implements Electronics{ //Thinkpad引導方法 public void boot(){ System.out.println('welcome,I am Thinkpad'); } //使用Thinkpad編程 public void program(){ System.out.println('using Thinkpad program'); }}

新建一個Mouse鼠標類,并實現(xiàn)電子產(chǎn)品接口:

public class Mouse implements Electronics{ //鼠標移動 public void move(){ System.out.println('move the mouse'); } //鼠標點擊 public void onClick(){ System.out.println('a click of the mouse'); }}

新建一個Keyboard鍵盤類,并實現(xiàn)電子產(chǎn)品接口:

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

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

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

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

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

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 方法用來獲取相應的電子產(chǎn)品。

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

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

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

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

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

所以,此時購物車里存放的子類實例對象,由于向上轉(zhuǎn)型成Electronics,已經(jīng)丟失了子類獨有的方法,以上述例子來分析,Thinkpad實例就是丟失了boot() 和program() 這兩個方法,而Mouse實例就是丟失了move()和onClick()這兩個方法

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

接著我們寫一個測試類 Test 去測試購物車里的電子產(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){ //添加進購物車 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鼠標 Mouse mouse = (Mouse)shopcar.getListItem(MOUSE); mouse.move(); mouse.onClick(); System.out.println('-------------------'); //開始測試Keyboard鍵盤 Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD); keyboard.input(); }}

運行截圖:

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

舉個例子分析就好

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

shopcar.getListItem(THINKPAD)

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

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

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

這樣子類實例又重新獲得了因為向上轉(zhuǎn)型而丟失的方法(boot 和program)

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

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

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

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

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

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

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

……

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

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

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

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

標簽: Java
相關文章:
主站蜘蛛池模板: Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 半容积式换热器_北京浮动盘管换热器厂家|北京亿丰上达 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 土壤养分检测仪|土壤水分|土壤紧实度测定仪|土壤墒情监测系统-土壤仪器网 | 驾驶人在线_专业学车门户网站| 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 杭州翻译公司_驾照翻译_专业人工翻译-杭州以琳翻译有限公司官网 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 西门子代理商_西门子变频器总代理-翰粤百科 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 粉碎机_塑料粉碎机_塑料破碎机厂家-星标机械 | 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 山东限矩型液力偶合器_液力耦合器易熔塞厂家-淄博市汇川源机械厂 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 |