选择在对象
public abstract class ShapeClass
{
private double area;
CONSTRUCTORS
MUTATORS, ACCESSORS
public abstract double calcArea();
}
public class CircleClass extends ShapeClass
{
private int diameter;
private double area;
public CircleClass()
{
super();
diameter = 10;
}
public CircleClass(CircleClass inCircle)
{
super(inCircle);
diameter = inCircle.getDiameter();
}
public CircleClass(int inDiameter)
{
setDiameter(inDiameter);
area = calcArea();
super.setArea(area);
}
public void setDiameter(int inDiameter)
{
if(validateInt(inDiameter))
{
diameter = inDiameter;
}
else
{
throw new IllegalArgumentException("invalid diameter");
}
}
public int getDiameter()
{
return diameter;
}
public boolean equals(int inDiameter)
{
return(diameter == inDiameter);
}
public boolean equals(Object inObj)
{
boolean same = false;
if(inObj instanceof CircleClass)
{
CircleClass inCircle = (CircleClass)inObj;
if(super.equals(inCircle));
{
if(diameter == inCircle.getDiameter());
same = true;
}
}
return same;
}
public String toString()
{
return (" area of circle is: " + super.toString());
}
private boolean validateInt(int inDiameter)
{
boolean valid = false;
if (inDiameter>0)
{
valid = true;
}
return valid;
}
private boolean validateReal(double inArea)
{
boolean valid = false;
if(inArea>0.0)
{
valid = true;
}
return valid;
}
@Override
public double calcArea()
{
double radius;
radius = ((double) diameter)/2.0;
area = Math.PI * radius * radius;
return area;
}
的阵列的特定对象,这是我的一个形状类代码我有其他2类矩形和三角形,吗更有几乎相同的圆类。
在另一个类即时分配一个数组中的ShapeClass对象。
如果我这样做,它会像形状[3] = {形状对象,形状对象,形状对象}。我不知道如果这是正确的即时通讯新的Java。对不起,如果有任何混淆。
我的问题是如果我这样做,我该如何区分什么对象是圆形,矩形或三角形?当我只想打印出一个圆形对象?
感谢您的帮助
您可以通过使用instanceof
检查:
if(shape[0] instanceof Circle){
// do something
}
所以在Java中的运营商 - 实例:
if(shapeObject instanceof Circle){
//print
}
,所以你可以用它来按类型区分对象。关于你的问题,它是否正确:你可以使用这种方法创建父对象类型的数组,并将子对象放在其中。在此之后,如果你调用这个数组具体实现方法的每个对象上的toString方法将被调用。例如,如果此数组中有Circle对象,并且存在重写,则将调用toString方法,然后在调用toString对来自ShapeObject数组的对象。
你有2种选择:
// Solution 1: prits out all instances of Circle, basically also all subclasses of Circle
for (ShapeClass shape : shapes) {
if (shape instanceof CircleClass)
System.out.println(shape.toString());
}
// Solution 2: Matches exact class
for (ShapeClass shape : shapes) {
if (shape.getClass().equals(CircleClass.class))
System.out.println(shape.toString());
}
上述解决方案将解决你问有关任务。但是,下面的信息可能会对你有用:
如果你想打印出每个形状的名称,在这种情况下如何使用它们,怎么办?
比方说,我们有3种形状:
3210这段代码打印正是你需要的,因为你定义的所有形状的相同的功能,在子类覆盖它,并适当的功能基于在运行时确定的对象类型上调用:
for (Shape shape : shapes) {
shape.print();
}
我不能理解评论。所以如果我使用第一个解决方案,那么只打印出超类中的字符串还是打印出圆类中的字符串? – ch1234
这意味着如果你有ChildCircleClass,它扩展了CircleClass,并且这个类型的对象也存储在这个数组中 - 它们也将被识别为instanceof CircleClass –
也许你想解决其他任务,比如适当打印每个形状?因为它有另一个解决方案。你应该阅读多态是什么。 –
尝试这样,
for(int i = 0; i < shapeArray.length; i++){
if(shapeArray[i] instanceof CircleClass){
// print circle here
}
}
1)不要用后缀'Class'来命名你的类。 'Circle'将会很好。 2)阅读https://stackoverflow.com/questions/7313559/what-is-the-instanceof-operator-used-for 3)如果你需要这样做,你可能应该重新考虑你的模型。 – bradimus