对象的引用与引用传递

今天偶然间读了大神的博客,本来以为自己是个黄金,结果连个青铜都不是。步入正题:

一.对象与引用的关系

		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指的是同一个对象
    }
}

参考:http://zwmf.iteye.com/blog/1738574

原创文章 42 获赞 32 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39671159/article/details/83515013