方法需要的参数被分为两类:基本数据类型和复合数据类型。
基本数据类型
当传入的参数为基本数据类型时,仅仅只是值传递,对形参的处理并不会影响实参的值。
public class PassTest {
void changeInt(int value){
value = 55;
System.out.println(value);
}
public static void main(String[] args) {
int val = 11;
PassTest pt = new PassTest();
pt.changeInt(val);
System.out.println(val);
}
}
程序的运行结果为
55
11
复合数据类型
对象
Java中的对象实际上是对地址的引用,当传入的参数为一个对象时,这时形参与实参指向的是同一个地址,如果此时通过形参修改对象的属性,对象的属性便会被改变。
public class Person {
String name;
int age;
String address;
void changePerson(Person num1){
num1.age += 20;
num1.address = "城市";
}
public static void main(String[] args) {
Person per1 = new Person();
per1.name = "李四";
per1.age = 20;
per1.address = "农村";
System.out.println(per1.age + "的" + per1.name + "生活在" + per1.address);
System.out.println("二十年后");
per1.changePerson(per1);
System.out.println(per1.age + "的" + per1.name + "生活在" + per1.address);
}
}
运行结果为
20的李四生活在农村
二十年后
40的李四生活在城市
String类
字符串实际上也是对地址的引用,字符串的变量名实际上指向的是字符串所在的地址,这时如果将字符串作为参数传入方法,并在方法中对形参重新赋值,那么不会对实参产生影响。
public class PassTest1 {
public void changeStr(String value) { // 引用类型参数
value = new String("different"); //方法中改变形参所指对象
System.out.println("Value value in changeStr is: " + value);
}
public static void main(String[] args) {
String str;
PassTest1 pt = new PassTest1();
str = new String("Hello");
pt.changeStr(str);
System.out.println("Str value is: " + str);
}
}
运行结果是
Value value in changeStr is: different
Str value is: Hello