如果类的toString()方法没有被重写(或重载),并且在类中定义了另一个返回字符串的方法,那么当我传递一个需要String的类的实例时会发生什么?
答案 0 :(得分:1)
如果您的课程延伸Object
,您将获得Object#toString()
的结果,这将被称为。如果您的类扩展了其他内容,它将获得继承路径中的第一个#toString
。
答案 1 :(得分:0)
不允许使用期望String的类的名称。请考虑以下事项:
class Foo {}
class Bar {
public void baz(String a) {
// Do something
}
public void binky() {
baz(Foo); // Compiler error
}
}
但是,您可以执行以下操作:
class Foo {}
class Bar {
public void baz(String a) {
}
public void binky() {
Foo b = new Foo();
baz(b.toString());
}
}
因为没有覆盖类Foo的.toString()方法,所以将从Object类继承默认的.toString()。此默认行为将打印一个字符串,该字符串由对象为实例的类的名称,符号字符@'以及对象的哈希码的无符号十六进制表示形式组成。 (谢谢凯文!)
答案 2 :(得分:0)
有趣的事实:测试此问题比在Stack Overflow上提出问题并获得答案需要更少的时间。
正如您所知,您直接或间接创建的每个类都继承自全能的Object
类!如果您不覆盖toString
,则调用toString
将导致调用最近祖先的toString
方法。
假设A
继承自B
继承自C
的{{1}}。只有D
已覆盖C
。
toString
我希望你能理解。
实际上,Calling toString on an object of... will result in calling the toString of...
A C
B C
C C
D Object
不仅表现得像这样。 每种方法都可以做到这一点!
现在您知道toString
将被调用。它实际上做了什么?
从this answer开始,我们知道Object.toString
输出的内容如下:
Object.toString
FullyQualifiedNameOfYourClass@12345
基本上是指您的班级名称,后跟其所在的包裹,例如FullyQualifiedNameOfYourClass
。
com.example.MyClass
是对象的哈希码,由12345
在对象上返回。
所以hashCode()
会打电话给你的一个班级'返回字符串的方法,如果你曾声明一个?
不。因为它没有。 Object.toString
的文档清楚地表明它只返回toString
之类的内容,而不是其他内容。
即使它确实如此,也没有意义。如果您声明了两个返回字符串的方法怎么办?它应该选择哪一个?此外,反思需要时间并且会减慢整个过程。