[英]Help with first Polymorphism class
我正在創建一些隨機類來更好地理解多態性。 編碼如下:
Poly1 :
public abstract class Poly1 {
int comPoly;
}
SubPoly1 :
public class SubPoly1 extends Poly1 {
String testPoly;
}
SubPoly2 :
public class SubPoly2 extends Poly1 {
int x;
}
testPoly :
public class testPoly {
public static void main(String[] args) {
Poly1[] testObj = new Poly1[2];
testObj[0] = new SubPoly1();
testObj[1] = new SubPoly2();
testObj[1].x = 1;
testObj[1].comPoly = 2;
System.out.println("Test Output : " + testObj[1].x+ " and " + testObj[1].comPoly);
testObj[0].testPoly = "Hello";
testObj[0].comPoly = 8;
System.out.println("Test Output : " + testObj[0].testPoly+ " and " + testObj[1].comPoly);
}
}
但是當我嘗試從SubPoly1
或SubPoly2
訪問變量時,程序沒有超過編譯階段,因為我得到symbol not found
錯誤(例如testObj[1].x
會返回錯誤)。
任何幫助,將不勝感激。
那是因為你已經聲明testObj
是Poly1[]
而x
不definied Poly1
,但在SubPoly2
。 在Poly1
引用上,您只能訪問comPoly
。
要解決此問題,您需要將x
移動到Poly1
或使用SubPoly2[]
代替或將Poly1
引用轉換為SubPoly2
(僅當實例實際上是SubPoly2
)。 哪一種最佳解決方案取決於功能要求。
你已聲明Poly1[] testObj = new Poly1[2];
這意味着無論您放入該數組,無論實際類型如何,都只能訪問Poly1類的成員。 多態性來自方法,而不是變量。
例如:
public class X
{
public void foo()
{
System.out.println("hello from X");
}
}
public class Y
extends X
{
public void foo()
{
System.out.println("hello from Y");
}
}
public class Main
{
public static void main(final String[] argv)
{
final X[] array;
array = new X[2];
array[0] = new X();
array[1] = new Y();
System.out.println(array[0].foo());
System.out.println(array[1].foo());
}
}
會做你期望的。
工業中多態性的主要用法(面向對象編程理論)是屬於不同類型的對象響應同名的方法,字段或屬性調用的能力,每個調用根據適當的類型特定行為。
這里的關鍵字名稱相同 。
您可以修改您的示例,並在基類中包含一個方法,例如public void sayHello()
。 子類從基類繼承,可以響應sayHello
,但是如果它們本身沒有實現這個方法,則調用將被調度到超類' sayHello
。 如果子類本身實現自己的sayHello
方法,則會發生多態性。
如果你選擇更多的說話例子,也許你會發現更容易熟悉這個概念。 多態性的一個突出的例子是形狀:你有一個,可能是抽象的,基本的形狀和不同的子類,例如一條線,一個矩形,一個圓形等。現在每個形狀都有一個draw
方法,但當然這些形狀將使用不同的繪制自己的方法。
一些起點:
從父引用中,您只能參考常用方法。 您正在使用父引用來訪問子類中定義的屬性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.