不管多好的总结都比不上一段代码

我们先来看看基本类型的实例变量的传值机制

创建一个Student类

1 public classStudent {2 int age=18;3 String name="Jack";4 }

尝试将基本类型实例变量age当做参数传入方法,在方法内修改参数的值,从而修改age的值

构造一个changeAge方法

1 public void changeAge(intin) {2 in=0;3 }

在main方法中实例化一个Student对象stu,调用changeAge方法来改变stu的age

1      Student stu=newStudent();2 System.out.println("尝试改变前stu的age:"+stu.age);3 stu.changeAge(stu.age);4 System.out.println("尝试改变后stu的age:"+stu.age);

运行结果:

尝试改变前stu的age:18

尝试改变后stu的age:18

发现age的值没有改变,猜想传入方法中的参数只是age的一个副本而不是age本身。

在main方法中直接更改age

1   System.out.println("尝试改变前stu的age:"+stu.age);2 stu.age=0;3   System.out.println("尝试改变后stu的age:"+stu.age);

运行结果:

尝试改变前stu的age:18

尝试改变后stu的age:0

age发生了改变,证明是传入时出了问题,传的是副本。

我们再来看看引用类型的实例变量的传值机制

尝试将引用类型实例变量name当做参数传入方法,在方法内实例化一个新的对象并将该对象的地址传给参数,从而修改name的指向

构造一个changeName方法

public voidchangeName(String str) {
String temp="null";
str=temp;
}

在main方法中调用changeName方法来改变stu的name

1 System.out.println("尝试改变前stu的name:"+stu.name);2 stu.changeName(stu.name);3 System.out.println("尝试改变后stu的name:"+stu.name);

运行结果:

尝试改变前stu的name:Jack

尝试改变后stu的name:Jack

发现name并没有改变,指向的仍旧是原来的那个对象,猜想传入方法的参数不是name本身而是name的一个副本(也就是地址的一个副本)。

在main方法中直接更改name

1      System.out.println("尝试改变前stu的name:"+stu.name);2 stu.name=("null");3 System.out.println("尝试改变后stu的name:"+stu.name);

运行结果:

尝试改变前stu的name:Jack

尝试改变后stu的name:null

name发生了改变,证明是传入时出了问题,传的是地址的一个副本。

代码一顿操作后来个总结是再好不过了

以上所有操作只说明一个结果:Java中传参是值传递,传入方法的只是一个copy。传基本类型的变量时传的是数据的一个copy,传引用类型的变量时传的是地址的一个copy。此时注意引用类型的变量承载的只是对象的地址而不是对象本身哦!

另(可视而不见):注意静态变量的与众不同,改变一个对象的静态变量就相当于改变所有哦。这时候如果使用对象来调用静态变量很容易造成混淆,毕竟它是属于类的。