1. 程式人生 > >動手動腦第三波類與物件

動手動腦第三波類與物件

 

1.不是static型別則需要定義一個物件變數,然後“建立(new)”一個物件,賦值給物件變數,現在就可以通過物件變數使用物件,主要方式有:(1)直接呼叫類的方法;(2)存取類的欄位。

2.在定義變數時,Java要求必須顯式初始化變數;物件變數如果不引用一個真實的物件,則必須宣告為null。特殊值null:代表一個物件變數不引用任何物件

引用物件後的物件變數:MyClass obj=new MyClass();

3.可以使用final定義一個“常量”物件變數                final MyClass obj = new MyClass();

注意:“常量”物件變數不能指向另一個物件,但可以修改物件,比如設定它所引用物件的某公有欄位值。

4.對於原始資料型別的變數(比如int),可以直接使用“==”判斷兩變數值是否相等

5.當“==”施加於原始資料型別變數時,是比較變數所儲存的資料是否相等

“==”施加於引用型別變數時,是比較這兩個變數是否引用同一物件。

引用代表地址,所以“==”實際上相當於比較兩個引用型別變數中儲存的物件地址是否相同。

6.兩個物件的“內容”,其實是指它們在某一時刻的所有欄位的值,“內容相等”,其實是就“對應欄位值”一致。

Java中要比對兩個物件的欄位值,可以 “重寫(override)”基類的equals()方法

7.當建立一個物件時,它的構造方法會被自動呼叫。構造方法與類名相同,沒有返回值。

如果類沒有定義建構函式,Java編譯器在編譯時會自動給它提供一個沒有引數的“預設構造方法”

8. 如果類提供了一個自定義的構造方法,將導致系統不再提供預設構造方法

執行類成員定義時指定的預設值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。

 

執行類的建構函式。。

 

 

 

優先呼叫有參構造方法,然後無參的話取決於初始化塊和欄位的初始值誰在前誰在後,先呼叫後面的那個。

 

11.class Employee

 

{

 

String name;

 

long salary;

 

short employee_id;

 

static int total_employee_id;

 

...

 

}

 

可以用物件名或類名作為字首訪問靜態資料

 

Employee newhire=new Employee();

 

newhire.total_employees=1;

 

Employee.total_employees=1;

 

 
 

 

推薦使用類名來直接訪問靜態欄位。

 

12.靜態初始化塊只執行一次。

 

建立子型別的物件時,也會導致父型別的靜態初始化塊的執行。

 

13. 類的靜態方法只能訪問類的靜態成員!

 

14. 總結出靜態初始化塊的執行順序
     總結:物件的初始化順序:首先執行父類靜態的內容,父類靜態的內容執行完畢後,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態程式碼塊,如果有就執行父類的非靜態程式碼塊,父類的非靜態程式碼塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態程式碼塊,如果有就執行子類的非靜態程式碼塊。子類的非靜態程式碼塊執行完畢再去執行子類的構造方法。總之一句話,靜態程式碼塊內容先執行,接著執行父類非靜態程式碼塊和構造方法,然後執行子類非靜態程式碼塊和構造方法。

 

15. 靜態方法中只允許訪問靜態資料,那麼,如何在靜態方法中訪問類的例項成員(即沒有附加static關鍵字的欄位或方法)?

 

只要定義一個類的物件在通過物件呼叫即可

 

類中靜態的方法或者屬性,本質上來講並不是該類的成員,在java虛擬機器裝在類的時候,這些靜態的東西已經有了物件,它只是在這個類中"寄居",不需要通過類的構造器(建構函式)類實現例項化;而非靜態的屬性或者方法,在類的裝載是並沒有存在,需在執行了該類的建構函式後才可依賴該類的例項物件存在。

 

在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。

 

靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數和例項方法;例項方法則無此限制。

package 課下測試;
public class Static {
    static int x;//靜態變數x
    int y;//例項變數y
    static public int getX() {
    return x;}
    static public void setX(int newX) {
    x = newX;}
    public int getY() {
    return y;
    }
    public void setY(int newY) {
    y = newY;
    }
    public static void main(String[] args) {
    System.out.println("靜態變數x="+Static.getX());
    //System.out.println("例項變數y="+Static.getY());// 非法,編譯時將出錯
    //why
    Static a= new Static();
    Static b= new Static();
    a.setX(1);
    a.setY(2);
    b.setX(3);
    b.setY(4);
    System.out.println("靜態變數a.x="+a.getX());
    System.out.println("例項變數a.y="+a.getY());
    System.out.println("靜態變數b.x="+b.getX());
    System.out.println("例項變數b.y="+b.getY());
    }
}