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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 来明坤 中级黑马   /  2012-8-11 10:50  /  1445 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当子类不带有构造函数的时候,系统会自动给子类加入一个构造函数,并且在该函数中执行父类的无参构造函数。但假如我在子类中自己定义了一个构造函数,并且让该子类的构造函数不执行父类的无参构造函数。但是运行一遍程序,父类的构造函数还是被执行了啊?
测试程序如下:
父类:
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
-------------------
难道说明了子类不管有啥构造函数,都是必须执行一次父类的构造函数?有没有啥技巧方法能避免将子类实例化的时候调用父类的无参构造函数?

5 个回复

倒序浏览
子类构造方法中,第一行默认是super()
        为什么子类中第一行会默认有super()
                因为他继承父类的成员使用,使用前这些成员必须初始化,
                而他们是父类的成员,所以,必须通过父类进行初始化。
                所以,会先创建一个父类的对象。
就相当于
public class child extends ancester{
public child(){
super();//默认的
System.out.println("aaaa");
}
回复 使用道具 举报
在子类对象进行初始化时,父类构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式语句 super();super:会访问父类中的构造函数。而且子类中所有的构造函数默认第一行默认都是super()
建议你再看看 毕老师的视频07-06
回复 使用道具 举报
子类是一定要访问父类的构造函数的。默认是无参数的。
为什么子类一定要访问父类的构造函数?
因为父类中的数据,子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语名的方式来指定。
你可以在子类的第一行语句中加入super(x)。访问父类的一个带参数的构造函数。这样就可以不执行父类的无参构造函数了。
回复 使用道具 举报
对了,构造函数不存在覆盖。因为构造函数的函数名必需与类名相同,子类与父类的类名是不可能一样的。总不能写成 A extends A吧
回复 使用道具 举报
其实可以达到 让该子类的构造函数不执行父类的无参构造函数 这个目的,
只要你在子类中构造函数第一行加上一个super(......),改变参数列表,那么默认的super()无参构造函数的调用就不存在了,
当然,你的父类中应该有其他的构造参数相对应,不然就要报错了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马