中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

          Java專題文章博客和開源

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          Java下static關(guān)鍵字用法詳解

            本文章介紹了java下static關(guān)鍵字的用法,大部分內(nèi)容摘自原作者,在此學(xué)習(xí)并分享給大家。
            Static關(guān)鍵字可以修飾什么?
            從以下測(cè)試可以看出, static 可以修飾:
            1. 語(yǔ)句塊
            2. 成員變量(但是不能修飾局部變量)
            3. 方法
            4. 接口(內(nèi)部接口)
            5. 類(只能修飾在類中的類, 即靜態(tài)內(nèi)部類)
            6. jdk 1.5 中新增的靜態(tài)導(dǎo)入
            那么static 修飾的表示什么呢? 當(dāng)創(chuàng)建一個(gè)類時(shí),就是在創(chuàng)建一個(gè)新類型,描述這個(gè)類的對(duì)象的外觀和行為,除非用new創(chuàng)建出那個(gè)類的對(duì)象,數(shù)據(jù)存儲(chǔ)空間才被分配,其方法才供外界調(diào)用。那么當(dāng)聲明一個(gè)事物為static時(shí),就意味著這個(gè)域或者方法不會(huì)與包含它的那個(gè)類的任何對(duì)象關(guān)聯(lián)在一起,也就是說(shuō),它不依賴類特定的實(shí)例,被類的所有實(shí)例共享,只要這個(gè)類被加載,Java虛擬機(jī)就能根據(jù)類名在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)定找到他們。因此,static對(duì)象可以在它的任何對(duì)象創(chuàng)建之前訪問(wèn),無(wú)需引用任何對(duì)象。
            1. static 修飾語(yǔ)句塊:
            static{} 可以有多處,執(zhí)行順序按照他們的聲明順序。當(dāng)JVM加載這個(gè)類的時(shí)候,就會(huì)執(zhí)行此語(yǔ)句塊,并且只執(zhí)行一次。
            2. static 變量:
            static 變量,可以被類的所有對(duì)象共享,并且它只有一份存儲(chǔ)空間,JVM只為靜態(tài)分配一次內(nèi)存,在加載類的過(guò)程中完成靜態(tài)變量的內(nèi)存分配。那么在引用static變量的時(shí)候,使用(類名.變量名)是首選的方式,因?yàn)樗粌H強(qiáng)調(diào)它是static結(jié)構(gòu),而且在某些情況下會(huì)為編譯器進(jìn)行優(yōu)化提供更好的機(jī)會(huì)。
            使用類名直接引用static變量是比較力薦的,這樣就很明確的告訴大家該變量或?qū)傩允莝tatic結(jié)構(gòu)或是被static修飾。
            但是我想說(shuō)一個(gè)更重要的知識(shí)點(diǎn)。static 在類中當(dāng)變量的重要使用方法,首先樓主先運(yùn)行一下下面代碼試試:
            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();
            //現(xiàn)在我改變它的值
            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();
            }
            //為了方便,封裝一個(gè)方法,來(lái)解釋
            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
            類似的形式同樣應(yīng)用在使用static修飾的方法上面(稱為靜態(tài)方法)。它可以像普通方法一樣使用對(duì)象來(lái)引用,也可以通過(guò)特殊的語(yǔ)法形式來(lái)調(diào)用如:“類名”+“ . ”+“方法”(); 定義靜態(tài)方法的方式與定義靜態(tài)變量一樣:
            public class StaticTest2 {
            static void method(){ ("這是靜態(tài)方法"); }
            }
            普通的調(diào)用方法:StaticTest2 st = new StaticTest2(); 因?yàn)閙ethod是static修飾的(靜態(tài)方法),所以可以這樣調(diào)用:StaticTest2.()。
            3. static方法:
            static方法與非static方法的區(qū)別在于: static方法可以用類名直接訪問(wèn)在static內(nèi)部的變量和方法,而不能引用非static的變量或者方法,但是你可以通過(guò)傳遞參數(shù)的方式傳遞一個(gè)引用,讓這個(gè)引用去調(diào)用非靜態(tài)數(shù)據(jù)。
            4. static 接口:
            內(nèi)部接口(inner interface)本身就默認(rèn)是static,所以static關(guān)鍵詞加與不加都是一樣的, 如此例中的接口:TestInInterface,TestInClass 實(shí)現(xiàn)此接口, 以下語(yǔ)句:
            StaticDescription.TestInInterface a = new StaticDescription.TestInClass();
            a.print();
            我們?nèi)サ魋tatic關(guān)鍵字也是一樣的, 但還是受訪問(wèn)權(quán)限控制TestInterface和FF。
            5. static 修飾類:(后部分會(huì)詳細(xì)說(shuō)明)
            表示它是一個(gè)靜態(tài)內(nèi)部類,它在引用外部類的事物時(shí),必須也是static的。而且, 靜態(tài)內(nèi)部類在創(chuàng)建自己的對(duì)象時(shí), 是不需要外圍類的存在。就好像下面的部分:
            class Member {
            static int classVar = 0; //類變量
            int instanceVar; //實(shí)例變量
            Member(int instanceVar) {
            this.instanceVar = instanceVar;
            }
            static void setClassVar(int i) {
            classVar=i;
            //instanceVar=i; // 類方法不能訪問(wèn)實(shí)例變量,只能訪問(wèn)類變量
            }
            static int getClassVar() {//類方法
            return classVar;
            }
            void setInstanceVar(int i) {
            classVar=i; //實(shí)例方法不但可以訪問(wèn)類變量,也可以實(shí)例變量
            instanceVar=i;
            }
            int getInstanceVar() {
            return instanceVar;
            }
            }
            Member未實(shí)例化: Member實(shí)例化之后:

          1
            對(duì)于非靜態(tài)數(shù)據(jù)成員,每個(gè)類對(duì)象都有自己的拷貝。而靜態(tài)數(shù)據(jù)成員被當(dāng)作是類的成員。無(wú)論這個(gè)類的對(duì)象被定義了多少個(gè),靜態(tài)數(shù)據(jù)成員在程序中也只有一份拷貝,由該類型的所有對(duì)象共享訪問(wèn)。也就是說(shuō),靜態(tài)數(shù)據(jù)成員是該類的所有對(duì)象所共有的。對(duì)該類的多個(gè)對(duì)象來(lái)說(shuō),靜態(tài)數(shù)據(jù)成員只分配一次內(nèi)存,供所有對(duì)象共用。所以,靜態(tài)數(shù)據(jù)成員的值對(duì)每個(gè)對(duì)象都是一樣的,它的值可以更新;
            Member m1 = new Member();
            Member m2 = new Member();
            內(nèi)存分配

          2
            引用static變量有兩種方法。如前例所示,可以通過(guò)一個(gè)對(duì)象去定位它,如m1.classVar; 也可以通過(guò)其類名直接引用,如Member.classVar,而對(duì)于非靜態(tài)成員則不行。
            盡管當(dāng)static作用于某個(gè)字段時(shí),肯定會(huì)改變數(shù)據(jù)的創(chuàng)建方式(因?yàn)橐粋€(gè)static字段對(duì)每個(gè)類來(lái)說(shuō)都只有一份存儲(chǔ)空間,而非static字段則是對(duì)每個(gè)對(duì)象都有一個(gè)存儲(chǔ)空間),但是如果static用于某個(gè)方法,差別卻沒(méi)有那么大。static方法的一個(gè)重要用法就是在不創(chuàng)建任何對(duì)象的前提下就可以調(diào)用它。這一點(diǎn),對(duì)定義main()方法很重要,這個(gè)方法是運(yùn)行一個(gè)應(yīng)用時(shí)的入口點(diǎn)。
            static方法就是沒(méi)有this的方法。在static方法的內(nèi)部不能調(diào)用非靜態(tài)方法,反過(guò)來(lái)倒是可以的。而且可以在沒(méi)有創(chuàng)建任何對(duì)象的前提下,僅僅通過(guò)類本身來(lái)調(diào)用static方法。這實(shí)際上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在類中置入static方法就可以訪問(wèn)其他static方法和static域。
            和其他任何方法一樣,static方法可以創(chuàng)建或使用與其類型相同的被命名對(duì)象,因此,static方法通常拿來(lái)做“牧羊人”的角色,負(fù)責(zé)看護(hù)與其奴隸同一類型的實(shí)例群。
            不過(guò),要是在代碼中出現(xiàn)大量的static方法,就該重新考慮自己的設(shè)計(jì)了sat答案 www.jszj123.com

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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          PK10開獎(jiǎng) PK10開獎(jiǎng)
          主站蜘蛛池模板: 肃北| 石景山区| 鸡泽县| 商都县| 额敏县| 宁陵县| 稻城县| 彭山县| 敦化市| 长宁区| 湖口县| 寿阳县| 洞头县| 沛县| 饶河县| 新田县| 怀远县| 滁州市| 苏尼特左旗| 芦山县| 凭祥市| 泰宁县| 宝坻区| 武陟县| 东山县| 福海县| 湖南省| 佛学| 获嘉县| 满洲里市| 柘荣县| 丹巴县| 瓦房店市| 岳阳市| 陇南市| 和顺县| 桐城市| 广昌县| 福清市| 菏泽市| 马鞍山市|