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