**
Java中传参数–值传递和引用传递
**
在Java中,传参数分为值传递和引用传递。
在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数组、类和接口),是指通过类创建的对象的变量名字,这种类型在传递的时候就要遵守“引用传递”的规则;另一种是原始类型,即为8大基本类型(字节型(byte),短整形(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度(double),布尔型(boolean)),这类型的数据在调用的时候传递时遵守 “值传递” 规则的。
接下来,就分别来介绍一下值传递和引用传递它们是如何进行参数传递的
一、值传递
值传递:是指方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数的改变不影响实际参数的值。
首先,可以来看一段代码:
package com.yf1020;
public class Student {
public void changeInt(int t) {
t=100;
System.out.println("这里t的值是:" +t);
}
}
这里先创建了一个Student类,在该类中有有一个改变t的值的方法。
然后我们再来创建对象,调用其中的方法,代码如下:
package com.yf1020;
public class Manager {
/*
* 程序运行的入口点
* */
public static void main(String[] arg) {
//创建对象
Student st = new Student();
int i = 1000;
//调用方法 在changeInt中改变i的值
st.changeInt(i);
System.out.println("这里i的值是:" +i);
}
输出结果:
通过输出结果,我们就可以去证明方法changeInt中所改变的t与i没有关系,方法中对t的改变,不会影响到调用代码中i的值。我们其实也可以这样理解,就是先看主类中的主程序,当设置i为1000时,继而将i的值传入到方法changeInt中,这样就改变了方法changeInt中的t的值,但是这不会影响在主类中i的值,仅仅是改变那个方法changeInt中的t值而已。
二、引用传递
引用传递: 也称传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
在理解引用传递之前,先明白何为引用,代码如下:
//创建对象,这里的test1类名是随意命名的,没有什么具体意义的
Student st = new Student();
这段代码可以描述为: 首先声明一个Student类型的变量st,再将这个st变量名指向一个新建的Student对象。st变量是这个新建对象的名字----并不是对象数据本身!!!例如你是一个学生对象,且叫“学生甲”,当我们使用“学生甲”这个名字的时候,“引用”的就是你,但是你的实体与“学生甲”这个名字不是同一个东西,你们之间称作“学生甲”,这个名字引用了你这个对象。
看一个代码例子就马上明白了,如下:
Student类:
package com.yf1020;
public class Student {
private String name;
public void setName(String t) {
name = t;
}
public String getName() {
return name;
}
}
主类:
package com.yf1020;
public class temp {
public static void main(String[] arg) {
//创建对象
Student st1 = new Student();
st1.setName("第一个");
Student st2 = new Student();
st2.setName("第二个");
Student st3 = new Student();
st3.setName("第三个");
//进行交换
st1 = st2; //将st2的引用值赋给st1;
st2 = st3; //将st3的引用赋值给st2;
st3 = st1; //因为上面已经把st2赋给了st1,此时st1内的引用值是之前st2内的值,所以这个时候相当于将最开始st2的值赋给了st3了。
String name1 = st1.getName();
String name2 = st2.getName();
String name3 = st3.getName();
System.out.println(name1);
System.out.println(name2);
System.out.println(name3);
}
}
输出的结果:
从最终的结果我们可以看出,st3变量名,最终指向了st2对象,即名字值被赋为“第二个”的对象。
同样地,在方法调用时,如果方法的参数是引用类型,传入的则只是一个对象名字的引用,而不是这个对象的本身!!!代码如下:
package com.yf1020;
public class Teacher {
public void changeST(Student st) {
String newName = "改名字";
st.setName(newName);
}
public static void main(String[] arg) {
//创建对象
Student st1 = new Student();
//调用前,设定学生的名字
st1.setName("第一个");
Teacher te = new Teacher();
//传入对象引用名:
te.changeST(st1);
String name = st1.getName();
System.out.println("调用后st1的名字其实是:"+name);
}
}
输出结果:
通过看输出的结果值,我们知道在te对象的changeST方法中改变了原来的值,即在调用时,main方法中的st1和changeST中的st变量名,都是指向的同一个Student对象!!!