toString()未覆盖时对象的行为

时间:2016-07-04 13:05:36

标签: java

如果类的toString()方法没有被重写(或重载),并且在类中定义了另一个返回字符串的方法,那么当我传递一个需要String的类的实例时会发生什么?

3 个答案:

答案 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之类的内容,而不是其他内容。

即使它确实如此,也没有意义。如果您声明了两个返回字符串的方法怎么办?它应该选择哪一个?此外,反思需要时间并且会减慢整个过程。