解决方法参数传递中的疑惑

解决方法参数传递中的疑惑,第1张

解决方法参数传递中的疑惑

首先我们需要知道java中参数传递的,如果是基本类型的值,那么在方法中传的就是复制后的基本类型的值,对形参的修改不会改变实参。

public class BlogWrite {
    public static void main(String[] args) {
        int n=555;
        changevalue(n);
        System.out.println(n);  //输出结果是555,说明形参的修改没有改变实参的值,传过去的只是一个副本
    }
    public static void changevalue(int value) {
        value=999;
    }
}

其次参数传递如果传的是一个对象,那么传递的就是这个对象的引用,这个引用通过复制原先引用得来的,即方法中的引用和对象的引用指向同一个地址,画个图解释一下

如果对传进来的对象进行修改的话,只要不是改变他的引用,也就是让这个引用指向另外一个地方,都是对原对象的修改,看一段代码

public class ArrayTest {
    public static void main(String[] args) {
        int n1=1111;
        //Integer_是自己定义的一个类,类的作用就是为了对一个整数进行修改
        Integer_ integer = new Integer_(222);
        changevalue(n1,integer);
        System.out.println(n1 +"+"+integer.getNum());  //n1是不会变的,最开始的时候已经说了,n2会变,变成了6666,因为在方法中传的是引用,那么对这个引用指向的对象进行修改的话就是对实参的对象进行修改
    }
    public static void changevalue(int n1,Integer_ n2) {
        n1=9999;
        n2.setNum(6666);
        System.out.println(n1 +"+"+n2.getNum());
    }
}
//这个类里面的方法就是初始化
class Integer_ {
    private int num;
    public Integer_(int n) {
        num=n;
    }
    public void setNum(int num) {
        this.num=num;
    }
    public int getNum() {
        return this.num;
    }
}

如果对上面的三点掌握了,那么java中方法中参数传递的知识也掌握的差不多了,还需要注意的一点是,也就是我写这篇博客最主要的因素,如果你在方法中改变了引用的指向,让引用指向了另一个对象,这时候你再对方法中引用指向的对象进行修改的话,也不会改变实参对象的值,还是以之前的一段代码为例

public class ArrayTest {
    public static void main(String[] args) {
        int n1=1111;
        Integer_ integer = new Integer_(222);
        changevalue(n1,integer);
        System.out.println(n1 +"+"+integer.getNum());    //输出就是1111+6666,后面所进行的修改66不会改变成功,我画个图帮大家理解一下
    }
    public static void changevalue(int n1,Integer_ n2) {
        n1=9999;
        n2.setNum(6666);
        n2=new Integer_(55);    //这里我让n2指向了一个新的对象,也就是改变了引用的指向,后面所做的修改都不会改变实参对象的值了
        n2.setNum(66);
    }
}

class Integer_ {
    private int num;
    public Integer_(int n) {
        num=n;
    }
    public void setNum(int num) {
        this.num=num;
    }
    public int getNum() {
        return this.num;
    }
}


public static void changevalue(int n1,Integer_ n2) {
n1=9999;
n2.setNum(6666); 这是在传过去的引用还指向原对象,对这个对象进行修改那么就会改变实参对象的值
n2=new Integer_(55); //这是改变了引用的指向,看图指向了红色的那个对象
n2.setNum(66); //再对引用指向的对象进行修改不会改变实参对象的值,因为实参对象的引用和传过去的引用没有指向同一个对象了
}

如果能看到这并理解上面代码的意思了,那么也不枉我花时间写这篇博客了。还有一点忘了提,如果传入的参数是一个数组,那么传入的也是一个对象。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存