怎样改写方法体使结果正确public class Point2D {
    protected double x, y;
    public Point2D(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public Point2D() {
        this(0, 0);
    }
   public boolean equals(Point2D p) {
        if(p instanceof Point3D){
            return false;//一个2D,一个3D直接false;可是如果两个比较的都是3D的?
        }else{
        return x == p.x && y == p.y;
        } 
    }class Point3D extends Point2D{
    protected double z;
     public Point3D(double x,double y,double z){
        super(x,y);
        this.z=z;
    }
    public boolean equals(Point3D p) {
        return x == p.x && y == p.y&&z==p.z;
    }
    
}

解决方案 »

  1.   

    http://blog.csdn.net/u011627980发来贺电
      

  2.   

    感觉有点头疼,p33.equal(p33)都能出错
      

  3.   

    因为equals()调用的是父类里的,然后发现p33是3D所有直接返回false
      

  4.   


    // Point2D的equals
    public boolean equals(Point2D p) {
    if (p instanceof Point2D) {
    return x == p.x && y == p.y;
    }
    return false;
    }// Point3D的equals
    @Override
    public boolean equals(Point2D p) {
    if (p instanceof Point3D) {
    Point3D p3d = (Point3D)p;
    return x == p3d.x && y == p3d.y && z == p3d.z;
    }
    return false;
    }处理思路是这样的:
    1. Point2D中只能处理2d的类,2d中不能出现子类3d的任何引用。如果将来出现了4d,5d这么办?是不是还得加判断?
    2. Point2D的参数不对,和父类不一样,并不是一个覆写的方法(如果实现了覆写,this实例就一定是这个对象本身,免去的判断和转换的操作,而且具有拓展性),这里需要将参数改成Point2D,另外在方法里面判断p是不是3d,是的话,强转并进行判断。
      

  5.   

    订正:2. Point3D的参数不对……
      

  6.   

    哦,我看了一下,Point3D的equals并没有重写Point2D中的equals方法,啊哈哈我认为要出现理想的结果,重写Object类的toString方法就可以了
         在Point2D中添加方法
             @Override
               public String toString(){
             String p="("+x+","+y+")";
            return p;
               }
        在Point3D中添加方法
            @Override
             public String toString(){
           String p="("+x+","+y+","+z+")";
            return p;
           }
    我自己测试了,可以用的,也可以把@Override省略
      

  7.   

    你写的第一个equals()2d的 p instanceof Point2D ,p33是它的子类返回值是true,只比较x和y 还是错的吧?