为了保证父类有良好的封装性,不会被子类随意修改,设计父类通常应该遵循以下规则:

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,因此将引发空指针异常。

到底何时需要从父类派生出新的子类,具备以下条件:

  • 子类需要额外增加属性,不仅仅是属性值的改变。
  • 子类需要增加自己独有的行为方式,

如果只是出于类复用的目的,并不一定需要使用继承,完全可以使用组合来实现。

class Animal{
private void beat()
{
System.out.println("心脏跳动。。。");
}
public void breath()
{
beat();
System.out.println("吸一口气,吐一口气,呼吸中。。。");
}
}
class Bird{
private Animal a;
public Bird(Animal a)
{
this.a=a;
}
public void Breath()
{
a.breath();
}
public void fly()
{
System.out.println("i can fly.");
}
}
public class CompositeTest {
public static void main(String [] args)
{
Animal a = new Animal();
Bird b = new Bird(a);
b.Breath();
b.fly(); }
}

总之继承要表达的是一种“是(is a)”的关系,而组合表达的是“有(has a)”的关系。

最新文章

  1. erlang 虚机性能调优
  2. <%@ page trimDirectiveWhitespaces="true" %>
  3. 你真的了解UITabBarController吗?
  4. 前端项目构建工具---Grunt
  5. 学习练习 session练习
  6. Dzz任务板初版完成笔记-仿trello私有部署的一款轻量团队任务协作工具。
  7. Node.js简单介绍
  8. Android(java)学习笔记101:WindowManager 中LayoutParams的各种属性
  9. Nagios监控部署(转)
  10. 自动化工具word文档批量转html
  11. Xamarin for android:为button设置click事件的几种方法
  12. 高速建成Android开发环境ADT-Bundle和Hello World
  13. 网站静态化处理—web前端优化—中(12)
  14. Android5.1 - 通讯录建立群组
  15. MyBatis 一、二级缓存和自定义缓存
  16. CSRF总结
  17. AUDIOqueue 为什么会播放一段时间就听不到声音
  18. 第34节:Java当中的异常
  19. python 微信跳一跳辅助 复现
  20. CSS学习摘要-语法和选择器

热门文章

  1. 如何建立nfs网络文件系统
  2. centos6上调整lv逻辑卷
  3. SharePoint Server 2019新特性
  4. python基础类型—字符串
  5. mybatis06--动态sql
  6. canvas霓虹雨
  7. javascript 缩写技巧
  8. 【C++ mid-term exerises】
  9. vue脚手架---vue-cli
  10. DATEADD日期函数的使用