簡體   English   中英

幫助第一個Polymorphism類

[英]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);
   }
}

但是當我嘗試從SubPoly1SubPoly2訪問變量時,程序沒有超過編譯階段,因為我得到symbol not found錯誤(例如testObj[1].x會返回錯誤)。

任何幫助,將不勝感激。

那是因為你已經聲明testObjPoly1[]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.

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