有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的子类

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

"implement a class called Square that represents a square. Class Square must be derived from Rectangle. Make sure you override 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);

    }
}

斯夸尔。爪哇

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) 个答案

  1. # 1 楼答案

    您应该注意,子类和超类不需要主类。应该有一个单独的主类来初始化这些对象

    要重写方法,请使用@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. # 2 楼答案

    你的“朋友”可能希望你使用超级构造函数。正如Peter Lawrey所解释的,你不需要在你的扩展课程中定义宽度和高度。以这种方式隐藏字段被认为是一种不好的做法。Square类将根据extends关键字从其超类矩形继承这些字段:

    public class Sqaure extends Rectangle
    

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

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

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

    public Rectangle(double width, double height)
    

    通过这样做,它将把正方形的继承字段宽度高度分配给相同的值,使其成为正方形。继承的方法getArea()和getPermission()仍然有效,因此不需要重写它们

    您需要重写toString()方法,因为它包含单词Rectangle。我相信你自己能弄明白

  3. # 3 楼答案

    只需要重写构造函数和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中的宽度/高度等效性