我最近開始學習 Java,目前正在研究多型性。考慮以下代碼:
public class Polygon{
public static void perimeter( ){
System.out.print("In Polygon perimeter");
}
public void area( ){
System.out.println("In Polygon area");
}
public void sides( ){
System.out.println("In Polygon sides");
}
public void angleSum( ){
System.out.println("In Polygon angleSum");
}
}
public class Pentagon extends Polygon{
public static void perimeter( ){
System.out.println("In Pentagon perimeter");
}
public void area( ) {
System.out.println("In Pentagon area");
}
public int sides( ){
return 5;
}
public void angleSum(int x) {
System.out.println("In Pentagon angleSum");
}
}
在執行此代碼時,我發現無法覆寫 side() 方法。我理解在覆寫中,方法名稱和回傳型別應該相同,但在這種情況下回傳型別是不同的。那么,有什么方法可以在不導致覆寫但保持相同名稱和不同型別的情況下執行它?
uj5u.com熱心網友回復:
有什么方法可以在不導致覆寫但保持相同名稱和不同型別的情況下執行它?
僅當父類中的方法宣告為 時private,才不會發生覆寫,但該方法的sides訪問權限非常有限,因此Main.java類中的以下代碼失敗:
class Polygon {
private void sides() {
System.out.println("In Polygon sides");
}
}
class Pentagon extends Polygon {
public int sides() {
return 5; // is not aware of `sides` in Polygon
}
}
Polygon p = new Pentagon();
p.sides(); // -> sides() has private access in Polygon
因此,方法sides只能用于Pentagon實體/參考:
Pentagon p = new Pentagon();
System.out.println(p.sides()); // -> 5
如果sides方法static在具有不同回傳型別的兩個類中宣告,則代碼也不會編譯:
class Polygon {
public static void sides() {
System.out.println("In Polygon sides");
}
}
class Pentagon extends Polygon {
public static int sides() {
return 5; // sides() in Pentagon cannot hide sides() in Polygon
// return type int is not compatible with void
}
}
uj5u.com熱心網友回復:
在 Java 中,方法簽名是方法宣告的一部分。它是方法名和引數串列的組合。
當我們在 superClass 和 subClass 中談論相同的方法簽名 協變回傳型別時,我們正在談論 Overriding 。
(相同的簽名 協變回傳型別)==覆寫
uj5u.com熱心網友回復:
據我所知,如果您建立繼承關系并且對父類中已經存在的方法使用相同的簽名,則不能更改回傳型別,除非您想更改作為實體的型別的回傳型別原始型別,否則會導致語法錯誤,因此您需要更改子類中的方法簽名或覆寫它。假設這將適用,那么子類將有兩個具有相同簽名的方法,一個是繼承的,另一個是您顯式撰寫的,因此當您呼叫它時,JVM 將不知道要呼叫哪個,因此不適用。注意重寫方法,它應該是實體方法和相同的簽名和相同的回傳型別或原始型別的實體和相同的訪問修飾符或更強,否則會導致語法錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407526.html
標籤:
上一篇:鏡像通用樹-我的錯誤是什么?
下一篇:計算大斐波那契數
