参考博客:http://www.cnblogs.com/chonh/p/6099605.html
http://www.cnblogs.com/answeryi/archive/2012/07/12/2588662.html
1 方法参数传递机制
将参数传递给方法(或函数)有两种方法。按值传递(call by value)表示方法接受的是调用者提供的值;按引用调用(call by reference)表示方法接受的是调用者提供的变量地址。Java程序设计语言都是采用按值传递。
下面是传递值,传递对象,传递数组的例子。
/**
* @data 2017.3.24
* author Shipp
*/
public class TextDemo_17 {
public static void main(String[] args) {
//值传递
Integer a=10;
Integer b=20;
System.out.println("值传递开始");
System.out.println("方法执行之前a:"+a+"--b:"+b);
TextDemo_17.changeValue(a, b);
System.out.println("方法执行之后a:"+a+"--b:"+b);
//对象传递
//创建对象
System.out.println();
System.out.println("对象传递开始");
Text text=new Text();
text.setA(1);
System.out.println("方法执行之前text对象中的a:"+text.getA());
//text指向堆内存中的区域,传进去的是该对象指向内存中的地址
TextDemo_17.changeQuote(text);
//由于main方法中的text引用和changeQuote方法中
//的text指向的是同一块堆内存地址.
System.out.println("方法执行之后text对象中的a:"+text.getA());
System.out.println();
System.out.println("传递数组开始");
//传递数组
Integer[] arrInt=new Integer[]{1,2,3,4};
System.out.println("方法执行之前数组中的值");
for(int i=0;i<arrInt.length;i++){
System.out.print(arrInt[i]+"--");
}
System.out.println();
//传递进去的是地址,指向同一片内存空间
//在方法中改变该内存中的数据会影响到其他位置指向该处内存的引用
TextDemo_17.changeArray(arrInt);
System.out.println("main方法中arrInt数组");
for(int i=0;i<arrInt.length;i++){
System.out.print(arrInt[i]+"--");
}
}
/**
* 值传递--交换
* @param a
* @param b
*/
public static void changeValue(Integer a,Integer b){
Integer temp;
temp=a;
a=b;
b=temp;
System.out.println("方法中a:"+a+"--b:"+b);
}
/**
* 对象传递
* @param text
*/
public static void changeQuote(Text text){
//如果打开下面的代码将会使text引用指向一块新的内存区域,
//不会影响到main中的text对象
//text=new Text();
//text得到的是传递进来的引用在内存中的堆地址
text.setA(2);
System.out.println("方法中text对象a:"+text.getA());
}
/**
* 数组传递
* @param arrInt
*/
public static void changeArray(Integer[] arrInt){
arrInt[0]=0;
System.out.println("方法中arrInt数组");
for(int i=0;i<arrInt.length;i++){
System.out.print(arrInt[i]+"--");
}
System.out.println();
}
}
/**
* 测试实体类
* @author Shipp
*/
class Text{
Integer a;
public Integer getA() {
return a;
}
public void setA(Integer a) {
this.a = a;
}
}
运行结果:
第一次调用的changeValue方法,由于传递的是值,改变的只是方法中的值,本质没有变化。
第二次调用的changeQuote方法,由于传递的是对象的引用,方法中的形参指向的是传递进来的对象在内存中的位置,指向的是同一块地址空间,方法中的改变会改变内存中的值,同时会改变传递进来的值。
说明均在代码中。
第三次调用的changeArray()方法,由于传递的是数组的首地址,方法中的参数和外面传递进去的均为同一块地址空间,改变的话会均改变。
总结:java中参数的传递均可用地址空间来解释,指向同一快地址空间,当通过一个引用改变了地址空间的值,其他引用均得到的是改变后的值。
传递对象:
Text text=new Text();
text.setA(1);
TextDemo_17.changeObject(text);
System.out.println(text);
System.out.println(text.getA());
/**
* 测试引用传递
* @param text
*/
public static void changeObject(Text text){
text.setA(2);
text=null;
}
总结:传递对象时,方法中不能改变对象指向的内存空间,但是能改变内存空间中的值。
未完待续。。。