Java 使用构造函数继承

Java inheritance with constructor

大家好,我正在研究一个简单的 java 形状继承程序。我知道我的问题不是什么新问题,但我已经研究过,通常的问题是超级参数与父级 class 的构造函数参数类型不匹配。但是,我有匹配的参数,但仍然出现此错误。错误发生在平行四边形的 super 语句中。任何帮助将不胜感激,谢谢!

public abstract class Quadrilateral implements Shapes
{
double base, height, perimeter, area, s1, s2, s3, s4;
String name;

 public Quadrilateral(String name, double base, double height, double side1, double side2, double side3, double side4){
   this.name = name;
   this.base = base;
   this.height = height;
   s1 = side1;
   s2 = side2;
   s3 = side3;
   s4 = side4;

}



public double getHeight(){
   return height;
}

public double getS1(){
    return s1;
}

public double getS2(){
    return s2;
}

public double getS3(){
    return s3;
}

public double getS4(){
    return s4;
}

public double getPerimeter(){
    return s1 + s2 + s3 + s4;
}

public String toString(){
    String str;
    str = "name is " + name + "\n";
    str += "area is " + area + "\n";
    str += "perimeter is " + perimeter + "\n";
    str += "sides 1-4 are " + s1 + ", " + s2 + ", " + s3 + "and " + s4;

    return str;
}
}

新class

public class Parallelogram extends Quadrilateral
{

public Parallelogram(String name, double base, double height){

super(name, side1, side2, side1, side1, side2, side2); //RECIEVE ERROR HERE WITH THE FIRST SIDE1!!!

}

public double getArea(){
area = base * height;
return area;    
}

public String getName(){
    return name;
}


}

新class

public class Rectangle extends Parallelogram
{
 public Rectangle(String name, double side1, double side2){
     super(name, side1, side2);
    }
}

新class

public class Square extends Rectangle
{
public Square(String name, double side1){
    super(name, side1, side2);
}
}

您正在将未在 Parallelogram 构造函数中定义的值传递给基本构造函数 - 即 side1side2。一种选择是更改

public Parallelogram(String name, double base, double height){

super(name, side1, side2, side1, side1, side2, side2); //RECIEVE ERROR HERE WITH THE FIRST SIDE1!!!

}

public Parallelogram(String name, double base, double height, double side1, double side2){

super(name, base, height, side1, side1, side2, side2); 

}

RectangleSquare

也类似

您没有在四边形 class 中使用 "this.s1" 关键字是有原因的吗? 此外,您是否打算在任何子 classes 中声明一个抽象方法?

此外,您应该养成将实例变量声明为私有的习惯,这是一种很好的做法,可以促进数据封装(数据隐藏)。

我认为如果您的所有子classes 都扩展为四边形,那将是一个更好的程序。而不是四边形延伸平行四边形延伸矩形延伸正方形等。 享受吧!