java只有值传递谁赞成谁反对 | Java Debug 笔记

519 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

前言

  • 你有没有遇到过这样的场景?当你初始化一个变量并完成业务处理后将变量传递给下游后变量会被污染。什么叫污染就是变量会被改变

问题说明

image-20210512085548451

  • 我们经常会在方法中调用其他方法协助处理,这样有利于代码的耦合。但是有的时候我们传值到子函数只是为了方便其内部进行自己的业务,不想受其内部的影响而污染自己的业务
  • 即Amethod调用Bmethod同时给了一个value参数。调用结束后value这个参数还需要保持原来的内容

问题解析

  • 为什么会发生变化呢?如果有这方面的同学可能会知道传值后有的会变化有的是不会变化的。这就和我们java的传值类型有关系的;值传递引用传递
  • 在Java中的传递准确的说全部都是值传递。那为什么还有引用传递这一说法呢。非基础类型数据传递时将该对象的地址传递过去了。而内部操作是通过地址找到对象的。所以我们又将这种传递叫做引用传递

引用传递

image-20210512091602226

  • 上面是我们一个案例代码。在logMap方法中将map打印的功能。此时我们看到外部也是没有变化的

image-20210512091649164

  • 但是如果我们在logMap中对参数做了结构上的改动的话。那么我们外部也就变化了

image-20210512091909270

  • 为什么会发生这样,上面也说了是将地址的值传递过去了。原理我们可以看如下

image-20210512093048670

值传递

	public static void main(String[] args) throws InterruptedException {
        int index = 0;
        add(index);
        System.out.println(index);
    }

    private static void add(int index) {

        index = index + 1;
    }
  • 但是我们传递基础类型是就不会发生变化。因为我们方法这件试讲内容直接复制的。

总结

  • 值传递我们理解成电脑里的复制 。复制过去的一份与原始数据没有关系 。 只是初始内容一致而已
  • 引用传递我们理解成桌面的快捷方式。操作的还是相同的一份

原创不易、多谢点赞