String a;这里创建的只是引用,并不是对象
String a='asdf';初始化,但没有创建对象
String a=new String("asdf");创建对象,引用a,常量adf
例1
package javastatic;
public class EveryIsObject {
private static final String MESSAGE = "taobao";
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = new String("taobao"); // 创建一个对象welcome,给利用单词welcome初始化
String str2 = new String("taobao"); // 创建一个对象welcome,给利用单词welcome初始化
String str3 = str1; // 创建一个对象,并利用对象str1的内存地址赋值
System.out.println(str1 == str2);
System.out.println(str1 == str3);
//str1,str2表示的是两个对象welcome的两个引用,它们在栈中的地址肯定不一样。
String a = "tao" + "bao";
String b = "tao";
String c = "bao";
String d="taobao";
System.out.println(a == MESSAGE);
System.out.println((b + c) == MESSAGE);
System.out.println(d==MESSAGE);
System.out.println(str1==d);
}
}
结果:
false str1和str2是两个不同的引用,它们地址不同true
true 内存地址的赋值形式
false 不同的引用
true 代表的地址相同
false
内存分为四个部分:heap(堆)\stack(栈)\code segment\data segmet\ 其中堆中存放的是NEW 出来的对象 而栈中存放的是局部变量 而静态变量和字符串常量放在data segment中 剩下的就是代码了 ,存放在CODE SEGMENT中
存储地方:
堆栈:位于RAM随机访问存储器中,创建并非是引用的“自动变量”,如int i=2;
堆:一种通用的内存池,位于RAM区,用于存放所有的Java对象
常量存储:常量值通常直接存放在程序代码内部。如“taobao”
例2
String string1 = "i love you"; String string2 = "i love you"; //输出 true System.out.println(string1 == string2); String string3 = new String("i love you"); String string4 = new String("i love you"); //输出 false System.out.println(string3 == string4);
分析:
String string1 = "i love you";
String string2 = "i love you";
在栈中分配两个空间,
其名为string1和string2
其值为两个相同的同时指向"i love you"的地址,"i love you"存放在data segment中只有一个。
String string3 = new String("i love you");
String string4 = new String("i love you");
在栈中分配两个空间,
其名为string3和string4
string3指向堆中为new String("i love you");(对象一)
新分配的空间,其值为指向这里的地址
string4指向堆中为new String("i love you")(对象二)
分配的空间;这是另一片空间,其值为指向这里的地址。