在我们学习Java的过程中有着许多的小知识点特别容易出bug,你知道吗?下面我就给大家科普下2个学习Java容易忽视的问题
1、值传递与引用传递
值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
结果输出:a = 20;b = 10;num1 = 10;num2 = 20
而引用传递传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到实际的对象上。(因为引用传递的时候,实际上是将实参的地址值复制一份给形参。)
public static void main(String[] args) {
int[ ] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[0]);
}
public static void change(int[] array) {
//将数组的第一个元素变为0
array[0] = 0;
}
//结果输出:0
而还有一个特殊的列子StringBuffer类型传递
public void method() {
StringBuffer str = new StringBuffer("1234");
System.out.println(str);
change(str);
System.out.println(str);
}
public static void change(StringBuffer str) {
str = new StringBuffer("abc");
//str.append("欢迎大家关注");//输出:1234欢迎大家关注
//str.insert(3, "(编程)");//输出:123(编程)4
}
结果:1234;1234。分析:因为在 change方法内部我们是新建了一个StringBuffer对象,所以 str指向了另外一个地址,相应的操作也同样是指向另外的地址的。如
public class Demo {
public static void main(String[] args) {
Person p = new Person("张三");
change(p);
System.out.println(p.name);
}
public static void change(Person p) {
Person person = new Person("李四");
p = person;
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
最后输出:张三;这是因为change方法中重新创建了一个 Person对象。这些都是很容易出bug的小知识,你Get到了吗?如果学习Java过程中有什么问题可以评论留言,我看到都会回复哦!