簡體   English   中英

在java中擴展類並實現接口

[英]extends class and implements interface in java

interface Bouncable{ } 
interface Colorable extends Bouncable{ } 
class Super implements Colorable{ } 
class Sub extends Super implements Colorable {} // Ok (case -1)

但,

class Sub implements Colorable extends Super {} // error (case -2)

為什么case-2顯示編譯錯誤{ expected . 為什么 ?? 雖然, case-1執行沒有錯誤。

extends應該在implements之前:

class Sub extends Super implements Colorable {}

我有一個例子來說明為什么在類聲明中擴展先於實現,

界面:

public interface IParent {
    void getName();
    void getAddress();
    void getMobileNumber();
}

抽象類:

public abstract class Parent {
    public abstract void getAge();
    public void getName(){
        System.out.print("the parent name");
    }
}

兒童班:

public class Child extends Parent implements IParent {

    @Override
    public void getAddress() {
       System.out.print(" Child class overrides the Parent class getAddress()");
    }

    @Override
    public void getMobileNumber() {
        System.out.print(" Child class overrides the Parent class getMobileNumber()");
    }

    @Override
    public void getAge() {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}

如果您觀察到接口和抽象類中都有相同的方法 getName() ,其中抽象類中的方法具有實現。

當您嘗試實現時,類必須覆蓋接口的所有抽象方法,然后我們嘗試擴展已經具有 getName() 方法實現的抽象類。

當您創建 Child 類的實例並調用方法 getName() 時

Child child = new Child();
child.getName();

孩子調用哪個方法實現會發生沖突,因為同一個方法 getName() 會有兩個實現。

為了避免這種沖突,他們強制首先擴展並稍后實現接口。

因此,如果抽象類具有與接口中相同的方法,並且抽象類已經實現了該方法,那么對於子類,則無需覆蓋該方法

java中有一個規則,如果要實現一個接口並擴展一個類,必須先擴展一個類,然后再實現一個接口

interface A{}
class super{}

class sub extends super implements A {}

當 Java 編譯器將類轉換為字節碼時,它必須首先查找父類。 那是因為類的底層實現是指向父類的字節碼——它包含相關的方法和字段。 然后它添加指向子類函數代碼的指針——其中一些是由“實現”關鍵字強制執行的。

因為父類必須是可編譯的,所以如果編譯器預先知道該類是什么,則更容易。 此外,您只能擴展一個類,但可以實現任意數量的接口。 如果 extends 關鍵字可以混合在任意數量的實現指令中,編譯時間就會攀升。 編譯器希望盡快失敗以減少開發時間,所以這個選擇是合乎邏輯的。 此外,出於同樣的原因,它可以幫助您清楚地思考課程。

這是因為JLS中的規范。 當您嘗試在 Java 中聲明一個類時,有一定的元素順序:

  • 修飾符,如publicprivate等。
  • 類名,首字母按慣例大寫。
  • 類的父類(超類)的名稱(如果有),以關鍵字extends 一個類只能擴展(子類)一個父類。
  • 類實現的接口的逗號分隔列表(如果有),前面帶有關鍵字implements 一個類可以實現多個接口。
  • 類體,由大括號{ }包圍。

參考:

http://docs.oracle.com/javase/tutorial/java/javaOO/classdecl.html

JLS 語法頁面中類定義的語法

NormalClassDeclaration: 
    class Identifier [TypeParameters] [extends Type] [implements TypeList] ClassBody

我認為為了簡化語法規則,他們並沒有使其可互換。

為了使可互換,您可能需要類似的東西:

NormalClassDeclaration: 
    class Identifier [TypeParameters] [ExtendsImplements] ClassBody

ExtendsImplements:
    [extends Type] [implements TypeList] | [implements TypeList] [extends Type]

甚至更糟糕的是,您可能需要聲明ExtendsImplements才能使用OR

我想把解析規則弄得一團糟並不重要。

你必須這樣做。 您只能擴展一個類,但可以分別通過逗號實現多個接口。 在實現之前先擴展對讀者更友好

class Sub extends Super implements Colorable

暫無
暫無

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

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