[英]Java Interfaces and inheritance
我對Java接口和繼承有一個非常基本的疑問。 假設我有兩個類A和B以及一個具有以下定義的接口C
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中重寫或實現check()方法?
兩者兼有,它們不是互斥的。 接口的目的是定義在實現類內部應該可用的方法簽名。
不過,您應該使用@Override
注釋該方法,這是一種很好的形式,因為它清楚地表明它來自基類,並且可以防止意外的拼寫錯誤。
正如@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())
那么就等於上述情況的最后一個
它既是最重要的,也是實現的。
在您的示例中:
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中將check方法定義為:
public void check(){
System.out.println("B");
允許您執行此操作,因為接口在創建時不包含接口中方法的定義,因此可以一遍又一遍地用於類似的事情,只需稍作調整即可使用相同的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.