static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別

static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別

長(zhǎng)沙一度軟件培訓(xùn)      2022-05-01 15:56:01     27

static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別, 今天長(zhǎng)沙一度軟件培訓(xùn)java培訓(xùn)機(jī)構(gòu)小編為大家介紹“static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別”,希望通過(guò)此文大家能夠熟悉

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

 

今天長(zhǎng)沙一度軟件培訓(xùn)java培訓(xùn)機(jī)構(gòu)小編為大家介紹“static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別 ”,希望通過(guò)此文大家能夠熟悉static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別 ,下面就隨小編一起來(lái)了解一下static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別是什么?



先看一個(gè)例子:


//class A 

package com.my.test;


class A {


    static {

        System.out.println("A1:父類靜態(tài)代碼區(qū)域");

    }


    {

        System.out.println("A2:父類非靜態(tài)代碼區(qū)域");

    }


    public A() {

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

    }

}


//class B


package com.my.test;


public class B extends A {


    static {

        System.out.println("B1:子類靜態(tài)代碼區(qū)域");

    }


    {

        System.out.println("B2:子類非靜態(tài)代碼區(qū)域");

    }


    public B() {

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

    }

}


// 測(cè)試類

package com.my.test;


public class Test {

    public static void main(String[] args) {

        B b1 = new B();

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

        B b2 = new B();

    }

}


  運(yùn)行結(jié)果:


  A1:父類靜態(tài)代碼區(qū)域


  B1:子類靜態(tài)代碼區(qū)域


  A2:父類非靜態(tài)代碼區(qū)域


  A3:父類構(gòu)造器


  B2:子類非靜態(tài)代碼區(qū)域


  B3:子類構(gòu)造器


  ====


  A2:父類非靜態(tài)代碼區(qū)域


  A3:父類構(gòu)造器


  B2:子類非靜態(tài)代碼區(qū)域


  B3:子類構(gòu)造器

  

  區(qū)別:


  靜態(tài)代碼塊,在虛擬機(jī)加載類的時(shí)候就會(huì)加載執(zhí)行,而且只執(zhí)行一次;


  非靜態(tài)代碼塊,在創(chuàng)建對(duì)象的時(shí)候(即new一個(gè)對(duì)象的時(shí)候)執(zhí)行,每次創(chuàng)建對(duì)象都會(huì)執(zhí)行一次


  一個(gè)程序可以有多個(gè)靜態(tài)非靜態(tài)代碼區(qū)域。



  static{}(靜態(tài)代碼塊)與{}(非靜態(tài)代碼塊)的異同點(diǎn)


  相同點(diǎn):


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


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


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


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


  不同點(diǎn):


(1)靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—>非靜態(tài)代碼塊—>構(gòu)造方法)。


  (2)靜態(tài)代碼塊只在第一次new執(zhí)行一次,之后不再執(zhí)行,而非靜態(tài)代碼塊在每new


 ?。?)一次就執(zhí)行一次。非靜態(tài)代碼塊可在普通方法中定義(不過(guò)作用不大);而靜態(tài)代碼塊不行。


      例:


//普通類

publicclass PuTong {

    public PuTong(){

        System.out.print("默認(rèn)構(gòu)造方法!-->");

    }

    

    //非靜態(tài)代碼塊

    {

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

    }

    

    //靜態(tài)代碼塊

    static{

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

    }

    

    publicstaticvoid test(){

        {

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

        }

    }

}


//測(cè)試類

publicclass TestClass {

    

   

    publicstaticvoid main(String[] args) {

        PuTong c1 = new PuTong();

        c1.test();

        

        PuTong c2 = new PuTong();

        c2.test();

    }

}



  一般情況下,如果有些代碼必須在項(xiàng)目啟動(dòng)的時(shí)候就執(zhí)行的時(shí)候,需要使用靜態(tài)代碼塊,這種代碼是主動(dòng)執(zhí)行的;需要在項(xiàng)目啟動(dòng)的時(shí)候就初始化,在不創(chuàng)建對(duì)象的情況下,其他程序來(lái)調(diào)用的時(shí)候,需要使用靜態(tài)方法,這種代碼是被動(dòng)執(zhí)行的。


  靜態(tài)代碼塊和靜態(tài)方法的區(qū)別


靜態(tài)代碼塊是自動(dòng)執(zhí)行的;


  靜態(tài)方法是被調(diào)用的時(shí)候才執(zhí)行的.


  靜態(tài)代碼塊和靜態(tài)方法的作用:


靜態(tài)代碼塊可用來(lái)初始化一些項(xiàng)目最常用的變量或?qū)ο?靜態(tài)方法可用作不創(chuàng)建對(duì)象也可能需要執(zhí)行的代碼.



  1、靜態(tài)代碼塊


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


