帮助第一个Polymorphism类

时间:2010-07-10 17:11:45

标签: java polymorphism

我正在创建一些随机类来更好地理解多态性。 编码如下:

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);
   }
}

但是当我尝试从symbol not foundSubPoly1访问变量时(例如SubPoly2)我收到testObj[1].x错误,程序没有超过编译阶段会返回错误。)

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:5)

那是因为你已宣布testObjPoly1[]x未在Poly1中定义,而是SubPoly2。在Poly1引用中,您只能访问comPoly

要解决此问题,您需要将x移至Poly1或改为使用SubPoly2[]或将Poly1引用转换为SubPoly2(即仅当实例实际 a SubPoly2时才可能。哪一种最佳解决方案取决于功能要求。

另见:

答案 1 :(得分:3)

您声明了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());
    }
}

会做你期望的事。

答案 2 :(得分:1)

  

行业中多态的主要用法(面向对象编程理论)是属于不同类型的对象响应同名的方法,字段或属性调用的能力,每个调用根据特定类型的适当类型行为。

此处的关键字为同名

您可以修改您的示例,并在基类中包含一个方法,例如: public void sayHello()。子类从基类继承时可以响应sayHello,但是如果它们本身没有实现此方法,则调用将被调度到超类“sayHello”。如果子类本身实现自己的sayHello方法,则会发生多态性。

如果您选择更多发言示例,也许您会发现更容易熟悉这个概念。多态性的一个突出例子是形状:你有一个,可能的抽象,基本形状和不同的子类,例如:一条线,一条矩形,一条圆等等。现在每个形状都有一个draw方法,但当然这些形状将使用不同的方法来绘制自己。

一些起点:

答案 3 :(得分:1)

来自父引用,您只能参考常用方法。您正在使用父引用来访问子类

中定义的属性