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

首頁 > 學院 > 開發設計 > 正文

Java 接口(interface)的作用與好處

2019-11-14 08:44:57
字體:
來源:轉載
供稿:網友

首先提出兩個問題:

一、明明可以在類中直接寫所需的方法,為什么還要多寫一個接口(或抽象類)?二、抽象類和接口都差不多,在什么時候才選擇使用接口?

一、抽象類 為了多態的實現

假設現在有7個類,分別如下: 1. 動物(Animal)抽象類 2. 哺乳動物(Mammal)抽象類 繼承動物類 3. 爬行動物(Reptile)抽象類 繼承動物類 4. 老虎(Tiger) 繼承爬行動物類 5. 蛇類(Snake) 繼承爬行動物類 6. 兔子(Rabbit) 繼承哺乳動物類 7. 農夫(Farmer)農夫可以喂養Animal

1. Animal類

動物都會行走,喝水,代碼如下

abstract class Animal{ public abstract void move(); public abstract void drink();}

2. Mammal類

abstract class Mammal extends Animal{ //繼承動物類的兩個抽象方法,該類為抽象類,不用具體實現}

3. Raptile類

abstract class Raptile extends Animal{ //繼承動物類的兩個抽象方法,該類為抽象類,不用具體實現}

4. Tiger類

public class Tiger extends Mammal{ PRivate static String name = "Tiger"; public String getName(){ return this.name; } public void move(){ System.out.println("Tiger moved to " + destination + "."); } public void drink(){ System.out.println("Tiger down to drink water"); }}

5. Snake類

public class Snake extends Raptile{ private static String name = "Snake"; public String getName(){ return this.name; } public void move(){ System.out.println("Snake moved to " + destination + "."); } public void drink(){ System.out.println("Snake stretched his tongue to drink water"); }}

6. Rabbit類

public class Rabbit extends Mammal{ private static String name = "Rabbit"; public String getName(){ return this.name; } public void move(){ System.out.println("Rabbit moved to " + destination + "."); } public void drink(){ System.out.println("Rabbit put out it's tongue and drink."); }}

7. Farmer類

農夫沒有繼承任何類,但農夫可以給動物喂水喝,而不關心給什么動物喂水喝,也不關心動物們從哪里來。

public class farmer{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination +"."); } public void feedWater(Animal animal, String destination){ this.bringWater(destination); animal.move(destination); animal.drink(); }}

農夫依次去三個地方給三只動物喂水,執行Farmer喂水代碼

public void f(){ Tiger tiger = new Tiger(); Snake snake = new Snake(); Rabbit rabbit = new Rabbit(); Farmer farmer = new Farmer(); farmer.feedWater(tiger, room); farmer.feedWater(snake, grassland); farmer.feedWater(rabbit, kichen);}

執行結果:

[java] Farmer bring water to room. [java] Tiger moved to room. [java] Tiger down to drink water. [java] Farmer bring water to grassland. [java] Snake moved to grassland. [java] Snake stretched his tongue to drink water. [java] Farmer bring water to kichen. [java] Rabbit moved to kichen. [java] Rabbit put out it's tongue and drink.

如果老虎、蛇、兔子沒有繼承抽象類來重寫同一個抽象方法,多態就不能實現 這樣的話,農夫類就要根據參數類型重載多個feedwater()方法,像這樣:

feedwater(Tiger tiger, String destination);feedwater(Snake snake, String destination);...

Tiger、Snake、Rabbit繼承了Raptile、Mammer抽象類,而Raptile、Mammer類繼承基類Animal抽象類,所以Tiger、Snake、Rabbit都向上轉型為Animal類,例如可以把農夫喂水的執行代碼寫成下面這樣:

public void f(){ Animal tiger = new Tiger(); Animal snake = new Snake(); Animal rabbit = new Rabbit(); Farmer farmer = new Farmer(); farmer.feedWater(tiger, room); farmer.feedWater(snake, grassland); farmer.feedWater(rabbit, kichen);}

既然抽象類與接口都能實現多態,那什么時候才需要使用接口呢?

二 、接口的使用

假設現在農夫學會了一個新方法,帶動物讓Tiger和Snake捕食,需要給Tiger、Snake加一個捕食方法hunt(),Rabbit則不需要此方法。 但從以上類中發現,Snake、Tiger繼承于Raptile、Mammer抽象類,Mammer的子類中有Rabbit類,則hunt()方法不能直接寫入Animal類中,因為寫在Animal類中,Animal的所有方法將會直接繼承到子類中,由于Rabbit類用不上hunt()方法,則會造成資源浪費。 現在考慮幾種方案: 1. 直接將hunt()方法寫在各肉食動物的類中         若這樣做,就不能實現多態,每個類中的hunt()方法只能由類對象進行調用,像這樣:

