父类里只有带参的构造函数,子类里的方法1的形参是父类的对象,在主类里创建并初始化父类对象,再初始化子类对象,用子类对象调用方法1,编译不通过.后在父类里加不带参数的构造函数,编译通过,为什么?形参也要实例化吗?是不是同时在内存中分配两个地址给实参、形参,然后使形参的地址等于实参地址,再释放形参的内存空间?

解决方案 »

  1.   

    没看明白,有些乱。
    很简单,创建子类的对象的时候会一次调用父类的构造方法,如果你自己不用super来显示的调用,编译器会自动给你写一个super();来调用父类的默认构造方法,如果父类没有无参构造方法,则编译出错。必须你显示的添加。没有别的问题了。
      

  2.   

    源程序:
    import java.util.Scanner;
    class  Point2D
    {
    double x,y;
    /*Point2D()
    {}//为什么一定要加构造函数*/
    Point2D(double a,double b)
    {x=a;y=b;}
    void offset(double a, double b)
    {x=x+a;y=y+b;}
    }
    class  Point3D extends Point2D
    {
    double x1,y1,z1;
    Point3D(double a,double b,double c)
    {
    x1=a;y1=b;z1=c;
    }
    Point3D(Point2D p,double z)//子类的方法的参数是父类的对象
    {
    x1=p.x;y1=p.y;z1=z;
    }
    void offset(double a, double b,double c)
    {x1=x1+a;y1=y1+b;z1=z1+b;}
    }
    public class lab4_1
    {
    public static void main(String[] args) 
    {
    Point2D p2d1,p2d2;
    Point3D p3d1,p3d2;
    int a,b,c;
    Scanner sc = new Scanner(System.in);
    System.out.println("输入二维空间下的第一起始点");
     a = sc.nextInt();
     b = sc.nextInt();
    p2d1=new Point2D (a,b);
    System.out.println("输入二维空间下的第二起始点");
     a = sc.nextInt();
     b = sc.nextInt();
    p2d2=new Point2D (a,b);
    System.out.println("是否要平移第一起始点?1代表是,0代表否");
    a = sc.nextInt();
    if(a==1)
    {
    System.out.println("输入平移量");
    a = sc.nextInt();
        b = sc.nextInt();
    p2d1.offset(a, b);
    }
    System.out.println("是否要平移第二起始点?1代表是,0代表否");
    a = sc.nextInt();
    if(a==1)
    {
    System.out.println("输入平移量");
    a = sc.nextInt();
        b = sc.nextInt();
    p2d2.offset(a, b);
    }
    System.out.println("它们之间的距离是"+Math.hypot(p2d1.x-p2d2.x,p2d1.y-p2d2.y));
    System.out.println("输入三维空间下的第一起始点");
     a = sc.nextInt();
     b = sc.nextInt();
     c = sc.nextInt();
    p3d1=new Point3D (a,b,c);
    System.out.println("输入三维空间下的第二起始点的z坐标");
     a = sc.nextInt();
    p3d2=new Point3D (p2d1,c);
    System.out.println("是否要平移第一起始点?1代表是,0代表否");
    a = sc.nextInt();
    if(a==1)
    {
    System.out.println("输入平移量");
    a = sc.nextInt();
        b = sc.nextInt();
    c = sc.nextInt();
    p3d1.offset(a,b,c);
    }
    System.out.println("是否要平移第二起始点?1代表是,0代表否");
    a = sc.nextInt();
    if(a==1)
    {
    System.out.println("输入平移量");
    a = sc.nextInt();
        b = sc.nextInt();
    c = sc.nextInt();
    p3d2.offset(a,b,c);
    }
    System.out.println("它们之间的距离是"+Math.sqrt((p3d1.x1-p3d2.x1)*(p3d1.x1-p3d2.x1)+(p3d1.y1-p3d2.y1)*(p3d1.y1-p3d2.y1)+(p3d1.z1-p3d2.z1)*(p3d1.z1-p3d2.z1)));
    }
    }
    知道应该把屏蔽的那条语句加入,但是不知道为什么
      

  3.   

    实例化子类时,会调用父类的构造函数,父类里有一个代参的构造函数,子类的构造函数里就必须显示调用父类的这个构造函数,
    否则会隐式调用super();,而父类没有无参的构造函数,则编译通不过