java对象与引用及参数传递
对象
对象(object)是类(class)的实例(instace)。对象一般存储在堆中。
引用
引用(reference)是对象(object)的标识符。引用存放的是该对象的地址,存放在栈中。
代码
User user = new User( );
这条语句的动作称为创建一个对象,它包含了四个动作:
右边的new People,是以Pelple类为模板,在堆空间中创建一个People类对象
结尾的(),在对象创建后,立刻调用People类的构造函数,对刚生成的对象初始化。这个例子中包含了构造函数,如果没写,java会自动帮你补上。
左侧的People one创建了一个People类的引用变量。即one是指向People对象的引用。
“=”操作符使对象引用指向刚创建的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 = 9test2:
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 worldtest3:
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