Java 面向物件2
Java 面向物件
1. static 和 final
static關鍵字---修飾成員變數
用static修飾的成員變數不屬於物件的資料結構。
static變數是屬於類的變數,通常可以通過類名來引用static成員。
static成員變數和類的資訊一起儲存在方法區,爾不是在堆中。
一個類的static成員變數只有一份,無論建立了多少物件。
static關鍵字---修飾成員變數的意義
class Cat { private int age; private static int numOfCats; public Cat(int age) { this.age = age; System.out.println(++numOfCats); } } Cat cat = new Cat(5); //1 Cat cat1 = new Cat(5); //2
static關鍵字---修飾方法
通常的方法都會涉及到具體物件的操作。這些方法在呼叫時,需要隱式的傳遞物件的引用。
int d = p1.distance(p2);
static修飾的方法則不需要針對某些物件進行操作,其執行結果僅僅與輸入的引數有關。呼叫時直接用類名呼叫。
double c = Math.sqrt(3.0*3.0+4.0*4.0);
static關鍵字---修飾方法的意義
由於static在呼叫時沒有具體的物件,因此static方法中不能非static成員進行訪問。static方法的作用在於提供一些“工具方法”和“工廠方法”等。
靜態方法屬於類的方法。
final關鍵字---修飾類
final關鍵字修飾的類不可以被繼承。
final關鍵字---修飾方法
final關鍵字修飾的方法不可以被重寫
final關鍵字---修飾成員變數
final關鍵字修飾成員變數,意為不可改變。該成員變數需要在初始化時賦值,物件一旦建立即不可改變。
2.物件陣列
所謂物件陣列,是物件的元素不是基本型別,而是引用型別。
物件陣列的初始化
與基本型別陣列的初始化方式一樣,只不過元素是物件引用而已。
但需要注意:基本型別陣列元素有預設初始值;而物件陣列建立後,其元素的預設值為null,不建立元素物件。
Cat[] cats = new Cat[4]; System.out.println(Arrays.toString(cats)); //[null, null, null, null]
陣列型別陣列(二維陣列)
陣列的元素可以為任何型別,也包括陣列型別。
int[][] arr4 = new int[3][];
arr4[0] = new int[2];
arr4[1] = new int[4];
arr4[2] = new int[2];
arr4[1][1] = 100;
3.抽象類
什麼是抽象類
用abstract關鍵字修飾的類稱為抽象類。抽象類不能例項化,抽象類的意義在於“被繼承”。抽象類為其子類“抽象”出了公共的部分,通常也定義了子類所必須具體實現的抽象方法。
public abstract class Shape {
//一個類如果定義有抽象方法必須以abstract關鍵字宣告為抽象類,
private int x;
private int y;
public abstract boolean contanins(int x,int y);
//用abstract修飾的方法,稱之為抽象方法,抽象方法僅有方法的定義,沒有實現。
}
繼承抽象類
一個類繼承抽象類必須實現其抽象方法。
4.Timer和TimerTask簡介
JDK提供的Timer和TimerTask抽象類可以以固定的週期執行某段時間。其中Timer常用的schedule方法如下:schedule(TimerTask task,long delay,long period);
class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("MyTask...");
}
}
Timer time = new Timer();
time.schedule(new MyTask(),1000,500);
time.cancel();
4.介面
什麼是介面
介面可以看成是特殊的抽象類。即只包含有抽象方法的抽象類,例
interface Runner { //通過interface關鍵字定義介面
//介面中不能定義成員變數,但可以定義常量
public static int DEFAULT_SPEED = 100;
//介面中只能定義沒有實現的方法(可以省略public abstract)。
public void run();
}
介面的實現
與繼承不同,一個類可以實現多個介面,實現的介面直接用逗號分隔,該類需要實現這些介面中定義的所有方法。
介面可以作為一個型別宣告變數,一個介面型別的變數可以引用實現了該介面的類的物件;通過該變數可以呼叫該介面中定義的方法。
class AmericanCurl implements Runner{
public void run(){
System.out.println("run...");
}
}
Runner runner = new AmericanCurl();
runner.run();
介面的繼承
介面間存在繼承關係,一個介面可以通過extends關鍵字繼承另一個介面。子介面繼承了父介面中定義的方法。
interface Hunter extends Runner {
public void hunt();
}
class AmericanCurl implements Hunter {
public void hunt() {
System.out.println("hunt...");
}
public void run() {
System.out.println("run...");
}
}
4.內部類和匿名類
內部類的定義
一個類可以定義在另一個類的內部,定義在類內部的類稱之為Inner,其所在的類稱之為Outer。
class Outer {
private int time = 100;
private Timer timer = new Timer();
public void start() {
timer.schedule(new Inner(),1000,500);
}
public void print() {
System.out.println(time);
}
//Inner定義在Outer的內部通常只服務於Outer,對外部具備可見性;Inner可以直接呼叫Outer的成員變數及方法。
class Inner extends TimerTask {
public void run(){
time++;
print();
}
}
}
內部類的應用
當一個類存在的價值僅僅是為某一個類服務時,應當使其成為那個類的內部類。
內部類一般情況下對外不可見,除了包含它的外部類外,其他類無法訪問到它。
內部類可以很方便的訪問其外部類的私有屬性。
匿名內部類的定義
如果在一段程式中需要建立一個類的物件,而物件建立後,這個類的價值就不存在了,這個類可以不必命名,稱之為匿名內部類。
匿名內部類的應用
匿名內部類應用在介面回撥、事件監聽等場合。
5.回撥模式
回撥模式是指---如果一個方法的引數是介面型別,則在呼叫改方法時,需要建立並傳遞一個實現此介面型別的物件;而該方法在執行時會呼叫到引數物件中所實現的方法。
public static void main(String[] args) {
reprat(5, new Action() {
@Override
public void doSth() {
System.out.println("Hello word");
}
});
}
public static void reprat(int n,Action action){
for (int i = 0; i < n; i++) {
action.doSth();
}
}
interface Action {
public void doSth();
}
6.事件監聽機制
事件監聽可以看成回撥模式在Swing元件響應使用者事件中的應用。
7.ActionListener
ActionListener一般用於監聽表示要開始某種操作的事件,如:按鈕的單擊,文字框輸入回車等。
public interface MouseListener extends EventListener {
public void mouseclicked(MouseEvent e);
public void mousePressed(MouseEvent e);
public void mouseReleased(MouseEvent e);
public void mouseEntered(MouseEvent e);
public void mouseExited(MouseEvent e);
}
MouseEvent的getX()、getY()方法可以獲取滑鼠在事件源區域點選的位置,
getButton()`方法可以判斷滑鼠點選的左鍵還是右鍵;getClickCount()可以判斷是單擊還是雙擊。
8.KeyListener
KeyListener用於監聽鍵盤事件,其中包括鍵按下、鍵釋放以及鍵入的事件。
public interface KeyListener extends EventListener {
public void keyTyped(KeyEvent e);
public void keyPressed(KeyEvent e);
public void keyReleased(KeyEvent e);
}
用getKeyCode()
方法用於獲取按下(釋放)的鍵值。
9.Listener和Adapter
在一些場合,僅僅需要響應Listener的某些方法,但作為實現Listener介面的物件又不得不實現其所有的方法,儘管某些方法只有空的實現。
JDK對某些Listener提供了相應的Adapter,即實現了改Listener介面,而所有方法都為空實現的抽象類。在使用中,只需要繼承該抽象類,重寫需要的方法即可。
public abstract class KeyAdapter implements KeyListener {
public void keyTyped(KeyEvent e){
//空實現
};
public void keyPressed(KeyEvent e){
//空實現
};
public void keyReleased(KeyEvent e){
//空實現
};
}