【问题标题】:How do I print my Java object without getting “something@677327b6” Without Overriding?如何在不覆盖的情况下打印我的 Java 对象而不获取“something@677327b6”?
【发布时间】:2016-12-02 10:38:33
【问题描述】:

我已经定义了这个方法:

    @Override
    public String toString(String line)
    {
        String[] categories = line.split("; ");
        String[] info;

        // Get the suspect's information
        info = categories[0].split(", ");
        suspect = new Person(info[0].charAt(0), Integer.parseInt(info[1]), Double.parseDouble(info[2]));
        String str = "";
        if (info[0].charAt(0) == 'M')
            str += "Male, ";
        else if (info[0].charAt(0) == 'F')
            str += "Female, ";
        else
            str += "unknown, ";
        str += Integer.parseInt(info[1]) + "'s, ";
        str += Double.parseDouble(info[2]) +"m";
        System.out.println(str);
        return str;
    }
}

当我在添加@Override 之前通过命令行运行此程序时,我得到了与此类似的输出:Detective@677327b6 in terminal。

我知道这是正在输出的哈希码。 但是,我需要它来打印我在 toString() 方法中定义的 str 。

问题是Detective类型的toString(String)方法必须重写或实现超类型方法,我唯一的解决办法是去掉@Override注解。

那么除了覆盖它们之外,还有什么其他方法可以访问正确的值呢?

【问题讨论】:

  • 如果你使用eclipse你可以去菜单source->generate toString。这样你就会得到一个 void 方法,它会打印所有数据

标签: java overriding tostring hashcode


【解决方案1】:

这不是通常在 Object 类中声明的toString 方法吗?

@Override
public String toString(String line)

对象上的那个不带任何参数...

@Override
public String toString() { ... }

line 来自哪里?

如果您将 line 存储在 (Detective?) 类本身中,那么您可以使用正确的 toString 签名。

希望这会有所帮助。

【讨论】:

  • 是的,我把它存储在侦探班里。我删除了参数,并将行初始化为空。现在我收到这些错误Exception in thread "main" java.lang.NullPointerException at Detective.toString(Detective.java:82) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131)
  • @sd2000e 不确定第 82 行是什么,但 line 是否设置为 null?使用调试器并逐步检查您的 toStirng 代码
  • 我很抱歉。我在评论中犯了一个错误。我在 toString 中将 line 初始化为 null。
  • @后面的值是哈希码。见API docs of Object.toString()Object.hashCode() 返回地址这一事实是另一回事。
  • @Jesper 我一直以为是内存地址,你说得对,我改一下答案……(你每天都学新东西……)谢谢
猜你喜欢
  • 2015-05-22
相关资源
最近更新 更多