有关Java覆盖的有关问题

有关Java覆盖的问题
package point3d;
import java.util.*;
class Point2D{
    int x,y;
    public Point2D(){
        x=0;y=0;
    }
    public Point2D(int X,int Y){
        x=X;
        y=Y;
    }
    void offset(int X,int Y){
        x=X;
        y=Y;
    }
    void output(){
        System.out.println("x="+this.x);
        System.out.println("y="+this.y);
    }
}
class Point3D extends Point2D{
    int x,y,z;
    public Point3D(int X, int Y,int Z) {
        super(X,Y);
        z=Z;
    }
    public Point3D(Point2D p,int Z){
        x=p.x;
        y=p.y;
        z=Z;
    }
    void offset(int X,int Y,int Z){
        x=X;
        y=Y;
        z=Z;
    }
    void output(){
        System.out.println("x="+x);
        System.out.println("y="+y);
        System.out.println("z="+z);
    }
}

public class Point{
    public static void main(String[] args){
        Point3D p1;
        p1=new Point3D(1,2,3);
        p1.output();
    }
}
请问这里输出的为什么是0 0 3而不是1 2 3呢?
------解决思路----------------------
Point3D有自己独立的属性x,y(它们是默认值0),被赋值的是父类对象属性
------解决思路----------------------
当new的时候,会开辟存储空间,比如,给x,y,z开辟空间,这时没有赋值的话有默认初始值,int类型为0。调用相应构造器,先执行调用父类的构造器,把形参的值传入,父类的x,y设置为1,2,执行下个语句子类的z设置为3,创建对象结束,下一条语句打印的是子类的x,y,z的值,所以为0  0  3