2007/3/1 星期四
学习父类,子类 构造器有感,百尺竿头,又近了一步。:)
继承对面向对象的诠释可谓是淋漓尽致阿。它抽象了世界上有继承关系的事物。
不如说人类。所以,下面就把小生对构造器的一点感悟与大家分享。
1.子类继承了父类的一些东西(可能不是全部,比如说私有成员 private),但它
总要继承一些东西的,或多或少。
这就好比人类中,父亲对财产的分配。每个子女都会从父亲那继承一些东西,有
相同的 ,也有不同的。
2.要创建子类的构造器必须隐式(只能隐式的调用父类中的无参构造器)或显式的
调用父类的构造器。而且在实例化子类对象时,也会首先实例化父类对象,如果继承的
层次过多的话,无疑会造成效率的下降,因此,要谨慎使用继承。:)
这就好比人类中,没有父亲,哪会有儿子的存在。
//example 1 隐式调用空参构造器
public class Father{
}
class Son extends Father{
}
//这样,不会出错,因为jvm在构造默认的子类构造器时会自动隐式调用父类默认的无参
构造器。
//example 2 父类重载默认的无参构造器,而且没有提供无参构造器
public class Father{
public Father(String s){
}
}
class Son extends Father{
}
//这样会抱错,没有定义隐式的无参构造器。 因为父类重载了默认的无参构造器,而且
又没有提供无参构造器,而隐式调用的只能是父类的无参构造器,所以会抱错。
如果子类构造器的参数列表比父类构造器的参数列表少,而父类中又没有无参构造器
,则必须在子类的构造器中显式的调用父类提供的构造器,而多出的参数则要被声明为
子类的静态成员变量。
//example 3
public class Father{
public Father(String s){
}
}
class Son extends Father{
// 声明构造器要用到的变量,必须为static
static String s;
public Son(){
super(s);
}
}