- 在对对象赋值的时候,当对一个对象进行操作的时候,真正操作的是对对象的引用。当把一个对象赋值给另外一个对象的时候,实际上是将引用从一个地方复制到另外一个地方。
package com.martind;
class Tank{
int level;
}
public class CreateFile {
public static void main(String[] args) {
Tank t1 = new Tank();
Tank t2 = new Tank();
t1.level = 12;
t2.level = 45;
System.out.println(t1.level + " " + t2.level);
t1 = t2;
System.out.println(t1.level + " " + t2.level);
t1.level = 234;
System.out.println(t1.level + " " + t2.level);
}
}
这个称为别名现象,当对t1进行赋值的时候,t1原来的包含对对象的引用的对象,将会指向t2对象,t1的原来的引用会丢失,然后这个不再被引用的对象会被“垃圾回收器”自动清理。
为了避免这个现象可以t1.level = t2.level,这样可以保持两个对象的彼此独立。
可以使用equals()方法来比较两个对象的实际内容,但是这个方法并不适合基本类型的比较,基本类型直接使用==和!=比较即可
package com.martind;
class Value{
int i;
}
public class learnJava {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2)); //false
}
}
遇到一个问题:java在创建对象的时候会把对象放到堆中,把变量的引用放到栈区,把一些程序中的常量放到常量池,当
new一个对象的时候会把这个对象放到堆中,然后可以调用intern()方法,如果常量池中有这个值,会返回指向这个常量的引用,如果常量区没有这个值,就会直接把这个值的指向堆区的引用引用放到常量池(这里要注意jdk1.6和jdk1.7以后的方法是不同的,1.6中常量池是独立于堆之外的,调用intern()方法是直接把这个值的副本拷贝过去,返回的是这个值而不是值的引用;而1.7之后的常量池是放在堆之中的),然后下面这个代码的两个返回值却是不同的,解释通一个另外一个却又相矛盾了……
package com.martind;
public class learnJava {
public static void main(String[] args) {
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s==s2);//false
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);//true
}
}

被折叠的 条评论
为什么被折叠?



