本帖最后由 了无尘 于 2012-3-12 02:32 编辑
Implicit super constructor Super() is undefined. Must explicitly invoke another constructor
这个错误今天已经几个人出了,这个意思就是你的父类必须有无参构造函数- class Super
- {
- int i=0;
- public Super()
- {
-
- }
- public Super(String s)
- {
- i=1;
- }
- }
- class Demo extends Super
- {
- public Demo(String s)
- {
-
- super();
- i=2;
- }
- }
- class Test
- {
- public static void main(String[] args)
- {
- Demo d=new Demo("yes");//编译失败。提示找不到构造函数,为什么?
- System.out.println(d.i);
- }
- }
复制代码 关键点就在于子类里的这个super()上,我们做个测试,- class Super
- {
- int i;
- public Super()
- {
- i=100;
- }
- public Super(String s)
- {
- i=1;
- }
- }
- public class Demo extends Super
- {
- public Demo(String s)
- {
-
- super();
- i+=2;
- }
- public static void main(String[] args)
- {
- Demo d=new Demo("yes");//编译失败。提示找不到构造函数,为什么?
- System.out.println(d.i);
- }
- }
复制代码 这里的子类构造函数中的super()调用了父类的无参构造函数,所以结果为102,但我们把这个super()注释了,结果还是102,因为默认的会调用父类的无参构造函数,所以我们必须手动指定一个无参的构造函数
在看下边这个代码- class Super
- {
- int i;
- public Super(String s)
- {
- i=1;
- }
- }
- public class Demo extends Super
- {
- public Demo(String s)
- {
-
- super(s);
- i+=2;
- }
- public static void main(String[] args)
- {
- Demo d=new Demo("super");//编译失败。提示找不到构造函数,为什么?
- System.out.println(d.i);
- }
- }
复制代码 结果为3,而且父类没有无参构造函数,原因是子类的有参构造第一句的super(s)覆盖了默认的super(),在父类里这个有参的构造函数是存在的,所以并不会发生问题
构造函数的补全功能是 类里并没有构造函数的情况下,为你补全一个空的构造函数,所以在你有有参构造函数的情况下是不会自动补全的。 |