• static靜態代碼塊的使用詳解


    一.與靜態方法的比較  

      一般情況下,如果有些代碼必須在項目啓動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啓動的時候就初始化,在不創建對象的情況下,其他程序來調用的時候,需要使用靜態方法,靜態方法在類加載的時候 就已經加載 可以用類名直接調用 比如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,非靜態代碼塊還未執行),提示找不到源,不管是不是這條語句都提示了這個警告(不算錯誤,因爲程序繼續正常運行),然後運行了非靜態代碼塊,繼而從有參的構造方法處繼續執行……

  • 相关阅读:
    业余草 SpringCloud教程 | 第十一篇: 断路器监控(Hystrix Dashboard)(Finchley版本)
    业余草 SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
    业余草 SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
    业余草 SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)
    业余草 SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
    POJ2135 Farm Tour
    POJ1149 PIGS
    POJ3041 Asteroids
    2020.7.4模拟 数据结构 (ds)
    2020.7.4模拟 浇花 (flower)
  • 原文地址:https://www.cnblogs.com/JSWBK/p/5101298.html
Copyright © 2020-2023  润新知