国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java之旅(9)多態(tài)性

2019-11-18 14:28:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  多態(tài)性是繼數(shù)據(jù)抽象和繼續(xù)后,面向?qū)ο笳Z(yǔ)言的第三個(gè)特征。



綁定(binding)(看起來(lái)到像一個(gè)音譯詞):將方法的調(diào)用連到方法本身被稱為綁定,當(dāng)綁定發(fā)生在程序運(yùn)行之前,被稱做前綁定(earlybinding),而在程序運(yùn)行的時(shí)候根據(jù)對(duì)象的類型來(lái)決定該綁定方法的成為后綁定,也叫運(yùn)行時(shí)綁定(run-time binding)或動(dòng)態(tài)綁定(dynamic binding);java的所有方法都采用后綁定,也就是說(shuō)通常情況下,

你不用考慮是不是該采用后綁定,這一切都是自動(dòng)的。



有一個(gè)經(jīng)典的關(guān)于“外形”的例子,可以生動(dòng)的說(shuō)明什么是后綁定。




在這個(gè)例子中,基類是shape類,它有幾個(gè)派生類:circle, Square, Triangle,

Shape s = new Circle();

這里先創(chuàng)建了一個(gè)Circle對(duì)象,接著把它給了一個(gè)Shape,看上去這樣做有點(diǎn)不妥,不過確是不錯(cuò)的,因?yàn)镃ircle確實(shí)也是個(gè)Shape,接著假設(shè)你調(diào)用了一個(gè)基類的方法

s.draw();
可能你會(huì)認(rèn)為這次調(diào)用的應(yīng)該是shape的draw方法吧,然而不是,它調(diào)用的卻是circle的draw(),這就是因?yàn)閷?shí)現(xiàn)的后綁定的原因。具體的實(shí)現(xiàn)方法就是基類定義了一個(gè)共用的接口――也就是說(shuō)所有的shape都有draw()方法和erase()方法,派生類會(huì)覆寫這兩個(gè)方法從而提供不同的行為。到這里我想為什么不直接寫成:

Circle s = new Circle();

s.draw();

后來(lái)看到作者將這個(gè)例子改動(dòng)成隨機(jī)的創(chuàng)建一個(gè)Circle, Square, Triangle對(duì)象,因?yàn)檫@時(shí)還不知道創(chuàng)建的對(duì)象具體是什么,所以只有像前面的那樣的寫法利用動(dòng)態(tài)綁定才能實(shí)現(xiàn)。



由此我們看到了多態(tài)性的最大優(yōu)勢(shì):可擴(kuò)展性。我們可以根據(jù)需要添加任意個(gè)新的類型,而不用擔(dān)心修改基類里的方法,因此在一個(gè)設(shè)計(jì)良好的OOP程序里,絕大多數(shù)方法都會(huì)和draw()方法一樣,只跟基類接口打交道。這種程序是可擴(kuò)展的,因?yàn)槟憧梢酝ㄟ^“讓新的數(shù)據(jù)類型繼續(xù)通用的基類“的方法來(lái)添加新的功能。而那些與基類接口打交道的方法,根本不需要做修改就能適應(yīng)新的類。



對(duì)程序員來(lái)說(shuō),多態(tài)性是一項(xiàng)非常重要的技術(shù),它能讓你將“會(huì)變的和不會(huì)變的分隔開來(lái)“。



抽象類和抽象方法:要?jiǎng)?chuàng)建像shape類這樣的類對(duì)象是沒有實(shí)際意義的,更何況你可能還要阻止用戶這么做,這樣我們可以使用抽象方法來(lái)解決這個(gè)問題。形如:

abstract void f();
而包含一個(gè)或多個(gè)抽象方法的類就是抽象類(含有抽象方法是必須被定義位抽象類的),抽象類的作用是通過一個(gè)公共的接口來(lái)操控一組類。它的方法就像上面例子里基類的方法一樣,只是樣子貨。而且假如創(chuàng)建一個(gè)抽象類的對(duì)象,編譯器就會(huì)報(bào)錯(cuò)。



假如你繼續(xù)了抽象類,并打算創(chuàng)建該類的對(duì)象,那就必須實(shí)現(xiàn)基類所定義的全部方法,否則有一個(gè)抽象方法存在的話,那么該類還是個(gè)抽象類。



創(chuàng)建一個(gè)不包含抽象方法的抽象類是可以的,這種技巧可以用于“不必創(chuàng)建抽象方法,但又想禁止別人創(chuàng)建這個(gè)類的對(duì)象的場(chǎng)合”。



構(gòu)造函數(shù)總是與眾不同,牽涉到多態(tài)性也不例外。首先研究一個(gè)例子,復(fù)習(xí)一下構(gòu)造函數(shù)的調(diào)用順序先。

///////////////////////////////////////////////////////////////////////////////////

class Meal {
Meal() { System.out.PRintln("Meal()"); }
}
class Bread {
Bread() { System.out.println("Bread()"); }
}
class Cheese {
Cheese() { System.out.println("Cheese()"); }
}
class LettUCe {
Lettuce() { System.out.println("Lettuce()"); }
}
class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}
class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()");}
}

public class Sandwich extends PortableLunch {
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich() {
System.out.println("Sandwich()");
}
public static void main(String[] args) {

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 岐山县| 和硕县| 信阳市| 舒兰市| 灵台县| 丹凤县| 汶川县| 江永县| 南昌市| 香格里拉县| 望都县| 吴旗县| 阿巴嘎旗| 宁明县| 天津市| 镶黄旗| 中阳县| 桃江县| 阿鲁科尔沁旗| 香港 | 富川| 衢州市| 灵寿县| 桐梓县| 闽侯县| 太仆寺旗| 上栗县| 宜昌市| 绥阳县| 喀喇| 沂源县| 堆龙德庆县| 平度市| 郴州市| 讷河市| 隆林| 晋州市| 黑山县| 岳阳县| 甘谷县| 历史|