覆盖具有不同参数数量的继承方法

lob*_*ter 0 java inheritance abstract

有两个任务要解决:

首先,应该从类GeoObjects继承一个类矩形。其次,应从类矩形继承类广场。

给出了抽象类GeoObjects。

abstract class GeoObjects{
    public abstract double Perimeter();
    public abstract double Surface();

    public static void main (String [] argv){
        double width = 4.0, height = 5.0, side= 3.0;
        GeoObject rectangle = new Rectangle (width, height);
        GeoObject square= new Square(side);

        System.out.println ("Perimeter = " + rectangle.Perimeter());
        System.out.println ("Surface= " + rectangle.Surface());
        System.out.println ("Perimeter= " + square.Perimeter());
        System.out.println ("Surface= " + square.Surface());
    }
}

class Rectangle extends GeoObjects{

    double width, height, side;

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

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

class Square extends Rectangle {

    double side;

    Square (double side){
        this.side= side;
    }
    public double Perimeter (){
        return 4*side;
    }
    public double Surface(){
        return side*side;
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了编译器信息,即Square构造函数具有与Rectangle不同的变量数量。

如何解决这个问题而又不损害Square必须从矩形而不是GeoObjects继承的要求?

rge*_*man 5

编译器错误消息通知您,您正在尝试使用与构造函数Rectangle不同数量的参数来调用超类构造函数。您并未在中显式调用超类构造函数Square,因此编译器已在中插入了对默认超类构造函数的调用Rectangle-有效地super();作为中的第一行Square()

但是Rectangle没有参数,没有构造函数。只有一个带有2个参数。通过传递两次side来适当地调用它super()

您还将注意到,PerimeterSurface方法不再需要被覆盖,因为它们现在将使用超类中的适当值。

同样,常规的Java方法命名约定将让您以小写字符开头的方法命名:perimetersurface