java值传递与引用传递

1、按值传递是什么

传递的是值的拷贝,也就是说传递后就互不相关了(基本数据类型和String都是这样)。

public class Test {
    private void test(int a){
            a = 5;
            System.out.println("test方法中的a==="+a);
}
    public static void main(String[] args) {
            TempTest t = new TempTest();
            int a = 3;
            t.test(a);//传递后,test方法对变量值的改变不影响这里的a
            System.out.println(”main方法中的a===”+a);
        }
}
运行结果是:test方法中的a===5   main方法中的a===3

2、按引用传递是什么

在方法调用时,传递前和传递后都指向同一个引用(也就是同一个内存空间)。

public class TempTest {

private void test1(A a){
        a.age = 20;
        System.out.println("test1方法中的age="+a.age);
}
public static void main(String[] args) {
                TempTest t = new TempTest();
                A a = new A();
                a.age=10;
                t.test1(a); //这里传递的参数a就是按引用传递
                System.out.println(”main方法中的age=”+a.age);
        }
}
class A{
            public int age = 0;
}
运行结果如下:test1方法中的age=20     main方法中的age=20

3、解释

值传递:针对基本类型
  方法调用时,实际参数把它的传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
  String表现为值传递,主要是因为String是不可变的!如何理解不可变?我们一般说的改变一个String变量,其实并不是改变的这个String本身,而是用一个新的String去替换掉原来的,原来的String本身并没有变。

String str1 = "old";
str1 = "new";//不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。  
  //对String对象的任何改变都不影响到原对象,相关的任何操作都会生成新的对象

引用传递:
  方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。

原文地址:https://www.cnblogs.com/qingchen521/p/8575770.html