面试题答案
一键面试值传递概念
在Java中,值传递意味着方法接收的是调用者提供的实际参数值的副本。对于基本数据类型,传递的是该数据的值本身。例如,在方法调用时,将一个int
类型变量的值复制一份传递给方法。这意味着在方法内部对该参数的修改不会影响到调用者代码中的原始变量。
引用传递概念
Java中严格来说只有值传递,但对于对象类型参数,传递的是对象引用的副本。当把一个对象作为参数传递给方法时,实际上传递的是该对象在内存中的地址的副本。通过这个副本,方法可以访问和修改对象的属性,但不能改变调用者代码中引用所指向的对象(除非重新赋值)。
传递简单数据类型示例
public class ValuePassingExample {
public static void main(String[] args) {
int num = 10;
System.out.println("Before method call: num = " + num);
changeValue(num);
System.out.println("After method call: num = " + num);
}
public static void changeValue(int number) {
number = 20;
}
}
在上述代码中,main
方法里定义了一个int
类型变量num
并赋值为10。调用changeValue
方法时,传递num
的值的副本。在changeValue
方法内部修改number
的值为20,但是这并不会影响到main
方法中num
的原始值,输出结果为:
Before method call: num = 10
After method call: num = 10
传递对象类型示例
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
public class ReferencePassingExample {
public static void main(String[] args) {
Person person = new Person("Alice");
System.out.println("Before method call: person.name = " + person.name);
changeName(person);
System.out.println("After method call: person.name = " + person.name);
}
public static void changeName(Person p) {
p.name = "Bob";
}
}
在这个例子中,main
方法创建了一个Person
对象并初始化其name
为"Alice"。调用changeName
方法时,传递person
对象引用的副本。在changeName
方法内部通过这个引用副本修改Person
对象的name
属性为"Bob",由于引用副本指向同一个对象,所以main
方法中person
对象的name
属性也被改变了,输出结果为:
Before method call: person.name = Alice
After method call: person.name = Bob
如果尝试在changeName
方法中重新赋值引用,如p = new Person("Charlie");
,这只会改变方法内部的引用副本所指向的对象,而不会影响main
方法中person
引用所指向的对象。