对象引用之String

来源:互联网 发布:mysql主键从1开始 编辑:程序博客网 时间:2024/06/09 22:41

学JAVA基础知识过程中,“对象的引用”是以前学c没有注意的地方。我认为首先需要搞懂两个概念:创建对象*和声明对象引用*。理解基本数据类型变量的创建很简单:int a=const;其分配内存的过程:变量a,系统在栈区为a分配一个地址空间,该空间中存放a的值。声明int a;(如果a之前未被分配空间,也可以说是定义)并未给a赋值,系统也会把空间分配给a,只是该空间里的值是不确定的。结论:a变量的声明与创建是同步的,声明即创建。
JAVA中对象的创建:Person p=new Person();首先提一个小知识点:java中用new方法来创建的对象,都是在堆而不是在栈创建。这里的p并不是所谓的对象,只是对真正对象的引用,Person p;是声明Person类的引用,p=new Person();才是真正的创建对象的过程
以String类来验证:
(这里的”==”比较的是两个对象的内存地址是否相同)

String a=new String("abc");String b=new String("abc");String c=a;System.out.println("a==b"+a==b);System.out.println("a==c"+a==c);

结果:

a==bfalse
a==cfalse

对于结果是不是有些惊讶,部分惊讶的人是正确的,因为结果是错误的,正确的说是过程出现错误。不瞒大家,我也是在写博客才发现这个问题的,之前是看了书上的示例,再在Eclipse上验证了一遍,发现结果与书上相同就结束了,自认为已经get到这个知识点。刚刚纯属是本着严谨的态度把代码又运行了一遍发现结果出现了问题。问题就是:没有注意到运算符优先级问题。
正确代码:

String a=new String("abc");String b=new String("abc");String c=a;System.out.println("a==b"+(a==b));System.out.println("a==c"+(a==c));

结果:

a==bfalse
a==ctrue

解释:a,b虽然值相同,但二者都是用new创建的,所以必然是a,b各自指向不同的对象地址,比较结果为false。而c所指向的对象地址是直接由a赋值的地址,两者地址比较自然是相同的。
不过String类还有其特殊性,那就是String a=”abc”;与String a=new String(“abc”);两种构造方法的区别。
String a= “abc”; 先在内存中找是不是有”abc” 这个字符串常量的对象,如果有,就让a指向那个”abc”.如果内存里没有”abc”,就创建一个新的对象保存”abc”.此时“abc”这个对象是在栈中存储,是一个共享的对象。a指向这个地址,b也指向这个地址。所以a,b地址相同。
String a=new String (“abc”) 就是不管内存里是不是已经有”abc”这个对象,都会创建一个新的对象。

String a="abc";String b="abc";String c=new String("abc");System.out.println("a==b"+(a==b));System.out.println("a==c"+(a==c));

结果:

a==btrue
a==cfalse

原创粉丝点击