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變數也是可以序列化的