Tiger tiger = new Tiger();tiger.hunt(animal);Snake snake = new Snake();snake.hunt(animal);

        此時農夫類像這樣,需要對Tiger、Snake類方法重載:

class Farmer{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void bringAnimal(Animal a,String destination){ System.out.println("Farmer bring " + a.getName() + " to " + destination + "."); } public void feedWater(Animal animal, String destination){ this.bringWater(destination); animal.move(destination); animal.drink(); } public void feedAnimal(Tiger tiger , Animal animal){ this.bringAnimal(animal,"Feeding Room"); tiger.move("Feeding Room"); tiger.hunt(animal); } public void feedAnimal(Snake snake, Animal animal){ snake.bringAnimal(animal,"Feeding Room"); snake.move("Feeding Room"); snake.hunt(animal); } }

        若有很多會捕食的動物,將需要大量重載,所以這個方案不可以取。 2. 增加 肉食動物 抽象類         如果是加入肉食動物類與非肉食動物類,將會使得類族圖復雜化,因為肉食動物中也有不會捕獵的動物。

這個時候就需要用到接口了。

1. Hunt接口

interface Hunt{ public void hunt(Animal animal);}

定義好了接口之后,直接由Tiger、Snake遵循這個接口,需要用到implements關鍵字:

2. Tiger類

public class Tiger extends Mammal implements Hunt{ private static String name = "Tiger"; public String getName(){ return this.name; } public void move(){ System.out.println("Tiger moved to " + destination + "."); } public void drink(){ System.out.println("Tiger down to drink water"); } public void hunt(Animal animal){ System.out.println("Tiger catched a " + animal.getName() + "and eated it." ) }}

3. Snake類

public class Snake extends Raptile implements Hunt{ private static String name = "Snake"; public String getName(){ return this.name; } public void move(){ System.out.println("Snake moved to " + destination + "."); } public void drink(){ System.out.println("Snake stretched his tongue to drink water"); } public void hunt(Animal animal){ System.out.println("Tiger catched a " + animal.getName() + "and eated it." ) }}

4. Farmer類

public class farmer{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void bringAnimal(Animal a,String destination){ System.out.println("Farmer bring " + a.getName() + " to " + destination + "."); } public void feedWater(Animal animal, String destination){ this.bringWater(destination); animal.move(destination); animal.drink(); } public void feedAnimal(Hunt hunter, Animal animal){ this.bringAnimal(animal,"Feeding Room"); Animal ht = (Animal)hunter; ht.move("Feeding Room"); hunter.hunt(animal); }}

此時接口實現了多態。 接口也成為Java中的多重繼承,在導出類中,如果是從一個非接口的類繼承,那只能繼承這一個類,其余的基元素都必須是接口,需要把所有的接口都置于implements關鍵字之后,用逗號將它們隔開。

現在總結一下文章一開始提出的兩個問題

一、明明可以在類中直接寫所需的方法,為什么還要多寫一個接口(或抽象類)?        1. 減少代碼的書寫(上邊分析的代碼重載)        2. 提高了代碼的可維護性和擴展性。        3. 在團隊合作中,代碼的規范性

二、抽象類和接口都差不多,在什么時候才選擇使用接口?        1. 在當前類族中不是必須的(例如Tuger需要而Rabbit不需要)的方法時        2. 不同類族的多個類需要實現同樣的方法時(接口)

