5-8继承与组合

5.8继承与组合

子类继承父类后,可能修改父类中的方法和变量,对父类方法的调用产生不可知的影响。为了防止这一点,父类应当这样做:

  • 隐藏父类的内部数据,使用private修饰

  • 父类方法的修饰:

    • 父类中的工具方法,应当采用private修饰,防止子类访问。
    • 如果需要被外部访问,但不想被修改,应当采用final来修饰。
    • 如果希望被子类重写,应当采用protected修饰
  • 尽量不要在父类构造器中调用将要被子类重写的方法

5.8.1 一个重写产生错误的案例

class Base
{
public Base()
{
test();
}
public void test()
{
System.out.println("将被子类重写的方法");
}
}

public class Sub extends Base
{
private String name;
public void test()
{
System.out.println("子类重写父类的方法,"+"其name字符串长度"+name.length());
}
public static void main(String[] args)
{
Sub s = new Sub(); //先调用Base的构造器,而构造器中test()会用到子类的name,而此时name是null
}
}

5.8.2 利用组合实现复用