当前位置: 代码迷 >> J2SE >> 类继承出有关问题了!求解
  详细解决方案

类继承出有关问题了!求解

热度:53   发布时间:2016-04-24 01:01:37.0
类继承出问题了!求解
Point3D是Point2D的子类,它们有同名的成员变量,在main最后的for中调用offset()改变坐标:
Point2D的对象可以成功,但Point3D的对象不可以!为什么呢?
  
  另外,当Point3D中不声明int x,y时,也就是直接继承Point2D中的x,y就可以成功调用offset()函数了?为什么呢?

  大神指教呀!先谢了。。。

Java code
public class Point2D {    protected int x,y;        Point2D(){};   //无参构造函数        Point2D(int x1,int y1)  //构造函数    {        x=x1;        y=y1;    }        public void offset(Point2D p)  //随机平移    {        p.x+=(int)(java.lang.Math.random()*100);        p.y-=(int)(java.lang.Math.random()*1000);    }        public String showContent()  //打印坐标    {        return "("+x+","+y+")";    }}public class Point3D extends Point2D{    private int x,y,z;    //private int z;        Point3D(int x1,int y1,int z1)  //子类必须调用父类的构造函数,所以在Point2D中要写Point2D(){}    {        //super();        x=x1;        y=y1;        z=z1;    }        Point3D(Point2D p,int z1)  //构造函数    {        super(p.x,p.y);        x=super.x;        y=super.y;        z=z1;    }        public void offset(Point3D p)  //随机平移    {        p.x+=(int)(java.lang.Math.random()*10);        p.y-=(int)(java.lang.Math.random()*1000);        p.z+=(int)(java.lang.Math.random()*100);    }        public String showContent()   //打印坐标    {        return "("+x+","+y+","+z+")";    }            public static void main(String[] args) {        // TODO Auto-generated method stub        double dist=0;  //记录两点间的距离                /*Point2D 对象*/        Point2D p2d1=new Point2D(3,5);        Point2D p2d2=new Point2D(4,1);        dist=java.lang.Math.sqrt((p2d1.x-p2d2.x)*(p2d1.x-p2d2.x)+(p2d1.y-p2d2.y)*(p2d1.y-p2d2.y));        System.out.println("二维空间两点之间距离为:"+dist);                /*Point3D 对象*/        Point3D p3d1=new Point3D(3,5,7);        Point3D p3d2=new Point3D(p2d2,1);        dist=java.lang.Math.sqrt((p3d1.x-p3d2.x)*(p3d1.x-p3d2.x)+(p3d1.y-p3d2.y)*(p3d1.y-p3d2.y)+(p3d1.z-p3d2.z)*(p3d1.z-p3d2.z));        System.out.println("三维空间两点之间距离为:"+dist);                /*随机生成Point2D,Point3D的对象*/        double rand=-1;   //存储随机数        Point2D array[]=new Point2D[10];  //声明对象数组        int count=0;     //计数变量        while(count<10)        {            rand=java.lang.Math.random();  //生成随机数            if(rand>=0 && rand<=0.5)  //分条件存储            {                array[count]=new Point2D((int)(rand*100),(int)(rand*1000));            }            else            {                array[count]=new Point3D((int)(rand*10),(int)(rand*100),(int)(rand*1000));            }                        count++;        }                /*输出各个对象对应坐标,以确定是Point2D,Point3D的对象*/        System.out.println("平移前"+"                                     "+"平移后");         for(count=0;count<10;count++)        {            System.out.print(array[count].showContent());  //当子类和父类有完全相同的函数时,不用super,默认调用子类自己的            array[count].offset(array[count]);          //每个对象随机平移            System.out.print("              ");            System.out.println(array[count].showContent());         }                    /*Point3D ppp=new Point3D(1,2,3);        System.out.println(ppp.showContent());         ppp.offset(ppp);        System.out.println(ppp.showContent()); */    }}




------解决方案--------------------
Java code
//子类的offset方法    public void offset(Point2D p1) // 随机平移    {        Point3D p = (Point3D)p1;        p.x += (int) (Math.random() * 10);        p.y -= (int) (Math.random() * 1000);        p.z += (int) (Math.random() * 100);    }
------解决方案--------------------
你的offset方法没有覆盖,而array[]数组在最初定义的是point2D类型,当这个数组中出现point3D元素时候,相当于是这样一个形式:Point2D array[count]=new Point3D(int ,int, int),所以当调用offset方法时候是找Point2D中的offset方法。然后在Point3D中,你自己有定义了x和y变量,将Point2D中的x和y隐藏了,因此就找不到相应的x和y来计算位移了。造成了前后两次坐标都没变化。
  相关解决方案