【问题标题】:How come printing a string(an Object) in java prints it?如何在 java 中打印一个字符串(一个对象)来打印它?
【发布时间】:2015-02-21 18:21:31
【问题描述】:

当我们这样做时:

String string = new String("Ralph");
//This creates a reference called string that points to a sequence of 
//characters in memory

这与:

String string = "Ralph"; 

当我们打印两者时,我们得到字符串的实际值。 如果我们在 Java 中打印任何其他对象,我们将获得该对象的地址。 我的问题是,幕后是否有任何取消引用?

【问题讨论】:

  • 对于任何其他对象,您得到的是它的toString() 方法,而不是“地址”。 ObjecttoString() 打印其类名和哈希码。
  • String 覆盖 Object.toString() 方法。所有其他类也可以这样做。如果这样做,则在打印对象时将打印返回的字符串。
  • 来自 docs (docs.oracle.com/javase/1.5.0/docs/api/java/lang/…) - “这个对象(已经是一个字符串!)本身就被返回了。”

标签: java string object


【解决方案1】:

当您将对象引用传递给System.out.println() 方法时,对于 例如,调用对象的toString()方法,toString()的返回值如下例所示:

public class HardToRead {
    public static void main (String [] args) {
        HardToRead h = new HardToRead();
        System.out.println(h);
    }
}

运行 HardToRead 类给我们带来了可爱而有意义的东西,

% java HardToRead
HardToRead@a47e0

现在, 尝试阅读此输出可能会促使您覆盖 toString() 例如,您的类中的方法,

public class BobTest {
    public static void main (String[] args) {
        Bob f = new Bob("GoBobGo", 19);
        System.out.println(f);
    }
}

class Bob {
    int shoeSize;
    String nickName;
    Bob(String nickName, int shoeSize) {
        this.shoeSize = shoeSize;
        this.nickName = nickName;
    }
    public String toString() {
        return ("I am a Bob, but you can call me " + nickName +". My shoe size is " + shoeSize);
    }
}

这应该更具可读性:

% java BobTest
我是 Bob,但你可以叫我 GoBobGo。我的鞋码是 19

【讨论】:

    【解决方案2】:

    String 类是 Java 中的一个特殊类。 但它的打印方式与其他所有课程一样。 如果我们调用 System.out.println("Ralph") 函数 println 获取该字符串,然后显示它。

    实现了类ObjectstoString()方法,所以它通过调用hashCode()函数来显示Object的哈希码。如果你覆盖toString() 方法,它会显示别的东西。

    如果您获取除String 之外的任何对象并将其提供给采用String 的方法(或者实际上将其转换为String),java 将调用该对象的toString() 方法,将其转换为String

    所以“打印”总是做同样的事情,只是以不同的方式实现,使用 toString() 方法。

    【讨论】:

    • 再一次,不是内存地址。当然不是在 int 是 32 位的 64 位系统中。它是对象的哈希码。
    【解决方案3】:

    new String("Ralph") 复制文字字符串的字符数据数组并将其存储在新的 String 实例中。

    但是,您只能在打印对象时获取该对象的地址,因为打印使用该对象的toString() 方法。如果没有实现该方法,则使用Object 中定义的默认实现,它返回类名和哈希码(如果没有实现hashCode(),这似乎是一个地址)。

    【讨论】:

    • 不参考。哈希码,来自hashCode() 方法。十六进制。
    • 我知道,但是如果hashCode()没有实现,它是参考ID。
    • 然后定义“参考 ID”。它可能基于对象的内存地址,但这不是语言的要求,在 64 位系统中肯定需要一些操作。
    • 我认为这与问题无关,我只是向他指出。但是通过引用 ID,我的意思是身份哈希码。
    【解决方案4】:

    我相信主要类型使用自动取消引用String, int, float, etc. 打印,而主要类型以外的对象仅使用在对象级别实现的取消引用功能object.toString()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2021-10-25
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多