我们先明确两个概念。
按值传递(Pass-by-value):指在方法调用中,传递的是参数值的拷贝(Pass-by-copy)
按引用传递(Pass-by-reference):指在方法调用中,传递是变量的地址。
在Java中,所有的对象引用都是按值传递的,但这是否意味着对象的实值就不会发生改变了呢?并不。我们可以传递对象的地址,通过地址修改对象的属性。
我们从一个比较综合的例子开始
public class DragonWarriorReferenceChallenger {
public static void main(String... doYourBest) {
StringBuilder warriorProfession = new StringBuilder("Dragon ");
String warriorWeapon = "Sword ";
changeWarriorClass(warriorProfession, warriorWeapon);
System.out.println("Warrior=" + warriorProfession + " Weapon=" + warriorWeapon);
}
static void changeWarriorClass(StringBuilder warriorProfession, String weapon) {
warriorProfession.append("Knight");
weapon = "Dragon " + weapon;
weapon = null; //weapon 和 warriorProfession 都是本地变量
warriorProfession = null;
}
}
请选择您输出的结果
A: Warrior=null Weapon=null
B: Warrior=Dragon Weapon=Dragon
C: Warrior=Dragon Knight Weapon=Dragon Sword
D: Warrior=Dragon Knight Weapon=Sword
正确答案:D
分析:String是不可变对象,而StringBuilder是可变对象
What to remember about object references
- Java always passes parameter variables by value.
- Object variables in Java always point to the real object in the memory heap.
- A mutable object’s (比如自己创建的类的对象,StringBulider)value can be changed when it is passed to a method.
- An immutable object’s (比如String)value cannot be changed, even if it is passed a new value.