一个 Java 的问题,来这里问下,这问题很白痴吗。。怎么我在 segmentfault 提问被踩了两次,又没一个人肯回答一下。。

2019-11-30 09:59:47 +08:00
 so2back

好像不能发图片,我直接复制一下自己用来解释的代码,应该能看得懂说什么吧。。。我就想问问 generateMap 这个方法是能够实现的了的吗。。


public static void main(String[] args) { String name = "abc"; Integer age = 20; List<string> hobby = new ArrayList(); hobby.add("run"); hobby.add("swim"); // 这里直接调用方法,放入想要生成 map 的参数 generateMap(name, age, hobby); }</string>

public static Map generateMap(Object... entrys) {
    // 然后在这里根据接到的可变参数,生成一个 map,生成的 map 如下,就是根据收到的参数的名称对应放进去

// Map map = new HashMap(); // map.put("name", name); // map.put("name", age); // map.put("name", hobby); }

10199 次点击
所在节点    Java
86 条回复
wysnylc
2019-12-02 16:51:21 +08:00
@greenlaw110 #79 https://www.baeldung.com/java-pass-by-value-or-pass-by-reference 这是根据 java pass by reference 搜出来的结果,底下有这样的内容总结
翻译一下:
1.对于基本类型,参数是按值传递
2.对于对象类型,对象引用是按值传递
那么他这里是说将"引用"当成了对象的值传递
所以我开始说你被误导了,关键在于"值"的定义
wysnylc
2019-12-02 16:55:45 +08:00
@greenlaw110 #78 这里没有交换是因为他们是基本类型,如果你理解的值传递和引用传递是"值传递为传递对象的值的副本,引用传递为传递对象本身" 那么你认为 java 没有引用传递你就错了
而如果你认为"引用"是值的一种所以 java 只是值传递,那么你就被"一切传引用其实本质上是传值"误导了
greenlaw110
2019-12-02 18:12:10 +08:00
@wysnylc 我觉得还是从字面上来讲比较好一点.

中文 英文
传值 pass by value
传引用 pass by reference

这里的中文表达并没有清晰地传递英语原意. 更准确地将应该是:

按照值方式传递函数形参 - 有拷贝发生
按照引用方式传递函数形参 - 无拷贝发生

你刚刚引用的 java-pass-by-value-or-pass-by-reference 中有下面一段话

A Java object, in contrast to Primitives, is stored in two stages. The reference variables are stored in stack memory and the object that they're referring to, are stored in a Heap memory.

Whenever an object is passed as an argument, an exact copy of the reference variable is created which points to the same location of the object in heap memory as the original reference variable.


上面第一部分将 Java 存放引用类型的机制说明地很清楚, 引用变量存储的是引用类型数据的内存地址, 也就是说变量本身的值就是引用类型数据的指针. 正因为如此, 传递引用变量的时候对值做了拷贝, 你将引用类型数据的地址通过值传递(拷贝)进了函数形参, 所以你可以操作这个引用类型数据, 但引用本身是没有传递进函数的, 因此我上面的 swapnum 函数不可能交换数据. 这个机制在第二部分说明的很清楚. 你上面说没有交换是因为他们是基本类型, 这个说法完全不正确, 因为在我上面的代码中我使用的是 Integer 而不是 int, 基本类型的包装类型, 即引用对象类型.

另一方面讲, 中文的表达 "传值" 和 "传引用" 也有 "传递值到函数形参" 和 "传递对象引用到函数形参" 的味道, 这个可能是中文传值, 传引用容易引起误解的部分原因吧.
greenlaw110
2019-12-02 18:22:15 +08:00
@wysnylc 我不清楚你为啥总是说我被 "一切传引用其实本质上是传值" 这句话误导. 实际情况是我在今天之前没有看到过这句话, 而且我也完全不同意这句话的说法. 传值隐含的语义是拷贝, 传引用是没有拷贝发生的, 这句话根本上就是错的.
wysnylc
2019-12-02 18:38:22 +08:00
@greenlaw110 #84 两种方式的本质是相同的,不同处在于对"值"的解释不同
你认为引用是没有拷贝发生,但是我认为引用是引用原来的对象
以后我还是改口成值传递,保持一致比较好,我们的本意是一样的
greenlaw110
2019-12-02 18:52:11 +08:00
@wysnylc 嗯嗯, 这个地方的确有点绕. 因为我以前做过 C++ 项目,对引用有另外的了解. 总的来说引用是一种安全地传递指针(即地址)的方式, 但这个地址不是 Java 引用类型对象的地址, 而是当前堆栈上变量的指针. 如果说一种简单地方法来判断是否为引用传递, 只需要看看方法内的引用改变会不会反馈到调用方法(外层堆栈)上就可以了. 也就是我上面那个 swapnum 方法做的事情

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/624528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX