基本类型参数绑定与引用类型参数绑定的区别

mac2024-01-26  26

对于这个知识点懵了挺久的。今天经高人指点明白了很多。 下面直接用例题来解释。

public class Main { public static void main(String[] args) { Person p = new Person(); int n = 15; // n的值为15 p.setAge(n); // 传入n的值 System.out.println(p.getAge()); // 15 n = 20; // n的值改为20 System.out.println(p.getAge()); // 15还是20? } } class Person { private int age; public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } }

15 15 结果输出是两个15。 对于传入的n是用户定义的一个常量15。在p.setAge(n)的时候相当于是把常量n=15传入了方法中。 在第二次输出p.getAge(n)的时候并为改变n的值也没有重新传入新的值进入。所以还是输出15。 结论:基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响。

public class Main { public static void main(String[] args) { Person p = new Person(); String[] fullname = new String[] { "Homer", "Simpson" }; p.setName(fullname); // 传入fullname数组 System.out.println(p.getName()); // "Homer Simpson" fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart" System.out.println(p.getName()); // "Homer Simpson"还是"Bart Simpson"? } } class Person { private String[] name; public String getName() { return this.name[0] + " " + this.name[1]; } public void setName(String[] name) { this.name = name; } }

Homer Simpson Bart Simpson fullname是类中new的对象,在p.setName(fullname)的时候对象fullname传入到了方法setName中。所以p.getName(fullname)会随着fullname的改变而改变。 结论:引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。

有了上面的结论,我们再看一个例子:

public class Main { public static void main(String[] args) { Person p = new Person(); String bob = "Bob"; p.setName(bob); // 传入bob变量 System.out.println(p.getName()); // "Bob" bob = "Alice"; // bob改名为Alice System.out.println(p.getName()); // "Bob"还是"Alice"? } } class Person { private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } }

Bob Bob 从这个例子就可以解释了。bob只是一个常量而不是对象。p.getName()并不会随着bob常量的改变而改变。

转载了廖雪峰老师的例子。加上了自己的分析解释。

最新回复(0)