class="p0" style="margin-top: 0pt; margin-bottom: 0pt;">a.值传递:?如果参数类型是基本类型和String类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,如果在函数中改变了副本的?值不会改变原始的值.基本数据类型:byte,short,int,long,float,double,char,boolean;
b.引用传递:如果参数类型是引用类型或者数组类型,那么传过来的就是这个canshu.html" target="_blank">引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的?地址,所以不会改变参数的值。
<!--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-->