![](/img/trans.png)
[英]Java Class cannot override method in abstract class which has a method signature that contains an interface
[英]Which Method will get override from interface or class?
在下面的程序中,我擴展了 Demo1 類並實現了 Demo 接口,在實踐類中,我覆蓋了在類和接口中聲明的public void demo()
,然后該方法將從哪個方法中獲得覆蓋? 為什么?
interface Demo{
void demo();
}
class Demo1{
int i=10;
public void demo() {
System.out.println("this is demo"+i);
}
}
public class practice extends Demo1 implements Demo {
public static void Main(String[] args ) {
practice p=new practice();
p.demo();
}
public void demo() {
System.out.println("This is Overrided method");
}
}
簡短的回答是沒關系。 編譯器正在尋找的是抽象接口方法的簽名是在您的類中實現的,還是從超類型繼承的(並且它不關心該繼承的簽名是否旨在實現有問題的抽象方法)。
並且您的demo()
方法是否在聲明為Demo
或Demo1
的practice
對象上調用也無關,方法簽名以任何一種方式實現。
事實上,您甚至可以刪除您的demo()
覆蓋(假設您不需要更改行為),並且代碼仍會編譯:
class practice extends Demo1 implements Demo {
public static void Main(String[] args) {
practice p = new practice();
p.demo();
}
}
也就是說,即使Demo1.demo()
與Demo.demo()
無關,但實際上practice
繼承了與Demo1.demo()
具有相同簽名的Demo.demo()
並且不違反訪問和異常約束,這使得practice
成為Demo
的有效實現。
來自接口的方法沒有被覆蓋,它被實現了。
你的練習類繼承了Demo1類的demo方法,如果你在練習類本身中省略了demo方法的實現,這個方法將用於實現Demo接口方法。
由於您在實踐類本身中實現了演示方法 - 該方法覆蓋了Demo1類中的方法,並且還實現了Demo接口中的方法
如果你運行下面的代碼
public class practice extends Demo1 implements Demo {
public static void main(String[] args ) {
practice p=new practice();
p.demo();
}
public void demo() {
System.out.println("This is Overrided method");
}
}
輸出將是“這是覆蓋方法”,如果您對演示方法進行評論,如下所示
public class practice extends Demo1 implements Demo {
public static void main(String[] args ) {
practice p=new practice();
p.demo();
}
/*public void demo() {
System.out.println("This is Overrided method");
}*/
}
輸出將是“這是demo10”。 在第一種情況下,當類對象在 self 中找到 demo 的定義時,它將優先於父類。
Demo1 提供了 demo() 的實現。 所以它將采用父 demo() 方法。 輸出將是
這是demo10
但是隨后您在子類實踐中再次實現了覆蓋 demo() 方法
所以現在輸出
這是重載方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.