簡體   English   中英

在對象數組中選擇特定對象

[英]choosing specific object in an array of objects

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;
    }
}

這是我的ShapeClass代碼。 我還有另外兩個RectangleTriangle類,它們與CircleClass幾乎相同。

在另一個類中,我在數組中分配ShapeClass對象。

如果我這樣做,它將是shape [3] = {Shape Object,Shape Object,Shape Object}之類的東西。 我不知道這是對的,我是Java新手。 對不起,有什么困惑。

我的問題是,如果我要怎么區分CircleRectangleTriangle是什么對象? 當我只想打印圓形對象時?

謝謝您的幫助。

您可以使用instanceof檢查:

if(shape[0] instanceof Circle){
 // do something
}

所以在Java中有一個運算子-的執行個體:

if(shapeObject instanceof Circle){
  //print
}

因此您可以使用它按類型區分對象。 另外,關於您的問題是否正確:您可以使用這種方法創建父對象類型的數組並將子對象放入其中。 之后,如果您從該數組中的每個對象上調用toString方法,則將調用該方法的特定實現。 例如,如果此數組中有Circle對象,並且其中重寫了toString方法,則在從ShapeObject數組中的對象上調用toString之后,將調用特定的實現。

您有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種形狀:

public class Shape {
   public void print() {
       System.out.println("Shape is printed");
   }
}

public class Triangle extends Shape {
   @Override
   public void print() {
       System.out.println("Triangle is printed");
   }
}

public class Circle extends Shape {
   @Override
   public void print() {
       System.out.println("Circle is printed");
   }
}

這段代碼將完全打印您所需的內容,因為您為所有形狀定義了相同的函數,並在子類中將其覆蓋,並且將根據運行時確定的對象類型來調用適當的函數:

for (Shape shape : shapes) {
    shape.print();
}

這樣嘗試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM