2012-10-20 91 views
10

可能重複:
What does it mean to 「program to an interface」?
Interface vs Abstract Class (general OO)困惑JAVA接口

我是新來學習Java,現在我感到困惑的接口。我已經搜索並閱讀了許多材料,但仍不清楚。

當我試圖找到關於接口的一些信息時,我看到很多人談論了接口和抽象類之間的關係。但我甚至不知道他們爲什麼對比這兩個。因爲我認爲抽象類用於告訴其他人你不能創建這個抽象類的對象,如果你想要,你必須修改抽象類。這是關於繼承的事情,對吧?

但我不知道界面的含義。有一個interface a,如果class B要實現接口a,它必須使用保留字class B implements a,然後完成接口所需的所有方法。但是我的問題是,如果B類必須自己完成所有的方法,接口的含義是什麼?我認爲我們不需要它。 我不太瞭解它。我讀了很多句子:「界面可以體現面嚮對象語言的核心思想」,「界面可以幫助程序更輕鬆」等等。但我無法真正理解這個意思。

那麼,有沒有人能告訴我一些例子讓理解界面?或者你可以告訴我一些有用的鏈接或清楚描述界面的書籍。我真的很希望弄明白。謝謝!

+0

它可能有助於探索你更多關於java中的接口:http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – Jimmy

+0

唯一的目的是接口是實現*公共定義的協議行爲*,意味着繼承接口的類必須包含由該接口定義的所有方法是一個規則,或者更具體地說它是該類的協議定義。 (無論如何,你在界面中定義的每件事都必須公開)。 – Lion

回答

7

假設你有一個Car類和Vegetable類,這是在現實生活無關,有一個共同的行爲稱爲wash()。因爲我們也可以洗車和洗菜。但洗車和洗菜是完全不同的過程/行爲。

對於例如:Car應該用你的廚房水槽下面的動力泵Vegetables進行清洗。所以洗滌的方式是不同的。因此,您將洗滌過程作爲wash()的方法在界面中進行,並在CarVegetable類中實施它們。

interface Washable { 

public void wash(); 

} 

public class Car implements Washable { 

public void wash() { 

    // wash the car with a power pump 

} 


} 

public class Vegetable implements Washable { 

public void wash() { 

    // wash the vegetable under a kitchen sink 

} 


} 

作爲一個人,你會想洗車和蔬菜。

public class Person { 


Washable washableObject = new Car(); 

washableObject.wash(); 

washableObject = new Vegetable(); 

washableObject.wash(); 




} 
  1. 所以接口是連接具有共同behavior.But的行爲將受到不同的實現,也可以在將來改變不相關的類的方法。

  2. 有一天你決定改變你洗車的方式。假設你已經購買了「洗車機」。因此,實現在Car類中的方法wash()內發生更改。

    公共類汽車實行水洗{

    public void wash() { 
    
        // wash the car with my new car washing machine !! 
    
    } 
    

    }

但作爲一個人,你還是叫wash()方法。執行wash()方法的方式發生了變化(使用新洗車機清洗汽車),但這種實施變更並未影響您的Person課程。

希望你明白我們爲什麼現在使用interfaces

+0

太棒了!它生動而清晰!謝謝! – lkkeepmoving

+0

是的,非常清楚,容易理解。但爲什麼?我沒有看到任何好處。你知道你正在洗車,因爲你將它實例化爲一輛新車()。你可以有一個名爲Washable的父類,make wash()抽象,並且Car和Vegetables繼承自Washable,實現它們的wash()版本。我錯過了什麼? –

+1

@ScottBiggs想象一下,您有一個帶有方法washAll()的SuperWashMachine類。它收到一個可清洗的數組。你只需要通過數組並調用wash()方法,因爲「契約」表示任何實現Washable的類都知道如何去做。就是這樣,這種方法甚至不需要知道任何汽車,蔬菜或任何特定的類,它只是處理可清洗的東西。爲什麼不使用繼承?那麼,也許這是語義。理想情況下,汽車和蔬菜應該有更多的共同點,除了可以清洗以建立與普通父親的「是」關係。 –

1

基本上,interface是一種完成多重繼承而不需要實現的方法。 (這並不是說Java人員「榨取」了 - 多重繼承是非常混亂且效率低下的。)

這意味着你可以擁有兩個完全分離的類A和B,沒有共同之處除Object以外的祖先,如果它們實現相同的interface,則可以用另一個替代(只要僅引用接口中的方法)。

+0

不完整,但在這裏最好的答案。 –

1

認爲像類和用戶之間的合同接口。當一個類實現一個接口時,它告訴它它承諾提供接口定義的所有方法。

+0

@Ravn壞詞xD對不起。固定。 –

1

假設你理解類的繼承,我認爲接口就像一個骨架類,其中類的結構被描述,但實際上沒有被寫入/實現。

然後,另一個類可以與實現特定接口的任何類一起工作,即使它尚未實現。

例如,某人可能會創建一個名爲Animal的接口。其方法可能是:Talk(),Walk()Eat()。你可以編寫一個Dog類,它實現了Animal,當調用Talk()方法時打印「woof」。因此,另一個類將知道如何使用實現Animal接口的所有類。

UPD

一個很好的現實世界的例子是JDBC數據庫語句接口。這列出了數據庫製造商必須實施的一些必需屬性,例如execute(String sql)。 Oracle將從Postgresql中實現這一點。這允許數據庫被換成另一個,但用戶代碼保持不變。

1

一個簡單的代碼來理解接口和類。

import java.util.List; 
import java.util.ArrayList; 
public class Q01 { 
List<Shape> shapes= new ArrayList(); 

public void add() { 
    shapes.add(new Square(3.0)); 
    shapes.add(new Circle(2.0)); 
} 
public void print() { 
    for (int i = 0; i < shapes.size(); i++) { 
     Shape shape = shapes.get(i); 
     System.out.println(shape.getClass().getSimpleName() + " --->" + shape.getArea()); 
    } 
} 

public static void main(String[] args) { 
    Q01 q01= new Q01(); 
    q01.add(); 
    q01.print(); 
} 

public interface Shape { 
    double getArea(); 
} 

public class Square implements Shape{ 
    private double edge; 

    public Square(double edge) { 
     this.edge = edge; 
    } 
    public double getArea() { 
     return edge*edge; 
    } 
} 
public class Circle implements Shape{ 
    private double radius; 

    public Circle(double radius) { 
     this.radius = radius; 
    } 

    public double getArea() { 
     return 3.14 * radius * radius; 
    } 
} 
} 
+0

在Q01類中,「列表 shapes = new ArrayList();」的類型必須是「列表」?爲什麼? – lkkeepmoving

+0

因爲,我們不知道它究竟是什麼類型。它可能是圓形或方形? – chrome

+0

明白了,謝謝! – lkkeepmoving