值传递和引用传递
这两个词是java很核心的概念。 很多新手一直不理解值传递和引用传递,老是被这两个概念绕晕。
首先最重要的哪些是值传递: 常见的基本数据类型 比如 byte short int double。。。。
哪些是引用传递:除基本类型之外的绝大部分 引用类型 比如方法 对象 接口 数组
先来看2个例子:
public class ReferencingDatatype {
public static void main(String[] args) {
int a =10;
addMethod(a);
System.out.println(a);
Student student = new Student();
student.setRanking(10);
addMethod3(student);
System.out.println(student.getRanking());
}
private static void addMethod3(Student student) {
student.setRanking(20);
}
private static void addMethod(int a) {
a=20;
}
}
对于第一个变量 a ,我们在方法里面 给他变一下 变成20
但是打印出来发现 a 依然是 10!
这是为什么 因为值传递 传递的是该值的副本, 在java的内存模型 中 方法的执行 是栈在控制,
每个方法将要被执行的是 就准备入栈 执行完之后就会出栈。
上面的代码中 main主方法先入栈 接着开始执行addMethod方法 于是这个方法入栈 这时候它的参数中有a 变量a就把他的值的副本传给方法 意味着 复制了一个10 给方法 这个10 和原来的a 就没有什么关系了。
然后再看第二个 Student 类创建出一个对象 student :属性ranking 是10
在方法中给他的属性ranking 变一下 变为20 打印出来发现 student.getRanking() 是20 发现已经改变了
这就是引用传递, 在java的内存模型中 对象是创建在堆上面, 堆是一块内存区域,他的引用的值是堆上的内存地址 打个比方 比如0001
所以我们把引用student 传给方法时 方法根据这个0001地址 去找到堆上的 student对象,
他做了改变 堆上的对象的值也就改了