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);
   }
}

/** 
 *  
 */  
package com.bzu.csh;  
  
import java.util.Random;  
  
/** 
 *  
 * 项目名称:Test1 类名称:Test2 类描述: 创建人:admin 创建时间:2017年1月7日 下午9:41:36 修改人:admin 
 * 修改时间:2017年1月7日 下午9:41:36 修改备注: 
 *  
 * @version 
 *  
 */  
class Test4 {  
    public static final int i = 6 / 2;// 编译时就处理了,即i =  
                                        // 3;不初始化类,static代码块和静态初始化块不执行  
    public static final int j = new Random().nextInt();// 运行时处理,需要初始化类,都执行  
    static {  
        System.out.println("static 静态代码块");  
    }  
    {  
        System.out.println("初始化块");  
    }  
}  
  //加入Java开发交流君样:756584822一起吹水聊天
public class Test3 {  
  
    /** 
     * @param args 
     *            2017年1月7日 
     */  
    public static void main(String[] args) {  
        System.out.println(Test4.i);  
    }  
}  

在这里插入图片描述

只有主动调用时才初始化类

[java] view plain copy

/** 
*  
*/  
package com.bzu.csh;  
 
import java.util.Random;  
 

class Test6 {  
   public static final int a = 6 / 2;// 编译时就处理了,即i = 3  
   // 3;不初始化类,static代码块和静态初始化块不执行  
   public static final int b = new Random().nextInt(10);// 运行时处理,需要初始化类,都执行  
   static {  
       System.out.println("Test6  static 静态代码块" + a + ":" + b);  
   }  
   {  
       System.out.println("Test6  初始化块");  
   }  
}  
 
class Test4 extends Test6 {  
   public static final int i = 6 / 2;// 编译时就处理了,即i = 3  
                                       // 3;不初始化类,static代码块和静态初始化块不执行  
   public static final int j = new Random().nextInt(10);// 运行时处理,需要初始化类,都执行  
   static {  
       System.out.println("Test4  static 静态代码块" + i + ":" + j);  
   }  
   {  
       System.out.println("Test4  初始化块");  
   }  
 //加入Java开发交流君样:756584822一起吹水聊天
}  
 
public class Test3 {  
 
   /** 
    * @param args 
    *            2020年12月24日 
    */  
   static {  
       System.out.println("Test3");  
   }  
 
   public static void main(String[] args) {  
       // Test4 t = new Test4();结果如下:执行了初始化块  
       // Test3  
       // Test6 static 静态代码块3:9  
       // Test4 static 静态代码块3:0  
       // Test6 初始化块  //加入Java开发交流君样:756584822一起吹水聊天
       // Test4 初始化块  
       /***********************************************************/  
       // System.out.println(Test4.j);// 这个不执行初始化块  
       // Test3  
       // Test6 static 静态代码块3:4  
       // Test4 static 静态代码块3:8  
       // 8  
       /***********************************************************/  
       System.out.println(Test4.b);// 不会初始化Test4,因为b定义在了Test6  
       // Test3  
       // Test6 static 静态代码块3:8  
       // 8  
 
   }  
}  

image

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,
需要获取这些内容的朋友请加Q君样:
756584822

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值