黑马程序员技术交流社区
标题:
关于调用父类无参函数
[打印本页]
作者:
来明坤
时间:
2012-8-11 10:50
标题:
关于调用父类无参函数
当子类不带有构造函数的时候,系统会自动给子类加入一个构造函数,并且在该函数中执行父类的无参构造函数。但假如我在子类中自己定义了一个构造函数,并且让该子类的构造函数不执行父类的无参构造函数。但是运行一遍程序,父类的构造函数还是被执行了啊?
测试程序如下:
父类:
public class ancester{
//父类的无参构造函数,继承的子类被实例化的时候这个无参构造函数总会被调用。
public ancester(){
System.out.println("ancester");
}
}
子类:
public class child extends ancester{
public child(){}
public static void main(String args[]){
child ch = new child();
}
}
输出:
ancester
------------------当父类不变,子类改成这样的时候:
public class child extends ancester{
public child(){
System.out.println("aaaa");
}
public static void main(String args[]){
child ch = new child();
}
}
输出:
ancester
aaaa
-------------------
难道说明了子类不管有啥构造函数,都是必须执行一次父类的构造函数?有没有啥技巧方法能避免将子类实例化的时候调用父类的无参构造函数?
作者:
杨彪
时间:
2012-8-11 10:56
子类构造方法中,第一行默认是super()
为什么子类中第一行会默认有super()
因为他继承父类的成员使用,使用前这些成员必须初始化,
而他们是父类的成员,所以,必须通过父类进行初始化。
所以,会先创建一个父类的对象。
就相当于
public class child extends ancester{
public child(){
super();
//默认的
System.out.println("aaaa");
}
作者:
胡刚涛
时间:
2012-8-11 11:13
在子类对象进行初始化时,父类构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式语句 super();super:会访问父类中的构造函数。而且子类中所有的构造函数默认第一行默认都是super()
建议你再看看 毕老师的视频07-06
作者:
黑马-李勇
时间:
2012-8-11 11:47
子类是一定要访问父类的构造函数的。默认是无参数的。
为什么子类一定要访问父类的构造函数?
因为父类中的数据,子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语名的方式来指定。
你可以在子类的第一行语句中加入super(x)。访问父类的一个带参数的构造函数。这样就可以不执行父类的无参构造函数了。
作者:
黑马-李勇
时间:
2012-8-11 11:55
对了,构造函数不存在覆盖。因为构造函数的函数名必需与类名相同,子类与父类的类名是不可能一样的。总不能写成 A extends A吧
作者:
尤洋
时间:
2012-8-11 12:16
其实可以达到 让该子类的构造函数不执行父类的无参构造函数 这个目的,
只要你在子类中构造函数第一行加上一个super(......),改变参数列表,那么默认的super()无参构造函数的调用就不存在了,
当然,你的父类中应该有其他的构造参数相对应,不然就要报错了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2