我是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());
}
}
答案 0 :(得分:4)
首先,如何定义超类字段的可见性存在问题:
public class Coordinates {
//defines as private
//sub classes cannot access to these fields directly
private double coorX, coorY;
这是因为您无法在任何子类上调用super.coorX
或super.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.coorX
和super.coorY
没有相同的意外行为。答案 1 :(得分:2)
我想补充一下现有的答案,即使在课堂上,也不应该使用它们的getter来读取字段。
@Override public String toString() { String myString = "(" + getX() + " , " + getY() + " , " + getZ() + ")"; return myString; }
这也解决了这个问题,但你仍然不应该让Coordinates3D
类成为Coordinates
的内部类。