黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 static{}靜態代碼塊與{}普通代碼塊之間的區別

static{}靜態代碼塊與{}普通代碼塊之間的區別

更新時間:2019-09-18 11:11:53 來源:動力節點 瀏覽2537次

 

今天動力節點java培訓機構小編為大家介紹“static{}靜態代碼塊與{}普通代碼塊之間的區別 ”,希望通過此文大家能夠熟悉static{}靜態代碼塊與{}普通代碼塊之間的區別 ,下面就隨小編一起來了解一下static{}靜態代碼塊與{}普通代碼塊之間的區別是什么?


timg (3).jpg


先看一個例子:


//class A 

package com.my.test;


class A {


    static {

        System.out.println("A1:父類靜態代碼區域");

    }


    {

        System.out.println("A2:父類非靜態代碼區域");

    }


    public A() {

        System.out.println("A3:父類構造器");

    }

}


//class B


package com.my.test;


public class B extends A {


    static {

        System.out.println("B1:子類靜態代碼區域");

    }


    {

        System.out.println("B2:子類非靜態代碼區域");

    }


    public B() {

        System.out.println("B3:子類構造器");

    }

}


// 測試類

package com.my.test;


public class Test {

    public static void main(String[] args) {

        B b1 = new B();

        System.out.println("====");

        B b2 = new B();

    }

}


  運行結果:


  A1:父類靜態代碼區域


  B1:子類靜態代碼區域


  A2:父類非靜態代碼區域


  A3:父類構造器


  B2:子類非靜態代碼區域


  B3:子類構造器


  ====


  A2:父類非靜態代碼區域


  A3:父類構造器


  B2:子類非靜態代碼區域


  B3:子類構造器

  

  區別:


  靜態代碼塊,在虛擬機加載類的時候就會加載執行,而且只執行一次;


  非靜態代碼塊,在創建對象的時候(即new一個對象的時候)執行,每次創建對象都會執行一次


  一個程序可以有多個靜態非靜態代碼區域。



  static{}(靜態代碼塊)與{}(非靜態代碼塊)的異同點


  相同點:


(1)都是在JVM加載類時且在構造方法執行之前執行,在類中都可以定義多個,


 ?。?)一般在代碼塊中對一些static變量進行賦值。.


 ?。?)另外static塊中只能使用static修飾的屬性。


 ?。?)程序中的static{}塊只是為了加載properties文件信息,這個加載只會被加載一次。


  不同點:


(1)靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。


 ?。?)靜態代碼塊只在第一次new執行一次,之后不再執行,而非靜態代碼塊在每new


  (3)一次就執行一次。非靜態代碼塊可在普通方法中定義(不過作用不大);而靜態代碼塊不行。


      例:


//普通類

publicclass PuTong {

    public PuTong(){

        System.out.print("默認構造方法!-->");

    }

    

    //非靜態代碼塊

    {

        System.out.print("非靜態代碼塊!-->");

    }

    

    //靜態代碼塊

    static{

        System.out.print("靜態代碼塊!-->");

    }

    

    publicstaticvoid test(){

        {

            System.out.println("普通方法中的代碼塊!");

        }

    }

}


//測試類

publicclass TestClass {

    

    /**

     * 區別兩次new靜態與非靜態代碼塊執行情況

     */

    publicstaticvoid main(String[] args) {

        PuTong c1 = new PuTong();

        c1.test();

        

        PuTong c2 = new PuTong();

        c2.test();

    }

}


/*

運行輸出結果是:

靜態代碼塊!-->非靜態代碼塊!-->默認構造方法!-->普通方法中的代碼塊!

非靜態代碼塊!-->默認構造方法!-->普通方法中的代碼塊!

*/


  一般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不創建對象的情況下,其他程序來調用的時候,需要使用靜態方法,這種代碼是被動執行的。


  靜態代碼塊和靜態方法的區別


靜態代碼塊是自動執行的;


  靜態方法是被調用的時候才執行的.


  靜態代碼塊和靜態方法的作用:


靜態代碼塊可用來初始化一些項目最常用的變量或對象;靜態方法可用作不創建對象也可能需要執行的代碼.



  1、靜態代碼塊


  在類中,可以將某一塊代碼聲明為靜態的,這樣的程序塊叫靜態初始化段。靜態代碼塊的一般形式如下:


static {

  語句序列

}


  靜態代碼塊只能定義在類里面,它獨立于任何方法,不能定義在方法里面。


  靜態代碼塊里面的變量都是局部變量,只在本塊內有效。


  靜態代碼塊會在類被加載時自動執行,而無論加載者是JVM還是其他的類。


  一個類中允許定義多個靜態代碼塊,執行的順序根據定義的順序進行。


  靜態代碼塊只能訪問類的靜態成員,而不允許訪問實例成員。


    【例1】靜態代碼塊運行示例:


