Java面试难点:值传递机制

一、前言

近日复习了一些java基础知识,看了看尚硅谷的javase视频,学到了许多新东西,在这里在整理成技术博客分享给大家,也便于自己学习使用。

二、针对基本数据类型

接下来,我们探讨方法形参的值传递机制
首先,我们先来一段代码:

public class ValueTransferTest1 {
    public static void main(String[] args) {
        int m = 10;
        int n = 20;

        //我们交换两个变量的值
        int temp = m;
        m = n;
        n = temp;

        //输出一下,看一下结果
        System.out.println("m = " + m + ", n = " + n);
    }
}
====================================================================================
输出结果为:
m = 20, n = 10

输出结果正如我们像的那样,m = 20, n = 10

接下来,我们将上面代码中的排序操作封装成swap方法进行调用,代码如下:

public class ValueTransferTest1 {
    public static void main(String[] args) {
        int m = 10;
        int n = 20;

        //创建类对象,为了调用swap方法进行变量交换
        ValueTransferTest1 v = new ValueTransferTest1();
        v.swap(m,n);

        //输出一下,看一下结果
        System.out.println("m = " + m + ", n = " + n);
    }

    //交换两个变量值的方法
    public void swap(int m,int n){
        int temp = m;
        m = n;
        n = temp;
    }
}
====================================================================================
这个时候我们会发现,结果不再是m = 20, n = 10;

结果是:
m = 10, n = 20;

为什么明明调用了交换变量的swap方法,输出结果却没有交换呢?
我们想要搞清楚原因,就需要画内存解析图

Java面试难点:值传递机制解析说明:

首先,我们在栈内存中声明两个变量m,n赋值分别为10,20,这是在main主方法中。
我们接着调用了swap方法将m,n两个变量作为实参传递给swap方法中。
两个变量值进行交换。交换的变量属于swap方法,调用完swap方法,该方法就销毁出栈了。
所以输出的最终结果m,n其实是main方法中的m,n,最终结果就是m = 10, n = 20

既然如此,我们该如何解决此类问题呢?就要提到引用数据类型了。

三、针对引用数据类型

同样的,想要交换变量值,定义一个swap方法,只不过这次,参数传递的是引用类型变量,话不多说,先看代码如下:

public class ValueTransferTest1 {
    public static void main(String[] args) {
        //创建Data对象
        Data data = new Data();
        //给属性m,n赋值
        data.m = 10;
        data.n = 20;
        //创建对象,调用swap方法,进行变量交换
        ValueTransferTest1 v= new ValueTransferTest1();
        v.swap(data);
        //输出结果
        System.out.println("m = " + data.m + ", n = " + data.n);
    }

    public void swap(Data data){
        int temp = data.m;
        data.m = data.n;
        data.n = temp;
    }
}

class Data{
    int m;
    int n;
}
====================================================================================
输出结果为:
m = 20, n = 10;

为什么形参传递的是引用数据类型结果就交换成功了呢?
我们继续看内存解析图

Java面试难点:值传递机制解析说明:

其实调用swap方法的时候,传的实参就是一个地址值。
毕竟引用类型变量存储的值不是null就是地址值。所有两个data变量指向同一个内存中的对象。
执行完swap方法后,方法销毁,导致tamp变量和data参数出栈销毁。
然而main方法中的data依旧指向内存中的0x7788,所以结果:m = 20, n = 10

四、值传递机制总结(重点)

如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值

如果理解不了,可以这么想:
其实实参传递的是基本数据类型,可以理解为传递的是复制了数值,不论怎么交换,也没有交换原本的数据,所以结果不发生改变。
然而实参传递的是引用数据类型,可以理解为传递了地址值,指向的都是同一个地址,所以交换的是同一个对象,结果发生改变。

匿名

发表评论

匿名网友