青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

Java中的向上轉(zhuǎn)型和向下轉(zhuǎn)型

class Useful

{
int value = 20;
public void f() {System.out.println("f() in the Useful class");}
public void g() {System.out.println("g() in the Useful class");}
}

class MoreUseful extends Useful {
int value = 21;
public void f() {System.out.println("f() in the MoreUseful class");}
public void g() {System.out.println("g() in the MoreUseful class");}
public void u() {System.out.println("u() in the MoreUseful class");}
public void v() {}
public void w() {}
}

class MoreUseful2 extends Useful {
int value = 21;
public void f() {System.out.println("f() in the MoreUseful2 class");}
public void g() {System.out.println("g() in the MoreUseful2 class");}
public void u() {System.out.println("u() in the MoreUseful2 class");}
public void v() {}
public void w() {}
}


class ExtendsMoreUseful2 extends MoreUseful2 {
int value = 22;
public void f() {System.out.println("f() in the ExtendsMoreUseful2 class");}
public void g() {System.out.println("g() in the ExtendsMoreUseful2 class");}
public void u() {System.out.println("u() in the ExtendsMoreUseful2 class");}
public void v() {}
public void w() {}
}

public class RTTI {
public static void main(String[] args) {

//Useful useful = new MoreUseful();
//useful.u();   //
這是錯(cuò)誤的,u()方法沒(méi)有在useful類(lèi)型中調(diào)用。

         Useful[] x =
         {
          new Useful(),
          new MoreUseful(),
          new MoreUseful2(),
          new ExtendsMoreUseful2()
          };
//
聲明一個(gè)變量數(shù)組,保存每個(gè)Useful對(duì)象的引用,
             //
那么每一個(gè)Useful對(duì)象就會(huì)自動(dòng)向上轉(zhuǎn)型為Useful

for(int i=0;i<x.length;i++)
{
if(x[i] instanceof MoreUseful2) //
判斷instanceof左邊的對(duì)象是否是右邊的類(lèi)的實(shí)例。
{
   MoreUseful2 moreuseful2 = (MoreUseful2)x[i];//
向下轉(zhuǎn)型(具體解釋見(jiàn)下面的分析)
   moreuseful2.u();
}

x[i].g(); //這是動(dòng)態(tài)綁定,將方法的調(diào)用和方法主體關(guān)聯(lián)起來(lái)就是動(dòng)態(tài)綁定。

}

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

g() in the Useful class        // 由于x[0].g()這一句中調(diào)用g()方法實(shí)際的對(duì)象類(lèi)型是

                                            // 基類(lèi)Useful類(lèi)型,故將調(diào)用基類(lèi)中的f()方法。(沒(méi)有轉(zhuǎn)型)
                             

g() in the MoreUseful class      // 由于x[1].g()這一句中調(diào)用g()方法實(shí)際的對(duì)象類(lèi)型是

                                                   //子類(lèi)Moreuseful類(lèi)型,故將調(diào)用子類(lèi)Moreuseful

                                                  //   覆蓋父 類(lèi)的g()方法。(向上轉(zhuǎn)型)
                                  

u() in the MoreUseful2 class        // 由于x[2]MoreUseful2類(lèi)型,故可以對(duì)其向下轉(zhuǎn)型調(diào)

                                                        // MoreUseful2中的擴(kuò)展方法u()。(向下轉(zhuǎn)型)

g() in the MoreUseful2 class        // x[2].g()這一句中調(diào)用g()方法實(shí)際的對(duì)象類(lèi)型是子

                                                   // 類(lèi)Moreuseful類(lèi)型,故將調(diào)用子類(lèi)Moreuseful
                                                       //  
覆蓋父類(lèi)的g()方法。(向上轉(zhuǎn)型)

u() in the ExtendsMoreUseful2 class     // 由于x[3]ExtendMoreUseful2類(lèi)型,

                                   // 它是MoreUseful2的子類(lèi),存在is-a關(guān)系,故可以對(duì)其向下轉(zhuǎn)

                          // ,將調(diào)ExtendMoreUseful2中的擴(kuò)展的方法u()。(向下轉(zhuǎn)型)

g() in the ExtendsMoreUseful2 class     // x[3].g()這一句中調(diào)用g()方法實(shí)際的對(duì)象類(lèi)型

                                                                   //是子類(lèi)ExtendMoreuseful類(lèi)型故將調(diào)用
                                    //
子類(lèi)ExtendMoreuseful中覆蓋父類(lèi)的g()方法。(向上轉(zhuǎn)型)


分析和結(jié)論:

(一)向上轉(zhuǎn)型

1)定義: 把對(duì)某個(gè)對(duì)象的引用視為對(duì)其基類(lèi)引用的做法被稱(chēng)為向上轉(zhuǎn)型
    
這主要是由于子類(lèi)的對(duì)象可以看成是基類(lèi)的對(duì)象這原因而得來(lái)的,也就是具有is-a關(guān)系。

比如:
     Useful useful = new MoreUseful();//
右邊是一個(gè)子類(lèi)的對(duì)象,而左邊是一個(gè)父類(lèi)類(lèi)型
                                      //
的變量,指向右邊的子類(lèi)對(duì)象。

2)基類(lèi)可以接收發(fā)給導(dǎo)出類(lèi)的任何消息,因?yàn)槎哂型耆嗤慕涌冢覀冎恍枰?span lang="EN-US">

