所以我现在正在学习java中的抽象类,这个具体要求重写一个父类(super class)Triangle为抽象类,并且有子类RightTriangle、EquisideTriangle返回面积/周长的比率。由于某种原因,当我不在 Triangle 父类(super class)中使用无参数构造函数时,BlueJ 程序会抛出错误。当我使用它时,代码似乎完全忽略子类的主体并为两个值返回 NaN。这是代码:
三角形抽象父类(super class):
public abstract class Triangle
{
private double side;
public Triangle()
{
double s;
}
public Triangle(double side)
{
super();
this.side = side;
}
public double getSide()
{
return side;
}
public void setSide(double side)
{
this.side = side;
}
@Override
public abstract double getPerimeter();
@Override
public abstract double getArea();
@Override
public abstract double getRatio();
@Override
public abstract String toString();
public static void main(String[] args)
{
Triangle equilateralTr = new RightTriangle(12);
Triangle rightTr = new EquilateralTriangle(12);
System.out.println(equilateralTr.toString());
System.out.println(rightTr.toString());
}
}
直角三角形子类:
public class RightTriangle extends Triangle
{
public RightTriangle(double s)
{
super.getSide();
}
public double getSideVal()
{
double s = super.getSide();
return s;
}
public double getPerimeter()
{
return (2 + Math.sqrt(2.0)) * getSideVal();
}
public double getArea()
{
return getSideVal() * getSideVal() / 2;
}
public double getRatio()
{
return getArea() / getPerimeter();
}
public String toString()
{
return "Right Triangle: " + getRatio();
}
}
等边三角形子类:
public class EquilateralTriangle extends Triangle
{
public EquilateralTriangle(double l)
{
l = super.getSide();
}
public double getSideVal()
{
double l = super.getSide();
return l;
}
public double getPerimeter()
{
return 3 * getSideVal();
}
public double getArea()
{
return Math.sqrt(3) / 4 * getSideVal() * getSideVal();
}
public double getRatio()
{
return getArea() / getPerimeter();
}
public String toString()
{
return "Equilateral Triangle: " + getRatio();
}
}
最佳答案
abstract
类中的无参数构造函数不执行任何操作。因此,当您尝试使用 side
初始化子类时,其值仍为 0.0。在您的测试中,您除以零并得到 NaN。
只要您明确不调用任何构造函数,您的子类就始终使用默认的无参数构造函数。
阅读here关于构造函数和构造函数调用层次结构。
关于java - Java中的抽象类正在运行,显然需要无参数构造函数,返回NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48877759/