String s=new String("abc")共生成几个对象?

来源:互联网 发布:影楼修片用什么软件 编辑:程序博客网 时间:2024/06/06 12:44

非原创作品

如题;

回答:

生成了两个对象。

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");}


反编译类文件 : javap -c StringObject

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