继承严重地破坏了父类的疯狂性。
设计父类通常应该遵循如下规则:
尽量隐藏父类的内部数据。尽量把父类的所有成员变量都设置成private访问类型,不要让子类直接访问父类的成员变量。
不要让子类可以随意访问、修改父类的方法。
但又不希望子类重写该方法,可以使用final修饰符,如果希望父类的某个方法被子类重写,但不希望被其他类自由访问,则可以使用protected来修饰该方法。
package chap5_7;
class Base {
public Base() {
// TODO Auto-generated constructor stub
test();
}
public void test() {
System.out.println("将被子类重写的方法");
}
}
public class Sub extends Base {
private String name;
@Override
public void test() {
// TODO Auto-generated method stub
// super.test();
System.out.println("子类重写父类的方法," + "其name字符串长度" + name.length());
}
public static void main(String[] args) {
Sub s = new Sub();
}
}
运行结果
Exception in thread "main" java.lang.NullPointerException
at chap5_7.Sub.test(Sub.java:21)
at chap5_7.Base.<init>(Sub.java:6)
at chap5_7.Sub.<init>(Sub.java:14)
at chap5_7.Sub.main(Sub.java:26)
此时Sub对象的name实例变量是null,因此将引发空指针异常。
从父类派生新的子类:
1.子类需要额外增加属性,而不仅仅是属性值的改变
2.子类需要增加自己独有的行为方式,包括增加新的方法或重写父类的方法。