2014-10-29 64 views
1

我對Java接口和繼承有一個非常基本的疑問。 假設我有兩個類A和B和一個接口下用下面的定義Java接口和繼承

interface C{ 
public void check(); 
} 

class A implements C{ 
public void check(){ 
    System.out.println("A"); 
} 
} 

class B extends A implements C{ 

// Is the following method overriding the method from class A or implementing the method from C? 
public void check(){ 
    System.out.println("B"); 
} 

} 

我感到困惑的是無論是壓倒或實施檢查()方法在B類?

+3

這是兩個。'B'中的方法'check'在接口'C'中實現該方法,但它覆蓋了超類'A'中的現有實現。 – 2014-10-29 08:14:01

回答

8

它既確實又不互相排斥。接口的目的是定義一個應該在實現類中可用的方法簽名。

你應該用@Override註解該方法,但它只是一個很好的形式,因爲它明確表示它來自基類,它會防止你意外錯別字。

2

它既是超越又是實施。

4

正如@Jeroen Vannevel和@EJP上面提到的那樣,它既是壓倒一切的,也是一種實現。

爲了理解這一點,我認爲你需要在編譯/運行時間的環境中看到它。

您有以下可能的方案:

C c = new B(); 
c.check(); 

編譯時看到C#check()運行你(你可以用你的IDE來把你帶到c.check()指向)看到覆蓋B#check()

A a = new B(); 
a.check(); 

編譯時你看A#check()(你可以用你的IDE來把你帶到c.check()指向)在運行看到覆蓋B#check()

B b = new B(); 
b.check(); 

編譯時看到B#check()(你可以用你的IDE讓你在那裏c.check()在運行指向),你看到的覆蓋B#check()

如果您或者直接通過方法調用的方法:

someMethod(new B().check()) 

那麼這相當於在過去的上述情況

0

在您的例子:

class B extends A implements C{ 

// Is the following method overriding the method from class A or implementing the method from C? 
public void check(){ 
    System.out.println("B"); 
} 

} 

你定義在C接口的檢查方法爲:

public void check(){ 
    System.out.println("B"); 

你被允許做到這一點,因爲接口在創建接口時不包含接口中方法的定義,因此可以一次又一次地使用相似度足以使用調整方法相同。