Java值传递与引用传递

值传递(call by value),指的是在Java中,如果向方法中传递的是int double等基本类型,那么传递到方法中的只是一个拷贝副本(形参),那么无论如何操作

这个形参,都不会对实参产生影响.

public class ExceptionClass {
    public static void main(String[] args) throws FileNotFoundException {
        int a=1,b=2;
        changeVal(a,b);
        //运行结果:a=1---b=2
        System.out.println("a="+a+"---b="+b);
    }
    
    private static void changeVal(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
}

引用传递(call by reference)

什么叫call by reference(引用传递),当往方法传递类对象时,会拷贝一个副本(形参)到方法里,这里的形参跟实参对象是同一地址。这里要注意,如果用形参内部方法修改形参内容,实参会一起改变。除此之外,形参怎么改变,实参都不会受到影响.比如:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;


public class ExceptionClass {
    public static void main(String[] args) throws FileNotFoundException {
        Student s = new Student("1", "zhangsan", 10);
        changeObj(s);
               //运行结果:Student [sid=1, sname=zhangsan, age=10]
        System.out.println(s.toString());
    }
    public static void changeObj(Student s){
        Student s2 = new Student("2", "lisi", 12);
        s = s2;
    }
}

因为传递到方法中的只是实参的引用地址的拷贝副本,而副本指向了一个新的student对象,但是实参的指向并没有改变,所以,打印实参的结果没变.

只有当形参中调用内部方法改变了值,才会更改实参中的内容

public class ExceptionClass {
    public static void main(String[] args) throws FileNotFoundException {
        Student s = new Student("1", "zhangsan", 10);
        changeObj(s);
               //运行结果:Student [sid=1, sname=zhangsan, age=25]
        System.out.println(s.toString());
    }
    public static void changeObj(Student s){
        s.setAge(25);
    }
}

 

posted @ 2018-11-19 22:44  魔瞳  阅读(84)  评论(0)    收藏  举报