当前位置 博文首页 > 疯狂的猫:java中只有值传递,没有引用传递

    疯狂的猫:java中只有值传递,没有引用传递

    作者:[db:作者] 时间:2021-07-19 22:40

    看到很多网站上(包括一些知名的培训网站)都说java有引用传递,其实这是不正确的,java中只有值传递,没有引用传递。我来分析一下吧,值传递很容易理解,举个简单的例子:

    public static void main(String[] args) {
    		
    	int a = 2;
    	calculate(a);
    	System.out.println(a);
    	
    }
    
    public static void calculate(int param) {
    	param = 3;
    }
    输出结果是2,a的值根本就没有改变,因为把a值传递给函数calculate传递的只是 对所传递参数a进行一次副本拷贝param,对参数a的修改只是对副本param的修改,函数调用结束,副本丢弃,原来的变量a不变 ( 即实参不变 )。

    那为什么很多网站上会说有引用传递呢?他们给出了很强的例证:

    class Ref1{
    	int temp = 10;
    	
    }
    
    public class RefDemo01 {
    	public static void main(String args[]){
    		Ref1 r1 =new Ref1();
    		r1.temp = 20;
    		System.out.println(r1.temp);
    		tell(r1);
    		System.out.println(r1.temp);
    	}
    	public static void tell(Ref1 r2){
    		r2.temp = 30;
    	}
    
    }
    输出的结果是20,30,难道这就是引用传递吗,因为值改变了嘛!其实不是这样子的,这里只是把r1的指向改变了而已,本来r1指向堆中的值是20,现在只是将r1在堆中指向了内容为30的堆,而r1本身是没有变化的,不信?来看下这个例子吧:

    class Ref1{
    	int temp = 10;
    	
    }
    
    public class RefDemo01 {
    	public static void main(String args[]){
    		Ref1 r1 =new Ref1();
    		Ref1 r2 =new Ref2();
    		r1.temp = 20;
    		r2.temp = 30;
    		System.out.println(r1.temp);
    		System.out.println(r2.temp);
    		tell(r1,r2);
    		System.out.println(r1.temp);
    		System.out.println(r2.temp);
    	}
    	public static void tell(Ref1 r1,Ref1 r2){
    		Ref1 temp;
    		temp = r1;
    		r1 = r2;
    		r2 = temp;
    	}
    
    }
    
    输出的结果是20,30;20,30,和上面的例子差不错,唯一不同的是函数功能修改成了将r2赋值给r1,但是可以看出r1的值根本就没有发生改变,原因很简单,参数传递属于值传递,而不是引用传递。java中根本就没有引用传递!



    cs
    下一篇:没有了