java对象与引用及参数传递

对象

对象(object)是类(class)的实例(instace)。对象一般存储在堆中。

引用

引用(reference)是对象(object)的标识符。引用存放的是该对象的地址,存放在栈中。

代码

User user = new User( );
这条语句的动作称为创建一个对象,它包含了四个动作:
  1. 右边的new People,是以Pelple类为模板,在堆空间中创建一个People类对象
  2. 结尾的(),在对象创建后,立刻调用People类的构造函数,对刚生成的对象初始化。这个例子中包含了构造函数,如果没写,java会自动帮你补上。
  3. 左侧的People one创建了一个People类的引用变量。即one是指向People对象的引用。
  4. “=”操作符使对象引用指向刚创建的People对象。注意是指向,不是赋值。
User user1 = new User( );
User user2 = new User( );
user1 = user2;
最后引用user1、user2都指向一个User对象。也就是说一个对象可以有多个引用,但一个引用最多指向一个对象。
代码中有一个User对象由于引用消失,所以该对象会交由垃圾处理器处理(可能垃圾回收器现在不收回该对象空间)。

参数传递

《thinking in Java》:When you’re passing primitives into a method,you get a distinct copy of the primitive. When you’re passing a reference into a method, you get a copy of the reference.

传递的是参数的副本 基本类型传递的是值的副本、对象传递的是引用的副本。

代码

test1:

public class TestPass1 {
    public static void testPass(int t){
        t = 2;
    }
    public static void main(String[] args){
        int t = 9;
        System.out.println("Before testPass: t = " + t);
        testPass(t);
        System.out.println("After testPass: t = " + t);
    }
}
out:
Before testPass: t = 9
After testPass: t = 9

test2:

public class TestPass2 {
    public static void testPass(StringBuffer strBuf){
        strBuf.append(" world");
    }
    public static void main(String[] args){
        StringBuffer strBuf = new StringBuffer("hello");
        System.out.println("Before testPass: strBuf " + strBuf);
        testPass(strBuf);
        System.out.println("After testPass: strBuf " + strBuf);
    }
}
out:
Before testPass: strBuf hello
After testPass: strBuf hello world

test3:

public class TestPass3 {
    public static void testPass(StringBuffer strBuf){
        strBuf = new StringBuffer(" world");
    }
    public static void main(String[] args){
        StringBuffer strBuf = new StringBuffer("hello");
        System.out.println("Before testPass: strBuf " + strBuf);
        testPass(strBuf);
        System.out.println("After testPass: strBuf " + strBuf);
    }
}
out:
Before testPass: strBuf hello
After testPass: strBuf hello

refence:

http://alexyyek.github.io/2014/12/29/Reference/

http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html