亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java多態的使用注意事項

2019-11-26 15:54:05
字體:
來源:轉載
供稿:網友

Java多態是如何實現的?
Java的多態和C++一樣,是通過延時綁定(late binding)或者說運行時綁定(runtime binding)來實現的。當調用某一個對象引用的方法時,因為編譯器并不知道這個引用到底指向的是變量聲明時說明的類型對象,還是該類型子類的對象。因此編譯器無法為這次調用綁定到具體的某個方法。只有通過java中的運行時類型識別(RTTI, Runtime type identification)在運行時綁定到具體的方法。下面是一個具體的例子:

復制代碼 代碼如下:

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();
}


結果是triangle
s是一個shape引用,但是在運行時因為是triangle對象,所以還是調用了triangle的draw方法。

Java多態中的一些陷阱

重寫私有方法?
Java里面是不能重寫私有方法的,這個其實很好理解,因為私有方法在子類是不可見的。子類沒有繼承父類的私有方法,更談不上重寫了。因此在子類中的同名方法是一個全新的方法。

復制代碼 代碼如下:

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");
    }
}


結果是 show parent

字段和靜態方法的多態?
子類可以繼承父類的非私有字段,子類的字段是否也具有多態性呢?我們來看一個實際的例子:

復制代碼 代碼如下:

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());
}
}


以下是運行結果:

這個運行結果包含了以下信息:
1.triangle對象向上轉型成shape后字段直接訪問都是由編譯器確定的,因此不會表現出多態性,返回的是1。
2.triangle對象向上轉型成shape后調用方法訪問字段是根據運行時對象類型延時綁定調用了triangle的getperimeter方法,返回的是3
3.t對象中包含了兩個perimeter字段,一個來自于他本身,一個來自于他的父類。同時用字段名去調用該字段時默認返回的是他本身的perimeter字段,要調用從父類繼承的該字段,要用super.perimeter的方法。
這個結果看起來多多少少讓人有些疑惑,為了避免這種情況出現,我們一般都把字段聲明為private(子類就無法繼承),同時我們在子類中聲明的字段最好不要與從父類繼承的字段同名。
靜態方法是沒有多態性的,因為靜態方法是和類綁定的,不會存在不知道具體類型的情況。

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

現在假設如果在第二步中,我們在父類的構造函數里調用了某個方法,這個方法是不是多態的?還是來看一個具體的例子:

復制代碼 代碼如下:

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();
}
}


運行結果:

 

我們可以看到雖然triangle對象還沒有構造完畢,draw方法仍是動態綁定到了triangle的draw方法。同時注意到perimeter的值還沒有初始化為3,而是0。

