[問題] 練習遇到有關繼承、介面、抽象類別的問題

看板java作者 (海海海)時間8年前 (2015/09/26 16:39), 8年前編輯推噓2(2015)
留言17則, 4人參與, 最新討論串1/2 (看更多)
最近讀到了介面,所以創了一個名叫Phone 的抽象類別、兩個分別叫SurfInternet 和Chat的介面,但編譯過程一直出現錯誤,說非static的方法不能被static的東西給關 聯,但我就是沒看到有東西被我用成static啊!拜託各位幫幫我。 interface SurfInternet { void SurfInternet(String WebName); } interface Chat { void Chat(String ToWhom); } abstract class Phone { int price; abstract void expensive(); void PrintPrice() { System.out.println("Price="+price); } } class Sony extends Phone implements SurfInternet,Chat { public Sony(int price,String WebName,String ToWhom) { this.price=price;SurfInternet(WebName);Chat(ToWhom); } public void Chat(String ToWhom) { System.out.println("Talking to "+ToWhom); } public void SurfInternet(String WebName) { System.out.println("Surfing "+WebName); } public void expensive() { System.out.println("It is so expensive!"); } } public class Test { public static void main(String[] args) { Sony sony=new Sony(10000,"yahoo","John"); Sony.expensive(); } } 結果: Test.java:42: error: non-static method expensive() cannot be referenced from a static context Sony.expensive(); ^ 1 error 到底~~~﹍﹍ 不知道我有沒有理解錯,介面比抽象類別還要更抽象簡潔,抽象類別是給和自己有關連的東西繼承的, 而介面只是要給他多個功能用而已。然後還是搞不懂這兩個東西到底有什麼實際用途,就算沒有這兩個東西 好像也不會怎樣,難道他們只是用來定義東西的嗎?

09/26 16:57, , 1F
Sony要改成sony
09/26 16:57, 1F

09/26 17:00, , 2F
您真是太神了!眼睛看到脫窗沒發現
09/26 17:00, 2F
那個介面到底是有什麼實際用途呢,看了課本範例: interface IArea { void area(); } class Circle implements IArea{ public void area(){...} } 這樣子和下面這到底差在哪邊? class Circle{ public void area(){...} } 感覺抽象類別和介面很多此一舉啊!現在我只能夠死記有這種寫法﹍ 有神人可以開導我嗎?感謝

09/26 17:21, , 3F
跟Polymorphism有關, 然後也可以拿來實現多重繼承
09/26 17:21, 3F
我現在正是在看介面和多形這邊,但是就算他們繼承了也還是要自己打一遍啊,譬如: interface A{ void A(); } class B implements A{ public void A(BBB); } class C implements A{ public void A(CCC); } 那我有沒有加那個interface做的事情不是都一樣嗎? 同理,抽象類別同樣讓我有這種感覺﹍,還是說他們只是概念上的用途? ※ 編輯: s9209122222 (122.117.207.31), 09/26/2015 17:31:38

09/26 17:48, , 4F
當某個函式需要一個物件有某個函式時
09/26 17:48, 4F

09/26 17:48, , 5F
宣告「我收一個有某函式的物件」這件事即是靠 interface
09/26 17:48, 5F

09/26 17:49, , 6F
以 IArea 跟 Circle 的例子, 一個函式宣告它收 IArea 物件
09/26 17:49, 6F

09/26 17:49, , 7F
即表示它期望傳進來的物件有 area() 函式可以用
09/26 17:49, 7F

09/26 17:50, , 8F
那當你不只有 Circle 實作 IArea 時, 其他實作的 class
09/26 17:50, 8F

09/26 17:50, , 9F
的物件也能交給目標函式使用
09/26 17:50, 9F

09/26 17:51, , 10F
這就是 interface 這東西的精神: "物件要提供的介面"
09/26 17:51, 10F

09/26 17:51, , 11F
(這也是為什麼它會叫做 interface 介面的原因)
09/26 17:51, 11F

09/26 17:52, , 12F
介面跟抽象類別的差別在於介面只宣告我要有什麼介面
09/26 17:52, 12F

09/26 17:52, , 13F
抽象類別除介面外可能提供某幾個介面有預設行為
09/26 17:52, 13F

09/26 17:54, , 14F
好像有點了解了,感謝
09/26 17:54, 14F

09/26 17:55, , 15F
那各位在寫程式的時候都是先定好interface後再寫其他
09/26 17:55, 15F

09/26 17:55, , 16F
的嗎?
09/26 17:55, 16F

09/27 16:56, , 17F
interface == abstract class without properties
09/27 16:56, 17F
文章代碼(AID): #1M1bccyi (java)
文章代碼(AID): #1M1bccyi (java)