1. 程式人生 > >JavaSE之面向物件(中)

JavaSE之面向物件(中)

1.static靜態修飾符

使用static修飾的成員變數、常量、方法和程式碼塊統稱為靜態成員。
靜態成員歸整個類所有,但不依賴於類的例項,只是別所有的例項所共享,只要這個類被JVM載入,就可以根據類名在全域性資料區域中找到他們,因此,靜態成員可以在任何例項物件建立之前訪問。
1.1static變數——靜態變數
static關鍵字修飾的成員變數稱為靜態變數,在沒有建立例項物件之前就可以通過類名.變數名的格式訪問。
沒有static關鍵字修飾的成員變數就是例項變數,
例項變數與成員變數的區別

  1. 每建立一個例項,JVM就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個備份且互不影響。例項變數隸屬於物件,在類的內部,非靜態方法可以直接訪問例項變數,而在靜態方法中,要類似於在main方法中訪問例項變數的形式一樣,即建立本類的例項物件,通過例項物件訪問例項變數。
  2. 對於靜態變數,是在載入類的過程中完成靜態變數記憶體的分配,且JVM只為靜態變數分配一次記憶體,靜態變數在記憶體中只有一個備份,靜態變數可以被所有的例項物件共享,在任何方法中都可以訪問靜態變數,通過類名.靜態變數名this.靜態變數名(不推薦)的方式訪問。

1.2satic方法——靜態方法
靜態方法是屬於類的,但不依賴於類,靜態方法在類建立以後就一直存在,其生命週期與類一樣。
例項方法與靜態方法的區別:

  1. 例項方法可以訪問靜態變數,靜態常量,靜態方法、例項變數、例項方法。
  2. 靜態方法可以不通過本類的例項物件,而是通過類名.靜態方法名();的方式呼叫。靜態方法不能直接訪問例項變數和方法,而是需要通過建立例項物件,通過例項物件呼叫的方法訪問例項變數和例項方法(參見main方法中的訪問呼叫)。靜態方法中可以直接訪問靜態成員。靜態方法中不能使用this和super關鍵字,因為這兩個關鍵字與特點的例項相關。
    main()方法

    main方法是Java程式的入口,每一個Java程式都是從main方法開始執行的。

主方法必須有以下幾點,缺一不可:

  1. 訪問修飾符為public
  2. 必須為靜態方法,有static修飾
  3. 返回值型別為void
  4. 方法引數列表必須為String型別的陣列

主方法 main()是靜態方法,JVM只需載入main()方法所在的類就可以執行main()方法,不需要建立例項物件, main()靜態方法不能直接訪問非靜態成員。其他靜態方法在理論上也可以呼叫靜態方法。

this關鍵字:

this關鍵字的作用:

  1. 在類的方法或構造方法內部使用this呼叫本類屬性this.成員變數名
  2. 在構造方法中使用this呼叫構造方法this([引數列表名])
  3. this表示當前物件this

在構造方法中使用this([引數列表])呼叫構造方法時,須有對應含有引數列表的構造方法,並且要將此語句放在當前構造方法的首行。

在類中的方法,如建構函式或setter方法中需對類中屬性賦值,若不使用this.變數名=變數名的方法對成員變數賦值,雖然能通過編譯,但是不能成功賦值。

2.程式碼塊

在Java中使用{}括起來的程式碼就稱為程式碼塊,根據其位置和宣告的不同,可以分為普通程式碼塊、構造塊、靜態塊、同步程式碼塊。
1.普通程式碼塊
直接在一個方法或語句中出現的程式碼塊稱為普通程式碼塊,在普通程式碼塊中定義的變數只在塊中起作用。普通程式碼塊和一般語句執行的順序由他們在程式碼塊中出現的順序決定——“先出現先執行”。
普通程式碼塊的作用:避免變數重名。
2.構造塊
直接在類中定義的程式碼塊就稱為構造塊。構造塊在建立物件時會被呼叫,每建立一次物件就會呼叫一次構造塊,並且構造塊的執行次序優先於建構函式。
構造塊的作用:在構造塊中為靜態屬性初始化。
3.靜態程式碼塊
在Java類中使用static關鍵字宣告的程式碼塊稱為靜態程式碼塊。
靜態程式碼塊的特點:

  1. 靜態程式碼塊不能存在於任何方法體內
  2. 靜態程式碼塊不能訪問例項變數和例項方法,需要通過類的例項物件訪問。
  3. JVM在載入類的同時就會執行程式碼塊,因此靜態程式碼塊先於主方法執行,如果類中包含多個靜態程式碼塊,就按照“先定義的程式碼塊先執行”的順序執行。
  4. 每個靜態程式碼塊只能執行一次

所有程式碼塊的執行優先順序:
靜態程式碼塊>主方法>構造程式碼塊>構造方法>普通程式碼塊

普通程式碼塊辨析:

public class CodeBlock{
public static void main(String[] args){
  {
		int x=7;// 區域性變量出了程式碼塊就會釋放
		System.out.println(x);
	}
	int x =5;//ok
	System.out.println(++x);
}
}
public class CodeBlock{
public static void main(String[] args){
	int x =5;
	System.out.println(++x);
		{
		int x=7;  //error
//前面有在main()方法作用域中定義的變數,到此處還沒有失效,因此不能重複定義變數
		
		System.out.println(x);
	}
}
}