ava下static關鍵字用法詳解

  Java下static關鍵字用法詳解
  本文章介紹了java下static關鍵字的用法,大部份內容摘自原做者,在此學習並分享給你們。
  Static關鍵字能夠修飾什麼?
  從如下測試能夠看出, static 能夠修飾:
  1. 語句塊
  2. 成員變量(可是不能修飾局部變量)
  3. 方法
  4. 接口(內部接口)
  5. 類(只能修飾在類中的類, 即靜態內部類)
  6. jdk 1.5 中新增的靜態導入
  那麼static 修飾的表示什麼呢? 當建立一個類時,就是在建立一個新類型,描述這個類的對象的外觀和行爲,除非用new建立出那個類的對象,數據存儲空間才被分配,其方法才供外界調用。那麼當聲明一個事物爲static時,就意味着這個域或者方法不會與包含它的那個類的任何對象關聯在一塊兒,也就是說,它不依賴類特定的實例,被類的全部實例共享,只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。所以,static對象能夠在它的任何對象建立以前訪問,無需引用任何對象。
  1. static 修飾語句塊:
  static{} 能夠有多處,執行順序按照他們的聲明順序。當JVM加載這個類的時候,就會執行此語句塊,而且只執行一次。
  2. static 變量:
  static 變量,能夠被類的全部對象共享,而且它只有一份存儲空間,JVM只爲靜態分配一次內存,在加載類的過程當中完成靜態變量的內存分配。那麼在引用static變量的時候,使用(類名.變量名)是首選的方式,由於他不只強調它是static結構,並且在某些狀況下會爲編譯器進行優化提供更好的機會。
  使用類名直接引用static變量是比較力薦的,這樣就很明確的告訴你們該變量或屬性是static結構或是被static修飾。
  可是我想說一個更重要的知識點。static 在類中當變量的重要使用方法,首先樓主先運行一下下面代碼試試:
  public class Person {
  static int[] arr = new int[3];
  public static void main(String[] args){
  Person per1 = new Person();
  Person per2 = new Person();
  Person per3 = new Person();
  System.out.println("----改變以前-----");
  System.out.print("per1-->");
  per1.show();
  System.out.print("per2-->");
  per2.show();
  System.out.print("per3-->");
  per3.show();
  //如今我改變它的值
  Person.arr[2]=10;//這種方法是建議的
  per1.arr[0]=1;//通常不用這種方法
  System.out.println("----改變以後-----");
  System.out.print("per1-->");
  per1.show();
  System.out.print("per2-->");
  per2.show();
  System.out.print("per3-->");
  per3.show();
  }
  //爲了方便,封裝一個方法,來解釋
  public void show(){
  for(int i=0; i
  System.out.print(arr[i] + "t");
  }
  System.out.println("");
  }
  }Output:
  ----改變以前-----
  per1-->0t0t0t
  per2-->0t0t0t
  per3-->0t0t0t
  ----改變以後-----
  per1-->1t0t10t
  per2-->1t0t10t
  per3-->1t0t10t
  相似的形式一樣應用在使用static修飾的方法上面(稱爲靜態方法)。它能夠像普通方法同樣使用對象來引用,也能夠經過特殊的語法形式來調用如:「類名」+「 . 」+「方法」(); 定義靜態方法的方式與定義靜態變量同樣:
  public class StaticTest2 {
  static void method(){ ("這是靜態方法"); }
  }
  普通的調用方法:StaticTest2 st = new StaticTest2(); 由於method是static修飾的(靜態方法),因此能夠這樣調用:StaticTest2.()。
  3. static方法:
  static方法與非static方法的區別在於: static方法能夠用類名直接訪問在static內部的變量和方法,而不能引用非static的變量或者方法,可是你能夠經過傳遞參數的方式傳遞一個引用,讓這個引用去調用非靜態數據。
  4. static 接口:
  內部接口(inner interface)自己就默認是static,因此static關鍵詞加與不加都是同樣的, 如此例中的接口:TestInInterface,TestInClass 實現此接口, 如下語句:
  StaticDescription.TestInInterface a = new StaticDescription.TestInClass();
  a.print();
  咱們去掉static關鍵字也是同樣的, 但仍是受訪問權限控制TestInterface和FF。
  5. static 修飾類:(後部分會詳細說明)
  表示它是一個靜態內部類,它在引用外部類的事物時,必須也是static的。並且, 靜態內部類在建立本身的對象時, 是不須要外圍類的存在。就好像下面的部分:
  class Member {
  static int classVar = 0; //類變量
  int instanceVar; //實例變量
  Member(int instanceVar) {
  this.instanceVar = instanceVar;
  }
  static void setClassVar(int i) {
  classVar=i;
  //instanceVar=i; // 類方法不能訪問實例變量,只能訪問類變量
  }
  static int getClassVar() {//類方法
  return classVar;
  }
  void setInstanceVar(int i) {
  classVar=i; //實例方法不但能夠訪問類變量,也能夠實例變量
  instanceVar=i;
  }
  int getInstanceVar() {
  return instanceVar;
  }
  }
  Member未實例化: Member實例化以後:
1
  對於非靜態數據成員,每一個類對象都有本身的拷貝。而靜態數據成員被看成是類的成員。不管這個類的對象被定義了多少個,靜態數據成員在程序中也只有一份拷貝,由該類型的全部對象共享訪問。也就是說,靜態數據成員是該類的全部對象所共有的。對該類的多個對象來講,靜態數據成員只分配一次內存,供全部對象共用。因此,靜態數據成員的值對每一個對象都是同樣的,它的值能夠更新;
  Member m1 = new Member();
  Member m2 = new Member();
  內存分配
2
  引用static變量有兩種方法。如前例所示,能夠經過一個對象去定位它,如m1.classVar; 也能夠經過其類名直接引用,如Member.classVar,而對於非靜態成員則不行。
  儘管當static做用於某個字段時,確定會改變數據的建立方式(由於一個static字段對每一個類來講都只有一份存儲空間,而非static字段則是對每一個對象都有一個存儲空間),可是若是static用於某個方法,差異卻沒有那麼大。static方法的一個重要用法就是在不建立任何對象的前提下就能夠調用它。這一點,對定義main()方法很重要,這個方法是運行一個應用時的入口點。
  static方法就是沒有this的方法。在static方法的內部不能調用非靜態方法,反過來卻是能夠的。並且能夠在沒有建立任何對象的前提下,僅僅經過類自己來調用static方法。這實際上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在類中置入static方法就能夠訪問其餘static方法和static域。
  和其餘任何方法同樣,static方法能夠建立或使用與其類型相同的被命名對象,所以,static方法一般拿來作「牧羊人」的角色,負責看護與其奴隸同一類型的實例羣。
  不過,要是在代碼中出現大量的static方法,就該從新考慮本身的設計託福答案java

相關文章
相關標籤/搜索