码迷,mamicode.com
首页 > 编程语言 > 详细

Java中的值传递和引用传递

时间:2016-04-28 22:39:56      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:


解释
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=10
        alterValues(num);//方法中num=30
        System.out.println("传入后num=" + num);//传入后num=10
        System.out.println("**********************************************");
        Employee bqt = new Employee("bqt", 10000);
        System.out.println("传入前salary=" + bqt.getSalary());//传入前salary=10000
        alterSalary(bqt); //方法中salary=10200
        System.out.println("传入后salary=" + bqt.getSalary());//传入后salary=10200
        System.out.println("*********************************************");
        Employee a = new Employee("aaaaa", 9000);
        Employee b = new Employee("bbbb", 8000);
        System.out.println("传入前a=" + a.getName());//传入前 a=aaaaa
        System.out.println("传入前b=" + b.getName());//传入前b=bbbb
        swap(a, b); //方法中a=bbbb;    方法中b=aaaaa
        System.out.println("传入后a=" + a.getName()); //传入后a=aaaaa
        System.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指向b
        b = temp;//同理,b指向了原来的a
        System.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;
    }
}  





Java中的值传递和引用传递

标签:

原文地址:http://www.cnblogs.com/baiqiantao/p/5444549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!