我有一个名为' Shape'的父类。它有一个子类' Circle'。 Circle类继承了Shape的属性,并有一个额外的参数' radius'以及一个名为getRadius()的方法。
最后我有一个' ShapeList'包含不同形状的ArrayList的类,以及各种添加/删除函数。
我正在尝试打印圆形的半径:
System.out.println(shapeArray.getShape(1).getRadius());
shapeArray是形状列表,getShape返回特定的形状对象。但是当我尝试使用getRadius时,它会查看Shape类而不是特定的Circle子类,因此无法识别方法,如何访问半径?
答案 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)
打印半径意味着您知道您的特定Shape
是Circle
。
如果您希望您的程序也知道这一点,您可以通过演员告诉它:
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是暗示设计不良的程序/系统的黑客。