java虛擬機的符號引用和直接引用


  在java中,一個java類將會編譯成一個class文件。在編譯時,java類並不知道引用類的實際內存地址,因此只能使用符號引用來代替。比如org.simple.People類引用org.simple.Tool類,在編譯時People類並不知道Tool類的實際內存地址,因此只能使用符號org.simple.Tool(假設)來表示Tool類的地址。而在類裝載器裝載People類時,此時可以通過虛擬機獲取Tool類 的實際內存地址,因此便可以既將符號org.simple.Tool替換為Tool類的實際內存地址,及直接引用地址。

總結:JVM對於直接引用和符號引用的處理是有區別的,可以看到符號引用時,JVM將使用StringBuilder來完成字符串的  添加,而直接引用時則直接使用String來完成;直接引用永遠比符號引用效率更快,但實際應用開發中不可能全用直接引用,要提高效能可以考慮按虛擬機的思維來編寫你的程序。

1.0 直接引用:

public class StringAndStringBuilder{
   public static void main(String[] args){    
       System.out.println ("s=" + "asdfa");
   }
}

2.0 符號引用:

public class StringAndStringBuilder{
   public static void main(String[] args){    
      String s="asdfa";
        System.out.println ("s=" + s);
   }
}

  1. /** 
  2.  *  
  3.  */  
  4. package com.bzu.csh;  
  5.   
  6. import java.util.Random;  
  7.   
  8. /** 
  9.  *  
  10.  * 項目名稱:Test1 類名稱:Test2 類描述: 創建人:admin 創建時間:2017年1月7日 下午9:41:36 修改人:admin 
  11.  * 修改時間:2017年1月7日 下午9:41:36 修改備注: 
  12.  *  
  13.  * @version 
  14.  *  
  15.  */  
  16. class Test4 {  
  17.     public static final int i = 6 / 2;// 編譯時就處理了,即i =  
  18.                                         // 3;不初始化類,static代碼塊和靜態初始化塊不執行  
  19.     public static final int j = new Random().nextInt();// 運行時處理,需要初始化類,都執行  
  20.     static {  
  21.         System.out.println("static 靜態代碼塊");  
  22.     }  
  23.     {  
  24.         System.out.println("初始化塊");  
  25.     }  
  26. }  
  27.   
  28. public class Test3 {  
  29.   
  30.     /** 
  31.      * @param args 
  32.      *            2017年1月7日 
  33.      */  
  34.     public static void main(String[] args) {  
  35.         System.out.println(Test4.i);  
  36.     }  
  37. }  

只有主動調用時才初始化類

 

[java]  view plain  copy
 
  1. /** 
  2.  *  
  3.  */  
  4. package com.bzu.csh;  
  5.   
  6. import java.util.Random;  
  7.   
  8. /** 
  9.  *  
  10.  * 項目名稱:Test1 類名稱:Test2 類描述: 創建人:admin 創建時間:2017年1月7日 下午9:41:36 修改人:admin 
  11.  * 修改時間:2017年1月7日 下午9:41:36 修改備注: 
  12.  *  
  13.  * @version 
  14.  *  
  15.  */  
  16. class Test6 {  
  17.     public static final int a = 6 / 2;// 編譯時就處理了,即i = 3  
  18.     // 3;不初始化類,static代碼塊和靜態初始化塊不執行  
  19.     public static final int b = new Random().nextInt(10);// 運行時處理,需要初始化類,都執行  
  20.     static {  
  21.         System.out.println("Test6  static 靜態代碼塊" + a + ":" + b);  
  22.     }  
  23.     {  
  24.         System.out.println("Test6  初始化塊");  
  25.     }  
  26. }  
  27.   
  28. class Test4 extends Test6 {  
  29.     public static final int i = 6 / 2;// 編譯時就處理了,即i = 3  
  30.                                         // 3;不初始化類,static代碼塊和靜態初始化塊不執行  
  31.     public static final int j = new Random().nextInt(10);// 運行時處理,需要初始化類,都執行  
  32.     static {  
  33.         System.out.println("Test4  static 靜態代碼塊" + i + ":" + j);  
  34.     }  
  35.     {  
  36.         System.out.println("Test4  初始化塊");  
  37.     }  
  38.   
  39. }  
  40.   
  41. public class Test3 {  
  42.   
  43.     /** 
  44.      * @param args 
  45.      *            2017年1月7日 
  46.      */  
  47.     static {  
  48.         System.out.println("Test3");  
  49.     }  
  50.   
  51.     public static void main(String[] args) {  
  52.         // Test4 t = new Test4();結果如下:執行了初始化塊  
  53.         // Test3  
  54.         // Test6 static 靜態代碼塊3:9  
  55.         // Test4 static 靜態代碼塊3:0  
  56.         // Test6 初始化塊  
  57.         // Test4 初始化塊  
  58.         /***********************************************************/  
  59.         // System.out.println(Test4.j);// 這個不執行初始化塊  
  60.         // Test3  
  61.         // Test6 static 靜態代碼塊3:4  
  62.         // Test4 static 靜態代碼塊3:8  
  63.         // 8  
  64.         /***********************************************************/  
  65.         System.out.println(Test4.b);// 不會初始化Test4,因為b定義在了Test6  
  66.         // Test3  
  67.         // Test6 static 靜態代碼塊3:8  
  68.         // 8  
  69.   
  70.     }  
  71. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM