A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴超 金牌黑马   /  2012-5-20 21:45  /  2532 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Demo4
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("Hello World!");
  6.         }
  7. }
  8. class Fu
  9. {
  10.         Fu(int x)
  11.         {
  12.                 System.out.println(x);
  13.         }
  14. }
  15. class Zi extends Fu
  16. {
  17.         Zi()
  18.         {
  19.                 //super();
  20.         }
  21. }
复制代码
为什么会报错,加上super(3),能具体说下吗~

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
Zi类继承了Fu类,但是Fu类中没有定义空参数列表的构造方法
而Zi类构造函数隐式的调用super(); 并且默认在子类构造方法第一行调用。
而这时根本找不到父类中对应的构造方法,就会报错了。
一般子类的参数列表都需要比父类参数列表长,或者相等。然后子类构造函数体内可以手动调用父类构造函数。
这样出错的几率会比较小。
当然并不代表不会出现子类参数列表比父类更短的情况。用eclipse编代码可以不用考虑这类问题。
因为动态联编的过程就会报错的,会提示的。
希望能帮到楼主

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
将毕老师视频中关于子类的初始化过程好好看看哦
子类构造函数中的第一行会隐含空参数语句super();子类在初始化时会先在父类中进行初始化,然后再在自己的构造函数中初始化,而你的父类中没有空参数的构造函数,所以报错。
解决有两方法:
1,在父类中加上空参数的构造函数
2,在子类构造函数第一行手动显示设置父类有参的语句,如super(3);因为当你手动设置后,子类构造函数第一行默认的父类的无参构造语句就无用了。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
一般有构造函数的时候最好都要手动加上空参构造函数的,否则有可能出错。
回复 使用道具 举报
继承父类,对父类的构造函数进行初始化,要观察父类的构造函数的特点,你定义的父类中的构造函数是有参数类的,在子类继承的时候,会调用父类的构造函数进行初始化,这时候要随着父类中构造函数的形式随之改动,你只要将子类中的第一行加上super()随便输入一个int型的参数即可初始化。
回复 使用道具 举报
       Zi()
        {
                //super();
        }
上面这个构造方法中如果不加上super()z这句,或加了后不给它传参数,侧出现无法将类 Fu中的构造器 Fu应用到给定类型;原因是与Fu类的构造方法参数不一致,
如果改为   Zi()
        {
              super(3);
        }
则编译能通过
回复 使用道具 举报
zi继承了fu,本来如果你不在fu内定义有参数的构造方法话,类会自带一个无参构造方法,但是一旦你定义有参构造方法后就不会默认带无参的那个,那么zi继承后就必须使用有参构造方法或者在fu中加一个无参构造方法
就能使用super()
回复 使用道具 举报
class Demo
{
        public static void main(String[] args)
        {
                Zi z1= new Zi();
                Zi z2= new Zi(4);
        }
}
class Fu
{
        Fu()
        {
                System.out.println("父 无参的");
        }

                Fu(int x)
        {
                System.out.println("父 有参的");
        }
}
class Zi extends Fu
{
        Zi()
        {
                //super();
                                System.out.println("子 无参的");
        }
                 Zi(int x)
        {       //super();
                super(x);
                                System.out.println("子 有参的");
        }
}
这个例子你去运行下就非常明白了,他继承找父的时候,super();这条语句是隐藏的,但只能传递无参数据,如果想自定义传数据的话,这条语句必须写上,而且里面也要有值;
继承的时候,如果不写,就要调用父类无参构造方法了!
如果不明白,私聊, 继承 这块,我学的透!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马