這樣的結果就是我們在triangle對象還沒有被初始化之前就訪問了其中的字段。因此我們在實際應用中要避免在構造函數中調用其他方法,或者只調用私有方法(不會被繼承,因此不會引發該問題)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人xvideos免费视频| 2018中文字幕一区二区三区| 久久精品国产精品亚洲| 国语自产在线不卡| 成人免费网视频| 九九视频这里只有精品| 久久久这里只有精品视频| 国产精品男女猛烈高潮激情| 亚洲国产精品小视频| 亚洲自拍小视频| 国产色婷婷国产综合在线理论片a| 国产亚洲人成a一在线v站| 91福利视频网| 国产va免费精品高清在线| 亚洲精品在线视频| 亚洲小视频在线观看| 亚洲欧洲日产国码av系列天堂| 超在线视频97| 久久久精品国产网站| 亚洲无限av看| 色爱av美腿丝袜综合粉嫩av| 午夜精品一区二区三区在线视| 久久久久久噜噜噜久久久精品| 黑人巨大精品欧美一区免费视频| 欧美成aaa人片免费看| 久久视频免费观看| 亚洲最新av网址| 九九热这里只有在线精品视| 亚洲精品成人久久| 精品国产一区二区三区久久| 欧美日韩综合视频| 亚洲精品xxxx| 国产精品久久久久久久久久久久久久| 日韩国产欧美精品一区二区三区| 国产精品成人免费电影| 亚洲精品资源美女情侣酒店| 亚洲一区二区在线播放| 浅井舞香一区二区| 色综合久久中文字幕综合网小说| 日韩中文字幕精品视频| 国产精品wwwwww| 欧美激情va永久在线播放| 在线午夜精品自拍| 欧美精品www在线观看| 一本一本久久a久久精品牛牛影视| 日韩国产在线看| 日韩麻豆第一页| 亚洲天天在线日亚洲洲精| 欧美电影在线免费观看网站| 国产丝袜高跟一区| 国产精品第三页| 国产亚洲精品va在线观看| 精品国产一区二区三区久久久| 日韩精品亚洲元码| 动漫精品一区二区| 亚洲精品国产精品自产a区红杏吧| 欧美激情在线狂野欧美精品| 亚洲人成在线一二| 91精品国产91久久久久福利| 国内精品小视频在线观看| 亚洲欧洲一区二区三区久久| 中文字幕无线精品亚洲乱码一区| 日韩成人中文字幕在线观看| 欧美亚洲成人精品| 中文字幕日韩视频| 麻豆一区二区在线观看| 国产日韩在线观看av| 91精品国产91久久久久久不卡| 日韩精品视频免费在线观看| 欧美黄色片视频| 亚洲欧洲一区二区三区在线观看| 亚洲欧美日韩在线一区| 欧美日韩另类在线| 国产精品成人在线| 欧美亚洲在线观看| 成人午夜激情网| 国产精品夜色7777狼人| 国产成人精品综合久久久| 欧洲成人午夜免费大片| 久久综合久久八八| 国产91|九色| 国产精品欧美日韩久久| 国产精品h在线观看| 自拍偷拍亚洲一区| 欧美精品福利视频| 精品国产鲁一鲁一区二区张丽| 久久亚洲精品视频| 草民午夜欧美限制a级福利片| 国产偷亚洲偷欧美偷精品| 菠萝蜜影院一区二区免费| 欧美性黄网官网| 国产一区二区日韩精品欧美精品| 精品国产一区二区三区在线观看| 69国产精品成人在线播放| 国产a∨精品一区二区三区不卡| 国产视频精品久久久| 性色av一区二区三区| 久久影视电视剧免费网站清宫辞电视| 精品国产一区二区三区久久久| 国产日本欧美一区二区三区| 欧美影院成年免费版| 国产一区二区三区在线| 日韩视频中文字幕| 热门国产精品亚洲第一区在线| 菠萝蜜影院一区二区免费| 国产精品成人久久久久| 欧美激情中文网| 午夜精品在线视频| 欧美视频精品一区| 欧美日韩亚洲精品内裤| 久久久精品日本| 在线丨暗呦小u女国产精品| 日韩精品视频在线观看免费| 国产午夜精品视频免费不卡69堂| 国产亚洲在线播放| 国产97在线播放| 欧美丰满片xxx777| 一本一道久久a久久精品逆3p| 亚洲午夜性刺激影院| 国产亚洲美女精品久久久| 亚洲高清一二三区| 国产在线久久久| 在线亚洲男人天堂| 久久精品国产亚洲精品2020| 欧美制服第一页| 亚洲人成在线观| 成人免费xxxxx在线观看| 日本亚洲欧美成人| 国产精品美女免费看| 国产精品99久久久久久白浆小说| 中文字幕精品久久| 久久天天躁狠狠躁夜夜av| 亚洲第一国产精品| 97免费视频在线| 日韩精品极品在线观看播放免费视频| 日韩的一区二区| 久久夜色精品亚洲噜噜国产mv| 国产精品1区2区在线观看| 国产欧美日韩中文字幕在线| 成人在线免费观看视视频| 国产欧亚日韩视频| 国产亚洲成av人片在线观看桃| 国产精品自在线| 91亚洲午夜在线| 在线日韩av观看| 欧美超级免费视 在线| 欧美成人亚洲成人| 日韩高清电影免费观看完整版| 日本高清视频精品| 久久这里有精品| 国产精品久久久久77777| 色偷偷91综合久久噜噜| 亚洲va欧美va在线观看| 久久人91精品久久久久久不卡| 亚洲一区久久久| 日本成人免费在线| 欧美与欧洲交xxxx免费观看| 韩国三级日本三级少妇99| 97高清免费视频| 69精品小视频| 在线播放国产一区中文字幕剧情欧美| 亚洲成年人影院在线| 在线视频欧美性高潮| 欧美人成在线视频|