我试图在小型Java控制台程序中尝试在运行时引用对象的名称,但我无法做到。我的控制台一直在返回" VirtualFriend @ 17dfafd1"而不是我在参数中传递的VirtualFriend对象的实际名称。如何将其转换为显示对象名称而不是其哈希码的实际String?以下是参考代码:
opacity
答案 0 :(得分:2)
每当我们希望任何类以字符串形式表示自己时,就会调用toString()
函数。它在Object
类中定义。所以它将在每个班级。此toString()
函数返回类的名称及其哈希码。
如果您想改变它的行为,只需覆盖此功能。
@Override
public String toString(){
return myName;
}
答案 1 :(得分:1)
您需要在print语句中调用other.getName()
。名为name
的变量在Java中没有特殊含义;当它看到一个与字符串连接的对象时,它会尝试在该对象上调用toString()
方法。如果该对象没有定义toString()
,那么(通过object
对象的继承)它会调用"default" toString()
方法,该方法返回您观察到的字符串;类名@哈希码。
答案 2 :(得分:1)
当您使用+
运算符来连接字符串时,如果另一个是字符串,Java将允许您将任何对象用作操作数之一。在这种情况下,对该对象进行隐含的toString()
调用。所以你的println
实际上是这样的:
System.out.println("Hi there " + other.toString() + ". It's nice "
+ "to meet you. My name is " + myName.toString() + ".");
所有对象都有toString()
,但默认情况下,结果看起来像Class@xxxxxxxx
,其中x是十六进制数字。如果你想要一个看起来合理的toString()
,你必须在班上自己覆盖它:
@Override
public String toString() {
return <whatever String expression you want>;
}
Java定义的许多类已经有toString()
个覆盖。 String
类型本身已覆盖toString()
,它只返回字符串(因此myName.toString()
与myName
相同)。但是你自己的类不会有内置的覆盖。 (此外,数组没有覆盖toString()
,您需要使用Arrays.toString(arr)
从数组中生成一个字符串。)
答案 3 :(得分:1)
- 每当我们打印任何java对象时,默认情况下会打印类似@ xxxx ...
的内容- 但是如果你想用它的关联值打印对象,那么你需要覆盖该类中的toString()方法。