<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    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方法,就該重新考慮自己的設計了sat答案 www.jszj123.com

    posted on 2014-09-10 22:29 好不容易 閱讀(204) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 91频在线观看免费大全| 蜜臀AV免费一区二区三区| 狼群影院在线观看免费观看直播 | 国产亚洲综合色就色| 亚洲精品9999久久久久无码| 免费观看激色视频网站bd | 扒开双腿猛进入爽爽免费视频| 久久影视国产亚洲| caoporm超免费公开视频| 亚洲欧洲中文日韩av乱码| 久草免费福利在线| 亚洲成色WWW久久网站| 在线免费观看亚洲| 亚洲综合一区二区三区四区五区| 免费看少妇作爱视频| 免费无码专区毛片高潮喷水| 亚洲最大AV网站在线观看| 国产在线一区二区综合免费视频| 亚洲情a成黄在线观看动漫尤物| 在线永久免费观看黄网站| 久久亚洲精品无码| 国产午夜不卡AV免费| 亚洲精品中文字幕无码AV| 欧美好看的免费电影在线观看| 色偷偷尼玛图亚洲综合| 国产中文在线亚洲精品官网| 日本黄色动图免费在线观看| 亚洲人成7777影视在线观看| 亚洲 小说区 图片区 都市| 国产一级a毛一级a看免费人娇 | 91亚洲精品自在在线观看| 日韩一品在线播放视频一品免费| 亚洲精品视频免费| 亚洲理论精品午夜电影| 亚洲国产成人影院播放| 日韩中文字幕免费视频| 无码一区二区三区亚洲人妻| 亚洲AV无码成人网站久久精品大 | 国产99视频免费精品是看6| 99re8这里有精品热视频免费| 亚洲最大成人网色香蕉|