java中的抽象类没有任何价值

时间:2017-11-04 16:10:42

标签: java abstract

我遇到了抽象类的问题,代码运行但它不会占用任何值,它在任何地方打印“0.0”,我认为这是一个访问问题。我必须创建一个抽象基类“点”我宣布一个点的3个坐标,然后我必须计算一个立方体和一个球体的面积,体积和中心点。如果某些东西不好看,需要格式化,或者不理解请告诉我。谢谢。

   //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;
}


}

The Cube

//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;
    }



}

我有主要的测试类

//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());
    }

}

4 个答案:

答案 0 :(得分:1)

你的设计真的错了。 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,并且该距离存储在球体中(如上所述)。因此,在这行代码之后,您已将球体的raza设置为0.然后执行

obSfera.getAria()

并且此方法

aria=4*Math.PI*raza*raza;
return aria;

所以,再一次,它不是只返回球体的区域,而是用计算值覆盖它的区域,因为你之前已经将raza设置为0,所以它是0。

以下是球体类的外观:

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;
    }
}

关键点:

  • 其领域是最终的:它们无法改变。
  • 无需将音量和区域存储为字段,因为它们是从半径
  • 派生的
  • getters不要尝试修改对象。他们只计算一个值并将其返回。

答案 1 :(得分:1)

您正在使用相同的点(p1)来计算raza,从而替换您在构造函数中使用的值。然后你用raza来计算Sfera类中的其他值。 在Cub类中你也是这样做的,所以程序正在做它应该做的事情。如果你在点与自身之间计算这些东西,它会给你0。 因此,您在构造函数中使用的值会被方法覆盖。

答案 2 :(得分:0)

System.out.println("Raza sfera:" + obSfera.getRaza(p1,p1));

抱歉,我无法翻译Raza,但此方法可计算两点之间的距离。 你在同一点上传入getRaza。两个相同点之间的距离为零。这就是getRaza返回零的原因。

您可以在方法Sfera::raza

中将点之间的距离指定给内部字段getRaza
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

也是如此

答案 3 :(得分: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());
    }

}

CubSfera都引用相同的对象p1,因此距离值Math.pow(p2.x-p1.x,2)始终为0