这个问题相对于函数而言,即方法参数。在java中是没有传址调用的,这里我们需要注意的是一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值,这句话相当重要,这是按值调用与引用调用的根本区别。
案例分析:
package com.yc.test;
public class User {
public String name;
public int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
package com.yc.test;
import org.junit.Test;
import junit.framework.TestCase;
public class TestProject extends TestCase {
public int a=10;
public User user=new User("张三",18);
public void add(int a,User student){
a=a+10;
student.setAge(20);
student.setName("李四");
}
@Test
public void test1(){
System.out.println("执行方法前a:"+a+"\t"+user);
add(a,user);
System.out.println("执行方法后a:"+a+"\t"+user);
}
}
运行结果:
执行方法前a:10 User [name=张三, age=18]
执行方法后a:10 User [name=李四, age=20]
由于参数是按值传递,方法参数类型有基本类型和引用类型,对于基本类型,在方法中改变参数值,不会改变原有变量的值;
对于引用变量则会改变引用所指向对象的状态。在这个案例当中,执行方法add时会将全局变量a的值,实例变量user的值拷贝给方法参数的a、student,对于方法中的a当方法执行结束就会销毁,原来a的值不变;对于student与user是一个对象引用,都指向堆内存的对象,所以当在方法改变对象状态的时候,user也会受到影响。