Java中的参数传递发生在方法调用中 。
有的时候传递一个基本类型的变量 然后方法中改变参数的值 ,原先的变量并不会被改变。
但是当传递一个非String类型的对象时 ,方法中改变这个传入的对象,原先的对象会被改变。
这些情况,需要分析总结一下 。
先说一下Java 参数传递的两种规则:
1)按值传递; 使用这种方式传参,原先的参数的值不发生改变,因为只是将这个参数的值copy 一份,然后传入方法
2)按址传递; 这种方式是将参数在内存中的存储地址传入到方法中,方法内部通过存储地址改变存储区域的内容,由于参数的存储地址只有一个,在方法内部修改参数的值时,参数原始的值也发生改变。
Java中对这两种规则的使用有明确的要求:
不同的数据类型对应不同的传递规则;
(1) 八种基本类型(int ,char, double等) 和 String 对应 按值传递
为什么有String ,虽然String对象也是按址传递,但是这个对象是不能被改变的,一旦改变就产生新对象,即原有的String引用指向了新的对象
所以也相当是属于按值传递。
例:
class test {
String str = new String("hello");
public void change(String str) {
str = "OK";
}
public static void main(String[] args){
test t= new test();
t.change(t.str);
System.out.print(t.str);
}
}
// 传递的是成员变量str,但是由于是按值传递,所以最后打印出:hello
(2) 除String以外的所有复合数据类型,包括数组、类和接口 对应 按址传递
因为这些都属于引用类型,创建的对象都对应一个对象引用,传参的时候只是传递一个对象引用,即对象存储位置的指针。
需要注意的是: 在有些按址传递的过程中,不想改变原先对象的值,可以重新构建一个对象 。如:
public class test {
public static void main(String[] args) {
int[] a = { 1, 2, 3 };
set(a);
System.out.println(a[0]);
}
public static void set(int[] m) {
int[] n = new int[m.length];
for (int i = 0; i < m.length; i++) {
n[i] = m[i];
}
n[0] = 10;
}
}