Java 中关于值传递的示例说明

还是先说总结吧。

Java 中只有值传递,没有引用传递。

下面我用一些代码示例进行验证及说明:

public static void main(String[] args) {

        int a=1;
        int b=2;

        exchange(a,b);  //交换a,b的值

        System.out.println("a的值为:"+a);
        System.out.println("b的值为:"+b);
    }

    private static void exchange(int c, int d){
        int temp=c;
        c=d;
        d=temp;
        System.out.println("c的值为:"+c);
        System.out.println("d的值为:"+d);

    }

输出结果为:

c的值为:2
d的值为:1
a的值为:1
b的值为:2

说明:exchange()方法的作用是交换c和d的值,在main()方法中调用exchange()方法时,传的参数值为a和b,但实际传到exchange()方法时,c和d接收的值是a和b的复制值,所以无论c和d怎样交换,都不会影响到main()方法中a和b的值。

Java中的数据类型分为基本数据类型和引用数据类型。

基本数据类型包括 byte,short,int,long,float,double,char 和 boolean 8种,当基本数据类型发生值传递情况时,实际传递的是基本数据类型的复制值,复制的值发生变化,不会影响原本的值。

下面是其他基本数据类型发生值传递情况的示例:

public static void main(String[] args) {

        char a='*';
        short b=1;
        float c=4f;
        boolean d=true;

        test(a,b,c,d);

        System.out.println("a的值为:"+a);
        System.out.println("b的值为:"+b);
        System.out.println("c的值为:"+c);
        System.out.println("d的值为:"+d);
        
    }

    private static void test(char a, short b, float c, boolean d){
        a='#';
        b=11;
        c=44f;
        d=false;
        System.out.println("基本数据类型a的值为:"+a);
        System.out.println("基本数据类型b的值为:"+b);
        System.out.println("基本数据类型c的值为:"+c);
        System.out.println("基本数据类型d的值为:"+d);

    }

运行结果:

基本数据类型a的值为:#
基本数据类型b的值为:11
基本数据类型c的值为:44.0
基本数据类型d的值为:false
a的值为:*
b的值为:1
c的值为:4.0
d的值为:true

上面我介绍了一下基本数据类型发生值传递的情况,那么引用数据类型发生值传递时又会发生什么呢?

我们还是先用代码看一下实际的发生情况吧

public static void main(String[] args) {

        int [] arr={1,2,3,4,5};

        System.out.println("初始值:"+arr[0]);
        test(arr);
        System.out.println("后期值:"+arr[0]);

    }

    private static void test(int [] array){
        array[0]=999;
        System.out.println("处理值:"+array[0]);
    }

运行代码

初始值:1
处理值:999
后期值:999

我们可以从结果发现,数组中的数据已经发生了改变。

说明:

array 接收到的值也是 arr 的拷贝,不过arr是引用数据类型,所以拷贝的不是其本身的值,而是其地址值,在 test() 方法中,根据地址值找出实际存储的值,然后改变了数组的第一个值,在main()方法中, 根据地址值查找实际存储的值,其本身也已经被改变了。

再看一个例子吧

public class Student {

    private String name;  

    public Student(String name){
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public static void main(String[] args) {

        Student student = new Student("张三");
        test(student);
        System.out.println(student.getName());

    }

    private static void test(Student s){
        System.out.println(s.getName());
        s.setName("李四");
        System.out.println(s.getName());
    }

输出结果:

张三
李四
李四

 

posted @ 2018-12-21 14:34  ____Peanut  阅读(286)  评论(0)    收藏  举报