基本类型参数的传递,是值的复制
基本类型参数的传递,是值的复制。双方各在内存中保存一份,各自的后续修改,互不影响。
例如:
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
所以外面的n从15变到了20,但是Person里面的age并没有改变。
数组类型参数的传递,是引用的复制
字符串数组在参数传递时,考虑到字符串数组占用内存空间非常大,所以传递的是一个引用,此时调用函数的变量,被调函数的变量,和被调函数内部的变量,都是指向内存中的同一个位置的。
任意一方的修改,都会指向这个引用区域的修改。
举例说明:
//注意这里的Main是基本类型,后面是不可以写括号的
public class Main{
public static void main(String[] args){
//新建一个类
Person p = new Person();
//初始化为字符串数组,需要使用new String[] {}来初始化
String[] fullname = new String[] {"liu","kai"};
//因为传入的是字符串数组,所以退化为引用,实际传入了引用
p.setName(fullname);
System.out.println(p.getName());
//修改了字符串数组里面的内容
fullname[0] = "chen";
//输出值指向被改变的引用,输出也是引用,
System.out.println(p.getName());
//再看一个例子
PPerson pp = new PPerson();
//初始化为一个基本的字符串类型
String shortname = "liukai";
//传入的基本值
pp.setName(shortname);
System.out.println(pp.getName());
shortname = "chenkai";
//输出的也是基本值
System.out.println(pp.getName()); //输出liukai
System.out.println(shortname); //输出chenkai
}
}
class Person{
//新建了一个字符串数组,特别注意引用
private String[] name;
public String getName(){
return this.name[0] + " " + this.name[1];
}
//注意这里返回类型不是String,必须写成void,否则会报错
public void setName(String[] name){
this.name = name;
}
}
class PPerson{
//新建了一个字符串基本类型
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
输出的结果为
liu kai
chen kai
liukai
liukai
chenkai