static {

  語(yǔ)句序列

}


  靜態(tài)代碼塊只能定義在類里面,它獨(dú)立于任何方法,不能定義在方法里面。


  靜態(tài)代碼塊里面的變量都是局部變量,只在本塊內(nèi)有效。


  靜態(tài)代碼塊會(huì)在類被加載時(shí)自動(dòng)執(zhí)行,而無(wú)論加載者是JVM還是其他的類。


  一個(gè)類中允許定義多個(gè)靜態(tài)代碼塊,執(zhí)行的順序根據(jù)定義的順序進(jìn)行。


  靜態(tài)代碼塊只能訪問(wèn)類的靜態(tài)成員,而不允許訪問(wèn)實(shí)例成員。


    【例1】靜態(tài)代碼塊運(yùn)行示例:


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

public static void main(String args[]){

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

}

//定義一個(gè)靜態(tài)代碼塊

static{

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

int stVar = 0;   //這是一個(gè)局部變量,只在本塊內(nèi)有效

}

}


  編譯通過(guò)后,用java命令加載本程序,會(huì)得到如下輸出:


This is static block.

This is main method.


從以上輸出結(jié)果中可以看出,靜態(tài)代碼塊甚至在main方法之前就被執(zhí)行。在main()方法中可以完成的任務(wù)在靜態(tài)代碼塊中都可以完成。但是二者在執(zhí)行上仍然有一些區(qū)別,請(qǐng)看下例。



  【例2】靜態(tài)代碼塊和main()方法的區(qū)別。


  這里仍然使用【例1】中的staticBlock類,然后新定義一個(gè)類來(lái)使用它。


public class useStaticBolck{

public static void main(String args[]){

new staticBlock();  //創(chuàng)建一個(gè)staticBlock的對(duì)象

}

}


  本例其實(shí)可以概括成一句話:靜態(tài)方法只能訪問(wèn)靜態(tài)成員,實(shí)例方法可以訪問(wèn)靜態(tài)和實(shí)例成員。之所以不允許靜態(tài)方法訪問(wèn)實(shí)例成員變量,是因?yàn)閷?shí)例成員變量是屬于某個(gè)對(duì)象的,而靜態(tài)方法在執(zhí)行時(shí),并不一定存在對(duì)象。同樣,因?yàn)閷?shí)例方法可以訪問(wèn)實(shí)例成員變量,如果允許靜態(tài)方法調(diào)用實(shí)例方法,將間接地允許它使用實(shí)例成員變量,所以它也不能調(diào)用實(shí)例方法?;谕瑯拥牡览恚o態(tài)方法中也不能使用關(guān)鍵字this。


  main()方法是一個(gè)典型的靜態(tài)方法,它同樣遵循一般靜態(tài)方法的規(guī)則,所以它可以由系統(tǒng)在創(chuàng)建對(duì)象之前就調(diào)用。



public class hasError{

int insVar = 100;

public static void main(String args[]){

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

}

}



  本程序沒(méi)有像以前的程序那樣,在創(chuàng)建對(duì)象時(shí)使用一個(gè)變量來(lái)接收對(duì)象,因?yàn)檫@個(gè)程序在后面并不需要用到這個(gè)變量。程序的輸出如下:


This is static block.



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


  最后來(lái)寫(xiě)一個(gè)復(fù)雜一點(diǎn)的靜態(tài)代碼塊的例子,它綜合體現(xiàn)了靜態(tài)代碼塊的使用方法。


  【例3】靜態(tài)代碼塊使用示例2:


public class staticBlock{

static int stMember = 100;    //定義靜態(tài)成員變量

public static void main(String args[]){

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

}

//第一個(gè)靜態(tài)代碼塊

static{

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

stMember  = 200;      //訪問(wèn)靜態(tài)成員變量

staticBlock oa = new staticBlock(); //創(chuàng)建對(duì)象

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

statFun();        //調(diào)用靜態(tài)方法

}

//定義一個(gè)靜態(tài)方法

static void statFun(){

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

//第二個(gè)靜態(tài)代碼塊

static{

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

}

}



以上就是長(zhǎng)沙一度軟件培訓(xùn)java培訓(xùn)機(jī)構(gòu)小編介紹的“static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別 ”的內(nèi)容,希望對(duì)大家有幫助,更多java最新資訊請(qǐng)繼續(xù)關(guān)注長(zhǎng)沙一度軟件培訓(xùn)java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會(huì)有精彩內(nèi)容分享與你。


相關(guān)免費(fèi)視頻教程推薦


java零基礎(chǔ)教程下載——static修飾代碼塊:http://www.bjpowernode.com/xiazai/2617.html


培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。