今天偶然间读了大神的博客,本来以为自己是个黄金,结果连个青铜都不是。步入正题:
一.对象与引用的关系
Demo d1 = new Demo();
Demo d1; //d1为null
d1 = new Demo(); //d1指向创建的Demo对象
(1)d1 :对象的引用,其实存放的是对象的地址,用于指向创建的对象。
(2)new Demo : 以Demo类为模板创建Demo对象。
(3)() : 对象创建后,立即调用Demo类的构造方法,对对象进行初始化。
(4)= : 使对象引用指向创建的Demo对象。
Demo d2 = new Demo();
d2 = d1;
-
为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳, 可以用来系汽球。
-
对象本身没有被复制,d2也指向了d1所指的对象,即指向了同一个对象。(两根绳子系同一个气球)
-
第一个创建的对象已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。
结论:
- 一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球)
- 一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)
二.没有引用的对象
①
②字符串对象
System.out.println(“I am Java!”);
字符串对象,打印完即被丢弃,所以也叫临时对象。
三.String 与 StringBuffer
①
StringBuffer s;
s = new StringBuffer("aa");
StringBuffer s1 = s;
s1.append(" 222");
System.out.println("s1=" + s1.toString()); //s1=aa 222
System.out.println("s=" + s.toString()); //s=aa 222
s1与s指的是同一个对象,所以输出相同。
②
String s = "aa";
String s1 = s;
s1 = s1 + " 222";
System.out.println("s1=" + s1.toString()); //s1=aa 222
System.out.println("s=" + s.toString()); //s=aa
由于String类的不可变性(public final class String),所以s1是一个新的对象(开辟了新的空间)
四.引用传递
①
public static void add(StringBuffer s) {
s.append("_add");
}
public static void change(StringBuffer s) {
s = new StringBuffer("Java");
//s本来和s1指的对象相同,但是对象换了,相当于气球线断了
//气球线断了就和s1指的对象没有一点关系了
}
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("init");
System.out.println("s1=" + s1.toString()); //s1=init
add(s1); //s与s1指的是同一个对象
System.out.println("s1=" + s1.toString()); //s1=init_add
change(s1); //s与s1指的不是同一个对象
System.out.println("sMain=" + s1.toString()); //s1=init_add
}
②
public class Test {
public int i,j;
public void test_m(Test a){
Test b = new Test();
b.i = 1;
b.j = 2;
a = b;
}
public void test_m1(Test a){
a.i = 1;
a.j = 2;
}
public static void main(String []args){
Test t = new Test();
t.i = 5;
t.j = 6;
System.out.println( "t.i = " + t.i + "t.j = "+ t.j); //t.i = 5t.j = 6
t.test_m(t);
System.out.println( "t.i = " + t.i + "t.j = "+ t.j); //t.i = 5t.j = 6
//对象已经变了,同上题一样,气球线断了
t.test_m1(t);
System.out.println( "t.i = " + t.i + "t.j = "+ t.j); //t.i = 1t.j = 2
//传的是t的引用,也就是地址,t与a指的是同一个对象
}
}