toString返回不同的值

时间:2014-11-02 14:42:25

标签: java

我是java的新手,我正在做一个简单的程序,但我不知道为什么我得到不同的值,即如果我使用getX,getY和getZ我得到(6,5,8)但是如果我使用toString我得到X和Y(3,4,8)的不同值,所以任何人都可以解释为什么它发生,因为据我所知它应该在两种情况下得到相同的值或我做错了什么?

public class Coordinates {

    private double coorX, coorY;

    Coordinates()
    {
        coorX = 1;
        coorY = 1;
    }

    Coordinates(double x, double y)
    {
        coorX = x;
        coorY = y;      
    }

    void setX(double x)
    {
        coorX = x; 
    }

    void setY(double y)
    {
        coorY = y; 
    }

    double getX()
    {
        return coorX;
    }

    double getY()
    {
        return coorY;
    }

    public String toString()
    {
        String myString = "(" + coorX + " , " + coorY + ")";
        return myString;
    }

    public class Coordinates3D extends Coordinates{
        private double coorZ;

        Coordinates3D()
        {
            super();
            coorZ = 1;
        }

        Coordinates3D(double x, double y, double z)
        {
            super(x,y);
            coorZ = z;
        }

        public void setZ(double z)
        {
            coorZ = z;
        }

        double getZ()
        {
            return coorZ;
        }

        @Override
        public String toString()
        {
            String myString = "(" + coorX + " , " + coorY + " , " + coorZ + ")" ;
            return myString;

        }

    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Coordinates test1 = new Coordinates(3,4);


        System.out.println(test1.toString());

        System.out.println(test1.getX());
        System.out.println(test1.getY());


        Coordinates3D test2 = test1.new Coordinates3D(6,5,8);

        System.out.println(test2.toString()); ---> here is the problem

        System.out.println(test2.getX());
        System.out.println(test2.getY());
        System.out.println(test2.getZ());


    }

}

2 个答案:

答案 0 :(得分:4)

首先,如何定义超类字段的可见性存在问题:

public class Coordinates {
    //defines as private
    //sub classes cannot access to these fields directly
    private double coorX, coorY;

这是因为您无法在任何子类上调用super.coorXsuper.coorY,例如Coordinates3D。因此,在toString方法中,当您拥有此代码时:

String myString = "(" + coorX + " , " + coorY + " , " + coorZ + ")" ;

它编译并运行正常因为Coordinates3D是一个内部类。因此,在此处使用coorX时,它会访问存储在创建coorX实例的Coordinates类实例中的Coordinates3D字段的值。如果你将这些类分开,这很容易复制:

class Coordinates {
    private double coorX, coorY;
}

public class Coordinates3D extends Coordinates {
    //current code...
    @Override
    public String toString() {
        //now you will get a compilaton error
        String myString = "(" + coorX + " , " + coorY + " , " + coorZ + ")" ;
        return myString;
    }
}

最好的解决方案是:

  • 将超类中的字段标记为protected
  • 分开课程

如果您仍想将Coordinates3D作为内部类(不推荐),那么:

  • 将超类中的字段标记为protected
  • 使用super.coorXsuper.coorY没有相同的意外行为。

答案 1 :(得分:2)

我想补充一下现有的答案,即使在课堂上,也不应该使用它们的getter来读取字段。

  @Override
    public String toString() {
        String myString = "(" + getX() + " , " + getY() + " , " + getZ() + ")";
        return myString;
    }

这也解决了这个问题,但你仍然不应该让Coordinates3D类成为Coordinates的内部类。