java - 数组中的多态子类对象方法不起作用

标签 java arrays inheritance foreach polymorphism

首先,我尝试研究我的问题,但我不知道如何表达我的问题......所以我不确定是否有一个问题可以解决我的问题,也不确定这是否是我的问题的最佳措辞。

所以,我有一个父类(super class)形状

public abstract class Shape {
protected String name;
protected String type;
public Shape(){
    name = "";
    type = "";
}
public void print (){
    System.out.printf("Name = %s, Type = %s", name, type);
}

}

和一个 2D 子类

public abstract class TwoDimensionalShape extends Shape{
protected double length;
protected double area;
public TwoDimensionalShape(double length){
    if (length<0.0)
        throw new IllegalArgumentException("ERROR: POSITIVE NUMBER REQUIRED");
    this.length = length;
    type = "Two Dimensional Shape";
}
public abstract void getArea();
@Override
public void print(){
System.out.printf("Name = %s, Type = %s, Length of side = %d, Area = %d",
name, type, length, area);
}
}

以及几个从 2D 延伸出来的较小的子类(以及另一个几乎相同的 3D 类)。我的问题是测试代码,它不计算面积。类测试代码

Circle S1 = new Circle(2.5);
etc.
shapesArray[0] = S1;
etc.
for(Shape CS : shapesArray){
CS.getArea();
if(CS.Type == "Three Dimensional Shape"){
CS.getVolume();
}
CS.print();
System.out.println(" ");
    }
}

我删除了 getArea 和 getVolume 方法,并且 print 语句工作正常。这让我认为每个子类与父类(super class)交互的方式存在问题,但是,子类打印方法重写并返回正确的值(区域除外:()

使用面积和体积命令,代码无法编译,并且出现此错误

ShapeTest.java:25:错误:找不到符号 CS.getArea();

三次。

这是子类之一,以防它包含解决方案所需的重要信息。

public class Circle extends TwoDimensionalShape {
public Circle(double length){
    super(length);
    name = "Circle";
}
@Override
public void getArea(){
    area = Math.PI * length * length;
}
@Override
public void print(){
System.out.printf("Name = %s, Type = %s, Radius = %f, Area = %f",
name, type, length, area);
}
}

我没有足够的经验来完全理解这个问题,我一直在改变类中的循环、变量的位置和方法,但我还没有取得进展。我感谢您阅读这个长问题,并且感谢您提供的任何帮助。

最佳答案

您的 Shape 类型未声明该方法。

编译器不知道您打算将 TwoDimensionalShape 对象放入该数组中。它只看到你说:这个数组包含Shapes;和形状没有其他两种方法!

所以你可以这样做:

  • 声明该数组仅包含 TwoDimensionalShape 对象。当然,那么你就不能添加3D了
  • 使用 if (thing is instanceof TwoDimensionalShape) { 然后转换为该类型
  • 然后:您不需要字符串类型。所有对象都有一个;并且该已经定义了其确切类型。这就是为什么您使用 instanceof 来确定类型;不是通过添加字符串字段并将该字符串(== 的错误方式)与其他字符串进行比较!

关于java - 数组中的多态子类对象方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43422866/

相关文章:

c++ - 传递对基类指针的引用

java - 如何在1秒内执行n次循环

java - 如何获得独立点击

java - 外部部署war的springboot配置文件

arrays - Mongoose $elemMatch 与多个相同属性

java - 从数组值制作非图形直方图

javascript - 在javascript中解析csv数据在chrome中不起作用

javascript - 关于原型(prototype)继承的一个令人困惑的案例

c++ - 函数调用继承 C++

java - eclipse tomcat设置页面中的Tomcat URIEncoding ="UTF-8"