Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的抽象类正在运行,显然不需要参数构造函数,返回NaN?_Java_Nan - Fatal编程技术网

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

Java中的抽象类正在运行,显然不需要参数构造函数,返回NaN?,java,nan,Java,Nan,所以我现在正在学习java中的抽象类,这一个特别要求将一个超类三角形重写为抽象的,并且有子类RightTriangle,EquilateralTriangle,返回面积/周长的比率。出于某种原因,当我在Triangle超类中没有使用无参数构造函数时,BlueJ程序抛出了一个错误。当我使用它时,代码似乎完全忽略了子类的主体,并返回两个值的NaN。代码如下: 三角形抽象超类: public abstract class Triangle { private double side; pub

所以我现在正在学习java中的抽象类,这一个特别要求将一个超类三角形重写为抽象的,并且有子类RightTriangle,EquilateralTriangle,返回面积/周长的比率。出于某种原因,当我在Triangle超类中没有使用无参数构造函数时,BlueJ程序抛出了一个错误。当我使用它时,代码似乎完全忽略了子类的主体,并返回两个值的NaN。代码如下:

三角形抽象超类:

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
类中的no-args构造函数不执行任何操作。所以当您尝试使用它初始化子类时,
side
的值保持为0.0。在你的测试中,你除以0得到NaN。 只要您显式地不调用任何参数,您的子类就始终使用默认的无参数构造函数


阅读有关构造函数和构造函数调用层次结构的信息。

抽象类中的无参数构造函数不执行任何操作。所以当您尝试使用它初始化子类时,
side
的值保持为0.0。在你的测试中,你除以0得到NaN。 只要您显式地不调用任何参数,您的子类就始终使用默认的无参数构造函数

阅读有关构造函数和构造函数调用层次结构的信息。

在此方法中:

public Triangle()
{
    double s;
}
public RightTriangle(double s)
{
  super.getSide();
}
public EquilateralTriangle(double l)
{
    l = super.getSide();
}
你认为
双s语句正在执行吗?
回答:它什么都不做


在这种方法中:

public Triangle()
{
    double s;
}
public RightTriangle(double s)
{
  super.getSide();
}
public EquilateralTriangle(double l)
{
    l = super.getSide();
}
您认为该参数曾经被使用过吗?
答:不是


在这种方法中:

public Triangle()
{
    double s;
}
public RightTriangle(double s)
{
  super.getSide();
}
public EquilateralTriangle(double l)
{
    l = super.getSide();
}
您认为在此处为参数赋值的效果如何?
答:没有效果,因为参数变量在赋值后从未使用过


总而言之,当您运行此命令时:

Triangle equilateralTr = new RightTriangle(12);
Triangle rightTr = new EquilateralTriangle(12);
您如何相信值
12
会被分配到
字段

提示:当子类构造函数没有显式调用
super()
时,将调用无参数基类构造函数,因此在代码中永远不会调用
三角形(双面)
构造函数

如果您尝试调试代码,您可能会注意到这一点。

在此方法中:

public Triangle()
{
    double s;
}
public RightTriangle(double s)
{
  super.getSide();
}
public EquilateralTriangle(double l)
{
    l = super.getSide();
}
你认为
双s语句正在执行吗?
回答:它什么都不做


在这种方法中:

public Triangle()
{
    double s;
}
public RightTriangle(double s)
{
  super.getSide();
}
public EquilateralTriangle(double l)
{
    l = super.getSide();
}
您认为该参数曾经被使用过吗?
答:不是


在这种方法中:

public Triangle()
{
    double s;
}
public RightTriangle(double s)
{
  super.getSide();
}
public EquilateralTriangle(double l)
{
    l = super.getSide();
}
您认为在此处为参数赋值的效果如何?
答:没有效果,因为参数变量在赋值后从未使用过


总而言之,当您运行此命令时:

Triangle equilateralTr = new RightTriangle(12);
Triangle rightTr = new EquilateralTriangle(12);
您如何相信值
12
会被分配到
字段

提示:当子类构造函数没有显式调用
super()
时,将调用无参数基类构造函数,因此在代码中永远不会调用
三角形(双面)
构造函数


如果您尝试调试代码,您可能会注意到这一点。

有太多需要更改/调整的地方。查收@


有太多需要改变/调整的地方。查收@


所有的空白行怎么办?使代码难以阅读坏的压痕是怎么回事?使代码难以阅读。为什么没有
@Override
注释?使得很难说哪些方法应该重写抽象基类中的方法。尝试使用一个IDED。所有的抽象方法都被重写了,ToStand方法是什么?使代码难以阅读坏的压痕是怎么回事?使代码难以阅读。为什么没有
@Override
注释?使得很难说哪些方法应该重写抽象基类中的方法。尝试使用IDE。所有抽象方法都将被重写,也将重写字符串方法