zoukankan      html  css  js  c++  java
  • 由方法体内修改实参能否在方法外面保留修改效果说开去(修正)

    package 一般情况;
    /**
     * 我的总结:方法外面的变量名传到方法里时,都会在栈空间里创建一个copy;方法结束后就销毁该copy。
     * @@1因为基本类型变量名都是储存在栈区的,变量名就代表变量的内容,
     *			所以修改方法里的变量copy并没有影响到方法外面的变量!
     * @@2因为对象变量名是储存在栈区的,而对象实体却储存在堆,变量名指向该堆内存,
     *			方法里的变量名copy同样指向了该堆内存,因此通过这个copy也可以修改那个堆内存!
     *			最后的结果是在方法里修改了变量名copy的内容在方法外面也会看到这个变化!
     * @@3这种形式把方法里的对象变量名copy的指向改变了,
     *			也就是说不是指向了方法外面的对象变量名所指向的堆内存了,
     *			所以修改此copy根本不会影响到原来的对象!
     * 
     * 由此可见,Java没有引用传递是真的!说引用传递那是对栈、堆的不了解造成的~
     * 例如后面的String的改变没有保留,如果用对象传递是引用传递理解肯定说不通!
     * 其实"2333333333333"这个字符串常量是在编译时就放在string池里的,s="2333333333333",
     * 即s在方法里的copy指向了string池里面的内容,不再是之前的堆了,所以不会影响到原来的堆内容!
     * 
     * 拓展:String s=new String("我去年买了个表");创建了几个对象?答案是两个!一个是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=new String("我去年买了个表");
    		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";
    	}
    }


  • 相关阅读:
    Java对象的生命周期与作用域的讨论(转)
    [置顶] Oracle学习路线与方法
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3508755.html
Copyright © 2011-2022 走看看