Java继承问题

时间:2014-04-28 13:35:42

标签: java inheritance

我有一个名为' Shape'的父类。它有一个子类' Circle'。 Circle类继承了Shape的属性,并有一个额外的参数' radius'以及一个名为getRadius()的方法。

最后我有一个' ShapeList'包含不同形状的ArrayList的类,以及各种添加/删除函数。

我正在尝试打印圆形的半径:

System.out.println(shapeArray.getShape(1).getRadius());

shapeArray是形状列表,getShape返回特定的形状对象。但是当我尝试使用getRadius时,它会查看Shape类而不是特定的Circle子类,因此无法识别方法,如何访问半径?

7 个答案:

答案 0 :(得分:4)

您需要将形状转换为圆形:

Circle circle = (Circle) shapeArray.getShape(1);
System.out.println(circle.getRadius());

当然,这种方式使得拥有父类的整个意义无效。

答案 1 :(得分:1)

System.out.println(((Circle)shapeArray.getShape(1)).getRadius());

答案 2 :(得分:1)

你应该 Shape对象投射到Circle

请注意,当您显式投射对象时,您会告诉编译器相信您知道自己在做什么,而且您已经确定 Shape Circle。如果情况并非如此,您可能会收到运行时异常。为避免这种情况,请使用instanceof运算符。

我强烈建议您阅读"Inheritance (The Java Tutorials)"

答案 3 :(得分:1)

你应该在打印之前投射到Circle。您必须知道这可能会导致java.lang.ClassCastException!

简单示例:

class Shape {
   private String property;
}
class Circle extends Shape {
    private int radius;
    public Circle(int radius) {
        this.radius = radius;
    }        

    public void setRadius(int radius) {
        this.radius = radius;
    }
    public int getRadius() {
        return this.radius;
    }
}


class ShapeArray {
    public ArrayList<Shape> shapeArray = new ArrayList<Shape>();

    public void addShapeToArray(Shape shape){
        shapeArray.add(shape);
    }
    public Shape getShape(int index) {
        return (Shape) this.shapeArray.get(index);
    }
}

用法:

import java.util.ArrayList;
public class Main {

    public static void main(String[] args) {
        ShapeArray shapeArray = new ShapeArray();
        shapeArray.addShapeToArray(new Shape());
        shapeArray.addShapeToArray(new Circle(2));
        System.out.println(shapeArray.getShape(0).getRadius());
    }
}

此代码无法编译,行

 System.out.println(shapeArray.getShape(0).getRadius());

是问题所在。 首先需要转换为Circle,如下所示:

 System.out.println(((Circle) shapeArray.getShape(0)).getRadius());

然而,正如我在开头写的那样 - 这可能会产生ClassCastException。所以你需要以某种方式确保你得到的对象实际上是一个圆圈,这样当你施放它时 - 代码就不会爆炸。

答案 4 :(得分:0)

打印半径意味着您知道您的特定ShapeCircle

如果您希望您的程序也知道这一点,您可以通过演员告诉它

Circle circle = (Circle) shapeArray.getShape(1);

现在程序知道circle确实是Circle,您可以使用getRadius()

答案 5 :(得分:0)

你需要投射到圆圈。

Google for Java + Casting ...

你正在做的事虽然看起来有点混乱 - 我想为每种类型的形状保留单独的数组,这意味着你可以为圆形运行一些代码(比如说getRadius),以及其他多边形的特定代码(比如打印掉顶点......)

你也可以在形状类上覆盖“GetDetails”方法,允许你像现在一样维护一个数组,但是它上面的每个对象都返回与它的形状类型相关的信息......

答案 6 :(得分:0)

到目前为止,所有答案都违背了在Java中使用类型系统的目的。

理解并使用visitor pattern

想想你创造了什么:

  • Circle,即“Shape
  • 一个容器,可以容纳任何“是”Shape

这并不意味着容器中的所有内容都是Circle

如果有人在您的容器中放置了不是Circle的内容,您认为您的程序会如何表现?

投射和使用instanceof是暗示设计不良的程序/系统的黑客。