`
鳄鱼旭
  • 浏览: 76269 次
文章分类
社区版块
存档分类
最新评论

Java 之为什么

 
阅读更多
了解了一些VM和ByteCode层面的规范以后,有些问题会忽然就懂了:

1)为什么Java要把方法名字等直接写入Class文件当中?学过C/C++的人都知道,实际上对于函数来说,程序被编译之后会丢掉函数的名称,使用一个偏移取而代之,然后对函数的调用时间上会变成转跳到某一个地址的子程序。 Java为什么不这样做呢?
     我原来以为是为了反编译的方便(能够看到类、方法等名称,多好!),最近才想清楚,是因为做不到这一点。 原因(起码是原因之一)如果使用了偏移地址来取代方法本身,由于Class的调用是“动态的”,即调用者实际上并不知道这个偏移地址是多少,所以只能把名字写进去;

2)Class的常量池为什么不是“共享”的呢?每个类拥有一个常量池(用来存放所有的常量,比如字符串常量,方法名、类名等)岂不是很浪费空间? 原因其实也是因为Class的动态特性,在Class没有被加载进来之前,有多少个“常量”实际上是不知道的,所以共享常量池实际上在编译期间无法确定。 但问题是方法、类名等在编译的时候会使用改名称在常量池中的偏移(即编译的时候必须要确定下来),与前者是矛盾的。
     其实关于这个问题,我又构造出来一个面试题:
      1.String a = new String("abc");
      String b = new String("abc");
      a.equals(b) 与   a==b? 结果true or false?

      2.String a = "abc";
      String b = "abc";
      a.equals(b) 与   a==b? 结果true or false?

      3.Class A{public static String a = "abc";)}  Class B {public static String b ="abc"}
      A.a.equals(B.b) 与 A.a == B.b 结果true or false?

      第一个比较简单:true,false;
      第二个由于a,b的赋值字符串在常量池中,因此a和b实际上指向的是同一个地址,因此结果为true,true;
      第三个虽然是二者的赋值字符串都在常量池中,但是由于隶属于不同的类,因此属于不同的常量池实例,当然也就不是同一个地址了,因此结论为:true,false(没有经过验证)

先写这么多,以后再补充。
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机...

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    Java 代码转换为 C# Java to C# Converter

    Java 代码转换为 C# Java to C# Converter 解除限制 Java 代码转换为 C# Java to C# Converter 解除限制 Java 代码转换为 C# Java to C# Converter 解除限制

    Java 面经手册·小傅哥.pdf

    这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...

    smali2java——直接将smali转换成java

    在Android开发中,Java是主要的编程语言之一,用于编写应用程序的逻辑。Java代码编译后生成字节码,然后在Android设备上的DVM或ART(Android运行时)环境中解释执行。 **smali2java工具** "smali2java"工具是专门...

    java将数字转换为时间格式

    ### Java将数字转换为时间格式的方法 在Java编程语言中,经常需要处理日期与时间相关的数据,例如将数字(通常是表示时间戳或特定格式的字符串)转换为更易读的时间格式。这种转换不仅可以帮助我们更好地理解和操作...

    java实现图片转换为视频

    在IT行业中,将图片转换为视频是一项常见的任务,特别是在多媒体处理、动画制作或者数据可视化等领域。Java作为一种跨平台的编程语言,提供了丰富的库和API来处理这类任务。本篇文章将详细探讨如何使用Java实现图片...

    java解析DWG文件为json使用superMap

    【标题】:“java解析DWG文件为json使用superMap” 【描述】:“java使用superMap解析DWG文件为json输出,本地通过,附件中为word操方式按照步骤可以导入数据集” 【标签】:“java解析DWG文件json java读取dwg...

    Java2Pas Java代码转pas代码

    Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...

    迅雷下载接口java实现

    - **平台兼容性**:由于C++和JNI的特性,可能需要为不同的操作系统(如Windows、Linux、macOS)分别编译和加载相应的动态库。 在"project"这个压缩包文件中,应该包含该项目的源代码,包括Java的主程序、JNI接口...

    C++代码转java工具

    在某些情况下,开发者可能需要将已有的C++代码转换为Java代码,以便在Java平台上运行或利用Java的生态系统。 标题“C++代码转Java工具”暗示了一个软件或服务的存在,它的功能是自动化C++源代码到Java源代码的转换...

    java中只有值传递

    Java中传递对象时传递的并不是对象中的内容, 而是对象的地址。

    java2python--java代码转python工具

    Java到Python的转换工具,如标题“java2python”所示,是编程领域中的一种实用技术,旨在帮助开发者将已有的Java代码转换为Python语言。这种转换对于那些熟悉Java但希望进入Python生态系统,或者想要利用Python特定...

    java11安装包正式版

    jdk11官方版是一款专为java编程人员推出的软件开发工具。JAVA JDK 11最新版可以帮助用户轻松的获取到JAVA的运行环境,让你在电脑上进行程序开发操作。JAVA JDK 11软件新增Epsilon 垃圾收集器和lambda 参数的局部变量...

    java 17 window 安装包

    这个安装包是专为在Windows x64平台上运行和开发Java应用程序设计的。让我们深入了解一下Java 17以及如何在Windows系统上进行安装。 Java 17,正式命名为Java SE 17 (Standard Edition),是Oracle公司推出的最新...

    Java API文档 中文网页版

    这份中文网页版的Java API文档为中国的开发者提供了便利,无需通过英文版本来学习和查找API信息,提高了开发效率。 首先,API全称为Application Programming Interface,它是软件系统中提供给开发者使用的预先定义...

    java笔记 java笔记

    与之相对的是面向过程编程,它侧重于函数和过程。 ##### 6.2 对象的概念 对象是类的实例,包含了该类的所有属性和方法。 ##### 6.3 成员变量和局部变量 - **成员变量**:定义在类中的变量。 - **局部变量**:...

    Java 浏览器 Java浏览器

    Java 浏览器是一种使用Java编程语言开发的网络浏览应用,虽然相对少见,但它的存在为Java开发者提供了一个独特的学习和研究平台。由于Java的跨平台特性,这种浏览器理论上可以在任何支持Java虚拟机(JVM)的设备上...

    java源码包3

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

Global site tag (gtag.js) - Google Analytics