簡體   English   中英

Java接口和繼承

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM