2016-02-16 35 views
0

我一直在研究一些東西,並且發現了一些關於接口的東西。我認爲這很常見,但我對此很陌生。我只是想確定我所做的是否正確。關於Java中的接口

讓我們假設我有一個接口說B.

interface B {}. 

我有一個實現B. A類

class A implements B { }. 

現在讓我們說我們有一個C級中,我們使用的界面B.

class C { 
    private B b; 

    public void setB(B b) { 
     this.b = b; 
    } 

    public B getB() { 
     return b; 
    } 
} 

我們有另一個測試類,如下所示:

public class TestAll { 
    private final C c = new C(); 
    private final A a = new A(); 
    private final B b = null; 
    void test123(){ 
     c.setB(a);//[1] 
     c.setB(b);//[2]  
    } 
} 

所以現在我的問題是方法調用[1]是正確還是錯誤?如果它是正確的,我相信它是面向對象的概念之一,那是什麼?我很抱歉,如果它是直截了當的,我是新來的所有這些Java的東西。

謝謝。

+5

編譯器可以告訴你這是否正確。 –

+1

你是什麼意思,「正確」?它的工作,它應該工作。 –

+0

你試過這個嗎?有錯誤嗎? – David

回答

1

接口代表了一種抽象的方式來劃分什麼一個類可以做,如何完全類會做,因爲實現了B,這意味着,A類「CAN」做B合同提供什麼接口,因此c.setB(a);//[1]是100%有效。

這種方法「組B(B B)」可以理解爲給我的東西,可以做什麼B酒店,無論多麼

ergo:這是一個有效的方法調用。

第二次調用更明顯,它的工作原理。

0

[1]是正確的。在contra方差原則下,您始終可以將對象作爲參數傳遞到指定對象的類或該類的任何父類的方法中作爲參數。

1

它是正確的,你可以隨時通過一個亞型(A類實現了B)無論你期望繼承類型(B)。

但是,在B類setB()中,您可以將傳遞的參數視爲B(並且無法訪問A類的其他屬性或方法)。

我建議你先用純繼承實現更簡單的實際項目,不用接口和抽象類來掌握這一切。

例如,假設您正在建模一個Pub。在Pub中,有Drinks人類實例可以消耗的東西。

class Drink { 
    String name; 
    double servingSize; 

    public Drink(String name,double servingSize) { 
     this.name=name; 
     this.servingSize=servingSize; 
    } 
} 

class Snaps extends Drink { 
    public Snaps() { 
     super("Finlandia Vodka",0,5); 
    } 
} 

class Human { 
    public void consume(Drink drink) { 
     // do something 
    } 
} 

現在你的問題是人類是否只消耗一個Drink實例,或者也是一個後裔,所以一個Snaps?答案當然是人類可以消耗快照,因爲快照是飲料的後代。一旦人類可以飲用飲料,他就可以飲用任何飲品後代。

我希望它能讓事情變得更容易理解。 :)