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

问题描述 投票:0回答:4

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

System.out.println(intarray);

这是输出“[I@7852e922”

如果java是按值传递的,那么该语句不应该返回数组的值而不是对象引用。这是我使用的修复方法。

System.out.println(Arrays.toString(intarray));
java arrays pass-by-reference
4个回答
6
投票

这与 Java 按值传递无关。

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

Object
toString
的默认实现会打印您所说的“乱码”(由表达式
getClass().getName() + "@" + Integer.toHexString(hashCode())
生成)。数组类不会覆盖该实现。因此,
System.out.println(intarray)
打印出“乱码”。

另一方面,

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


2
投票

当你这样做时

System.out.println(myObj);

通过调用

myObj
,将对象
String
转换为可打印格式(即
myObj.toString()
)。

如果一个对象没有提供自己的

toString()
实现,它会从
toString()
继承
Object
,它返回对象的类名与对象的哈希码连接,如下(javadoc):

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

数组从

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


1
投票

Java传递的是引用的值

intarray
,也就是说传递的是数组的地址。

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


1
投票

这里Java是否按值传递并不重要。它打印哈希码的原因是因为数组是 Java 中的对象。

当您尝试使用

System.out.println()
在 Java 中打印对象时,将显示该对象的字符串表示形式。也就是说,Array(继承自Object类)的
toString()
方法将被隐式调用,从而给你所谓的“乱码”。

© www.soinside.com 2019 - 2024. All rights reserved.