您的位置:首页 > 编程语言 > Java开发

Java参数传递机制

2015-12-15 12:53 375 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: