热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java虚拟机的符号引用和直接引用

在java中,一个java类将会编译成一个class文件。在编译时,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 plaincopy
  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. }  

转:https://www.cnblogs.com/fpcbk/p/9013761.html



推荐阅读
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
author-avatar
后悔不够狠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有