從導(dǎo)出類(lèi)向上轉(zhuǎn)型,永遠(yuǎn)不需要知道正在處理的對(duì)象的確切類(lèi)型,這也就是多態(tài)性決

定的。利用多態(tài)性,具有同樣方法名和方法特征的方法根據(jù)調(diào)用方法的對(duì)象的類(lèi)型,

可以產(chǎn)生不同的動(dòng)作,這極大地增加了程序員的表達(dá)能力。


    
回頭再看一看上面這個(gè)例子中的一段for循環(huán)代碼,

for(int i=0;i<x.length;i++)
{
if(x[i] instanceof MoreUseful2)   //
判斷instanceof左邊的對(duì)象是否是右邊的類(lèi)的實(shí)例。
{
MoreUseful2 moreuseful2 = (MoreUseful2)x[i]; //
向下轉(zhuǎn)型(具體解釋見(jiàn)下面的分析)
moreuseful2.u();
}

x[i].g(); //動(dòng)態(tài)綁定

}
    
主要看x[i].g();這一句話,現(xiàn)在我們還不知道x[i]這個(gè)到底是指代哪一個(gè)Useful對(duì)象,

在這種情況下,編譯器是怎么知道調(diào)用哪個(gè)方法的呢?這是一個(gè)動(dòng)態(tài)綁定的問(wèn)題,見(jiàn)

下面。

(二)動(dòng)態(tài)綁定

1)定義:將方法的調(diào)用和方法主體關(guān)聯(lián)起來(lái)就是動(dòng)態(tài)綁定。

比如:x[i].g();這就是一個(gè)動(dòng)態(tài)綁定,x[i]是一個(gè)對(duì)象類(lèi)型,g()是一個(gè)不知道是屬于

哪個(gè)對(duì)象的方法,將這兩個(gè)兩個(gè)聯(lián)合在一起,就是一個(gè)綁定。

2要注意:Java中除了staticfinal方法(private方法屬于final方法,因?yàn)?span lang="EN-US">fianl方法

不可以覆蓋,static方法是一個(gè)全局方法,屬于所有類(lèi)共享,不在多態(tài)范圍內(nèi))之外,

其他所有的方法都是動(dòng)態(tài)綁定,這就意味著在通常情況下,我們不必判定是否應(yīng)該進(jìn)

行動(dòng)態(tài)綁定,因?yàn)檫@個(gè)會(huì)自動(dòng)發(fā)生。

3)接著上面的答復(fù)。編譯器是怎么知道調(diào)用哪個(gè)方法的呢?

