隨筆-126  評(píng)論-247  文章-5  trackbacks-0


          前言:這屬于 java 的基礎(chǔ)知識(shí),你可以不了解,也可以不拿它當(dāng)一回事,代碼也一樣能敲的順暢;這是很久之前,我從 C++ 轉(zhuǎn) java 剛?cè)腴T那會(huì)的看法,那會(huì)我堅(jiān)持自己的理念:
              重實(shí)踐,講運(yùn)用,輕理論。當(dāng)然,對(duì)同一樣事物,在不同階段也會(huì)有不一樣的看法,這理念在某個(gè)時(shí)段已經(jīng)不適合我,早就被拋棄了。不扯淡了,直接進(jìn)入主題。

          java 中的變量大致分為 成員變量 和 局部變量 兩大類。

          成員變量:
              在類體里面定義的變量稱為成員變量;
              如果該成員變量有 static 關(guān)鍵字修飾,則該成員變量稱為 靜態(tài)變量類變量
              如果該成員變量沒(méi)有 static 關(guān)鍵字修飾,則該成員變量被稱為 非靜態(tài)變量實(shí)例變量

          局部變量:
              形參、方法內(nèi)定義的變量、代碼塊中定義的變量,都屬于局部變量。

          類變量 (靜態(tài)變量
              1. 可以向前引用
              2. 變量屬于類本身
              3. 類變量不依賴類的實(shí)例,類變量只在初始化時(shí)候在棧內(nèi)存中被分配一次空間,無(wú)論類的實(shí)例被創(chuàng)建幾次,都不再為類變量分配空間
              4. 通過(guò)類的任意一個(gè)實(shí)例來(lái)訪問(wèn)類變量,底層都將將其轉(zhuǎn)為通過(guò)類本身來(lái)訪問(wèn)類變量,它們的效果是一樣的
              5. 一旦類變量的值被改變,通過(guò)類或類的任意一個(gè)實(shí)例來(lái)訪問(wèn)類變量,得到的都將是被改變后的值
              6. 將在類的初始化之前初始化

          實(shí)例變量(非靜態(tài)變量)
              1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的
              2. 變量屬于類的實(shí)例對(duì)象
              3. 隨著類的實(shí)例被創(chuàng)建而分配內(nèi)存空間

          非靜態(tài)代碼塊
              直接由 { } 包起來(lái)的代碼,稱為非靜態(tài)代碼塊

          靜態(tài)代碼塊
              直接由 static { } 包起來(lái)的代碼,稱為靜態(tài)代碼塊

          類變量(靜態(tài)變量)、實(shí)例變量(非靜態(tài)變量)、靜態(tài)代碼塊、非靜態(tài)代碼塊 的初始化時(shí)機(jī)
              由 static 關(guān)鍵字修飾的(如:類變量[靜態(tài)變量]、靜態(tài)代碼塊)將在類被初始化創(chuàng)建實(shí)例對(duì)象之前被初始化,而且是按順序從上到下依次被執(zhí)行;
              沒(méi)有 static 關(guān)鍵字修飾的(如:實(shí)例變量[非靜態(tài)變量]、非靜態(tài)代碼塊)初始化實(shí)際上是會(huì)被提取到類的構(gòu)造器中被執(zhí)行的,但是會(huì)比類構(gòu)造器中的
              代碼塊優(yōu)先執(zhí)行到,其也是按順序從上到下依次被執(zhí)行。

          - 以上是本人在翻完 PDF 后的個(gè)人筆記和理解以及見(jiàn)解,不見(jiàn)得百分百對(duì),以下附上本人測(cè)試示例代碼,會(huì)更有說(shuō)服性

          示例代碼

           1
           2/**
           3 * -----------------------------------------
           4 * @文件: Statical.java
           5 * @作者: fancy
           6 * @郵箱: fancydeepin@yeah.net
           7 * @時(shí)間: 2012-7-9
           8 * @描述: TEST
           9 * -----------------------------------------
          10 */

          11public class Statical {
          12
          13 /**
          14     * 靜態(tài)代碼塊
          15     * 類變量(靜態(tài)變量)可以向前引用(即:先引用,再定義)
          16     */

          17    static {
          18        name = "fancydeepin"// name 的定義在使用之后
          19        System.out.println("--->  靜態(tài)代碼塊被執(zhí)行   <---");
          20    }

          21 /**
          22     * 類變量(靜態(tài)變量)在類的初始化之前初始化,無(wú)論類的實(shí)例將被創(chuàng)建多少個(gè)
          23     * 類變量(靜態(tài)變量)都將只在初始化時(shí)候在棧內(nèi)存上分配一次空間
          24     * 凡 static 修飾的,都將按位置被順序執(zhí)行,所以,
          25     * name 的值最終輸出 fancy 而不是上面的 fancydeepin
          26     */

          27    public static String name = "fancy"//類變量(靜態(tài)變量)
          28    private String mail = "myEmail"//實(shí)例變量(非靜態(tài)變量),定義時(shí)指定初始值,會(huì)比在構(gòu)造器賦予值更早執(zhí)行
          29    
          30    public Statical() {
          31        mail = "fancydeepin@yeah.net";
          32        System.out.println("---> 構(gòu)造器代碼塊被執(zhí)行 <---");
          33    }

          34 /**
          35     * 非靜態(tài)代碼塊
          36     * 實(shí)際上,非靜態(tài)代碼塊在類初始化創(chuàng)建實(shí)例時(shí),將會(huì)被提取到類的構(gòu)造器中,
          37     * 但是,非靜態(tài)代碼塊會(huì)比構(gòu)造器中的代碼塊優(yōu)先被執(zhí)行
          38     * 所以,mail 最終輸出的是類構(gòu)造器中給定的值,也就是 fancydeepin@yeah.net
          39     * 而不是 1525336367@qq.com,更不是 myEmail
          40     */

          41    {
          42        mail = "1525336367@qq.com";
          43        System.out.println("---> 非靜態(tài)代碼塊被執(zhí)行 <---");
          44    }

          45    
          46    // getting and setting 
          47


          測(cè)試類示例代碼

           1
           2      /**
           3         * 類變量(靜態(tài)變量)在類被初始化創(chuàng)建實(shí)例之前被初始化
           4         */

           5        System.out.println("-----------------> @1 <----------------");
           6        System.out.println("name --->> " + Statical.name); // @1
           7        System.out.println("-----------------> @1 <----------------");
           8       /**
           9         * 創(chuàng)建類的實(shí)例對(duì)象
          10         */

          11        System.out.println("-----------------> @6 <----------------");
          12        Statical statical = new Statical(); // @6
          13        System.out.println("-----------------> @6 <----------------");
          14        /**
          15         * 通過(guò)實(shí)例來(lái)訪問(wèn)類變量,底層將轉(zhuǎn)化成通過(guò)類本身來(lái)訪問(wèn)類變量
          16         */

          17        System.out.println("-----------------> @2 <----------------");
          18        System.out.println("name --->> " + statical.name); // @2
          19        System.out.println("-----------------> @2 <----------------");
          20       /**
          21         * 如果類變量的值被改變,再訪問(wèn)類變量,將得到被改變后的值
          22         */

          23        Statical.name = "fancydeepin";
          24        
          25        System.out.println("-----------------> @3 <----------------");
          26        System.out.println("name --->> " + statical.name); // @3
          27        System.out.println("-----------------> @3 <----------------");
          28        
          29        System.out.println("-----------------> @4 <----------------");
          30        System.out.println("name --->> " + Statical.name); // @4
          31        System.out.println("-----------------> @4 <----------------");
          32       /**
          33         * 非靜態(tài)代碼塊 和 構(gòu)造器 被執(zhí)行的時(shí)機(jī)
          34         */

          35        System.out.println("-----------------> @5 <----------------");
          36        System.out.println("mail --->> " + statical.getMail()); // @5
          37        System.out.println("-----------------> @5 <----------------");
          38


          后臺(tái)輸出結(jié)果


          -----------------> @1 <----------------
          --->  靜態(tài)代碼塊被執(zhí)行   <---
          name 
          --->> fancy
          -----------------> @1 <----------------

          -----------------> @6 <----------------
          ---> 非靜態(tài)代碼塊被執(zhí)行 <---
          ---> 構(gòu)造器代碼塊被執(zhí)行 <---
          -----------------> @6 <----------------

          -----------------> @2 <----------------
          name 
          --->> fancy
          -----------------> @2 <----------------

          -----------------> @3 <----------------
          name 
          --->> fancydeepin
          -----------------> @3 <----------------

          -----------------> @4 <----------------
          name 
          --->> fancydeepin
          -----------------> @4 <----------------

          -----------------> @5 <----------------
          mail 
          --->> fancydeepin@yeah.net
          -----------------> @5 <----------------



          為了能更好的看出后臺(tái)的輸出是哪一行代碼執(zhí)行的結(jié)果,我用了 @和數(shù)字來(lái)做了標(biāo)記,希望大家不要看暈了哈 ^_^
          最后針對(duì)輸出結(jié)果簡(jiǎn)單說(shuō)一下:
          @1 說(shuō)明,靜態(tài)(類變量、靜態(tài)代碼塊)屬于類本身,不依賴于類的實(shí)例
          @6 說(shuō)明,在創(chuàng)建類的實(shí)例對(duì)象的時(shí)候,非靜態(tài)代碼塊比構(gòu)造器代碼塊更早的執(zhí)行
          @3 4 說(shuō)明,當(dāng)類變量的值改變后,再通過(guò)類或類的實(shí)例來(lái)訪問(wèn)類變量,得到的將是被改變后的值
          @5 說(shuō)明,非靜態(tài)(實(shí)例變量、非靜態(tài)代碼塊)的地位是相等的,它們將按順序被執(zhí)行,但會(huì)比構(gòu)造器中的代碼塊更早的執(zhí)行




            
          posted on 2012-07-09 19:55 fancydeepin 閱讀(12354) 評(píng)論(3)  編輯  收藏

          評(píng)論:
          # re: java 中的 成員變量、局部變量、靜態(tài)變量、類變量、非靜態(tài)變量、實(shí)例變量、向前引用、非法向前引用、靜態(tài)代碼塊、非靜態(tài)代碼塊 執(zhí)行時(shí)機(jī)[未登錄](méi) 2014-01-10 16:58 | 陽(yáng)光
          類變量只被加載到方法區(qū),而不是棧內(nèi)存  回復(fù)  更多評(píng)論
            
          # re: java 中的 成員變量、局部變量、靜態(tài)變量、類變量、非靜態(tài)變量、實(shí)例變量、向前引用、非法向前引用、靜態(tài)代碼塊、非靜態(tài)代碼塊 執(zhí)行時(shí)機(jī) 2014-02-14 10:52 | colorain
          請(qǐng)問(wèn)一個(gè)問(wèn)題

          類的成員變量,不能夠在類中使用 這是為什么呢
          比如

          class Test{
          private List list = new ArrayList();
          list.add("abc");// 在這里是不能使用 list變量的 原因是什么呢?


          }  回復(fù)  更多評(píng)論
            
          # re: java 中的 成員變量、局部變量、靜態(tài)變量、類變量、非靜態(tài)變量、實(shí)例變量、向前引用、非法向前引用、靜態(tài)代碼塊、非靜態(tài)代碼塊 執(zhí)行時(shí)機(jī)[未登錄](méi) 2015-05-24 18:07 | Kevin
          @colorain
          它是需要在方法中執(zhí)行的。  回復(fù)  更多評(píng)論
            

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 嘉义市| 潢川县| 静海县| 历史| 萨迦县| 墨脱县| 迭部县| 金川县| 鄂尔多斯市| 饶平县| 马边| 贵溪市| 宜昌市| 即墨市| 上思县| 剑川县| 丹棱县| 镇安县| 伊宁县| 亚东县| 游戏| 板桥市| 大新县| 福鼎市| 古交市| 佛学| 揭东县| 大连市| 固原市| 二连浩特市| 勃利县| 理塘县| 永和县| 三亚市| 家居| 龙南县| 永平县| 澎湖县| 寻乌县| 丹江口市| 神木县|