一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java多態(tài)的使用注意事項(xiàng)

Java多態(tài)的使用注意事項(xiàng)

2019-10-21 12:03java教程網(wǎng) Java教程

本文講解了什么是JAVA多態(tài)和Java多態(tài)是如何實(shí)現(xiàn)的,在使用Java多態(tài)時(shí)需要注意什么,具體大家看下面的內(nèi)容

Java多態(tài)是如何實(shí)現(xiàn)的?
Java的多態(tài)和C++一樣,是通過(guò)延時(shí)綁定(late binding)或者說(shuō)運(yùn)行時(shí)綁定(runtime binding)來(lái)實(shí)現(xiàn)的。當(dāng)調(diào)用某一個(gè)對(duì)象引用的方法時(shí),因?yàn)榫幾g器并不知道這個(gè)引用到底指向的是變量聲明時(shí)說(shuō)明的類型對(duì)象,還是該類型子類的對(duì)象。因此編譯器無(wú)法為這次調(diào)用綁定到具體的某個(gè)方法。只有通過(guò)java中的運(yùn)行時(shí)類型識(shí)別(RTTI, Runtime type identification)在運(yùn)行時(shí)綁定到具體的方法。下面是一個(gè)具體的例子:

復(fù)制代碼代碼如下:


class shape
{
    public void draw()
    {

 

   print("shape");
    }
}
class triangle extends shape
{
    public void draw()
    {

   print("triangle");
    }
}
public class Polymorphism {
public static void main(String[] args)
{
    shape s=new triangle();
    s.draw();
}


結(jié)果是triangle
s是一個(gè)shape引用,但是在運(yùn)行時(shí)因?yàn)槭莟riangle對(duì)象,所以還是調(diào)用了triangle的draw方法。

 

Java多態(tài)中的一些陷阱

重寫私有方法?
Java里面是不能重寫私有方法的,這個(gè)其實(shí)很好理解,因?yàn)樗接蟹椒ㄔ谧宇愂遣豢梢?jiàn)的。子類沒(méi)有繼承父類的私有方法,更談不上重寫了。因此在子類中的同名方法是一個(gè)全新的方法。

復(fù)制代碼代碼如下:


public class Polymorphism {
    private void show()
    {

 

   print("show parent");
    }
public static void main(String[] args)
{
    Polymorphism p=new privateMethod();
    p.show();
}
}
class privateMethod extends Polymorphism
{
    public void show()
    {

   print("show derived");
    }
}


結(jié)果是 show parent

 

字段和靜態(tài)方法的多態(tài)?
子類可以繼承父類的非私有字段,子類的字段是否也具有多態(tài)性呢?我們來(lái)看一個(gè)實(shí)際的例子:

復(fù)制代碼代碼如下:


class shape
{
    protected int perimeter=1;
    public void draw()
    {

 

   print("shape");
    }
    public int getPerimeter()
    {

   return perimeter;
    }
}
class triangle extends shape
{

int perimeter=3;
    public void draw()
    {

   print("triangle");
    }
    public int getPerimeter()
    {

   return perimeter;
    }
    public int getSuperPerimeter()
    {

   return super.perimeter;
    }
}
public class Polymorphism {

public static void main(String[] args)
{
    shape s=new triangle();
    print("s.perimeter:"+s.perimeter);
    print("s.getperimeter:"+s.getPerimeter());
    triangle t=new triangle();
    print("t.perimeter:"+t.perimeter);
    print("t.getperimeter:"+t.getPerimeter());
    print("t.getsuperperimeter:"+t.getSuperPerimeter());
}
}


以下是運(yùn)行結(jié)果:
Java多態(tài)的使用注意事項(xiàng)
這個(gè)運(yùn)行結(jié)果包含了以下信息:
1.triangle對(duì)象向上轉(zhuǎn)型成shape后字段直接訪問(wèn)都是由編譯器確定的,因此不會(huì)表現(xiàn)出多態(tài)性,返回的是1。
2.triangle對(duì)象向上轉(zhuǎn)型成shape后調(diào)用方法訪問(wèn)字段是根據(jù)運(yùn)行時(shí)對(duì)象類型延時(shí)綁定調(diào)用了triangle的getperimeter方法,返回的是3
3.t對(duì)象中包含了兩個(gè)perimeter字段,一個(gè)來(lái)自于他本身,一個(gè)來(lái)自于他的父類。同時(shí)用字段名去調(diào)用該字段時(shí)默認(rèn)返回的是他本身的perimeter字段,要調(diào)用從父類繼承的該字段,要用super.perimeter的方法。
這個(gè)結(jié)果看起來(lái)多多少少讓人有些疑惑,為了避免這種情況出現(xiàn),我們一般都把字段聲明為private(子類就無(wú)法繼承),同時(shí)我們?cè)谧宇愔新暶鞯淖侄巫詈貌灰c從父類繼承的字段同名。
靜態(tài)方法是沒(méi)有多態(tài)性的,因?yàn)殪o態(tài)方法是和類綁定的,不會(huì)存在不知道具體類型的情況。

 