主要還是x[i].g();這一句話的作用,x[i]在調(diào)用方法的時(shí)候,會(huì)調(diào)用實(shí)際的方法,這

個(gè)實(shí)際的方法由所引用的對(duì)象的類(lèi)型決定。那么調(diào)用的實(shí)際方法可能是父類(lèi)中沒(méi)有被

子類(lèi)覆蓋的方法,也可能是子類(lèi)中覆蓋父類(lèi)的方法,主要看調(diào)用這個(gè)方法的實(shí)際的對(duì)

象類(lèi)型是哪一個(gè)。


(三)向下轉(zhuǎn)型

既然有向上轉(zhuǎn)型,那么有沒(méi)有向下轉(zhuǎn)型呢?

答:有

1)概述

繼承可以確保所有的子類(lèi)類(lèi)具有基類(lèi)的接口,且絕對(duì)不會(huì)少。那么子類(lèi)除了有父類(lèi)的

方法,也可以有自己的額外的新方法(這些方法是基類(lèi)所沒(méi)有的),那么一旦向上轉(zhuǎn)

型,就不能調(diào)用子類(lèi)中的新方法,那么能不能用一種方式調(diào)用這些新方法呢?當(dāng)然有

了,這時(shí)候就需要向下轉(zhuǎn)型。

2)向下轉(zhuǎn)型

將超類(lèi)的引用強(qiáng)制轉(zhuǎn)換為子類(lèi)類(lèi)型就叫做向下轉(zhuǎn)型。

注意:將超類(lèi)的引用賦給為子類(lèi)類(lèi)型的變量(沒(méi)有進(jìn)行顯示地強(qiáng)制轉(zhuǎn)換)是一個(gè)編譯

錯(cuò)誤。

例子:

還是上面的for循環(huán)代碼

for(int i=0;i<x.length;i++)
{
if(x[i] instanceof MoreUseful2) //    
判斷instanceof左邊的對(duì)象是否是右邊的類(lèi)的實(shí)例。
{
MoreUseful2 moreuseful2 = (MoreUseful2)x[i]; //
向下轉(zhuǎn)型
moreuseful2.u();
}

x[i].g();

}


分析:x[i]可以代表具體的Useful對(duì)象類(lèi)型,當(dāng)它是MoreUseful2ExtendsMoreUseful2

對(duì)象類(lèi)型時(shí),就可以調(diào)用該對(duì)象的額外方法u(),v(),w()也就是當(dāng)對(duì)象x[i]Moreusful對(duì)

象存在is-a關(guān)系時(shí),才可以進(jìn)行向下轉(zhuǎn)型,如果要轉(zhuǎn)換的對(duì)象類(lèi)型與指定的對(duì)象類(lèi)型不

存在is-a關(guān)系時(shí),會(huì)產(chǎn)生一個(gè)ClassCastException異常。

總之:

向下轉(zhuǎn)型時(shí),對(duì)象只能強(qiáng)制轉(zhuǎn)換為其本身類(lèi)型或者其超類(lèi)類(lèi)型。比如,

當(dāng)x[i]ExtendsMoreUseful2對(duì)象時(shí),可以把他轉(zhuǎn)換為其本身ExtendsMoreUseful2對(duì)象類(lèi)

型,也可以把它轉(zhuǎn)換為其基類(lèi)MoreUseful2類(lèi)型。但是在編譯時(shí)候還不知道這個(gè)x[i]是代

表那個(gè)具體對(duì)象類(lèi)型只知道這個(gè)x[i]是基類(lèi)類(lèi)型引用,所以要用這樣的形式" (想要要得

到的類(lèi)型)x[i] " 進(jìn)行轉(zhuǎn)換。x[i]在這里是就我這個(gè)例子來(lái)說(shuō)明的,你也可以使用其它的

英文代替,其意義是一切符合規(guī)定的需要被轉(zhuǎn)換的對(duì)象。

下面還有個(gè)關(guān)于向上轉(zhuǎn)型和向下轉(zhuǎn)型的例子,

