interfacePerson{
void eat();
void sleep();
}
class Studentimplements Person{
public void eat(){
System.out.println("學生去食堂吃飯!");
}
public void sleep(){
System.out.println("學生回寢室睡覺!");
}
}
class Teacherimplements Person{
public void eat(){
System.out.println("教師去教工餐廳吃飯!");
}
public void sleep(){
System.out.println("教師回學校公寓睡覺!");
}
}
class Parents implements Person{
publicvoid eat(){
System.out.println("家長去招待所飯館吃飯!");
}
public void sleep(){
System.out.println("家長回招待所睡覺!");
}
}
public class PersonInterface{
public static void main(String[] args)
{
Person p=new Student();
p.eat();
p.sleep();
p=new Teacher();
p.eat();
p.sleep();
p=new Parents();
p.eat();
p.sleep();
}
}
程式執行結果:
學生去食堂吃飯!
學生回寢室睡覺!
教師去教工餐廳吃飯!
教師回學校公寓睡覺!
家長去招待所飯館吃飯!
家長回招待所睡覺!
現在需要添加一些功能,即現在需要添加“外賓、上級領導”兩類角色,并且以后工具需要還要添加相應的身份角色的人進來,此時,只需要根據需要添加“外賓”類、“領導”類,而主類仍然可以拿來就用,無需進行更多的修改。此時就可以顯示出介面的作用了。
在上面的程式中添加如下兩個類即可。
class Foreign implements Person{
publicvoid eat(){
System.out.println("外賓去酒店吃飯!");
}
public void sleep(){
System.out.println("外賓回酒店睡覺!");
}
}
class Leader implements Person{
publicvoid eat(){
System.out.println("領導去賓館吃飯!");
}
public void sleep(){
System.out.println("外賓回賓館睡覺!");
}
}
而主函式中用法仍然一樣。
下面給出完整的代碼:
interfacePerson{
void eat();
void sleep();
}
class Studentimplements Person{
public void eat(){
System.out.println("學生去食堂吃飯!");
}
public void sleep(){
System.out.println("學生回寢室睡覺!");
}
}
class Teacherimplements Person{
public void eat(){
System.out.println("教師去教工餐廳吃飯!");
}
public void sleep(){
System.out.println("教師回學校公寓睡覺!");
}
}
class Parents implements Person{
publicvoid eat(){
System.out.println("家長去招待所飯館吃飯!");
}
public void sleep(){
System.out.println("家長回招待所睡覺!");
}
}
class Foreign implements Person{
publicvoid eat(){
System.out.println("外賓去酒店吃飯!");
}
public void sleep(){
System.out.println("外賓回酒店睡覺!");
}
}
class Leader implements Person{
publicvoid eat(){
System.out.println("領導去賓館吃飯!");
}
public void sleep(){
System.out.println("領導回賓館睡覺!");
}
}
public class PersonInterface{
public static void main(String[] args)
{
Person p=new Student();
p.eat();
p.sleep();
p=new Teacher();
p.eat();
p.sleep();
p=new Parents();
p.eat();
p.sleep();
p=new Foreign();
p.eat();
p.sleep();
p=new Leader();
p.eat();
p.sleep();
}
}
程式執行結果:
學生去食堂吃飯!
學生回寢室睡覺!
教師去教工餐廳吃飯!
教師回學校公寓睡覺!
家長去招待所飯館吃飯!
家長回招待所睡覺!
外賓去酒店吃飯!
外賓回酒店睡覺!
領導去賓館吃飯!
領導回賓館睡覺!
我把介面換成普通類,有物體方法,下面子類繼續重寫,效果一樣,那為什么要介面呢?
uj5u.com熱心網友回復:
比如換成【獸人】,【小龍人】,【死掉的人】呢。吃和睡覺只是2個功能,但具體的,各自實作就好了。
使用方只需要呼叫,根本不管對面是人?神仙?妖怪?
uj5u.com熱心網友回復:
你只需要知道有介面這么一回事就可以了。當你覺得介面是多余的時候,說明這個場景不適合使用介面。
當你遇到需要介面的場景時,你自然就會想起介面。
如果不是造很基礎的輪子(例如:框架、引擎),大多數時候其實確實用不上介面。
假設現在我們來開發游戲。里面有100種裝備(未來還會升級增加更多的新裝備)裝備可以增加主角的HP MP 速度 防御什么的。
假設每種裝備都是不同的類,有裝備E1 E2 E3...
然后主角的裝備放到串列中,list=[e1,e2,e3];
然后我們要讓裝備對主角產生影響
for(E e:list){
e.effect(hero);
}
這時你就會發現E1 E2 E3需要實作介面E,并且E需要有個effect方法。
如果沒有介面并且沒有類的繼承,這代碼完全沒法寫了。
uj5u.com熱心網友回復:
我的意思是把介面改成普通類,效果也是一樣的,都是多型,子類還是自己寫自己的,但最上面那個介面改成了普通類,與介面一樣,只是普通類可以自己寫方法,也就是說最上面的是普通類,下面子類繼承他,多型呼叫和用介面是一樣的效果,所以我問介面比普通類好在哪了
uj5u.com熱心網友回復:
我的意思是把介面改成普通類,效果也是一樣的,都是多型,子類還是自己寫自己的,但最上面那個介面改成了普通類,與介面一樣,只是普通類可以自己寫方法,也就是說最上面的是普通類,下面子類繼承他,多型呼叫和用介面是一樣的效果,所以我問介面比普通類好在哪了
uj5u.com熱心網友回復:
一個類,可以實作多個介面。 但只能有1個基類。
如果有萬能的基類,設計的及其完美,那么不要介面也罷。 但不可能啊。
uj5u.com熱心網友回復:
原來你是這個意思啊。的確哦,從實作上來講,用普通的父類來代替介面沒毛病,在任何情況下都行得通。介面是顯得有點多余。介面的微弱優勢是:
1. 可以防止不小心 new 了個父類來用。
2. 不用寫抽像方法的關鍵字
3. 對于java來說還有很特別的一點,一個類可以實作多個介面,但一個類不允許繼承多個父類。
uj5u.com熱心網友回復:
比如換成【獸人】,【小龍人】,【死掉的人】呢。
吃和睡覺只是2個功能,但具體的,各自實作就好了。
使用方只需要呼叫,根本不管對面是人?神仙?妖怪?
我的意思是把介面改成普通類,效果也是一樣的,都是多型,子類還是自己寫自己的,但最上面那個介面改成了普通類,與介面一樣,只是普通類可以自己寫方法,也就是說最上面的是普通類,下面子類繼承他,多型呼叫和用介面是一樣的效果,所以我問介面比普通類好在哪了
一個類,可以實作多個介面。 但只能有1個基類。
如果有萬能的基類,設計的及其完美,那么不要介面也罷。 但不可能啊。
就這么點優勢啊
uj5u.com熱心網友回復:
原來你是這個意思啊。的確哦,從實作上來講,用普通的父類來代替介面沒毛病,在任何情況下都行得通。介面是顯得有點多余。
介面的微弱優勢是:
1. 可以防止不小心 new 了個父類來用。
2. 不用寫抽像方法的關鍵字
3. 對于java來說還有很特別的一點,一個類可以實作多個介面,但一個類不允許繼承多個父類。
就這么點優勢啊
uj5u.com熱心網友回復:
原來你是這個意思啊。的確哦,從實作上來講,用普通的父類來代替介面沒毛病,在任何情況下都行得通。介面是顯得有點多余。
介面的微弱優勢是:
1. 可以防止不小心 new 了個父類來用。
2. 不用寫抽像方法的關鍵字
3. 對于java來說還有很特別的一點,一個類可以實作多個介面,但一個類不允許繼承多個父類。
就這么點優勢啊
這還不行啊? 給你舉個例子。
你現在實作了一個能吃,能睡的豬,對吧,吃的姿勢,睡得姿勢都實作的非常好。
后來你想,能不能同時養10頭豬呢? 于是你想到了多執行緒? 可是,你的基類可不是繼承執行緒的啊?
怎么辦呢?
a: 自己寫一套執行緒控制,這不太現實,太辛苦了。
b: 讓基類繼承執行緒基類(如果有的話,因為沒介面了)。
搞定。
幾個月后,你的豬能賣了,這是后你發現,想賣豬到A村,必須得使用【賣豬的類A】,他們有一套如何賣的方法。
怎么辦?人家的類,必須是繼承于【賣豬的類A】,否則人家的程式無法運行。
隔壁B村,必須是繼承于【賣豬的類B】,否則人家的程式無法運行。
...
傻眼了吧,你到底是想【繼承】養多頭豬的并發執行緒呢,還是賣豬的類呢?
總結:
如果你一個人玩,想怎么玩,就怎么玩。
如果是多人合作,那么只好使用介面。 你總不能因為【賣豬的類A】還沒做完,你就不【養豬】了吧。你只要實作了標準的【賣豬介面】,管他是A村的還是B村的,統統都能賣。
uj5u.com熱心網友回復:
我是這么理解的 你物件讓你買一瓶闊落,一瓶雪碧,一瓶芬達。可以創建這三個介面,想買哪個就實作哪個介面。要是用類的話,買一瓶闊落是一個類,但是Java給你限制了,你只能拿一次(繼承一個類)。你單買確實沒什么區別,但是你要買可樂雪碧的話,你就只能跟老板說,讓老板給你打包好(創建新類),但是你發現不是買可樂雪碧,而是要買可樂芬達。就又要創建一個了。可樂雪碧芬達就有其中可能了,萬一你物件還可能想要牛奶,礦泉水,奶茶,啤酒等等。那創建的類就太多了uj5u.com熱心網友回復:
當你專案需要滿足多方面需求的時候,你就體會到可以多實作介面的好處跟單繼承的痛苦。小小的優勢也是優勢uj5u.com熱心網友回復:
介面就是定義的方法,實作該介面的類都必須實作這些方法,我覺得這是它的最大的意義。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195566.html
標籤:Java SE
