a.值传递: 如果参数类型是基本类型和String类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,如果在函数中改变了副本的 值不会改变原始的值.基本数据类型:byte,short,int,long,float,double,char,boolean;
b.引用传递:如果参数类型是引用类型或者数组类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
<!--EndFragment-->
值传递的代码实例:
/**
*定义一个学生类
*/
public class Student {
/**
* 学生的学习方法
*/
public void study(int score){
//改变副本的值
score++;
//输出改变后的值
System.out.println(score);
}
}
/**
*程序入口
*/
public class Test {
/**
* 主函数
*/
public static void main(String[] args) {
//实例化一个学生对象
Student stu = new Student();
//给score初始化一个值
int score = 90;
//对象stu调用学生类中的方法
stu.study(score);
//输出的原始值不变
System.out.println(score);
}
}
引用传递代码实例1:
/**
*定义一个学生类
*/
public class Student {
//定义属性
private String name;
//给name赋值
public String getName() {
return name;
}
//取name的值
public void setName(String name) {
this.name = name;
}
}
/**
* 主函数
*/
public static void main(String[] args) {
//实例化一个学生对象
Student st = new Student();
st.setName("张三");
//再实例化一个学生对象
Student st1 = new Student();
st1.setName("李四");
//改变了st 的地址指向
st = st1;
st.getName();
//输出结果
System.out.println(st.getName());
//改变了对象的属性
st1.setName(“王五”);
//输出的是改变后的结果
System.out.println(st.getName());
}
}
运行结果是:李四
王五
引用传递实例2:
/**
*定义一个学生类
*/
public class Student {
//定义属性
private String name;
//给name赋值
public String getName() {
return name;
}
//取name的值
public void setName(String name) {
this.name = name;
}
}
/**
*定义一个老师类
*/
public class Teacher {
/**
* 老师教学生的方法
*/
public void teach(Student st){
//传入的地址是st1的副本,所以指向st1;
System.out.println("老师教"+st.getName());
}
}
/**
*程序入口
*/
public class Test {
/**
* 主函数
*/
public static void main(String[] args) {
//实例化一个学生对象
Student st = new Student();
st.setName("张三");
//再实例化一个学生对象
Student st1 = new Student();
st1.setName("李四");
//实例化一个老师对象
Teacher te = new Teacher();
//对象te调用Teacher类中的方法,传入参数st1;
te.teach(st1);
}
}
运行结果是:老师教李四
<!--EndFragment-->