//定義一個普通的main()方法

public static void main(String args[]){

System.out.println("This is main method.");  

}

//定義一個靜態代碼塊

static{

System.out.println("This is static block.");

int stVar = 0;   //這是一個局部變量,只在本塊內有效

}

}


  編譯通過后,用java命令加載本程序,會得到如下輸出:


This is static block.

This is main method.


從以上輸出結果中可以看出,靜態代碼塊甚至在main方法之前就被執行。在main()方法中可以完成的任務在靜態代碼塊中都可以完成。但是二者在執行上仍然有一些區別,請看下例。



  【例2】靜態代碼塊和main()方法的區別。


  這里仍然使用【例1】中的staticBlock類,然后新定義一個類來使用它。


public class useStaticBolck{

public static void main(String args[]){

new staticBlock();  //創建一個staticBlock的對象

}

}


  本例其實可以概括成一句話:靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變量,是因為實例成員變量是屬于某個對象的,而靜態方法在執行時,并不一定存在對象。同樣,因為實例方法可以訪問實例成員變量,如果允許靜態方法調用實例方法,將間接地允許它使用實例成員變量,所以它也不能調用實例方法?;谕瑯拥牡览?,靜態方法中也不能使用關鍵字this。


  main()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在創建對象之前就調用。



public class hasError{

int insVar = 100;

public static void main(String args[]){

System.out.println("insVar = " + insVar);

}

}



  本程序沒有像以前的程序那樣,在創建對象時使用一個變量來接收對象,因為這個程序在后面并不需要用到這個變量。程序的輸出如下:


This is static block.



  這一次,只執行了靜態代碼塊,main()方法在這種情況下是不會被執行的。


  最后來寫一個復雜一點的靜態代碼塊的例子,它綜合體現了靜態代碼塊的使用方法。


  【例3】靜態代碼塊使用示例2:


public class staticBlock{

static int stMember = 100;    //定義靜態成員變量

public static void main(String args[]){

System.out.println("This is main method.");

}

//第一個靜態代碼塊

static{

System.out.println("This is first static block.");

stMember  = 200;      //訪問靜態成員變量

staticBlock oa = new staticBlock(); //創建對象

System.out.println("stMember = " + oa.stMember);

statFun();        //調用靜態方法

}

//定義一個靜態方法

static void statFun(){

System.out.println("This is a static method.");

//第二個靜態代碼塊

static{

System.out.println("This is second static block.");

}

}


timg.jpg


以上就是動力節點java培訓機構小編介紹的“static{}靜態代碼塊與{}普通代碼塊之間的區別 ”的內容,希望對大家有幫助,更多java最新資訊請繼續關注動力節點java培訓機構官網,每天會有精彩內容分享與你。


相關免費視頻教程推薦


java零基礎教程下載——static修飾代碼塊:http://www.ilovecolors.com.cn/xiazai/2617.html


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产制服丝袜视频 | 天天狠狠干 | 5x性区m免费毛片视频看看 | 成人在免费观看视频国产 | 成人黄色在线观看 | 成人性生活免费视频 | 国产福利在线 | 色黄污在线看黄污免费看黄污 | 999久久免费高清热精品 | 日韩不卡一二三区 | 成人毛片免费在线观看 | 日本亚洲欧美在线 | 中文字幕在线免费 | 国产一级特黄全黄毛片 | 老司机亚洲精品影院 | 极品精品国产超清自在线观看 | 日韩伦理在线免费观看 | 免费看日批视频 | 深夜福利欧美 | 欧美激情在线播放一区二区 | 亚洲欧美在线不卡 | 欧美日韩在线精品一区二区三区 | 视频一区二区中文字幕 | 国产福利免费视频 | 狠狠狠很橹影院 | 男人下面疯狂进女人下部视频 | 日本一区二区免费在线观看 | 日韩欧美一区在线观看 | 亚洲导航深夜福利 | 高清视频黄色录像免费 | 97精品国产自在现线免费观看 | 日本欧美一区二区三区 | 动漫精品一区二区三区视频 | 成人国产一区二区三区 | 中国黄色三级 | 夜夜澡人人爽人人喊_欧美 夜夜躁天天躁很很躁 | 成人在线日韩 | 国产一区二区在线 |播放 | 免费视频你懂得 | 国产亚洲午夜精品 | 鲁丝片一区二区三区毛片 |