Java学习笔记004——接口、克隆、回调、内部类
接口
1、接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統(tǒng)一格式進行定義
2、定義接口,如:
public interface Abc{
int aaa(Object other)
}
3、接口中的所有方法自動地屬于public,聲明在接口中的內部類自動成為static和public
4、接口不能含有實例域,也不能在接口中實現(xiàn)方法,提供實例域和方法實現(xiàn)的任務應該由實現(xiàn)接口的那個類完成
5、為了讓類實現(xiàn)一個接口,需要如下兩個步驟:
① 將類聲明為實現(xiàn)給定的接口,需要使用implements關鍵字,如:class Employee implements Compable
② 對接口中的所有方法進行定義
6、在接口聲明中的方法不需要聲明為public,但在實現(xiàn)接口時必須把方法聲明為public,否則編譯器會發(fā)出警告
7、如果存在一種通用算法,它能夠對兩個不同的子類對象進行比較,在應該在超類中提供一個compareTo方法,并將這個方法聲明為final
8、接口的特性
① 接口不是類,不能使用new運算符實例化一個接口,但能夠聲明接口的變量,如:Comparable x;
② 接口變量必須引用實現(xiàn)了接口的類對象:x = new Employee(...)
③ 可以使用instanceof檢查一個對象是否實現(xiàn)了某個特定的接口,如:if(anObject instanceof Comparable){...}
④ 接口可以被擴展,如:有一個成為Moveable的接口:
public interface Moveable{
void move(double x, double y);
}? //然后可以以它為基礎擴展一個叫做Powered的接口:
public interface Powered entends Moveable{
public milesPerGallon();
}
⑤ 在接口中不能包含實例域或靜態(tài)方法,但卻可以包含常量,如:
public interface Powered entends Moveable{
double milesPerGallon();
double SPEED_LIMIT = 95;
}? //類中的域將被自動設定為public static final
——有些程序員為了提高清晰度的考慮,將接口方法標記為public,將域標記為public static final,雖然這在Java中是允許的,但Java語言規(guī)范卻建議不要書寫這些多余的關鍵字
⑥ 實現(xiàn)多個接口,如:class Employee implements Clonealbe, Comparable,使用逗號將實現(xiàn)的對個接口隔開
克隆
1、clone方法是Object類的一個proteced方法,該方法只能實現(xiàn)淺拷貝,若淺拷貝對象共享的子對象是不可變的,那就不會出現(xiàn)什么問題,但如果需要拷貝的對象里有可變的子對象,那就需要編寫該類自己的clone方法
2、一個類需要實現(xiàn)了Cloneable接口才能實現(xiàn)克隆操作,否則編譯不通過,可以使用if(obj instanceof Cloneable)...來檢查是否實現(xiàn)了該接口,該接口用來表明這個類需要擁有克隆的能力
3、即使clone的默認實現(xiàn)(淺拷貝)能夠滿足需求,也應該實現(xiàn)Cloneable接口,將clone重定義為public,并調用super.clone(),如:
class Employee implements Cloneable{
public Employee clone() throws CloneNotSupportedException{
Employee cloned = (Employee)super.clone();
}
}
4、建立深拷貝clone方法的示例:
class Employee implements Cloneable{
public Employee clone() throws CloneNotSupportedException{
Employee cloned = (Employee)super.clone();
cloned.hireDay = (Date)hireDay.clone();
return cloned;
}
}
回調
1、回調是一種程序設計模式,在這種模式中可以指出某個特定事件發(fā)生時應該采取的動作
2、java.swing包中有一個Timer類可以使用它在到達個頂?shù)臅r間間隔時發(fā)出通告,需要設置一個時間間隔,將某一個類的對象傳遞給定時器可以設置定時器定時進行的操作,這要求傳遞的對象所屬的類實現(xiàn)了java.awt.event包的ActionListener接口,該接口如下:
public interface ActionListener{
void actionPerformed(ActionEvent event);
}? //當?shù)竭_指定的時間間隔時,定時器就調用actionPerformed方法
3、回調的示例:
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 time is " + now);
}
}
內部類
1、內部類是定義在另一個類中的類,使用內部類的主要原因有:
① 內部類方法可以訪問該類定義所在的作用域中的數(shù)據(jù),包括私有的數(shù)據(jù)
② 內部類可以對同一個包中的其他類隱藏起來
③ 當先要定義一個回調函數(shù)且不想編寫大量代碼時,使用匿名內部類比較便捷
2、內部類既可以訪問自身的數(shù)據(jù)域,也可以訪問創(chuàng)建它的外圍類對象的數(shù)據(jù)域
3、若在A類中定義了內部類B,則只有A類的方法才能夠生成B對象,只有內部類是私有類,而常規(guī)類只可以具有包可見性或者公有可見性
4、表達式OuterClass.this表示外圍類引用,如A類是外圍類,在內部類B里要使用A類的成員變量可以這樣:A.this.xxx,可以使用下列語法格式來編寫內部對象的構造器:outerObject.new InnerClass(構造方法變量列表),如this.new B();這里的this限定詞是多余的,不過可以通過顯式地命名將外圍類引用設置為其他的對象,如果B是A的內部類,對于任意的A對象都可以構造一個B對象:
A abc0 = new A();
A.B abc1 = abc0.new B();
5、局部內部類
即在一個方法中定義的類,局部類不能用public或private進行聲明,它的作用域被限定在聲明這個局部類的塊中,其優(yōu)點有:
① 可以對外部世界外圈地隱蔽起來
② 它不僅可以訪問包含它們的外部類,還可以訪問被聲明為final的局部變量
final關鍵字可以應用于局部變量、實例變量和靜態(tài)變量中,在所有這些情況下,它們的含義都是:在創(chuàng)建這個變量后,只能夠為之賦值一次,此后,再也不能修改它的值了,在定義final變量的時候,不必進行初始化
6、匿名內部類
① 假如只創(chuàng)建某個類的一個對象,就不必命名了,這種類叫做匿名內部類,如:
public void start(int interval, final boolean beep){
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){
Date now = new Date();
System.out.println("At the tone, the time is " + now);
if(beep) Toolkit.getDefaultToolkit().beep();
}
};
Timer t = new Timer(interval, listener);
t.start();
}? //創(chuàng)建一個實現(xiàn)ActionListener接口的新對象,需要實現(xiàn)的方法actionPerformed定義在括號{}內
② 用于構造對象的任何參數(shù)都要被放在超類/接口/類名后面的括號()內,通常的語法格式是:
new SuperType(構造方法變量列表){
inner class methods and data
}
③ 由于匿名類沒有類名,所以匿名類不能有構造器,取而代之的是將構造器參數(shù)傳遞給超類構造器,尤其是在內部類實現(xiàn)接口的時候不能有任何構造參數(shù),還要加上一組(),如果構造參數(shù)的閉圓括號后跟一個花括號,則表示定義的是匿名內部類
7、靜態(tài)內部類
① 有時候,使用內部類只是為了把一個類隱藏在另外一個類的內部,并不需要內部類引用外圍類對象,為此可以將內部類聲明為static,以便取消產(chǎn)生的引用
② 只有內部類可以聲明為static,靜態(tài)內部類的對象除了沒有對生成它的外圍類對象的引用特權外,與其他所有內部類完全一樣
③ 注:在內部類不需要訪問外圍類對象的時候,應該使用靜態(tài)內部類;聲明在接口中的內部類自動成為public和static
轉載于:https://www.cnblogs.com/oushihua/archive/2013/02/26/2933653.html
總結
以上是生活随笔為你收集整理的Java学习笔记004——接口、克隆、回调、内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10款交互设计原型开发工具(转)
- 下一篇: java美元兑换,(Java实现) 美元