構(gòu)造函數(shù)的多態(tài)性?
構(gòu)造函數(shù)是不具有多態(tài)性的,因?yàn)闃?gòu)造方法本身是靜態(tài)方法(如果不是的話,就會(huì)陷入雞生蛋,蛋生雞的死循環(huán)了)。要引入我們的問(wèn)題,先來(lái)看一下構(gòu)造函數(shù)的調(diào)用順序。
1.為這個(gè)對(duì)象分配的存儲(chǔ)空間都被初始化為0(對(duì)象初始化為null)
2.父類的構(gòu)造函數(shù)調(diào)用(這樣才能保證在子類的構(gòu)造函數(shù)中訪問(wèn)的字段被初始化)
3.成員變量初始化
4.子類的構(gòu)造函數(shù)調(diào)用

現(xiàn)在假設(shè)如果在第二步中,我們?cè)诟割惖臉?gòu)造函數(shù)里調(diào)用了某個(gè)方法,這個(gè)方法是不是多態(tài)的?還是來(lái)看一個(gè)具體的例子:

復(fù)制代碼代碼如下:


class shape
{
    protected int perimeter=1;
    public shape()
    {

 

   draw();

   print("shape created");
    }
    public void draw()
    {

   print("draw shape "+perimeter);
    }

}
class triangle extends shape
{

int perimeter=3;

public triangle()

{

    print("triangle created");

}
    public void draw()
    {

   print("draw triangle "+perimeter);
    }
    public int getPerimeter()
    {

   return perimeter;
    }
}

public class Polymorphism {

public static void main(String[] args)
{
    shape s=new triangle();
}
}


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

我們可以看到雖然triangle對(duì)象還沒(méi)有構(gòu)造完畢,draw方法仍是動(dòng)態(tài)綁定到了triangle的draw方法。同時(shí)注意到perimeter的值還沒(méi)有初始化為3,而是0。

這樣的結(jié)果就是我們?cè)趖riangle對(duì)象還沒(méi)有被初始化之前就訪問(wèn)了其中的字段。因此我們?cè)趯?shí)際應(yīng)用中要避免在構(gòu)造函數(shù)中調(diào)用其他方法,或者只調(diào)用私有方法(不會(huì)被繼承,因此不會(huì)引發(fā)該問(wèn)題)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99草精品视频 | 青青色综合 | np高h疯狂黄暴宫口 narutomanga玖辛奈之乳 | 教师系列 大桥未久在线 | 香蕉久久ac一区二区三区 | 亚洲区精品久久一区二区三区 | 日韩在线1 | 久久成人亚洲 | 亚洲va国产日韩欧美精品色婷婷 | 五月天精品视频在线观看 | 国产91一区二区在线播放不卡 | 爸爸的宝贝小说全文在线阅读 | 91视频综合网 | 国产资源中文字幕 | 男人j放进女人的p视频免费 | 精品久久久久久综合网 | 成人在线播放 | 双性总裁被调教1v1 双性双根 | free性丰满hd性欧美厨房 | 门房秦大爷在线阅读 | 免费观看无遮挡www的小视频 | 国产动作大片 | 男人狂擦女人的下面视频 | 波多野结衣52部合集在线观看 | 男生操女生漫画 | 亚洲精品视频在线免费 | 被强上后我成瘾了小说 | 农村老少伦小说 | 非洲黑人又大粗gay 非洲黑人bbwbbwbbw | 和两个男人玩3p好爽视频 | 亚洲国产成人99精品激情在线 | 五月激激激综合网色播免费 | 四虎影院在线免费观看视频 | gayxxx视频 | 第一次破学生处破 | 国产成人99精品免费观看 | 精品国产麻豆免费人成网站 | 国产亚洲玖玖玖在线观看 | 亚洲第一男人天堂 | 国产首页精品 | 国产精品久久久久久久久免费 |