Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第一节课的帮助_Java_Polymorphism - Fatal编程技术网

Java 第一节课的帮助

Java 第一节课的帮助,java,polymorphism,Java,Polymorphism,我正在创建一些随机类来更好地理解多态性。 编码如下: Poly1: 第1款: 第2分段: testPoly: 但是程序没有通过编译阶段,因为每当我尝试从SubPoly1或SubPoly2访问变量时,都会出现符号未找到错误(例如testObj[1]。x将返回错误) 任何帮助都将不胜感激 多态性在工业中的主要用途(面向对象编程理论)是属于不同类型的对象能够响应相同名称的方法、字段或属性调用,每个调用根据适当的特定类型行为进行响应 这里的关键字应该是同名 您可以修改示例,并在基类中包含一个方法,例如,

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

Poly1:

第1款:

第2分段:

testPoly:

但是程序没有通过编译阶段,因为每当我尝试从
SubPoly1
SubPoly2
访问变量时,都会出现
符号未找到
错误(例如
testObj[1]。x
将返回错误)

任何帮助都将不胜感激

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

这里的关键字应该是同名

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

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

一些出发点:


从父参考中,您只能参考常用方法。您正在使用父引用访问子类中定义的属性,这是因为您已将
testObj
声明为
Poly1[]
,而
x
未在
Poly1
中定义,而是在
SubPoly2
中定义。在
Poly1
参考上,您只能访问
comPoly

要解决此问题,您需要将
x
移动到
Poly1
,或者使用
SubPoly2[]
,或者对
SubPoly2
进行
Poly1
引用(仅当实例实际上是
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());
    }
}

将做您期望的事情。

虽然多态性主要与方法相关,但这个概念也适用于实例变量。Java中不能有多态变量。
public class SubPoly1 extends Poly1 {
    String testPoly;
}
public class SubPoly2 extends Poly1 {
    int x;
}
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);
   }
}
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());
    }
}