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

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

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

    kermart

    k

     

    java 中的 各種變量、代碼塊執(zhí)行時(shí)機(jī)

    前言:這屬于 java 的基礎(chǔ)知識(shí),你可以不了解,也可以不拿它當(dāng)一回事,代碼也一樣能敲的順暢;這是很久之前,我從 C++ 轉(zhuǎn) java 剛?cè)腴T(mén)那會(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-10 13:00 kermart 閱讀(1365) 評(píng)論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆檔案

    收藏夾

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲视频在线观看免费视频| 亚洲国产一区二区三区青草影视| 可以免费观看的国产视频| 亚洲不卡中文字幕| 国产AV无码专区亚洲AWWW| 黄网址在线永久免费观看| 麻豆精品不卡国产免费看| 一级女性全黄久久生活片免费| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲国产精品嫩草影院久久| 97碰公开在线观看免费视频| 国产99精品一区二区三区免费| 涩涩色中文综合亚洲| 亚洲影视一区二区| 久久亚洲精品无码| 亚洲伊人久久大香线蕉综合图片 | 亚洲精品久久久久无码AV片软件| 亚洲精品和日本精品| 歪歪漫画在线观看官网免费阅读| 久久免费看少妇高潮V片特黄| 亚洲欧洲日产国码高潮αv| 1024免费福利永久观看网站| 久久国产乱子伦免费精品| 黄网站色视频免费观看45分钟| 亚洲AV无码一区二区大桥未久| 国产亚洲漂亮白嫩美女在线| 羞羞网站在线免费观看| 国产精品极品美女自在线观看免费| 国产高潮久久免费观看| 久久青草免费91线频观看不卡| 亚洲免费人成视频观看| 天天看片天天爽_免费播放| 亚洲精品黄色视频在线观看免费资源| 亚洲国产精品无码久久久不卡 | 亚洲综合成人网在线观看| 亚洲综合激情九月婷婷| 亚洲国产熟亚洲女视频| 色吊丝性永久免费看码 | jiz zz在亚洲| 日日狠狠久久偷偷色综合免费 | 亚洲Av永久无码精品一区二区|