初识字节码文件--Java

news/2024/11/1 2:00:12/

1,问题:请问以下代码,每行创建了几个对象?

java">    public static void main(String[] args) {String a = "你好";String b = new String("你好");String c = "你" + "好";}

如何查看字节码

方法一:编译命令

使用 javac 命令编译你的Java源文件

java">javac YourClass.java

使用 javap 命令,查看字节码

java">javap -c YourClass

方法一:机智使用插件

jclasslib

插件使用方法

(1) 选中编译后的class文件

(2) 打开view窗口,点击show Bytecode With Jclasslib

效果如下:

下面对该字节码进行详解

0 ldc #7 <你好>

将常量池中索引为7的字符串“你好”加载到操作数栈中。

  • ldc 指令用于加载常量。在这里,它加载字符串常量 你好,该常量在常量池中索引为 7

2 astore_1

astore_1:将操作数栈顶部的值(“你好”)存储到局部变量表的索引1处。

  • astore_1 将栈顶的引用(即刚刚加载的 你好 字符串)存储到局部变量表中的第一个位置。

3 new #9 <java/lang/String>

new #9 <java/lang/String>创建一个新的 String 对象实例。

  • new 指令用于创建一个新的对象,这里创建的是 java/lang/String 类型的对象。常量池中的索引 9 指向 String 类。

6 dup

dup:复制操作数栈顶部的值(新创建的 String 对象的引用),以便后续调用构造函数时使用。

  • dup 指令复制栈顶的引用。此时,栈顶是新创建的 String 对象的引用,复制后栈顶有两个相同的引用。

7 ldc #7 <你好>

ldc #7 <你好>:再次将常量池中的字符串“你好”加载到操作数栈中。

  • 这里再次加载字符串常量 你好,与第一行相同。

9  invokespecial #11 <java/lang/String.<init> : (Ljava/lang/String;)V>
invokespecial:调用 String 类的构造函数,传入之前加载的字符串“你好”。

  • invokespecial 指令调用构造方法。在这里,调用 String 类的构造方法,将刚刚加载的 你好 字符串传入,以初始化 String 对象。

12 astore_2

astore_2:将构造函数返回的 String 对象引用存储到局部变量表的索引2处。

  • astore_2 将构造出来的 String 对象存储到局部变量表中的第二个位置。

13 ldc #7 <你好>

ldc #7 <你好>:再次将常量池中的字符串“你好”加载到操作数栈中。

  • 再次加载字符串常量 你好,此时是为了将其存储到第三个局部变量中。

15 astore_3

astore_3:将操作数栈顶部的值(“你好”)存储到局部变量表的索引3处。

  • astore_3 将栈顶的字符串常量 你好 存储到局部变量表中的第三个位置。

16 return

return:结束方法的执行,返回到调用者。

  • return 指令结束方法执行,返回到调用者。

由上可以看出,该代码一共只创建了两个对象

第一个对象:通过 ldc #7 <你好> 加载的字符串常量 你好。这个常量在运行时会被视为一个对象,虽然它是一个字符串字面量,但在常量池中会被视为一个 String 对象。

第二个对象:通过 new 指令创建的 java/lang/String 对象。这是使用构造方法 String.<init> 初始化的对象。


http://www.ppmy.cn/news/1543459.html

相关文章

Python中的`update`方法详解及示例

Python中的update方法详解及示例 1. update方法简介2. update方法的应用场景3. 代码示例示例代码代码解释运行结果 4. 总结 在Python编程中&#xff0c;update方法是一个非常实用的工具&#xff0c;尤其是在处理集合&#xff08;Set&#xff09;数据类型时。本文将详细介绍upda…

数据库的三范式是什么?

数据库的三范式&#xff08;3NF&#xff09;是数据库规范化过程中的三个不同层次&#xff0c;旨在减少数据冗余和提高数据完整性。以下是三个范式的详细说明&#xff1a; 1. **第一范式&#xff08;1NF&#xff09;**&#xff1a; - **原子性**&#xff1a;确保数据库表的每…

深入分析-MySQL中的死锁问题排查与解决(二)

深入分析&#xff1a;MySQL中的死锁问题排查与解决 在高并发的数据库环境中&#xff0c;死锁是一个不可避免的问题。它发生在两个或多个事务互相等待对方持有的资源&#xff0c;导致所有相关事务无法继续执行。本文将通过一个实际案例&#xff0c;详细分析死锁的成因、排查过程…

深入探讨 Go 语言的函数基本概念

在现代编程中&#xff0c;函数是构建可重用和模块化代码的基本单元。Go 语言以其简洁和高效的特性而受到广泛欢迎&#xff0c;而函数在其中扮演着至关重要的角色。本文将深入探讨 Go 语言中函数的基本概念&#xff0c;包括函数的定义、参数、返回值、作用域以及高阶函数等内容。…

python爬虫基础篇:文本操作和二进制存储

文本操作 读取方式r readw writea appendb btye 合并方式 text.txt文件写入 lll aaa hhh wywywywywywy 读取文件方式&#xff1a;open&#xff08;“文件名”&#xff0c;读取方式&#xff0c;编码方式&#xff09; # ("读取文件名字"&#xff0c;读取方式&#xff0…

什么是标准差?详解

文章目录 一、什么是标准差&#xff1f;二、公式三、举个例子&#x1f330;参考 一、什么是标准差&#xff1f; 在统计学中&#xff0c;标准差&#xff08;Standard Deviation&#xff09;是用于衡量变量值围绕其平均值变化程度的指标。低标准差表示这些值通常接近平均值&…

Rust 力扣 - 643. 子数组最大平均数 I

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的最大和即可&#xff0c;遍历过程中刷新最大值 结果为窗口长度为k的最大和 除以 k 题解代码 impl Solution {pub fn find_max_average(nums: Vec<…

Qt以Json(JsonArray)格式向数据库添加图片数据(十六进制)及回显(序列化及反序列化)(解决方案)

这是一篇关于讲解"Qt以Json(JsonArray)格式向数据库添加图片数据(十六进制)及回显"的解决方案。 原因 在进行编程时&#xff0c;想将本地图片资源以Json格式保存到数据库&#xff0c;这样在不同的终端&#xff0c;都可以使用该数据库读取图片。 实现之前&#xff0c…