标签:
解释
1、Java中有没有引用传递?答:Java中只有按值传递,没有按引用传递!2、当一个对象被当作参数传递到一个方法中后,在此方法中可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?答:是值传递。
Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的,如果在函数中改变了副本的值不会改变原始的值。public class Test {public static void main(String[] args) {int x=1; //原始类型f(x);System.out.println(x);//结果仍是1}public static int f(int i) {i += 1;return i;}}
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。public class Test {public static void main(String[] args) {String x="1"; //对象,也即引用类型f(x);System.out.println(x);//结果仍是1}public static String f(String i) {i += 1;//注意Sting是final类型,所以当对字符串的内容操作时,实际上是将 i 指向了新new的一个String对象的地址,这个新的对象和传进来的对象不再有任何关系return i;}}
测试案例
public class Test {public static void main(String[] args) {int num = 10;System.out.println("传入前num=" + num);//传入前num=10alterValues(num);//方法中num=30System.out.println("传入后num=" + num);//传入后num=10System.out.println("**********************************************");Employee bqt = new Employee("bqt", 10000);System.out.println("传入前salary=" + bqt.getSalary());//传入前salary=10000alterSalary(bqt); //方法中salary=10200System.out.println("传入后salary=" + bqt.getSalary());//传入后salary=10200System.out.println("*********************************************");Employee a = new Employee("aaaaa", 9000);Employee b = new Employee("bbbb", 8000);System.out.println("传入前a=" + a.getName());//传入前 a=aaaaaSystem.out.println("传入前b=" + b.getName());//传入前b=bbbbswap(a, b); //方法中a=bbbb; 方法中b=aaaaaSystem.out.println("传入后a=" + a.getName()); //传入后a=aaaaaSystem.out.println("传入后b=" + b.getName());//传入后b=bbbb}//测试1:更改基本数据类型的值private static void alterValues(int x) {x = 3 * x;System.out.println("在方法中num= " + x);}//测试2:更改引用数据类型的值private static void alterSalary(Employee x) {x.setSalary(x.getSalary() + 200);//这里是直接更改了对象中的内容System.out.println("方法中salary=" + x.getSalary());}//测试3:private static void swap(Employee a, Employee b) {Employee temp = a;a = b;//这里是把b引用的对象的地址赋给了a,所以a指向bb = temp;//同理,b指向了原来的aSystem.out.println("方法中a=" + a.getName());System.out.println("方法中b=" + b.getName());}}public class Employee {private String name;private int salary;public Employee(String name, int salary) {super();this.name = name;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}}
标签:
原文地址:http://www.cnblogs.com/baiqiantao/p/5444549.html