热门标签 | 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



推荐阅读
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 本文详细探讨了 Android Service 组件中 onStartCommand 方法的四种不同返回值及其应用场景。Service 可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 本文探讨了如何利用 Android 的 Movie 类来展示 GIF 动画,并详细介绍了调整 GIF 尺寸以适应不同布局的方法。同时,提供了相关的代码示例和注意事项。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 深入理解Dockerfile及其作用
    Dockerfile是一种文本格式的配置文件,用于定义构建Docker镜像所需的步骤。通过使用`docker build`命令,用户可以将Dockerfile中的一系列指令转换成一个可执行的Docker镜像。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
  • 探讨在内核中集成头文件的可行性与好处,特别是在处理外部模块和BPF应用时的作用。 ... [详细]
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社区 版权所有