更新時間:2019-09-18 11:11:53 來源:動力節(jié)點 瀏覽2524次
今天動力節(jié)點java培訓機構(gòu)小編為大家介紹“static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別 ”,希望通過此文大家能夠熟悉static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別 ,下面就隨小編一起來了解一下static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別是什么?
先看一個例子:
//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)造器");
}
}
// 測試類
package com.my.test;
public class Test {
public static void main(String[] args) {
B b1 = new B();
System.out.println("====");
B b2 = new B();
}
}
運行結(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)代碼塊,在虛擬機加載類的時候就會加載執(zhí)行,而且只執(zhí)行一次;
非靜態(tài)代碼塊,在創(chuàng)建對象的時候(即new一個對象的時候)執(zhí)行,每次創(chuàng)建對象都會執(zhí)行一次
一個程序可以有多個靜態(tài)非靜態(tài)代碼區(qū)域。
static{}(靜態(tài)代碼塊)與{}(非靜態(tài)代碼塊)的異同點
相同點:
(1)都是在JVM加載類時且在構(gòu)造方法執(zhí)行之前執(zhí)行,在類中都可以定義多個,
(2)一般在代碼塊中對一些static變量進行賦值。.
(3)另外static塊中只能使用static修飾的屬性。
(4)程序中的static{}塊只是為了加載properties文件信息,這個加載只會被加載一次。
不同點:
(1)靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—>非靜態(tài)代碼塊—>構(gòu)造方法)。
(2)靜態(tài)代碼塊只在第一次new執(zhí)行一次,之后不再執(zhí)行,而非靜態(tài)代碼塊在每new
(3)一次就執(zhí)行一次。非靜態(tài)代碼塊可在普通方法中定義(不過作用不大);而靜態(tài)代碼塊不行。
例:
//普通類
publicclass PuTong {
public PuTong(){
System.out.print("默認構(gòu)造方法!-->");
}
//非靜態(tài)代碼塊
{
System.out.print("非靜態(tài)代碼塊!-->");
}
//靜態(tài)代碼塊
static{
System.out.print("靜態(tài)代碼塊!-->");
}
publicstaticvoid test(){
{
System.out.println("普通方法中的代碼塊!");
}
}
}
//測試類
publicclass TestClass {
/**
* 區(qū)別兩次new靜態(tài)與非靜態(tài)代碼塊執(zhí)行情況
*/
publicstaticvoid main(String[] args) {
PuTong c1 = new PuTong();
c1.test();
PuTong c2 = new PuTong();
c2.test();
}
}
/*
運行輸出結(jié)果是:
靜態(tài)代碼塊!-->非靜態(tài)代碼塊!-->默認構(gòu)造方法!-->普通方法中的代碼塊!
非靜態(tài)代碼塊!-->默認構(gòu)造方法!-->普通方法中的代碼塊!
*/
一般情況下,如果有些代碼必須在項目啟動的時候就執(zhí)行的時候,需要使用靜態(tài)代碼塊,這種代碼是主動執(zhí)行的;需要在項目啟動的時候就初始化,在不創(chuàng)建對象的情況下,其他程序來調(diào)用的時候,需要使用靜態(tài)方法,這種代碼是被動執(zhí)行的。
靜態(tài)代碼塊和靜態(tài)方法的區(qū)別
靜態(tài)代碼塊是自動執(zhí)行的;
靜態(tài)方法是被調(diào)用的時候才執(zhí)行的.
靜態(tài)代碼塊和靜態(tài)方法的作用:
靜態(tài)代碼塊可用來初始化一些項目最常用的變量或?qū)ο?靜態(tài)方法可用作不創(chuàng)建對象也可能需要執(zhí)行的代碼.
1、靜態(tài)代碼塊
在類中,可以將某一塊代碼聲明為靜態(tài)的,這樣的程序塊叫靜態(tài)初始化段。靜態(tài)代碼塊的一般形式如下:
static {
語句序列
}
靜態(tài)代碼塊只能定義在類里面,它獨立于任何方法,不能定義在方法里面。
靜態(tài)代碼塊里面的變量都是局部變量,只在本塊內(nèi)有效。
靜態(tài)代碼塊會在類被加載時自動執(zhí)行,而無論加載者是JVM還是其他的類。
一個類中允許定義多個靜態(tài)代碼塊,執(zhí)行的順序根據(jù)定義的順序進行。
靜態(tài)代碼塊只能訪問類的靜態(tài)成員,而不允許訪問實例成員。
【例1】靜態(tài)代碼塊運行示例:
//定義一個普通的main()方法
public static void main(String args[]){
System.out.println("This is main method.");
}
//定義一個靜態(tài)代碼塊
static{
System.out.println("This is static block.");
int stVar = 0; //這是一個局部變量,只在本塊內(nèi)有效
}
}
編譯通過后,用java命令加載本程序,會得到如下輸出:
This is static block.
This is main method.
從以上輸出結(jié)果中可以看出,靜態(tài)代碼塊甚至在main方法之前就被執(zhí)行。在main()方法中可以完成的任務(wù)在靜態(tài)代碼塊中都可以完成。但是二者在執(zhí)行上仍然有一些區(qū)別,請看下例。
【例2】靜態(tài)代碼塊和main()方法的區(qū)別。
這里仍然使用【例1】中的staticBlock類,然后新定義一個類來使用它。
public class useStaticBolck{
public static void main(String args[]){
new staticBlock(); //創(chuàng)建一個staticBlock的對象
}
}
本例其實可以概括成一句話:靜態(tài)方法只能訪問靜態(tài)成員,實例方法可以訪問靜態(tài)和實例成員。之所以不允許靜態(tài)方法訪問實例成員變量,是因為實例成員變量是屬于某個對象的,而靜態(tài)方法在執(zhí)行時,并不一定存在對象。同樣,因為實例方法可以訪問實例成員變量,如果允許靜態(tài)方法調(diào)用實例方法,將間接地允許它使用實例成員變量,所以它也不能調(diào)用實例方法。基于同樣的道理,靜態(tài)方法中也不能使用關(guān)鍵字this。
main()方法是一個典型的靜態(tài)方法,它同樣遵循一般靜態(tài)方法的規(guī)則,所以它可以由系統(tǒng)在創(chuàng)建對象之前就調(diào)用。
public class hasError{
int insVar = 100;
public static void main(String args[]){
System.out.println("insVar = " + insVar);
}
}
本程序沒有像以前的程序那樣,在創(chuàng)建對象時使用一個變量來接收對象,因為這個程序在后面并不需要用到這個變量。程序的輸出如下:
This is static block.
這一次,只執(zhí)行了靜態(tài)代碼塊,main()方法在這種情況下是不會被執(zhí)行的。
最后來寫一個復雜一點的靜態(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.");
}
//第一個靜態(tài)代碼塊
static{
System.out.println("This is first static block.");
stMember = 200; //訪問靜態(tài)成員變量
staticBlock oa = new staticBlock(); //創(chuàng)建對象
System.out.println("stMember = " + oa.stMember);
statFun(); //調(diào)用靜態(tài)方法
}
//定義一個靜態(tài)方法
static void statFun(){
System.out.println("This is a static method.");
}
//第二個靜態(tài)代碼塊
static{
System.out.println("This is second static block.");
}
}
以上就是動力節(jié)點java培訓機構(gòu)小編介紹的“static{}靜態(tài)代碼塊與{}普通代碼塊之間的區(qū)別 ”的內(nèi)容,希望對大家有幫助,更多java最新資訊請繼續(xù)關(guān)注動力節(jié)點java培訓機構(gòu)官網(wǎng),每天會有精彩內(nèi)容分享與你。
相關(guān)免費視頻教程推薦
java零基礎(chǔ)教程下載——static修飾代碼塊:http://www.dabaquan.cn/xiazai/2617.html