这道题想考察什么?
是否了解什么是值传递和引用传递与真实场景使用,是否熟悉什么是值传递和引用传递在工作中的表现是什么?
考察的知识点
什么是值传递和引用传递的概念,两者对开发中编写的代码的影响
考生应该如何回答
值传递:在方法调用时,传递的参数是这个参数指向值的拷贝;
引用传递:在方法调用时,传递引用的地址
在Java中对于参数的传递可以分为两种情况:
1.基本数据类型的参数
1 public class TransferTest {
2 public static void main(String[] args) {
3 int num = 1;
4 System.out.println("changeNum()方法调用之前:num = " + num);
5 changeNum(num);
6 System.out.println("changeNum()方法调用之后:num = " + num);
7 }
8
9 public static void changeNum(int x) {
10 x = 2;
11 }
12 }
运行结果:
传递过程的示意图如下:
分析:num作为参数传递给changeNum()方法时,是将内存空间中num所指向的那个存储单元中存放的值1复制了一份传递给了changeNum()方法中的x变量,而这个x变量也在内存空间中分配的一个存储单元。这时就把num对的值1传递给了x变量所指向的存储单元中。此后在changeNum()方法中对x变量的一切操作都是针对于x所指向的这个存储单元,与num所指向的存储单元无关。
所以,在changeNum()方法被调用后,num所指向的存储单元的值还是没有发生变化,这就是所谓的“值传递”。
值传递的精髓是:传递的是存储单元中的内容,而不是存储单元的引用。
2.引用类型的参数
1 public class TransferTest2 {
2 public static void main(String[] args) {
3 Person person = new Person();
4 System.out.println(person);
5 change(person);
6 System.out.println(person);
7 }
8
9 public static void change(Person p) {
10 p = new Person();
11 }
12 }
13
14 /**
15 * Person类
16 */
17 class Person {
18
19 }
运行结果:
可以看出两次打印结果一致。即调用change()方法后,person变量并没发生改变。
传递过程的示意图如下:
分析:
01.当程序执行到第3行 Person person = new Person()时,程序在堆内存(heap)中开辟了一块内存空间用来存储Person类实例对象,同时在栈内存(stack)中开辟了一个存储单元来存储该实例对象的引用,即上图中person指向的存储单元。
02.当程序执行到第5行 change(person)时,person作为参数(实参)传递给了change()方法。这里是person将自己的存储单元的内容传递给了change()方法的p变量。 此后在change()方法中对p变量的一切操作都是针对于p变量所指向的存储单元,与perosn所指向的存储单元就没有关系了。
因此Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递!
今天面试题分享到此结束,下期更精彩~
这里还整理收纳了更多面试题和Android最新版学习资源