【问题标题】:why need of "println(char[] x)" when there is already "println(Object x)" - java为什么在已经存在“println(Object x)”时需要“println(char [] x)” - java
【发布时间】:2018-01-22 18:20:19
【问题描述】:

我正在阅读有关 println 函数的信息,发现有 println(char[ ] x) 以及 println(Object x)
@987654321 @

我的问题是: 由于 java 中的数组是对象,所以需要 特别地 用 char[] 重载 println() 而其余数组如 int[]等使用 println(Object x) 重载函数。

【问题讨论】:

  • 可能是因为不可能在char[] 上实现toString(),即charCharacter 不同。
  • 您可以尝试Object o = "abc".toCharArray(); System.out.println(o); 看看如果将数组传递给对象重载会发生什么。
  • 你试过两者来看看有什么不同吗?

标签: java arrays char


【解决方案1】:
 println(Object x)

如果你用它来打印一个 char 数组(char 数组是一个对象),它不会打印内容而是 objectClass@hashcode 样式。您可以自行测试以查看确切的输出。

【讨论】:

  • 是的,我知道这是仪式,其他数组类型也是如此......但这就是产生疑问的地方,为什么 println 只用 char[] 而不是其他数组类型重载跨度>
  • 因为您很可能会将字符串和字符数组打印为字符串算法的一部分。在一条线上实施是直截了当的。就好像你想要打印你的数组对象 - 那更自定义..你想要它们在一行吗?或逗号分隔..非编译器的业务
【解决方案2】:

因为它们的实现方式不同。

println(Object)

将(在检查null等之后)调用参数的toString()方法并显示它的结果。

数组的toString() 方法没有用:它会给你数组类型和数组的哈希码。所以重载形式在char[]参数的情况下提供了更有用的实现。

请注意,对于大多数对象类型,toString() 方法可以被覆盖(因此没有必要(或可能......)为每种可能的类型重载 println(...) 方法。但是,toString() 方法不能被数组覆盖,因此在这种情况下重载println 有好处。

【讨论】:

  • 我仍然无法得到它的好处。假设这个 func "println(char[] x)" 不存在,那么我们仍然可以使用 for 循环获取 char[] 的内容,可以使用 valueOf() 将其转换为字符串,甚至可以获取数组类型和哈希码等...就像任何其他数组类型一样,即 int[]、float[] 等。
  • @Adi 好处是您不必在每次想要显示chars 数组时编写for 循环或进行转换。 (我认为它也会进行空值检查,因此您也不必自己进行这些检查。)您可以提出同样的论点,即您并不真正需要 println(int) 等(您可以使用 Integer.toString(...))甚至 @ 987654334@(使用println(obj == null ? "null" : obj.toString()))。它们只是让使用更方便。
  • 感谢您的解释并帮助我解决疑惑
  • @Adi 题外话:你的意思是“问题”,而不是“怀疑”。 “问题”和“怀疑”在用作动词时可以是同义词(“我怀疑……”与“我怀疑……”大致相同),但它们作为名词具有完全不同的含义(a “怀疑”是对某事错误的怀疑;问题只是您提出的问题。
  • *帮我解决问题。
【解决方案3】:

因为它将 char 数组打印为字符串,否则以对象形式打印,并且查看内容可能更方便。您可以先尝试将其强制转换为对象,然后查看差异。

【讨论】:

    【解决方案4】:

    因为print/ln(char[]) 处理字符的实际打印,所以数组对象本身的toString() 仍然提供通常的类型+哈希输出,不管是字符数组

    char c[]={'a','b','c'};
    Object o=c;
    System.out.println(c);
    System.out.println(c.toString());
    System.out.println(o); // *
    System.out.println(o.toString());
    

    * 的东西很有趣(这就是我发帖的原因,因为其余的已经在其他答案中了)因为它表明 Java 具有单一调度:要调用的实际方法是在编译时间决定的,基于在参数的声明类型上。所以 o 在运行时是一个字符数组并不重要,在编译时它似乎是一个Object,因此将为其调用print/ln(Object)

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      相关资源
      最近更新 更多