String name=“zhangsan”,这里只创建了一个对象,存放在内存中的堆里面。具体说来,首先"zhangsan“是一个字符串常量,放在内存的数据段(data segment)中 然后把它的内容传给引用类型中的变量name,而这里的name在栈内存中。
String name=new String("zhangsan"),这里创建了两个对象。一个是“zhangsan”这个字符串,另一个是通过new新建的String对象。具体说来,首先在栈内存中有一个变量name它是指向堆内存中的一个String对象的一个引用,而堆内存中的String对象是使用new方法创建的,其创建过程是调用String的一个构造方法,这里的构造方法需要的参数是一个字符串常量(即“zhangsan”),所以在栈内存中再开辟一块空间来放置这个方法的参数字符串引用,它的引用指向data segment中的字符串常量,然后在构造方法内部使用这个引用,从而在对内存中构造一个新的字符串,构造方法结束,栈内存中的构造方法用到的参数和局部变量消失。
StringBuffer构造对象的方法和String基本相同,只是StringBuffer的内容可以变,可String的内容不可变。
总体来说String name=“zhangsan”指向的是data segment中的字符串常量引用(地址)。后面两个指向的是堆内存中的对象的引用(地址),他们对象的创建过程就是构造方法的执行过程。同一般方法执行过程中的内存调用一样。 |