1. 程式人生 > >Java的static關鍵字學習(一)

Java的static關鍵字學習(一)

static關鍵字

基本作用簡言之就是:方便在沒有建立物件的情況下來進行呼叫(方法/變數)

被static關鍵字修飾的方法或者變數不需要依賴於物件來進行訪問,只要類被載入了,就可以通過類名去進行訪問

(1)static方法

“static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法。這實際上正是static方法的主要用途。”

在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法,因為非靜態成員方法/變數都是必須依賴具體的物件才能夠被呼叫。

(2)static變數 注意:java中static不能用於修飾區域性變數

static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響。

static成員變數的初始化順序按照定義的順序進行初始化。

案例:解釋被所有物件共享的含義

package java03;

public class statictry {
	
	static int i  =10 ;
 
}

package java03;

public class statictest {
	
	 public void run(){
		
		statictry.i = 20 ;
		 System.out.println(statictry.i);
	}
}

class statictest2{
	
	public void run(){

		System.out.println(statictry.i);
		
	}
	
}
package java03;

public class test {

	public static void main(String[] args) {
		 new statictest().run();
		 new statictest2().run();
		 
	}

}

執行結果輸出均為20,在前一個類中方法中對i值得改動,影響了後面的類2中的i值,其實是因為他們共享了statictry類中的靜態

變數i的值。

一下是非靜態的案例:

package java03;

public class statictry {
	
  int i  =10 ;
 
}

package java03;

public class statictest {
	
	 public void run(){
		
		statictry s = new statictry();
		s.i= 20 ;
		 System.out.println(s.i);
	}
}

class statictest2{
	
	public void run(){
		
		

		System.out.println(new statictry().i);
		
	}
	
}

這時候再用test輸出為第一個20 第二個10 ,說明每一個物件的i值是獨立的。

(3)static程式碼塊

static關鍵字還有一個比較關鍵的作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。

為什麼說static塊可以用來優化程式效能,是因為它的特性:只會在類載入的時候執行一次。

 用static{}

把只執行一次的初始化操作放在程式碼塊中,通過這樣可以避免在方法中有初始化時,每次呼叫方法都進行一次初始化