java - Java中的抽象类正在运行,显然需要无参数构造函数,返回NaN?

标签 java nan

所以我现在正在学习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/

相关文章:

Python 的 'set' 运算符不适用于 numpy.nan

python-3.x - 如何在不使用 Pandas 的情况下创建相当于 numpy.nan 的日期时间对象?

java - Maven复制资源

java - Eclipse 解析器不应该检测到这种 IndexOutOfBounds 异常吗?

java - 函数调用后的大括号是什么?

java - 如何在maven中部署父项目打包war

java - org.springframework.web.servlet.DispatcherServlet noHandlerFound

javascript - 返回 NaN 的数字?

ruby - 检查数字是否为 NaN

python - Tensorflow:矩阵乘法和加法期间的nan