abstract class ClassAbstract1{}
class ClassDerived1 extends ClassAbstract1
{
public void play1()
{
   System.out.println("play1() is in the ClassDerived1");
}
}
abstract class ClassAbstract2{public abstract void play2();}
class ClassDerived2 extends ClassAbstract2
{
public void play2()
{
   System.out.println("play2() is in the ClassDerived2");
}
}


public class E14_UnCast {

public static void playDemo1(ClassAbstract1 ObjectParameter)
{
   ((ClassDerived1)ObjectParameter).play1();//
向下轉(zhuǎn)型,可以調(diào)用導(dǎo)出類(lèi)中的擴(kuò)展方法
}

public static void playDemo2(ClassAbstract2 ObjectParameter)
{
   ObjectParameter.play2();//
向上轉(zhuǎn)型,可以調(diào)用導(dǎo)出類(lèi)中的覆蓋方法
}

/**
* @param args
*/
public static void main(String[] args) {
   // TODO Auto-generated method stub
   ClassAbstract1 classabstract = new ClassDerived1();
   playDemo1(classabstract);
   ClassAbstract2 classabstract2 = new ClassDerived2();
   playDemo2(classabstract2);

}

}


運(yùn)行結(jié)果:
play1() is in the ClassDerived1
play2() is in the ClassDerived2

 

 

