java 中的摘要 类 没有取任何值
Abstract classes in java not taking any value
我在使用抽象 classes 时遇到问题,代码运行但不会获取任何值,到处都打印“0.0”,我认为这是一个访问 problem.I 必须创建一个名为 "Point" 的抽象基础 class,其中我声明了一个点的 3 个坐标,然后我必须计算立方体和球体的面积、体积和中心点。此外,如果有的话不好看,需要格式化,或者一个字都不懂,请告诉me.Thank你。
//this is the base class
public abstract class Punct
{
public double x,y,z;
Punct(double x,double y, double z)
{
this.x=x;
this.y=y;
this.z=z;
}
public double getX()
{
return x;
}
public double getY()
{
return y;
}
public double getZ()
{
return z;
}
}
然后球体
//This is the sphere class that extends the Point class
public class Sfera extends Punct
{
private double aria,volumul,raza,centrul;
Sfera(double x, double y, double z,double aria,double volumul,
double centrul,double raza)
{
super(x, y, z);
this.aria=aria;
this.volumul=volumul;
this.centrul=centrul;
this.raza=raza;
}
public double getRaza(Punct p1,Punct p2)
{
raza=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
return raza;
}
public double getAria()
{
aria=4*Math.PI*raza*raza;
return aria;
}
public double getVolumul()
{
volumul=4/3*Math.PI*raza*raza*raza;
return volumul;
}
public double getCentrul(Punct p1)
{
return centrul;
}
}
立方体
//this is the cube
public class Cub extends Punct
{
double latura,aria,volumul,centrul;
Cub(double x, double y, double z,double latura, double aria,double volumul, double centrul)
{
super(x, y, z);
this.latura=latura;
this.aria=aria;
this.volumul=volumul;
this.centrul=centrul;
}
public double getLatura(Punct p1,Punct p2)
{
latura=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
return latura;
}
public double getAria()
{
aria=6*Math.pow(latura, 2);
return aria;
}
public double getVolumul()
{
volumul=latura*latura*latura;
return volumul;
}
}
还有测试 Class 我有主要
//this is the Test class
public class TestTema
{
public static void main(String[] args_)
{
Punct p1=new Punct(2, 2, 2) {};
Sfera obSfera=new Sfera(1,2,3,1,1,1,1);
System.out.println("Raza sfera:" + obSfera.getRaza(p1,p1));
System.out.println("Aria sfera=" + obSfera.getAria());
System.out.println("Volum sfera= " +obSfera.getVolumul());
// System.out.println("Centrul= "+obSfera.getSuprafata());
Cub obCub=new Cub(1,2,3,1,1,1,1);
System.out.println("Lungime latura cub:"+obCub.getLatura(p1,p1));
System.out.println("Aria cubului="+obCub.getAria());
System.out.println("Volumul cubului="+obCub.getVolumul());
// System.out.println("Suprafata="+obCub.getCentrul());
}
}
System.out.println("Raza sfera:" + obSfera.getRaza(p1,p1));
抱歉,我无法翻译什么是 Raza
,但此方法计算两点之间的距离。
你传递到 getRaza
相同的点。两个相同点之间的距离为零。这就是为什么 getRaza
returns 零。
您在方法 getRaza
中将点之间的距离分配给内部字段 Sfera::raza
public double getRaza(Punct p1,Punct p2)
{
raza=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
return raza;
}
所以在调用 obSfera.getRaza(p1,p1)
之后字段 obSfera.raza
等于零。
所有其他方法在其公式中使用 obSfera.raza
:
public double getAria()
{
aria=4*Math.PI*raza*raza;
return aria;
}
public double getVolumul()
{
volumul=4/3*Math.PI*raza*raza*raza;
return volumul;
}
将 raza
值放入您的公式中:
volumul = 4/3*Math.PI*raza*raza*raza = 4/3*Math.PI*0*0*0 = 0
aria = 4*Math.PI*raza*raza = aria=4*Math.PI*0*0
对象obCub
也是如此
你的设计真的错了。 Sfera 有一个方法 getRaza()
可以计算两点之间的距离。没有理由使用 Sphere 来计算两点之间的距离。这应该是Punct的一个实例方法,应该以另一个点作为参数。
但更糟糕的是:它不只是计算两点之间的距离,而是将这个距离存储在球体中,覆盖它之前的 raza(不确定球体为什么有距离):
raza=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
您在其他几个方法中犯了同样的错误:get 方法不应该改变对象的状态。
现在,让我们看看您的代码。您首先调用
obSfera.getRaza(p1,p1)
计算 p1 和它自己之间的距离,所以答案是 0,并且这个距离存储在 Sphere 中(如上所述)。因此,在这行代码之后,您已将球体的 raza 设置为 0。然后执行
obSfera.getAria()
而这个方法确实
aria=4*Math.PI*raza*raza;
return aria;
所以,再一次,它不再只是 return 计算球体的面积,而是用计算值覆盖它的面积,计算值是 0,因为你之前已经将 raza 设置为 0。
这是球体 class 的样子:
public class Sphere {
private final double radius;
public Sphere(double radius) {
this.radius = radius;
}
public double getArea() {
return 4 * Math.PI * this.radius * this.radius;
}
public double getVolume() {
return (4.0 / 3) * Math.PI * this.radius * this.radius * this.radius;
}
}
要点:
- 它的字段是最终的:它们不能改变。
- 不需要将体积和面积存储为字段,因为它们是从半径导出的
- getter 不要尝试修改对象。他们只是计算一个值,然后 return 它。
您正在使用相同的点 (p1) 来计算 raza,从而替换了您在构造函数中使用的值。然后您使用 raza 计算了 Sfera class 中的其他值。
在 Cub class 中你也在做同样的事情,所以程序正在做它应该做的事情。如果你计算点和它本身之间的那些东西,它会给你 0。
结果,您在构造函数中使用的值被您的方法覆盖了。
为 class Punct
创建另一个对象并重写如下代码:
public class TestTema
{
public static void main(String[] args_)
{
Punct p1=new Punct(2, 2, 2) {};
Punct p2=new Punct(3, 3, 3) {};
Sfera obSfera=new Sfera(1,2,3,1,1,1,1);
System.out.println("Raza sfera:" + obSfera.getRaza(p1,p2));
System.out.println("Aria sfera=" + obSfera.getAria());
System.out.println("Volum sfera= " +obSfera.getVolumul());
// System.out.println("Centrul= "+obSfera.getSuprafata());
Cub obCub=new Cub(1,2,3,1,1,1,1);
System.out.println("Lungime latura cub:"+obCub.getLatura(p1,p2));
System.out.println("Aria cubului="+obCub.getAria());
System.out.println("Volumul cubului="+obCub.getVolumul());
// System.out.println("Suprafata="+obCub.getCentrul());
}
}
类 Cub
和 Sfera
都指向同一个对象 p1,所以距离值 Math.pow(p2.x-p1.x,2)
总是 0
。
我在使用抽象 classes 时遇到问题,代码运行但不会获取任何值,到处都打印“0.0”,我认为这是一个访问 problem.I 必须创建一个名为 "Point" 的抽象基础 class,其中我声明了一个点的 3 个坐标,然后我必须计算立方体和球体的面积、体积和中心点。此外,如果有的话不好看,需要格式化,或者一个字都不懂,请告诉me.Thank你。
//this is the base class
public abstract class Punct
{
public double x,y,z;
Punct(double x,double y, double z)
{
this.x=x;
this.y=y;
this.z=z;
}
public double getX()
{
return x;
}
public double getY()
{
return y;
}
public double getZ()
{
return z;
}
}
然后球体
//This is the sphere class that extends the Point class
public class Sfera extends Punct
{
private double aria,volumul,raza,centrul;
Sfera(double x, double y, double z,double aria,double volumul,
double centrul,double raza)
{
super(x, y, z);
this.aria=aria;
this.volumul=volumul;
this.centrul=centrul;
this.raza=raza;
}
public double getRaza(Punct p1,Punct p2)
{
raza=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
return raza;
}
public double getAria()
{
aria=4*Math.PI*raza*raza;
return aria;
}
public double getVolumul()
{
volumul=4/3*Math.PI*raza*raza*raza;
return volumul;
}
public double getCentrul(Punct p1)
{
return centrul;
}
}
立方体
//this is the cube
public class Cub extends Punct
{
double latura,aria,volumul,centrul;
Cub(double x, double y, double z,double latura, double aria,double volumul, double centrul)
{
super(x, y, z);
this.latura=latura;
this.aria=aria;
this.volumul=volumul;
this.centrul=centrul;
}
public double getLatura(Punct p1,Punct p2)
{
latura=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
return latura;
}
public double getAria()
{
aria=6*Math.pow(latura, 2);
return aria;
}
public double getVolumul()
{
volumul=latura*latura*latura;
return volumul;
}
}
还有测试 Class 我有主要
//this is the Test class
public class TestTema
{
public static void main(String[] args_)
{
Punct p1=new Punct(2, 2, 2) {};
Sfera obSfera=new Sfera(1,2,3,1,1,1,1);
System.out.println("Raza sfera:" + obSfera.getRaza(p1,p1));
System.out.println("Aria sfera=" + obSfera.getAria());
System.out.println("Volum sfera= " +obSfera.getVolumul());
// System.out.println("Centrul= "+obSfera.getSuprafata());
Cub obCub=new Cub(1,2,3,1,1,1,1);
System.out.println("Lungime latura cub:"+obCub.getLatura(p1,p1));
System.out.println("Aria cubului="+obCub.getAria());
System.out.println("Volumul cubului="+obCub.getVolumul());
// System.out.println("Suprafata="+obCub.getCentrul());
}
}
System.out.println("Raza sfera:" + obSfera.getRaza(p1,p1));
抱歉,我无法翻译什么是 Raza
,但此方法计算两点之间的距离。
你传递到 getRaza
相同的点。两个相同点之间的距离为零。这就是为什么 getRaza
returns 零。
您在方法 getRaza
Sfera::raza
public double getRaza(Punct p1,Punct p2)
{
raza=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
return raza;
}
所以在调用 obSfera.getRaza(p1,p1)
之后字段 obSfera.raza
等于零。
所有其他方法在其公式中使用 obSfera.raza
:
public double getAria()
{
aria=4*Math.PI*raza*raza;
return aria;
}
public double getVolumul()
{
volumul=4/3*Math.PI*raza*raza*raza;
return volumul;
}
将 raza
值放入您的公式中:
volumul = 4/3*Math.PI*raza*raza*raza = 4/3*Math.PI*0*0*0 = 0
aria = 4*Math.PI*raza*raza = aria=4*Math.PI*0*0
对象obCub
你的设计真的错了。 Sfera 有一个方法 getRaza()
可以计算两点之间的距离。没有理由使用 Sphere 来计算两点之间的距离。这应该是Punct的一个实例方法,应该以另一个点作为参数。
但更糟糕的是:它不只是计算两点之间的距离,而是将这个距离存储在球体中,覆盖它之前的 raza(不确定球体为什么有距离):
raza=Math.sqrt(Math.pow(p2.x-p1.x,2)+Math.pow(p2.y-p1.y, 2)+Math.pow(p2.z-p1.z, 2));
您在其他几个方法中犯了同样的错误:get 方法不应该改变对象的状态。
现在,让我们看看您的代码。您首先调用
obSfera.getRaza(p1,p1)
计算 p1 和它自己之间的距离,所以答案是 0,并且这个距离存储在 Sphere 中(如上所述)。因此,在这行代码之后,您已将球体的 raza 设置为 0。然后执行
obSfera.getAria()
而这个方法确实
aria=4*Math.PI*raza*raza;
return aria;
所以,再一次,它不再只是 return 计算球体的面积,而是用计算值覆盖它的面积,计算值是 0,因为你之前已经将 raza 设置为 0。
这是球体 class 的样子:
public class Sphere {
private final double radius;
public Sphere(double radius) {
this.radius = radius;
}
public double getArea() {
return 4 * Math.PI * this.radius * this.radius;
}
public double getVolume() {
return (4.0 / 3) * Math.PI * this.radius * this.radius * this.radius;
}
}
要点:
- 它的字段是最终的:它们不能改变。
- 不需要将体积和面积存储为字段,因为它们是从半径导出的
- getter 不要尝试修改对象。他们只是计算一个值,然后 return 它。
您正在使用相同的点 (p1) 来计算 raza,从而替换了您在构造函数中使用的值。然后您使用 raza 计算了 Sfera class 中的其他值。 在 Cub class 中你也在做同样的事情,所以程序正在做它应该做的事情。如果你计算点和它本身之间的那些东西,它会给你 0。 结果,您在构造函数中使用的值被您的方法覆盖了。
为 class Punct
创建另一个对象并重写如下代码:
public class TestTema
{
public static void main(String[] args_)
{
Punct p1=new Punct(2, 2, 2) {};
Punct p2=new Punct(3, 3, 3) {};
Sfera obSfera=new Sfera(1,2,3,1,1,1,1);
System.out.println("Raza sfera:" + obSfera.getRaza(p1,p2));
System.out.println("Aria sfera=" + obSfera.getAria());
System.out.println("Volum sfera= " +obSfera.getVolumul());
// System.out.println("Centrul= "+obSfera.getSuprafata());
Cub obCub=new Cub(1,2,3,1,1,1,1);
System.out.println("Lungime latura cub:"+obCub.getLatura(p1,p2));
System.out.println("Aria cubului="+obCub.getAria());
System.out.println("Volumul cubului="+obCub.getVolumul());
// System.out.println("Suprafata="+obCub.getCentrul());
}
}
类 Cub
和 Sfera
都指向同一个对象 p1,所以距离值 Math.pow(p2.x-p1.x,2)
总是 0
。