動手動腦第三波類與物件
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()); } }