标签:成员 -- test 异常 数据 属性 nbsp 子类 类重写
为了保证父类有良好的封装性,不会被子类随意修改,设计父类通常应该遵循以下规则:
1、尽量隐藏父类的内部数据,尽量把父类的所有成员变量设置为 private 访问类型,不要让子类直接访问父类的成员变量;
2、不要让子类可以随意访问和修改父类方法,父类中仅为辅助其他工具的方法,应该使用private 访问控制符修饰,让子类无法访问该方法;如果父类中的方法需要被外部类调用,则必须设置为 public 修饰,但不希望子类重写该方法,可以使用final修饰符来修饰该方法;如果希望父类的某个方法被子类重写,但不希望被其他类自由访问,则可以使用protected来修饰该方法。
3、尽量不要在父类构造器中调用将要被子类重写的方法。
package test_Java; class Base { public Base() { test(); } public void test()//1 { System.out.println("将被子类重写的方法"); } } public class Sub { private String name; public void test()//2 { System.out.println("子类重写父类的方法, "+"其name字符串的长度"+name.length()); } public static void main(String[] args) { // TODO Auto-generated method stub Sub s = new Sub(); s.test();//空指针异常 } }
产生空指针异常的原因:当系统试图创建Sub对象时,同样会先执行其父类构造器,如果父类构造器调用了被其子类重写的方法,则变成调用被子类重写后的方法,当创建Sub对象时,会先执行Base类中的Base构造器,而Base构造器中调用test()方法-----并不是1而是2,此时的Sub对象的name实例变量是null,因此将引发空指针异常。
到底何时需要从父类派生出新的子类,具备以下条件:
如果只是出于类复用的目的,并不一定需要使用继承,完全可以使用组合来实现。
标签:成员 -- test 异常 数据 属性 nbsp 子类 类重写
原文地址:http://www.cnblogs.com/wft1990/p/7992706.html