6.1 接口implement
繼承接口,即履行“義務(wù)”
- 接口中所有的方法自動屬于public蛋褥,在接口聲明中,不必提供關(guān)鍵字public
-
接口中決不能含有實(shí)例域,也不能在接口中實(shí)現(xiàn)方法
為了讓類實(shí)現(xiàn)一個接口蓝仲,通常需要下面兩個步驟:
- 將類聲明為實(shí)現(xiàn)給定的接口
- 對接口中的所有方法進(jìn)行定義
接口與抽象類
為什么要引入接口,抽象類不是已經(jīng)滿足接口的功能了嗎官疲?
因?yàn)槊總€類只能擴(kuò)展一個類袱结,Java不支持
多類繼承
,主要原因是多類繼承會讓語言本身變得非常復(fù)雜(如同C++)途凫,效率也會降低(如同Eiffel)垢夹。
實(shí)際上,接口可以提供多重繼承的大多數(shù)好處维费,同時還可以避免多重繼承的復(fù)雜性和低效性果元。
6.2 對象克隆
拷貝
Copy時,原始變量A與copy變量B引用同一個對象犀盟,B改變而晒,A也會相應(yīng)的改變 。
克隆
-
clone
是Object類的一個protected
方法且蓬,在用戶編寫的代碼中不能直接調(diào)用欣硼。 - 默認(rèn)的
clone
方法是淺copy,數(shù)值或基本類沒有問題,對于子對象的引用诈胜,拷貝的結(jié)果會使得兩個域引用同一個對象豹障。 - 所有數(shù)組類型均包含一個clone方法,public而不是protected
常常需要重新定義clone
方法焦匈,對每個類需要做以下判斷:
- 默認(rèn)的clone方法是否滿足需求
- 默認(rèn)的clone方法是否能夠通過調(diào)用可變子對象的clone得到修補(bǔ)
- 是否不應(yīng)該使用clone
實(shí)際上血公,選項(xiàng)3是默認(rèn)的。如果選擇1或者2缓熟,類必須:
- 實(shí)現(xiàn)
Cloneable
接口( 是Java提供的幾種標(biāo)記接口之一累魔,標(biāo)記接口沒有方法) - 實(shí)現(xiàn)
public
訪問修飾符重新定義的clone方法
Class Employee implements Cloneable
{
// 即使默認(rèn)clone能夠滿足需求,也建議實(shí)現(xiàn)Cloneable接口
public Employee clone() throws CloneNoSupportedException
{
// call Object clone()
Employee cloned = (Employee) super.clone();
// clone mutable fields
cloned.hireDay = (Date) hireDay.clone();
return cloned;
}
}
6.3 接口與回調(diào)(callback)
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class TimerTest
{
public static void main(String[] args)
{
ActionListener listener = new TimePrinter();
Timer t = new Timer(1000, listener);
t.start();
JOptionPane.showMessageDialog(null, "quit program");
System.exit(0);
}
}
class TimePrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Date now = new Date();
System.out.println("At the tone, the time is" + now);
Toolkit.getDefaultToolkit().beep();
}
}
6.4 內(nèi)部類
為什么要使用內(nèi)部類够滑?
- 內(nèi)部類可以訪問該類定義所在的作用域中的數(shù)據(jù)垦写,包括私有數(shù)據(jù)
- 內(nèi)部類可以對同一個包中其他類隱藏起來
-
當(dāng)想定義一個回調(diào)函數(shù)且不想編寫大量的代碼時,使用
匿名內(nèi)部類
比較便捷 - 只有內(nèi)部類可以是私有類彰触,常規(guī)類只具有包可見性梯投,或者共有可見性
局部內(nèi)部類
局部類不能用public或者private訪問修飾符進(jìn)行說明。它的作用域被限定在聲明在這個局部類的快中况毅。
由外部方法訪問final變量
局部類還有一個優(yōu)點(diǎn)分蓖,不僅能夠訪問包含它們的外部類,還可以訪問局部變量尔许,不過這些局部變量必須被聲明為
final
public void start(int interval, final boolean beep)
{
class TimerPrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Date now = new Date();
System.out.println("At the time is " + now);
if(beep) Toolkit.getDefaultToolkit().beep();
}
}
ActionListener listener = new TimerPrinter();
Timer t = new Timer(interval, listener);
t.start();
}