非原创作品
如题;
回答:
生成了两个对象。
2个字符串对象,全部在堆中,只是创建时间不同。
一个叫inner String对象——对应于常量池中的字符串字面值,这个对象在第一次常量池解析的时候就已经创建,至于常量池解析在什么时候发生,不同的虚拟机实现不同,有的在类静态变量初始化之前,有的在执行方法指令时同时边解析边执行。常量池解析之后会存储指向这个堆中对象的引用
一个是new指令创建的String对象。在执行new指令的时候在堆中创建的。
String a="abc"; //创建了一个对象
String a="ab"+"cd"; //创建了三个对象
"ab"和"cd"分别创建了一个对象,它们经过“+”连接后又创建了一个对象"abcd",因此一共三个,并且它们都被保存在字符串池里了。
栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。
堆(heap):用于存储对象。
测试:
public class StringObject {
String str = new String("abc");
}
Compiled from "StringObject.java"
public class com.unison.test.StringObject extends java.lang.Object{
java.lang.String str;
public com.unison.test.StringObject();
Code:
0: aload_0
1: invokespecial #10; //Method java/lang/Object."<init>":()V
4: aload_0
5: new #12; //class java/lang/String
8: dup
9: ldc #14; //String abc
11: invokespecial #16; //Method java/lang/String."<init>":(Ljava/lang/String;)V
14: putfield #19; //Field str:Ljava/lang/String;
17: return
}
附录
反汇编器-javap
javap命令反汇编一个java字节代码文件, 返回有关可变部分和成员函数的信息,其命令行如下:
C:\>javap options classname additionalClasses
javap的标准输出是公有变量和类的成员函数。javap反汇编器的命令行选项如下表:
选项 | 功能 |
-h | 此选项将建立能够放入C头文件中的信息 |
-p | 此选项将使javap输出私有和公有的成员函数和变量 |
-c | 此选项将使javap为各成员函数输出实际已编译过的字节代码 |
-classpath path | 此选项将使得javap在路径path中寻找Java类 |
-v | 输出所有的信息 |
-verify | 运行校验器以验证并显示出调试信息 |
-version | 输出javap的版本信息 |
此段文字摘自:http://www.it315.org/articles/Java/java4.htm