簡體   English   中英

Java中的子類

[英]sub-classes in Java

我的朋友給了我這項任務,而我在最后一個方面苦苦掙扎,它要求我:

“實現一個名為Square的類,該類代表一個正方形。Square類必須從Rectangle派生。請確保重寫toString()。”

我什至不認為我什至要得到它,但是任何幫助都會很棒

矩形

public class Rectangle {

    public double width;
    public double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    public double getArea() {
        return width * height;
    }

    public double getPerimeter() {
        return 2*width+2*height;
    }

    @Override
    public String toString() {
        return "Rectangle[width "+width+",height "+height+"]Area:"+getArea()+",Perimeter:"+getPerimeter();
    }

     public static void main(String[] args) {

        double width = (10);
        double height = (10);
        Rectangle rectangle = new Rectangle(width, height);
        System.out.println(rectangle);

    }
}

Sqaure.java

public class Sqaure extends Rectangle {

      private final double width, height, area, perimeter;

      public Sqaure(double width, double height) {
        this.width = width;
        this.height= height;
      }

      public static void main(String[] args) {    
        double width = (10);
        double height = (10);
        Sqaure sqaure = new Sqaure(width, height);
        System.out.println(square);
      }
}

除了構造函數和toString()以外,無需覆蓋其他內容。 由於正方形只是邊長相等的特殊矩形,您可以將它們初始化為相同的值,所有其他方法將按預期工作:

public class Square extends Rectangle {

  public Square(double width) {
    super(width, width);
  }

  @Override
  public String toString() {
      return "Square[width:" + width + "]Area:" + getArea() +
          ",Perimeter:" + getPerimeter();
  }

請注意,在現實世界中,在這種情況下,您可能不會使用繼承,因為這會引入一些歧義-您仍然可以使用矩形構造函數創建正方形,而且人們可能會誤導使用instanceof檢查來確定給定的矩形是一個正方形。 相反,可能會添加一個參數構造函數並檢查toString中的寬度/高度等效項。

您應該注意,子類和超類不需要主類。 您應該有一個單獨的主類,您可以在其中初始化這些對象。

要覆蓋方法,請使用@Override 這樣做是因為可以將子類初始化為超類,例如Rectangle square = new Square(...) 當您調用square.toString() ,輸出不應為Rectangle[width...] ,而應為Square[width...]

@Override
public String toString() {
    return return "Square[width "+size+",height "+size+"]Area:"+getArea()+",Perimeter:"+getPerimeter();
}

如果不重寫方法,則該功能將與超類的功能相同(對於getArea()getPerimeter()來說就很好了getPerimeter()

請注意: Square通常只有一個參數而不是兩個參數,因為這就是使其成為Square ;)

您的“朋友”可能想要您做的是使用超級構造函數。 正如Peter Lawrey所解釋的那樣,您無需在擴展類中定義寬度和高度。 以這種方式隱藏字段被認為是不好的做法。 Square類將基於extends關鍵字從其超類Rectangle繼承這些字段:

public class Sqaure extends Rectangle

這就是您可能在情況下使用超級構造函數的方式。

public Sqaure(double side) {
    super(side, side);
}

這將調用超類的構造函數:

public Rectangle(double width, double height)

然后,它將Square的繼承字段的widthheight分配給相同的值,使其成為正方形。 繼承的方法getArea()和getPerimeter()仍將起作用,因此無需重寫它們。

您將需要重寫toString()方法,因為它包含單詞Rectangle。 我相信您可以自己弄清楚。

暫無
暫無

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

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