方林博士 fanglin1970@gmail.com http://www.popframework.net 面向对象的程序设计 方林博士 fanglin1970@gmail.com http://www.popframework.net
Java面向对象的概念和机制 封装(Encapsulation) 继承(Inheritance) 引用(Reference) 重定义(Override) 接口 重载(Overload)
封装 public class Student { String name; String gender; int age; public void setName(String name) { this.name = name; } public void addAge() { age++;
继承 public class CollegeStudent extends Student { String major; public void setMajor(String name) { this.name = name; }
成员函数和成员变量(域)的区别 子类可以重定义父类的成员函数,不可以重定义父类的成员变量 成员函数可以是抽象的,成员变量不可以 抽象的成员函数可以出现在接口中,成员变量不可以
成员(函数和变量)与继承的实质区别 成员定义了对象之间的引用 (Reference)关系 继承定义了类之间的关系,而不是对象之间的关系。
接口(Interface) 接口的实质是一些函数声明(即函数头、抽象函数)的集合。 类实现一个接口意味着为接口中的函数定义函数体。 接口可以多继承(多实现),原因在于接口中的函数都是抽象的,没有函数体。一个类实现多个接口意味着为所有接口中的所有函数定义函数体。
善用以下机制表达你的思想 封装(Encapsulation) 继承(Inheritance) 引用(Reference) 重定义(Override) 接口 重载(Overload)
第一个例子:舞会问题 男孩和女孩们要到一个舞场跳舞,舞场的规定是: 只有配对的男孩和女孩才能进入舞场 一个男孩只能与一个女孩配对,反之亦然 没有配对的男孩/女孩必须在门口等待直到有一个女孩/男孩出现
舞会问题的同步解 Boy Girl Dance
Dance的设计 public class Dance { // 所有男孩都应该调用这个函数。这个函数 // 将返回与男孩配对的女孩。如果没有女孩与之配对, // 这个函数将阻塞到有一个女孩到来为止 public Girl dance(Boy boy) { … } // 所有女孩都应该调用这个函数。这个函数 // 将返回与女孩配对的男孩。如果没有男孩与之配对, // 这个函数将阻塞到有一个男孩到来为止 public Boy dance(Girl boy) {
第二个例子:舞会问题的异步解 Dance一旦发现有男孩女孩可以配对就向二者分别发送通知
类关系图 Boy DanceMatchListener Girl Dance DanceMatchEvent
异步Dance类的设计 public class Dance { // 男孩调用这个方法进行注册 public void registerBoy(Object boy, DanceMatchListener listener) { … } // 女孩调用这个方法进行注册 public void registerGirl(Object girl, DanceMatchListener listener) {
DanceMatchListener public interface DanceMatchListener{ void match(DanceMatchEvent evt); }
DanceMatchEvent public class DanceMatchEvent extends java.util.EventObject { Object getBoy(); // 获取配对的男孩 Object getGirl(); // 获取配对的女孩 Dance getDance(); // 获取舞场 }
Boy和Girl的设计 public class Boy implements DanceMatchListener {…} public class Girl implements DanceMatchListener {…}
异步Dance的算法 Dance内部为男孩女孩分别准备一个队列 Dance内部有一个线程对上述两个队列进行监控 监控线程一般情况下处于睡眠状态,一旦有男孩或女孩来注册就会被激活 监控线程被激活后就检查两个队列,男孩女孩可以匹配的话就发送通知。如果没有发现匹配就重新进入休眠
异步Dance的实现(略)
第三个例子:Java的Thread和Runnable 实现类还可以实现其他接口 可以在其他线程中使用同一个Runnable 对象 Thread
Thread和Runnable 的设计 public class Thread implements Runnable { public Thread() { …… } public Thread(Runnable runnable} { …… } @Override public void run() { …… } } public interface Runnable { void run();
第四个例子:分形图的绘制 Graph Picture Draw in Draw Element Line Recurse
谢谢大家 方林 fanglin1970@gmail.com 本文下载地址:http://www.popframework.net