- Overloading=多載。
- Overriding=覆載。
就在這個時候,國內的大學生發現這可能是教授為了能當更多人而玩的文字遊戲,又或者是當初的翻譯者害怕太多人學會之後飯碗不保,刻意翻得很奇怪,於是提出更明確的翻譯方式以自救:
- Overloading = 給予太多工作 (load多到太over)。
- Overriding =忤逆家長 (也就是ride在家長頭上太over的意思)。
import java.awt.*;
import java.awt.event.*;
class RobotTest{
public static void main(String[] arg)throws AWTException,
InterruptedException{
Robot robot = new Robot();
while(true){
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
Thread.sleep(3000); // 讓執行緒睡3秒
}
}
}
interface Observer{
/** 通知此觀察者*/
public void update(String message);
}
interface Observable{
/** 增加觀察者 */
public void addObserver(Observer observer);
/** 移除觀察者*/
public void removeObserver(Observer observer);
}Observable介面的addObserver方法雖暗示了實作類別必須使用陣列或串列來儲存多個觀察者實體,但這並非強制性的,一個被觀察者也能只有一個觀察者,取決於整體的設計。Observer介面中的update方法所傳遞的參數也取決於使用的場合。若要設計出較一般化的Observer模式的實作,可以參考Java API中的Observer介面和Observable類別。class Main{
public static void main(String[] arg){
//小明的在學資料
StudentData studentData = new StudentData("小明");
People ming = new People("小明本人");
People father = new People("小明的爸爸");
//學生資料加入觀察者
studentData.addObserver(ming);
studentData.addObserver(father);
//設定成績
studentData.setScore("微積分", 59);
studentData.setScore("物理", 60);
studentData.setScore("計算機網路", 54);
// 學期結束,結算被當科目
studentData.validateCredits();
}
}接下來是表示人(小明本人、小明的爸爸)的類別,實作觀察者介面:class People implements Observer{最後是表示「學生在學資料」的類別,實作被觀察者介面:
private String name;
public People(String name){
this.name = name;
}
public void update(String message){
System.out.println(
name + " 收到["+ message +"]的訊息。");
}
}
/** 在學學生資料*/執行結果如下:
class StudentData implements Observable{
private String name;
/** 使用LinkedList來儲存多個觀察者。 */
private List< Observer> observers =
new LinkedList<Observer >();
private HashMap< String,Integer> scores =
new HashMap<String, Integer>();
public StudentData(String name){
this.name = name;
}
public String getName(){
return name;
}
/** 設定成績*/
public void setScore(String subject, int score){
scores.put(subject, score);
}
/** 結算學分*/
public void validateCredits(){
int totalSubject = scores.size(); //全部科目數
int failSubject = 0; //被當的科目數
/** 尋訪整個HashMap,取出所有的值 */
for(int score: scores.values()){
//不到60分,累加被當的科目數
if( score < 60)
failSubject++;
}
//若被當的科目數大於總科目數的一半
if( (totalSubject / 2) < failSubject )
notifyObservers("下學期不用繳註冊費。");
else
notifyObservers("下學期記得繳註冊費。");
}
/** 通知所有觀察者*/
public void notifyObservers(String msg){
/** 尋訪整個List,取出所有觀察者 */
for(Observer observer : observers)
observer.update(msg);
}
/** 新增觀察者*/
public void addObserver(Observer observer){
observers.add(observer);
}
/** 移除觀察者*/
public void removeObserver(Observer observer){
observers.remove(observer);
}
}
class Student{
private int score;
Student(int s){
score = s; //A
}
public void say(){
if( this.score > 59) // B
System.out.println("教授讓我過了!");
else
System.out.println("教授把我當了!");
}
public static void main(String[] arg){
Student 好學生 = new Student(80);
Student 混學生 = new Student(40);
好學生.say();
混學生.say();
}
}class Professor{
public void grade(Student student){
student.score = (int)(Math.random()*101);
}
}
class Student{
...
Professor 叫獸 = new Professor();
public int getScore(){
叫獸.grade(this); // C
return score;
}
public static void main(String[] arg){
Student 羔羊 = new Student(0);
羔羊.getScore();
羔羊.say();
}
}