Java 未重写时对象的toString()行为

Java 未重写时对象的toString()行为,java,Java,如果一个类的toString()方法未被重写(或重载),并且在该类中定义了另一个返回字符串的方法,那么当我传递该类的一个实例时,会发生什么情况?如果您的类扩展了对象,您将得到对象#toString(),这就是我们所说的。如果您的类扩展了其他内容,它将获得继承路径中的第一个#toString。不允许使用需要字符串的类的名称。考虑以下事项: class Foo {} class Bar { public void baz(String a) { // Do something }

如果一个类的toString()方法未被重写(或重载),并且在该类中定义了另一个返回字符串的方法,那么当我传递该类的一个实例时,会发生什么情况?如果您的类扩展了
对象
,您将得到
对象#toString()
,这就是我们所说的。如果您的类扩展了其他内容,它将获得继承路径中的第一个
#toString

不允许使用需要字符串的类的名称。考虑以下事项:

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());
  }
}
但是,您可以执行以下操作:

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()方法未被重写,您将从对象类继承默认的.toString()。此默认行为将打印一个字符串,该字符串由对象作为实例的类的名称、at符号字符@'和对象哈希代码的无符号十六进制表示形式组成。(谢谢Kevin!)

有趣的事实:测试这一点比问一个关于堆栈溢出的问题并得到答案花费的时间要少

您可能知道,您创建的每个类都直接或间接地继承自全能的
对象
类!如果不重写
toString
,调用
toString
将导致调用最近祖先的
toString
方法

假设
A
继承自
B
,后者继承自
C
,后者继承自
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
的行为不仅如此。每种方法都可以做到这一点

现在您知道了对象。将调用toString。它实际上做什么

从中,我们知道
Object.toString
输出如下内容:

FullyQualifiedNameOfYourClass@12345
FullyQualifiedNameOfYourClass
基本上是指你的类名,后面是它所在的包,例如
com.example.MyClass

12345
是对象的hashcode,由对象上的
hashcode()
返回

因此,
Object.toString
是否会调用类中返回字符串的方法之一(如果您声明了字符串的话)

没有。因为事实并非如此。
toString
的文档清楚地表明它只返回类似
FullyQualifiedNameOfYourClass@12345
没有其他内容


即使是这样,也毫无意义。如果声明了两个返回字符串的方法呢?它应该选择哪一个?而且,反射需要时间,会减慢整个过程。

试试看。这是一个简单易行的测试。否则,请认真阅读文档。认真地说:不要为那些可以轻松测试的东西写问题。一个好的程序员的核心品质之一是好奇心——那种让你尝试东西的好奇心。你通过做编程来学习编程,而不是问别人这些基本的事情。我住在一家没有笔记本电脑和带有java编译器的电脑的旅馆里,我是从一个陌生的环境中学习java的book@karthikeyan如果您可以登录到堆栈溢出,这意味着您必须具有Internet连接。那么为什么不downlload JDK呢?不是返回字符串的方法返回的字符串。答案已更新,现在正式正确。
类对象的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符@'和对象哈希代码的无符号十六进制表示形式组成。
它不是内存地址。从
的文档到字符串