飞道的博客

骚年,Java值传递你会吗

578人阅读  评论(0)

骚年,Java值传递你会吗

值传递和引用传递

1、值传递是通过方法对传入值操作后,并不会改变传入的值

2、引用传递是通过方法对传入的值操作后,会改变传入的引用指向数据

Java中的值传递

Talk is cheap, show your code。

/**
 * @author : cuantianhou 2020/4/30
 */

public class Student {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
        "name='" + name + '\'' +
        '}';
    }

    private String name;
}
/**
 * @author : cuantianhou 2020/4/30
 */
public class ValueTransfer {


    public static void swap(int a, int b){
        a = a ^ b;
        b = a ^ b;
        a = a ^b;
        System.out.println("swap after"+a + ","+b);
    }

    public static void swapObject(Student a ,Student b){
        Student student = a;
        a = b;
        b = student;
        System.out.println("swap after"+a + ","+b);
    }
    public static void main(String[] args) {
        int a =  1;
        int b =  2;
        System.out.println("swap before"+a + ","+b);
        swap(a,b);
        Student sa = new Student();
        sa.setName("sa");
        Student sb = new Student();
        sb.setName("sb");
        System.out.println("swap before"+sa + ","+sb);
        swapObject(sa,sb);

    }
}

然后我们来看下测试结果

优秀的你,肯定会觉得太简单了,傻子都会,你不会是标题党吧。下面我们来看下一个场景:比如我们需要去调用一个接口,该接口会返回一个对象,然后你使用方法参数接收返回的对象,自以为已经改变方法中传入对象属性的值,那我们来模拟验证下。

/**
 * @author : cuantianhou 2020/4/30
 */
public class RemoteCallClass {


    public Student remoteCall(){
        Student student = new Student();
        student.setName("remote");
        return student;
    }
}
/**
 * @author : cuantianhou 2020/4/30
 */
public class RemoteMain {


    public static void getStudent(Student studnet){
        RemoteCallClass remoteCallClass = new RemoteCallClass();
        studnet = remoteCallClass.remoteCall();
    }

    public static void main(String[] args) {
        Student  student = new Student();
        getStudent(student);
        System.out.println(student);
    }
}

我们来看下模拟结果:

此时只想说:小朋友你是否有很多问号,那为什么会出现这种现象呢,来上图。


这个是在不同时机,student指向的内存图,getStudent中的student通过返回对象,指向了RemoteCallClass中指向的这个对象,getStudnet的student没有返回值,所以Main方法中的student这是值传递的一个变种,平时需要注意,主要是针对小白。那如何来解决这种问题呢?主要有两种方法:第一我们在传递的时候改变对象的属性;
修改后代码如下:

public static void getStudent(Student studnet){
    RemoteCallClass remoteCallClass = new RemoteCallClass();
    studnet.setName(remoteCallClass.remoteCall().getName());
    System.out.println("remote"+studnet);
}

测试结果:

第二,将赋值的对象返回到调用方法中。
修改后的代码如下:

public static Student getStudent(Student studnet){
    RemoteCallClass remoteCallClass = new RemoteCallClass();
    studnet = remoteCallClass.remoteCall();
    System.out.println("remote"+studnet);
    return studnet;
}

public static void main(String[] args) {
    Student  student = new Student();
    student=getStudent(student);
    System.out.println(student);
}

测试结果如下:

总结

每天进步一点点,祝各位前程似锦,觉得不错,点个赞再走呗。


转载:https://blog.csdn.net/u014046563/article/details/105862854
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场