posted on 2009-07-27 13:00 肥仔 閱讀(1103) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Web-后臺(tái)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩亚洲在线| 欧美一区二区三区另类| 亚洲一区三区视频在线观看| 亚洲欧洲综合另类| 日韩手机在线导航| 欧美日本三区| 欧美日韩一级视频| 欧美亚洲第一区| 国产精品永久在线| 亚洲午夜久久久| 在线亚洲欧美专区二区| 亚洲少妇诱惑| 欧美制服丝袜第一页| 久久久久国产免费免费| 久久视频一区| 欧美日韩一二三四五区| 国产视频一区三区| 91久久极品少妇xxxxⅹ软件| 亚洲一品av免费观看| 久久三级福利| 亚洲激情在线观看| 亚洲视频一二| 久久久久久久国产| 欧美午夜一区二区三区免费大片 | 一区二区三区四区五区精品视频| 亚洲午夜日本在线观看| 久久精品亚洲一区二区| 欧美啪啪成人vr| 激情久久五月天| 9久草视频在线视频精品| 久久久精彩视频| 日韩亚洲欧美一区二区三区| 欧美在线视频观看免费网站| 欧美日本一道本| 在线精品一区| 亚洲免费视频中文字幕| 欧美成人第一页| 亚洲欧美偷拍卡通变态| 欧美精品一区二区精品网| 国产农村妇女毛片精品久久麻豆| 亚洲精品免费一二三区| 久久精品在线视频| 亚洲综合不卡| 欧美日韩在线视频首页| 亚洲欧洲精品一区二区三区波多野1战4| 欧美一区二区三区婷婷月色 | 亚洲欧美日本国产专区一区| 久久嫩草精品久久久久| 国产日韩精品在线播放| 亚洲亚洲精品三区日韩精品在线视频| 久久色在线观看| 午夜精品一区二区三区在线视| 欧美人与禽猛交乱配| 亚洲精品免费网站| 欧美福利小视频| 蜜桃久久精品乱码一区二区| 伊人久久亚洲美女图片| 久久精品久久综合| 午夜国产精品影院在线观看| 国产精品午夜在线观看| 亚洲综合第一页| 亚洲欧美激情一区| 亚洲免费成人| 欧美日韩国产一区精品一区| 99这里只有精品| 亚洲人成亚洲人成在线观看| 女女同性精品视频| 亚洲精品乱码久久久久久日本蜜臀| 亚洲成人在线视频播放 | 一区二区三区精品| 欧美一级在线视频| 国产乱肥老妇国产一区二| 午夜精品在线| 销魂美女一区二区三区视频在线| 国产精品成人免费精品自在线观看| 一区二区三区欧美| 中文在线资源观看视频网站免费不卡| 欧美日韩一区三区| 亚洲综合欧美日韩| 亚洲免费在线观看视频| 国产亚洲一区二区三区在线观看| 久久精品国产精品亚洲| 久久久噜噜噜久久中文字免 | 久久精品99国产精品| 欧美有码在线观看视频| 狠狠噜噜久久| 亚洲福利视频一区| 欧美视频精品在线| 久久精品亚洲一区二区| 久久精品一区蜜桃臀影院| 亚洲国产精品久久久久久女王| 亚洲大片精品永久免费| 欧美午夜在线观看| 久热爱精品视频线路一| 欧美精品免费在线观看| 欧美一区二区三区免费观看| 久久精品中文字幕免费mv| 亚洲精品极品| 亚洲欧美日韩综合一区| 亚洲精品无人区| 亚洲综合好骚| 亚洲激情二区| 亚洲一级黄色av| 在线成人av| 亚洲香蕉在线观看| 亚洲全黄一级网站| 亚洲综合色婷婷| 亚洲品质自拍| 欧美制服丝袜| 国产精品美女www爽爽爽视频| 久久婷婷色综合| 国产精品盗摄久久久| 欧美国产日韩精品| 国产亚洲欧洲一区高清在线观看| 亚洲人体影院| 欧美日本一区二区高清播放视频| 久久精品国产清高在天天线| 欧美精品一区三区| 欧美成人精品一区| 国产精品亚洲综合一区在线观看| 亚洲国产欧美在线人成| 一区福利视频| 亚洲一区综合| 亚洲主播在线播放| 欧美激情一二三区| 欧美激情视频网站| 精品999网站| 亚洲欧美偷拍卡通变态| 亚洲欧美日韩另类| 国产精品草莓在线免费观看| 亚洲精品一区二区三区婷婷月| 国色天香一区二区| 亚久久调教视频| 久久精品国产69国产精品亚洲 | 亚洲第一成人在线| 欧美资源在线观看| 欧美在线视频免费观看| 国产精品国产亚洲精品看不卡15| 亚洲精品午夜| 日韩午夜在线播放| 欧美日本精品| 99av国产精品欲麻豆| 亚洲免费网站| 国产日韩欧美一区二区三区在线观看| 亚洲一区免费| 久久激情视频| 在线不卡亚洲| 欧美大胆成人| 999亚洲国产精| 欧美一区二区精品在线| 国产亚洲午夜| 老司机免费视频一区二区三区| 免费欧美电影| 亚洲精品小视频在线观看| 欧美精品日本| 亚洲欧美国产三级| 久久免费精品视频| 亚洲激情第一页| 欧美视频你懂的| 午夜精品福利电影| 欧美高清视频一区| 亚洲一区在线观看免费观看电影高清| 国产精品久久久一区二区| 欧美一级视频| 在线观看欧美视频| 欧美日韩精品一区二区三区| 亚洲一区二区三区久久| 久久久久青草大香线综合精品| 91久久综合| 欧美日韩一区国产| 久久精品国产亚洲一区二区三区| 欧美高清不卡| 欧美一区二区三区久久精品茉莉花| 狠狠狠色丁香婷婷综合激情| 鲁大师成人一区二区三区| 日韩视频中文字幕| 久久久综合网站| 在线天堂一区av电影| 国产一区二区三区丝袜| 欧美激情视频网站| 欧美在线综合视频| 洋洋av久久久久久久一区| 久久婷婷蜜乳一本欲蜜臀| 99精品国产热久久91蜜凸| 国产亚洲成精品久久| 亚洲国产精品久久| 午夜一区在线| 日韩亚洲欧美高清| 亚洲欧美一区二区视频| 欧美一区二区三区视频免费播放| 99国产麻豆精品| 欧美激情中文字幕一区二区| 亚洲高清久久网| 欧美激情免费观看| 欧美激情导航| 亚洲欧美一区二区原创| 久久九九99视频| 在线观看不卡av| 日韩视频一区| 激情国产一区|