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";
    	}
    }


  • 相关阅读:
    leetcode hot 100- 84. 柱状图中最大的矩形
    leetcode hot 100- 221. 最大正方形
    leetcode hot 100-34. 在排序数组中查找元素的第一个和最后一个位置
    leetcode hot 100-剑指 Offer 37. 序列化二叉树
    leetcode hot 100-2. 两数相加
    leetcode hot 100-33. 搜索旋转排序数组
    leetcode hot 100- 98. 验证二叉搜索树
    leetcode hot 100-152. 乘积最大子数组
    leetcode hot 100-19. 删除链表的倒数第N个节点
    v-modal的使用。
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3508755.html
Copyright © 2011-2022 走看看