1、按...调用
按值调用:表示方法接收的是调用者提供的值。
按引用调用:表示方法接收的是调用者提供的变量地址。
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
JAVA只采用按值传递调用。也就是说,方法得到的是参数值的一个拷贝。
2、方法参数的两种类型
a、基本数据类型(数字、布尔值);
b、对象引用;
2.1、基本数据类型的传递
一个方法不能修改一个基本数据类型的参数。
例如:
public static void add(int i){
i +=1;
}
public static void main(String[] args){
int n=100;
add(n);
System.out.println(“n=”+n);
}
结果:n=100
分析:如下图所示,传递的只是n的一个拷贝值,方法只是修改拷贝值,并没有修改n,所以结果仍是原值
2.2、对象引用的传递
a、一个方法可以改变一个对象参数的状态。
b、一个方法不能让一个对象参数引用一个新的对象
举例a:
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
}
public class UserTest {
public static void changeAage(User user){
int age = user.getAge()+1;
user.setAge(age);
}
public static void main(String[] args){
User jack = new User("jack",29);
UserTest.changeAage(jack);
System.out.println(jack.getAge());
}
}<strong>
</strong>
结果:30
分析:如下图,因为传递的是对象的引用,所以拷贝的只是jack对象的引用。两个引用指向的堆内存空间地址是一样的,所以如果修改了拷贝引用的属性,会修改堆空间User对象的值(即jack对象的值)
举例b:
public class UserTest {
public static void changeUser(User user){
User tom = new User("tom",28);
user = tom;
}
public static void main(String[] args){
User jack = new User("jack",29);
changeUser(jack);
System.out.println(jack.getName() + " "+ jack.getAge());
}
}
结果:jack 29
分析:传递的只是拷贝的引用,所以引用一个新的tom对象时,并没有影响原来的。jack引用仍然指向堆内存的jack对象。
3、总结
a、一个方法不能修改一个基本数据类型的参数。
b、一个方法可以改变一个对象参数的状态。
c、一个方法不能让一个对象参数引用一个新的对象