接口還有許多沒有總結的特點,例如泛型接口,總之學會規范使用接口,就會在將來的項目中,有著很大的幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久国产精品免费| 国产精品成人一区| 国产99久久精品一区二区 夜夜躁日日躁| 久久噜噜噜精品国产亚洲综合| 欧美放荡办公室videos4k| 久久久黄色av| 亚洲欧美日韩国产成人| 91精品久久久久久久久久久| 欧美日韩国产成人在线| 亚洲成人亚洲激情| 亚洲人成自拍网站| 国产精品对白刺激| 在线观看日韩专区| 黄色成人在线播放| 成人欧美一区二区三区在线湿哒哒| 96精品久久久久中文字幕| 在线观看精品自拍私拍| 91av视频在线观看| 国产欧美 在线欧美| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲男人天堂2024| 国产丝袜一区二区三区免费视频| 国产精品都在这里| 国产91精品久久久久| 亚洲色图在线观看| 中文字幕免费精品一区| 亚洲国产欧美一区二区三区久久| 日韩av网址在线| 亚洲精品电影在线观看| 91欧美精品午夜性色福利在线| 97香蕉久久夜色精品国产| 91中文字幕在线| 久久九九亚洲综合| 欧美激情一区二区三级高清视频| 美日韩精品免费观看视频| 亚洲精品成a人在线观看| 欧美激情亚洲激情| 一本一本久久a久久精品牛牛影视| 久久97久久97精品免视看| 成人福利在线视频| 成人精品一区二区三区电影免费| 国产成人免费av电影| 国产精品wwwwww| 国产精品视频一区二区高潮| 久久精品夜夜夜夜夜久久| 亚洲视频在线观看| 懂色av中文一区二区三区天美| 国产精品久久久久久久久久新婚| 国产伊人精品在线| 亚洲人成毛片在线播放| 日韩久久精品成人| 国产美女精品视频| 国产91露脸中文字幕在线| 国产主播在线一区| 国产在线观看91精品一区| 欧美日韩国产一区二区三区| 欧美猛少妇色xxxxx| 日韩av综合中文字幕| 国产小视频91| 最近2019年手机中文字幕| 久久视频精品在线| 国产美女久久精品香蕉69| 欧美电影免费在线观看| 北条麻妃一区二区在线观看| 欧美性一区二区三区| 456亚洲影院| 欧洲美女免费图片一区| 亚洲欧美日韩中文在线制服| 青青久久av北条麻妃海外网| 亚洲午夜久久久久久久| 69久久夜色精品国产69乱青草| 在线观看国产精品淫| 中文在线资源观看视频网站免费不卡| 国产一区二区三区毛片| 亚洲免费伊人电影在线观看av| 欧美一区二区三区艳史| 亚洲自拍偷拍色片视频| 91色精品视频在线| 欧美综合国产精品久久丁香| 91精品久久久久久久久久另类| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美黑人一区二区三区| 国产精品久久91| 国产精品香蕉在线观看| 97久久伊人激情网| 中文字幕在线观看日韩| 久久久在线免费观看| 欧美成年人视频网站| 欧美日韩国产激情| 久久成人一区二区| 久久精品电影一区二区| 日本在线精品视频| 欧美在线观看www| 国产91在线播放精品91| 精品国产1区2区| 久久精品成人欧美大片| 亚洲国产精彩中文乱码av| 色老头一区二区三区| 日韩欧美999| 欧美日韩国产二区| 91精品久久久久久综合乱菊| 欧美黄色性视频| 性亚洲最疯狂xxxx高清| 91精品啪在线观看麻豆免费| 美女999久久久精品视频| 国产精品日韩欧美综合| 亚洲精品自拍第一页| 亚洲精品国产综合久久| 国产精品日韩在线观看| 亚洲精品中文字幕av| 欧洲s码亚洲m码精品一区| 久久噜噜噜精品国产亚洲综合| 日韩视频第一页| 久久伊人精品天天| 久久天天躁日日躁| 高清欧美电影在线| 精品久久久久久中文字幕一区奶水| 久久99热这里只有精品国产| 欧美自拍视频在线| 在线播放日韩精品| 亚洲摸下面视频| 中文字幕亚洲欧美日韩2019| 国产精品午夜视频| 国精产品一区一区三区有限在线| 欧美国产日产韩国视频| 久久久人成影片一区二区三区观看| 午夜精品美女自拍福到在线| 亚洲高清免费观看高清完整版| 欧美激情亚洲综合一区| 成人免费福利在线| 最新国产成人av网站网址麻豆| 亲爱的老师9免费观看全集电视剧| 麻豆一区二区在线观看| 欧美日韩aaaa| 久久亚洲一区二区三区四区五区高| 97精品国产97久久久久久| 精品伊人久久97| 国产91九色视频| 亚洲男人7777| 久久的精品视频| 国色天香2019中文字幕在线观看| 久久艹在线视频| 亚洲精品久久久久中文字幕二区| 国内外成人免费激情在线视频| 久久99精品视频一区97| 色综合亚洲精品激情狠狠| 欧美精品激情在线| 久久精品青青大伊人av| 91精品久久久久久久久久久久久| 欧美日韩国产精品一区二区三区四区| 亚洲成人a级网| 久久69精品久久久久久国产越南| 深夜福利日韩在线看| 亚洲欧美制服第一页| 亚洲国产精品小视频| 亚洲欧美日韩久久久久久| 91高潮精品免费porn| 日韩欧美aⅴ综合网站发布| 亚洲精品99999| 日韩动漫免费观看电视剧高清| 久久夜色精品国产| 日韩欧美在线观看| 亚洲国产欧美在线成人app| 欧美高清不卡在线|