如果 java 是按值传递的,那么为什么显示数组名称会返回乱码?[复制]

If java is pass-by-value, then why does displaying an array name return gibberish? [duplicate]

提问人:saulsebrook 提问时间:5/8/2018 最后编辑:user3437460saulsebrook 更新时间:11/14/2023 访问量:571

问:

我很困惑为什么我不能使用该语句来显示数组中的值?

System.out.println(intarray);

这是输出“[I@7852e922”

如果 java 是按值传递的,则该语句不应该返回数组的值,而不是对象引用。这是我正在使用的修复程序。

System.out.println(Arrays.toString(intarray));
Java 数组 引用传递

评论

0赞 Lutzi 5/8/2018
我认为没有方法。所以它试图显示一些它不知道如何显示的东西......ArraytoString()
0赞 nbokmans 5/8/2018
你的问题没有意义。传递值和打印对象完全不相关。如果你在谷歌上搜索过“java pass by value”,你会发现这个答案:stackoverflow.com/questions/40480/...,它特别说:“Java总是按值传递的。不幸的是,他们决定将物体的位置称为“参考”。当我们传递一个对象的值时,我们是在传递对它的引用。"
1赞 L.Spillner 5/8/2018
@Lutzi 数组(即使对于基元类型)与任何其他对象一样都是 Object,因此至少继承自 。toString()java.lang.Object
0赞 Lutzi 5/8/2018
是的,但不知道如何显示价值。并不是因为你专门化了 Object,Java 才知道如何打印它(例如,对具有两个字段的 Object 进行专业化)。
1赞 L.Spillner 5/8/2018
@Lutzi如何计算 String 的直接实现:Object.toString()

答:

1赞 Vincent Cantin 5/8/2018 #1

Java 传递了引用的值,这意味着它传递了数组的地址。intarray

它打印的内容与是否按值传递参数无关,这取决于打印方法的作用。

6赞 Eran 5/8/2018 #2

这与 Java 按值传递无关。

System.out.println(intarray)使用该方法获取传递对象的表示形式。toString()String

的默认实现 会打印您所说的“乱码”(由表达式 生成)。数组类不会重写该实现。因此,打印“胡言乱语”。ObjecttoStringgetClass().getName() + "@" + Integer.toHexString(hashCode())System.out.println(intarray)

另一方面,返回 a 列出传递的数组的元素。Arrays.toString(intarray)String

1赞 user3437460 5/8/2018 #3

在这里,Java 是否按值传递并不重要。它打印哈希码的原因是因为 Array 是 Java 中的一个对象。

当您尝试在 Java 中使用 打印 Object 时,将显示该 Object 的 String 表示形式。也就是说,Array 的方法(继承自 Object 类)将被隐式调用,从而为您提供所谓的“乱码”。System.out.println()toString()

2赞 k_ssb 5/8/2018 #4

当你这样做时

System.out.println(myObj);

通过调用 将对象转换为可打印格式(即 a)。myObjStringmyObj.toString()

如果对象没有提供自己的实现,它将继承 from ,它返回与对象的哈希码连接的对象的类名,如下所示 (javadoc):toString()toString()Object

getClass().getName() + '@' + Integer.toHexString(hashCode())

数组继承自 ,这就是你得到输出的原因。请注意,类名实际上是 ,它表示“包含原始类型 int 的数组”——您可以在此处阅读有关类名的更多信息。toString()Object[I@7852e922[I