沙漠中的魚

          欲上天堂,先下地獄
          posts - 0, comments - 56, trackbacks - 0, articles - 119
            BlogJava :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

          finalize()

          工作原理應(yīng)該是這樣的:一旦垃圾收集器準備好釋放對象占用的存儲空間,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過程中,才會真正回收對象的內(nèi)存。

          為什么要使用finalize()方法

          因為java內(nèi)存回收之能回收自己java自己創(chuàng)建的對象,而對調(diào)用未java的對象,如C,C++創(chuàng)建的對象,不能自動的清除,可以通過在finalize()方法,將這些對象顯示的清除。

          finalize()最有用處的地方之一是觀察垃圾收集的過程。

          class Chair {
            
          static boolean gcrun = false;
            
          static boolean f = false;
            
          static int created = 0;
            
          static int finalized = 0;
            
          int i;
            Chair() 
          {
              i 
          = ++created;
              
          if(created == 47
                System.out.println(
          "Created 47");
            }

            
          protected void finalize() {
              
          if(!gcrun) {
                gcrun 
          = true;
                System.out.println(
                  
          "Beginning to finalize after " +
                  created 
          + " Chairs have been created");
              }

              
          if(i == 47{
                System.out.println(
                  
          "Finalizing Chair #47, " +
                  
          "Setting flag to stop Chair creation");
                f 
          = true;
              }

              finalized
          ++;
              
          if(finalized >= created)
                System.out.println(
                  
          "All " + finalized + " finalized");
            }

          }


          public class Garbage {
            
          public static void main(String[] args) {
              
          if(args.length == 0{
                System.err.println(
          "Usage: \n" +
                  
          "java Garbage before\n  or:\n" +
                  
          "java Garbage after");
                
          return;
              }

              
          while(!Chair.f) {
                
          new Chair();
                
          new String("To take up space");
              }

              System.out.println(
                
          "After all Chairs have been created:\n" +
                
          "total created = " + Chair.created +
                
          ", total finalized = " + Chair.finalized);
              
          if(args[0].equals("before")) {
                System.out.println(
          "gc():");
                System.gc();
                System.out.println(
          "runFinalization():");
                System.runFinalization();
              }

              System.out.println(
          "bye!");
              
          if(args[0].equals("after"))
                System.runFinalizersOnExit(
          true);
            }

          }
           ///:~

          輸入結(jié)果為:

          Created 47
          Beginning to finalize after 8694 Chairs have been created
          Finalizing Chair #47, Setting flag to stop Chair creation
          After all Chairs have been created:
          total created = 9834, total finalized = 108
          bye!
          成員初使化
          可以方法賦值初使化成員
          下面這樣做是合法的:

          class CInit {
          int i = f();
          int j = g(i);
          //...
          }

          但下面這樣做是非法的:

          class CInit {
          int j = g(i);
          int i = f();
          //...
          }
          構(gòu)造器初使化
          class Counter {
          int i;
          Counter() { i = 7; }
          i首先會初始化成零,然后變成7。
          1.初使化順序
          先初使化成員,然后執(zhí)行構(gòu)造器內(nèi)容
          2.靜態(tài)數(shù)據(jù)初使化
           
          
          public class Dog {
              
          public static Dog sDog=new Dog("static dog");
              
          public Dog(String str){
                  System.out.println(str);
              }

              
          public static void main(String[] args){
                  Dog dog
          =new Dog("init");
              }

          }
          輸入出結(jié)果
          static dog
          init

          (1) 類型為Dog的一個對象首次創(chuàng)建時,或者Dog類的static方法/static字段首次訪問時,Java解釋器必須找到Dog.class(在事先設(shè)好的類路徑里搜索)。
          (2) 找到Dog.class后(它會創(chuàng)建一個Class對象,這將在后面學(xué)到),它的所有static初始化模塊都會運行。因此,static初始化僅發(fā)生一次——在Class對象首次載入的時候。
          (3) 創(chuàng)建一個new Dog()時,Dog對象的構(gòu)建進程首先會在內(nèi)存堆(Heap)里為一個Dog對象分配足夠多的存儲空間。
          (4) 這種存儲空間會清為零,將Dog中的所有基本類型設(shè)為它們的默認值(零用于數(shù)字,以及boolean和char的等價設(shè)定)。
          (5) 進行字段定義時發(fā)生的所有初始化都會執(zhí)行。
          (6) 執(zhí)行構(gòu)建器。

          3.明確進行的靜態(tài)初始化
          
          
          class Spoon {  
             
          static int i;  
             
          static {    
               i 
          = 47;  
             }

          }
          這段代碼僅執(zhí)行一次——首次生成那個類的一個對象時,或者首次訪問屬于那個類的一個static成員時
          4.非靜態(tài)實例的初始化
          class Mug {
            Mug(
          int marker) {
              System.out.println(
          "Mug(" + marker + ")");
            }

          }


          public class Mugs {
            Mug c1;
            
          {
              c1 
          = new Mug(1);
              System.out.println(
          "c1 initialized");
            }

            Mugs() 
          {
              System.out.println(
          "Mugs()");
            }

            
          public static void main(String[] args) {
              System.out.println(
          "Inside main()");
              Mugs x 
          = new Mugs();
            }

          }

          輸入出結(jié)果
          Inside main()
          Mug(1)
          c1 initialized
          Mugs()
           
          主站蜘蛛池模板: 垦利县| 资阳市| 巢湖市| 盐津县| 驻马店市| 新巴尔虎左旗| 新干县| 罗平县| 嘉义县| 讷河市| 木兰县| 商丘市| 漳浦县| 姜堰市| 天门市| 金门县| 大丰市| 邢台市| 昔阳县| 镇宁| 新平| 五指山市| 当雄县| 鹤峰县| 河间市| 通江县| 聊城市| 石泉县| 郎溪县| 岳池县| 二连浩特市| 双柏县| 怀仁县| 钟山县| 黄大仙区| 北票市| 弋阳县| 临朐县| 筠连县| 金川县| 精河县|