黑马程序员技术交流社区

标题: 子父类的继承问题 [打印本页]

作者: 古银平    时间: 2012-5-21 19:16
标题: 子父类的继承问题
比如:
class Fu
{   Fu  (int a)
    {
      System.out.println("父类 :"+x);
    }
}
class Zi extends Fu
{   Zi  ()
    {
      System.out.println("子类 :");
    }
   Zi  (int x)
    {
       System.out.println("子类 :"+x);
    }
}
class Test
{
    public static void main(String[] args)
    {    Zi a=new Zi();
          Zi b=new Zi(5);
    }
}
会出现错误,为什么?
作者: 小小企鹅    时间: 2012-5-21 19:22
本帖最后由 小小企鹅 于 2012-10-27 22:32 编辑

在创建新对象时,所有继承下来的构造函数都执行,如果已经写了一个构造函数,需要一个其他参数的构造函数,系统不会自动添加,父类缺少Fu()构造方法;父类还需要声明x变量再使用。

class Fu {
    Fu(int a) {
        int x = a; //定义局部变量x
        System.out.println("父类 :" + x);
    }

    Fu() {//定义构造函数Fu()
    };
}

class Zi extends Fu {
    Zi() {
        System.out.println("子类 :");
    }

    Zi(int x) {
        System.out.println("子类 :" + x);
    }
}

class Test {
    public static void main(String[] args) {
        Zi a = new Zi();
        Zi b = new Zi(5);
    }
}

作者: 凡延海    时间: 2012-5-21 20:12
Java中继承关系构造方法调用是有顺序的,子类在产生对象实例的时候首先会调用父类的构造方法,然后在调用子类的构造方法。Fu类中显式的声明了在参数的构造方法,那么在子类Zi的构造方法中调用父类的构造方法才可以,不然就会像楼主说的那样会因为找不到父类构造方法而报错。楼主可以在父类加上无参数的构造方法,
  1. class Fu
  2. {  
  3.         Fu()
  4.         {
  5.                
  6.         }
  7.         Fu  (int x)
  8.     {
  9.       System.out.println("父类 :"+x);
  10.     }
  11. }
  12. class Zi extends Fu
  13. {   
  14.          Zi()
  15.     {
  16.       System.out.println("子类 :");
  17.     }
  18.     public Zi(int x)
  19.     {

  20.        System.out.println("子类 :"+x);
  21.     }
  22. }
  23. class Test
  24. {
  25.     public static void main(String[] args)
  26.     {    Zi a=new Zi();
  27.          Zi b=new Zi(5);
  28.     }
  29. }
复制代码

作者: 李斌    时间: 2012-5-21 23:27
本帖最后由 李斌 于 2012-5-21 23:47 编辑

class Fu
{        
        
        Fu()
        {
                int x=11;
                System.out.println("父类:"+x);
        }

        
        Fu  (int x)
    {
        x=1000;
      System.out.println("父类 :"+x);
    }
}
class Zi extends Fu
{   
        Zi  ()
    {
      System.out.println("子类 :");
    }
   Zi  (int x)
    {
       System.out.println("子类 :"+x);
    }
}
class Test
{
    public static void main(String[] args)
    {    Zi a=new Zi();
          Zi b=new Zi(5);
    }
}
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1932687959\QQ\WinTemp\RichOle\L]8AHAAQ829M$LYQ8F@6{MR.jpg

我是这样理解的:
Zi a=new Zi();这一句,建立完对象就会访问父类中空参数的构造函数而你的代码里面没有, 所以需要创建一个空参数的构造函数;
Zi b=new Zi(5);这一句,建立完对象就会访问父类中也是 不带参数 的构造函数,然后再方位本类中 带参数 的构造函数。
当父类中没有空参数的构造函数时,需要子类手动通过super语句或者添加一个空参数的构造函数,
还可以通过this语句老访问本类中的构造函数,但是子类中至少有一个构造函数会访问父类中的构造函数。

file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1932687959\QQ\WinTemp\RichOle\L]8AHAAQ829M$LYQ8F@6{MR.jpg
前面那个打错字 了  以这个为准


L]8AHAAQ829M$LYQ8F@6{MR.jpg (7.69 KB, 下载次数: 41)

L]8AHAAQ829M$LYQ8F@6{MR.jpg

作者: 李斌    时间: 2012-5-21 23:35
我是这样理解的:
Zi a=new Zi();这一句,建立完对象就会访问父类中空参数的构造函数而你的代码里面没有, 所以需要创建一个空参数的构造函数;
Zi b=new Zi(5);这一句,建立完对象就会访问父类中带参数的构造函数,然后再方位本类中带参数的构造函数。
当父类中没有空参数的构造函数时,需要子类手动通过super语句或者添加一个空参数的构造函数,
还可以通过this语句老访问本类中的构造函数,但是子类中至少有一个构造函数会访问父类中的构造函数。

作者: 刘聪    时间: 2012-5-22 14:16
有点乱哈,只要子类没有显示的调用父类构造器,java就会让子类默认自动调用父类无参构造器,而若父类没有,sorry,俺就报错了(好像编译都通不过吧...)
作者: 闾丘日月    时间: 2012-5-22 15:09
楼主这个帖子不是刷分的吧。。。
这个在毕向东老师的视频里应该讲的很清楚了,上面的各位解答了我就不多说了。
看到一个没加任何自己分析的问题真的不爽,大家别介意哈!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2