![](/img/trans.png)
[英]how to create generic java class that extends class and implements interface?
[英]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 中聲明一個類時,有一定的元素順序:
public
、 private
等。extends
。 一個類只能擴展(子類)一個父類。implements
。 一個類可以實現多個接口。{ }
包圍。參考:
http://docs.oracle.com/javase/tutorial/java/javaOO/classdecl.html
NormalClassDeclaration:
class Identifier [TypeParameters] [extends Type] [implements TypeList] ClassBody
我認為為了簡化語法規則,他們並沒有使其可互換。
為了使可互換,您可能需要類似的東西:
NormalClassDeclaration:
class Identifier [TypeParameters] [ExtendsImplements] ClassBody
ExtendsImplements:
[extends Type] [implements TypeList] | [implements TypeList] [extends Type]
甚至更糟糕的是,您可能需要聲明Extends
和Implements
才能使用OR
。
我想把解析規則弄得一團糟並不重要。
你必須這樣做。 您只能擴展一個類,但可以分別通過逗號實現多個接口。 在實現之前先擴展對讀者更友好
class Sub extends Super implements Colorable
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.