黑马程序员技术交流社区
标题:
有关继承~
[打印本页]
作者:
吴超
时间:
2012-5-20 21:45
标题:
有关继承~
class Demo4
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
class Fu
{
Fu(int x)
{
System.out.println(x);
}
}
class Zi extends Fu
{
Zi()
{
//super();
}
}
复制代码
为什么会报错,加上super(3),能具体说下吗~
作者:
云惟桉
时间:
2012-5-20 22:10
Zi类继承了Fu类,但是Fu类中没有定义空参数列表的构造方法
而Zi类构造函数隐式的调用super(); 并且默认在子类构造方法第一行调用。
而这时根本找不到父类中对应的构造方法,就会报错了。
一般子类的参数列表都需要比父类参数列表长,或者相等。然后子类构造函数体内可以手动调用父类构造函数。
这样出错的几率会比较小。
当然并不代表不会出现子类参数列表比父类更短的情况。用eclipse编代码可以不用考虑这类问题。
因为动态联编的过程就会报错的,会提示的。
希望能帮到楼主
作者:
杨威
时间:
2012-5-20 22:33
将毕老师视频中关于子类的初始化过程好好看看哦
子类构造函数中的第一行会隐含空参数语句super();子类在初始化时会先在父类中进行初始化,然后再在自己的构造函数中初始化,而你的父类中没有空参数的构造函数,所以报错。
解决有两方法:
1,在父类中加上空参数的构造函数
2,在子类构造函数第一行手动显示设置父类有参的语句,如super(3);因为当你手动设置后,子类构造函数第一行默认的父类的无参构造语句就无用了。
作者:
hongbo
时间:
2012-5-20 23:16
一般有构造函数的时候最好都要手动加上空参构造函数的,否则有可能出错。
作者:
杨康
时间:
2012-5-20 23:39
继承父类,对父类的构造函数进行初始化,要观察父类的构造函数的特点,你定义的父类中的构造函数是有参数类的,在子类继承的时候,会调用父类的构造函数进行初始化,这时候要随着父类中构造函数的形式随之改动,你只要将子类中的第一行加上super()随便输入一个int型的参数即可初始化。
作者:
彩虹
时间:
2012-5-20 23:41
Zi()
{
//super();
}
上面这个构造方法中如果不加上super()z这句,或加了后不给它传参数,侧出现无法将类 Fu中的构造器 Fu应用到给定类型;原因是与Fu类的构造方法参数不一致,
如果改为 Zi()
{
super(3);
}
则编译能通过
作者:
陌花╮有意、
时间:
2012-5-21 01:28
zi继承了fu,本来如果你不在fu内定义有参数的构造方法话,类会自带一个无参构造方法,但是一旦你定义有参构造方法后就不会默认带无参的那个,那么zi继承后就必须使用有参构造方法或者在fu中加一个无参构造方法
就能使用super()
作者:
我能驾驭住
时间:
2012-5-21 10:14
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();这条语句是隐藏的,但只能传递无参数据,如果想自定义传数据的话,这条语句必须写上,而且里面也要有值;
继承的时候,如果不写,就要调用父类无参构造方法了!
如果不明白,私聊, 继承 这块,我学的透!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2