Java中的子类

时间:2016-02-23 13:22:19

标签: java subclass

我的朋友给了我这个任务,我正在努力争取最后一个,它要求我:

  

“实现一个名为Square的类,代表一个正方形   Square必须从Rectangle派生。确保你覆盖   的toString()“。

我甚至不认为我接近它,但任何帮助都会很棒

Rectangle.Java

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

3 个答案:

答案 0 :(得分:5)

不需要覆盖构造函数和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中的宽度/高度等效。

答案 1 :(得分:0)

您应该注意,sub和super类不需要main-class。您应该有一个单独的主类来初始化这些对象。

要覆盖方法,请使用@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()

请注意:Square通常只有一个参数而不是两个,因为这是Square的原因。 ;)

答案 2 :(得分:0)

你的“朋友”可能要你做的是使用超级构造函数。正如Peter Lawrey已经解释的那样,您不需要在扩展类中定义宽度,高度。以这种方式隐藏字段被认为是一种不好的做法。 Square类将从extends关键字:

的帐户继承其超类Rectangle中的那些字段
public class Sqaure extends Rectangle

这是您在案例中使用超级构造函数的方法。

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

这将调用超类的构造函数:

public Rectangle(double width, double height)

通过这样做,它会将Square的继承字段 width height 分配给相同的值,使它成为一个正方形。继承的方法getArea()和getPerimeter()仍然可以工作,因此不需要覆盖它们。

您需要覆盖toString()方法,因为它中包含单词Rectangle。我相信你可以自己解决这个问题。