当一个类继承另一个类的时候,它调用构造函数,一般是先调用被继承那个类的构造函数,如果父类中没有带参数的构造函数的话,子类会调用默认的构造函数;如果你的父类有带参数的构造函数的话,这个带参数的构造函数就会覆盖默认的构造函数,这样,你的子类就必须会去调用带有参数的父类的构造函数。
派生类必须调用基类的构造函数,但不继承基类的构造函数,实际上不继承是句废话,因为构造函数不能通过类的实例来调用。任何一个类都有构造函数,如果你不写构造函数,就生成默认的构造函数,如果你写了一个任何形式的构造函数,那么系统都不会为你生成默认构造函数。
构造函数的继承有如下限制:
1、子类无条件地继承父类的默认构造函数(即无形参的构造函数)。
2、如果子类定义了自己的构造函数,则子类在创建新对象时,构造函数的执行顺序是:先执行继承自父类的无参构造函数---> 再执行自己的构造函数,即执行了两次;
3、如父类没有默认的构造函数,子类也不能定义自己的无参的构造函数;对于父类的含参构造函数,子
类可以通过在自己的构造函数中使用super 来显式调用父类的构造函数,但这个调用语句必须是子类构造
函数的第一个可执行语句。
SubClass sc = new SubClass(); BaseClass bc = (BaseClass)sc ;---是正确的
而 BaseClass bc = new BaseClass(); SubClass sc = (SubClass)bc ;---是错误的
BaseClass bc = new SubClass()也是正确的,并且在调用bc中的方法时执行的方法体是子类的方法体,但该方法必须同时在子类,父类中同时存在,若子类中有,而父类中没有,则不可以这样调用bc.subMethod();
class Base{
public void print(){System.out.println("Base");}
}
public class Derived extends Base{
public void print(){System.out.println("Derived");}
public static void main(String[]args){
Base p=new Derived();
p.print();//result is Derived 调用的是子类中的方法
} }
注意:若两个类都继承于同一个类(必须是直接继承,否则不对),则这两个类可以互相赋值,如:Panel和Frame 同继承于Container,所以Panel p = new Frame() ;和Frame f = new Panel()都是正确的
父类:
class FatherClass{
public int i=0;
public FatherClass() {
System.out.println("FatherClass Create");
}
public FatherClass(String text) {
i=1;
System.out.println("FatherClass Create");
}}
子类 :
public class ChildClass extends FatherClass{
public ChildClass(String text) {//子类的构造函数第一行代码就是调用父类构造函数,如果子类构造函数第一行不是调用父类构造函数,则编译器自动调用父类无参构造函数(这也就是所谓的隐式调用父类构造函数),而如果父类里面没有无参构造函数,所以编译器会报错。解决方法:在父类里添加一个无参构造函数
System.out.println("ChildClass Create");
}
public static void main(String[] args) {
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}}
输出结果:
FatherClass Create
FatherClass Create
ChildClass Create