我正在创建一些随机类来更好地理解多态性。 编码如下:
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 found
或SubPoly1
访问变量时(例如SubPoly2
)我收到testObj[1].x
错误,程序没有超过编译阶段会返回错误。)
任何帮助都将不胜感激。
答案 0 :(得分:5)
那是因为你已宣布testObj
为Poly1[]
而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)
来自父引用,您只能参考常用方法。您正在使用父引用来访问子类
中定义的属性