国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中的static靜態代碼塊的使用詳解

2019-11-26 16:10:32
字體:
來源:轉載
供稿:網友

一.與靜態方法的比較  

  一般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不創建對象的情況下,其他程序來調用的時候,需要使用靜態方法,靜態方法在類加載的時候 就已經加載 可以用類名直接調用 比如main方法就必須是靜態的 這是程序入口。兩者的區別就是:靜態代碼塊是自動執行的; 靜態方法是被調用的時候才執行的。


二.靜態方法注意事項  

  使用類的靜態方法時,注意:

    a.在靜態方法里只能直接調用同類中其他的靜態成員(包括變量和方法),而不能直接訪問類中的非靜態成員。這是因為,對于非靜態的方法和變量,需要先創建類的實例對象后才可使用,而靜態方法在使用前

不用創建任何對象。

    b.靜態方法不能以任何方式引用this和super關鍵字,因為靜態方法在使用前不用創建任何實例對象,當靜態方法調用時,this所引用的對象根本沒有產生(this關鍵字只能在方法內部使用,表示對“調用方法的那

個對象”的引用)。

  靜態變量是屬于整個類的變量而不是屬于某個對象的。注意不能把任何方法體內的變量聲明為靜態,例如: fun() {    static int i=0;//非法。 }
 

三.程序舉例

復制代碼 代碼如下:

public class TestStaticCon {
     public static int a = 0;

     static {
         a = 10;
         System.out.println("父類的靜態代碼塊在執行a=" + a);
     }

     {
         a = 8;
         System.out.println("父類的非靜態代碼塊在執行a=" + a);
     }

     public TestStaticCon() {
         this("a在父類帶參構造方法中的值:" + TestStaticCon.a); // 調用另外一個構造方法
         System.out.println(a);
         System.out.println("父類無參構造方法在執行a=" + a);
     }

     public TestStaticCon(String n) {
         System.out.println(n);
         System.out.println(a);

     }

     public static void main(String[] args) {
         TestStaticCon tsc = null;
         System.out.println("!!!!!!!!!!!!!!!!!!!!!");
         tsc = new TestStaticCon();
     }
 }

復制代碼 代碼如下:

運行結果:
父類的靜態代碼塊在執行a=10
!!!!!!!!!!!!!!!!!!!!!
父類的非靜態代碼塊在執行a=8
a在父類帶參構造方法中的值:10
8
8
父類無參構造方法在執行a=8

四.網友提供
復制代碼 代碼如下:

public class StaticBlock {

     static {
         System.out.println("靜態塊");
     }
     {
         System.out.println("構造塊,在類中定義");
     }

     public StaticBlock() {
         System.out.println("構造方法執行");
     }

     public static void main(String[] args) {
         new StaticBlock();
         new StaticBlock();
     }

 }

復制代碼 代碼如下:

靜態塊
構造塊,在類中定義
構造方法執行
構造塊,在類中定義
構造方法執行

  結論:靜態代碼塊是在類加載時自動執行的,非靜態代碼塊是在創建對象時自動執行的代碼,不創建對象不執行該類的非靜態代碼塊。且執行順序為靜態代碼塊------非靜態代碼塊----構造函數。

  其中讓我疑惑的是“a在父類帶參構造方法中的值:10”,我再想那時候為什么不是8,debug了(F11,不能直接設置斷點然后運行,那樣和直接運行沒區別),發現先進入了無參的構造方法,執行了第一條語句并且切換到了另一個構造方法(不管是不是反正第一句都要執行,此時a還是10,非靜態代碼塊還未執行),提示找不到源,不管是不是這條語句都提示了這個警告(不算錯誤,因為程序繼續正常運行),然后運行了非靜態代碼塊,繼而從有參的構造方法處繼續執行……

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 呼和浩特市| 保靖县| 万全县| 专栏| 两当县| 弋阳县| 榆社县| 疏勒县| 浑源县| 盘山县| 上杭县| 屯门区| 香港 | 临夏县| 杨浦区| 武定县| 荃湾区| 赤壁市| 安龙县| 勃利县| 寻甸| 元氏县| 宁德市| 凌海市| 景谷| 潜山县| 吉林市| 多伦县| 邵东县| 本溪市| 巴彦县| 宕昌县| 辛集市| 盘山县| 星子县| 孙吴县| 恩施市| 桦川县| 栖霞市| 垦利县| 亚东县|