来源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.htmlhtml
---------------------java
java继承中对构造函数是不继承的,只是调用(隐式或显式)。函数
如下是例子:spa
public class FatherClass {
public FatherClass() {
System.out.println(100);
}htm
public FatherClass(int age) {
System.out.println(age);
}对象
}blog
public class SonClass extends FatherClass{继承
public SonClass() {
}
public SonClass(int c) {
System.out.println(1234);
}
public static void main(String[] args) {get
SonClass s = new SonClass(66);
}
}虚拟机
编译后执行结果以下是什么呢?
分析:SonClass s = new SonClass(66);执行这句时,调用
public SonClass(int c) {
System.out.println(1234);//系统会自动先调用父类的无参构造函数(super())
}
在这个构造函数中,等价于
public SonClass(int c) {
super();//必须是第1行,不然不能编译
System.out.println(1234);
}
因此结果是 100
1234
在建立子类的对象时,Java虚拟机首先执行父类的构造方法,而后再执行子类的构造方法。在多级继承的状况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这能够保证子类对象从全部直接或间接父类中继承的实例变量都被正确地初始化。
3.若是子类构造函数是这样写的
public SonClass(int c) {
super(22);//必须是第1行,不然不能编译
//显式调用了super后,系统就再也不调用无参的super()了;
System.out.println(1234);
}
执行结果是 22
1234
总结1:构造函数不能继承,只是调用而已。
若是父类没有无参构造函数
建立子类时,不能编译,除非在构造函数代码体中第一行,必须是第一行显式调用父类有参构造函数
以下:
SonClass (){
super(777);//显示调用父类有参构造函数
System.out.println(66);
}
若是不显示调用父类有参构造函数,系统会默认调用父类无参构造函数super();
可是父类中没有无参构造函数,那它不是不能调用了。因此编译就没法经过了。
总结2:建立有参构造函数后,系统就再也不有默认无参构造函数。
若是没有任何构造函数,系统会默认有一个无参构造函数。