由方法体内修改实参能否在方法外面保留修改效果说开去

2014-11-24 03:31:46 · 作者: · 浏览: 0
package 一般情况;
/**
 * 我的总结:传到方法里的实参,都会在栈空间里创建一个copy;方法结束后就销毁该copy。
 * @@1因为基本类型都是储存在栈区的,所以修改方法里的实参copy并没有影响到原来的基本类型实参!
 * @@2因为对象变量名是储存在栈区的,而实体却储存在堆,
 * 		    因此即使对变量名的copy里的内容修改也会影响到堆里的内容!
 * @@3这种形式把对象变量名的指向改变了,也就是说不是指向了原来的堆内存了,
 * 		    所以修改此copy根本不会影响到原来的对象!
 * 
 * 由此可见,Java没有引用传递是真的!那是对栈、堆的不了解造成的~
 * 例如后面的String的改变没有保留,如果用什么对象传递是引用传递理解肯定说不通!
 * 其实"2333333333333"这个字符串常量是在编译时就放在string池里的,s="2333333333333",
 * 即s在方法里的copy指向了string池里面的内容,不再是之前的堆了,所以不会影响到原来的堆内容!
 * 
 * 拓展:String s="我去年买了个表";创建了几个对象?答案是两个!一个是string池里的对象,
 * 一个是堆中的对象(把string池中的"我去年买了个表"内容复制到堆,并把堆内存地址赋给s)。
 * 
 * 唉,笔试做错了,坑爹啊......
 * @author 炜sama
 *
 */
public class 由方法体内修改实参能否在方法外面保留修改效果说开去 {

	public static void main(String[] args) {
		int i=10;
		Test t=new Test(1);
		t.changeANum(i);
		System.out.println(i);
		System.out.println(t.getI());
		t.changeTestI(t);
		System.out.println(t.getI());
		t.changeTest(t);
		System.out.println(t.getI());
		String s="我去年买了个表";
		t.changes(s);
		System.out.println(s);//还是不变!
	}

}

class Test{
	private int i;
	public Test(int i) {
		this.i=i;
	}
	public int getI() {
		return i;
	}
	public void setI(int i) {
		this.i = i;
	}
	public void changeANum(int i) {//@@1
		i=99;
	}
	
	public void changeTestI(Test t) {//@@2
		t.i=2;//t不是main中的t!但是指向与main中t相同的堆空间,因此把那个空间里的i改变了!
	}
	public void changeTest(Test t) {//@@3
		t=new Test(100);//这个改变不能保留!!!
	}
	public void changes(String s) {//@@3
		s="2333333333333";
	}
}