1. 程式人生 > >Java 面向物件2

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){
            //空實現
        };
    }