选择在对象

问题描述:

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。对不起,如果有任何混淆。

我的问题是如果我这样做,我该如何区分什么对象是圆形,矩形或三角形?当我只想打印出一个圆形对象?

感谢您的帮助

+3

1)不要用后缀'Class'来命名你的类。 'Circle'将会很好。 2)阅读https://stackoverflow.com/questions/7313559/what-is-the-instanceof-operator-used-for 3)如果你需要这样做,你可能应该重新考虑你的模型。 – bradimus

您可以通过使用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(); 
} 
+0

我不能理解评论。所以如果我使用第一个解决方案,那么只打印出超类中的字符串还是打印出圆类中的字符串? – ch1234

+0

这意味着如果你有ChildCircleClass,它扩展了CircleClass,并且这个类型的对象也存储在这个数组中 - 它们也将被识别为instanceof CircleClass –

+0

也许你想解决其他任务,比如适当打印每个形状?因为它有另一个解决方案。你应该阅读多态是什么。 –

尝试这样,

for(int i = 0; i < shapeArray.length; i++){ 
    if(shapeArray[i] instanceof CircleClass){ 
      // print circle here 
    } 
}