java到底是值传递还是引用传递

Python025

java到底是值传递还是引用传递,第1张

java中方法参数传递方式是按值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而自己本身不会受到任何影响。

如果参数是基本类型,传递的是基本类型的字面量值的拷贝。 

如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

Java中的参数传递:分为值传递和引用传递

但本质上,Java中只有值传递。引用传递,其实可以理解为传的是类似指针的东西。

值传递就是把基本变量的值拷贝一份,传递这个拷贝。引用传递则是传递的引用的地址,也就是该变量在内存空间的地址。

1.值传递

只有基本数据类型采用值传递,特点是传递的是值的拷贝,传递完后两者就没有关系了。也就是说方法内和方法外的值互不相干

基本数据类型:

·整型:int,long,byte,short

浮点型:float,double

字符型:char

布尔型:boolean

注:8种基本数据类型以外的数据类型都为引用类型。

2.引用传递

指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

传递的是一个拷贝,即副本。也就是说,对于一个参数传递,存在两个地址指向同一个内存空间。这里我们可以用内存分配示意图来体现

3.String类型传递

先说结论,String类型传递与基本数据类型的传递效果相似。

说明:

String类对象一旦创建,其内容不可更改:

String类的所有方法都不会改变String类对象内容,要改变String类对象的值就必须创建一个新的String对象。

也就是说,当进行参数传递时,如果方法内对String类对象的值进行了修改,那么实际上是创建了一个新的String类对象,然后让原来的变量指向它而已。但是这个“原来的变量”是一份拷贝副本,只是一开始创建的时候与主方法中的传递的值相同而已,现在改变之后,两者就毫无关系了。

结果是(p1[0,0], p2[5,5])就对了, 下图是执行流程以及内存变化

记住: 当对象的引用被执行赋值操作(=)后, 讲不在指向原来的对象(新的对象不是原来的对象)

// modify方法做如下修改就知道为什么是那样的结果了:

    private static void modify(Point p1,Point p2){

        System.out.println(p2) // 注意观察hashcode值, 不要重写toString()方法

        Point p = p1

        p1 = p2

        p2 = p

        p1.setLocation(5, 5)

        p2 = new Point(5, 5)

        System.out.println(p2) // 这里p2与之前的p2的hashcode值已经不是同一份

    }

    

// 修改main方法如下

    public static void main(String[] args)

    {

        Point p1 = new Point(0,0)

        Point p2 = new Point(0,0)

        System.out.println(p2)

        modify(p1, p2)

        System.out.println(p2)    // modify执行完成后, p2的指向并未改变

        System.out.println(p1.getX()+","+p1.getY()+","+p2.getX()+","+p2.getY())

    }

    

    /**

    * 可以使用断点调试观察modify方法中p2的指向变化

    * Eclipse中引用被赋予新的值时, 调试界面中[变量列表]的变化为 黄色高亮显示

    */

希望对你有帮助!