1,使用抽象類和接口實現適配器模式設計。涉及的類和接口分別爲ButtonListener(接口),ide
其中含有click() / dbclick() / keyUp() / keyDown()等方法。函數
ButtonAdapter(按鈕適配器類),適配器中對非click()方法進行默認實現。this
Button類中添加addListener(ButtonListener l)方法。spa
//按鈕監聽器接口設計
interface ButtonListener {orm
public void onClick(); // 單擊事件對象
public void onDbclick(); // 雙擊事件繼承
public void onKeyDown(); // 按鍵按下接口
public void onKeyUp(); // 按鍵釋放事件
}
// 按鈕監聽器適配器
abstract class ButtonAdapter implements ButtonListener {
public void onDbclick() {//抽象類,適配器空實現,還有一個onClick()沒有實現
}
public void onKeyUp() {
}
public void onKeyDown() {
}
}
class MyListener extends ButtonAdapter {
public void onClick() {
System.out.println("i click one !");
}
}
class YourListener extends ButtonAdapter {
public void onClick() {
System.out.println("you click one !");
}
}
// 按鈕
class Button {
// 按鈕的監聽器
private ButtonListener listener;//按鈕的處理程序就是這個listener,把上面的接口定義爲了按鈕的成員(按鈕是有這些屬性的)
// 添加監聽器
public void addListener(ButtonListener lsn) {
this.listener = lsn;
}
// 模擬單擊事件
public void click() {
// 處理單擊事件
listener.onClick();//找到單擊事件的處理方法,調用監聽器的onClick方法,on指的是什麼事件發生時
}
// 模擬雙擊事件
public void dbClick() {
listener.onDbclick();
}
}
class AdapterDemo {
public static void main(String[] args) {
// button1
Button btn1 = new Button();
MyListener l = new MyListener();
btn1.addListener(l);
btn1.click();
// button2
Button btn2 = new Button();
YourListener yl = new YourListener();
// btn2.addListener(yl);
// btn2.click();
//還能夠這樣寫
btn2.addListener(new ButtonAdapter(){//關鍵,匿名內部類對象
public void onClick() {
System.out.println("you click one !除了上面常規的,還能夠用匿名內部類對象");
}
});
btn2.click();
}
}
2,闡述什麼是多態。爲何函數能夠覆蓋,而屬性不能覆蓋?
(1)多態:某一類事物的多種存在形態。對於接口來講,可使用接口引用實現了該接口的類所建立的對象;對於繼承來講,是使用父類類型來引用子類的對象。
(2)屬性是資產,是容納數據的地方,函數是行爲,不容納和存儲數據,因此函數能夠被覆蓋,而屬性不能。