簡體   English   中英

Class C 實現接口 B 擴展接口 A,你能說 C 實現 A 嗎?

[英]Class C implements interface B which extends interface A, can you say C implements A?

如果 class C 實現了接口 B 並且接口 B 擴展了接口 A。說 class Z0D61F8340CAD1D41257 實現接口是否正確?

是的。 C 可以覆蓋 A 的方法。

示例:(這不是一個很好的示例,但只是為了表明 C/Chimpanzee 可以覆蓋 A/Animal 的方法)

interface Animal
{
    void giveBirth();
}

interface Mammal extends Animal
{
    void walk();
}

class Chimpanzee implements Mammal
{

    @Override
    public void giveBirth()
    {
        System.out.println("Chimpanzee gives birth.");
    }

    @Override
    public void walk()
    {
        System.out.println("Chimpanzee walks.");

    }
}

即使我同意關於第一部分的公認答案(“是”),我也不同意第二部分“C可以覆蓋A 的方法”。

我相信正確的描述是C必須實現A和B的方法。

例如,如果接口 A 聲明方法 fooA() 而 B 聲明方法 fooB(),則 C 必須同時實現 fooA() 和 fooB()。 從這個意義上說,是的,您可以說 C 實現了接口 A(因為它實現了擴展 A 的接口)。

接受的答案是正確的。 由於 Java 語言中的多態性,這是可能的。 但是,必須了解使用 JVM 指令invokeDynamic而不是invokeVirtual對性能的影響。 后者需要在類的虛擬表中進行簡單的查找,而前者需要通過其所有實現者的虛擬方法表進行更深入的遞歸搜索。

是的,您可以說 C 實現了 A。instanceof 運算符在這里非常方便:

public interface B extends A {      
    public void b();    
}

public interface A {
    public void a();        
}    

public class C implements B {

@Override
public void a() {}

@Override
public void b() {}

public static void main(String[] args) {
    C c = new C();
    System.out.println("C is A? " + (c instanceof A));
    System.out.println("C is B? " + (c instanceof B));
}

}

結果將是:

C is A? true
C is B? true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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