1. 程式人生 > >Java 常用關鍵字的作用

Java 常用關鍵字的作用

主篇主要是對 static、final、super、this、native、transient這6個關鍵字進行簡單講解。

一、static
static關鍵字可以修飾變數、方法、程式碼塊及內部類。

/**
 * static 關鍵字學習
 * @author kobe
 *
 */
public class MyStaticDemo {
	
	// 成員變數
	private String name;
	
	// 用static修飾的成員變數 叫做靜態變數或類變數
	private static int count;
	
	// 當類第一次呼叫或建立例項時給屬性初始化且只執行一次
	static{
		count = 99;
	}
	
	// 成員方法 需要建立物件才可以呼叫
	public void test() {
		System.out.println("Hello World");
	}
	
	// 靜態方法 可直接用類來呼叫
	public static void testStatic() {
		System.out.println("Hello World static");
	}
	
	public static void main(String[] args) {
		
		// 靜態變數可以直接用類名呼叫  隨著類載入而存在類的消失而消失
		MyStaticDemo.count = 77;
		MyStaticDemo demo = new MyStaticDemo();
		
		// 靜態變數也可以通過物件來呼叫(推薦用類名來呼叫)
		demo.count = 99;
		
		// 成員變數只能通過物件來呼叫。隨著物件建立而存在隨著物件回收而釋放
		demo.name = "最牛班";
		
		// 非靜態方法只能通過物件來呼叫
		demo.test();
		
		// 靜態方法也可以通過物件來呼叫(不建議這樣使用)
		demo.testStatic();
		
		// 靜態方法也可以直接用類名呼叫
		MyStaticDemo.testStatic(); 
	}

}

成員變數和靜態變數的區別
  1.生命週期的不同:
    成員變數隨著物件的建立而存在隨著物件的回收而釋放。
    靜態變數隨著類的載入而存在隨著類的消失而消失。
  2.呼叫方式不同:
    成員變數只能被物件呼叫。
    靜態變數可以被物件呼叫,也可以用類名呼叫。(推薦用類名呼叫)
  3.別名不同:
    成員變數也稱為例項變數。
    靜態變數稱為類變數。    
  4.資料儲存位置不同:
    成員變數資料儲存在堆記憶體的物件中,所以也叫物件的特有資料。
    靜態變數資料儲存在方法區(共享資料區)的靜態區,所以也叫物件的共享資料。
普通方法和靜態方法的區別:


       靜態方法中不可以使用this或者super關鍵字。
       main()方法也是靜態的。
靜態程式碼塊:
       隨著類的呼叫或建立例項而執行,而且只執行一次。作用:執行類的初始化載入資料。
       靜態程式碼塊裡面賦值也只能賦靜態變數。

這裡就可以學習下反射Class.forName和ClassLoader的區別:
      Class.forName()預設是進行static的引數初始化。
      ClassLoader()預設不會去執行該類靜態塊中間的內容。

靜態內部類:

定義內部類的時候,在其前面加上一個許可權修飾符static,這個內部類就變為了靜態內部類。

 

二:final

final關鍵字可以用於三個地方。用於修飾類、修飾變數和修飾方法。

修飾類:當用final修飾一個類時,表明這個類不能被繼承。(很少用到)

修飾變數:對於一個final變數,如果是基本資料型別的變數,則其數值一旦在初始化之後便不能更改;如果是引用型別的變數,則在對其初始化之後便不能再讓其指向另一個物件。

修飾方法:使用final修飾方法的原因是:把方法鎖定,以防任何繼承類修改它的含義;

可以簡單概括為:被final關鍵字修飾的類不能被繼承,被final關鍵字修飾的類屬性和類方法不能被覆蓋(重寫);

三:super

super,大家都知道是表示一個父類的引用。關於面試題中經常出現的 super.getClass().getName()的輸出問題,輸出的是當前這個類的類名,而不是父類的名稱。

當new一個物件出來的時候,這個物件會產生一個this的引用,這個this引用指向物件自身。如果new出來的物件是一個子類物件的話,那麼這個子類物件裡面還會有一個super引用,這個super指向當前物件裡面的父物件。所以相當於程式裡面有一個this,this指向物件自己,還有一個super,super指向當前物件裡面的父物件。

四:this

this關鍵字主要有三個應用:
 1、this呼叫本類中的屬性,也就是類中的成員變數;
 2、this呼叫本類中的其他方法;
 3、this呼叫本類中的其他構造方法,呼叫時要放在構造方法的首行。

五:native

1、native 是用做java 和其他語言(如c++)進行協作時用的,也就是native 後的函式的實現不是用java寫的。不用細究

native關鍵字的函式都是作業系統實現的,java只能呼叫。

六:transient

Java的serialization提供了一種持久化物件例項的機制。當持久化物件時,可能有一個特殊的物件資料成員,我們不想用serialization機制來儲存它。為了在一個特定物件的一個域上關閉serialization,可以在這個域前加上關鍵字transient。   
    transient是Java語言的關鍵字,用來表示一個域不是該物件序列化的一部分。當一個物件被序列化的時候,transient型變數的值不包括在序列化的表示中,然而非transient型的變數是被包括進去的。  
注意static變數也是可以序列化的