怎么正确的在JAVA中打印一个对象?而不是输出SomeType@2f92e0f4?

怎么正确的在JAVA中打印一个对象?而不是输出SomeType@2f92e0f4?

我们有下面一个类:

class SomeClass {
    private String field;
    ...getter/setter
}

当我们尝试直接输出该类的时候:

System.out.println(someClass);

会得到一个奇怪的结果:

org.xiaochao.SomeClass@4e50df2e

为什么会得到这样的结果呢?怎么才能正常的输出呢?

为什么会得到一个奇怪的结果

事实上,java的每个类都是继承自Object的,Object中有几个方法,其中一个方法是toString()System.out.println被调用时,会自动调用对象的toString()方法。如果我们的类覆盖了该方法,就会调用我们实现的结果,如果未覆盖,则会调用Object的该方法。
Object实现的toString()方法如下所示:

    public String toString() {
        return getClass().getName() +
         "@" + Integer.toHexString(hashCode());
    }

因此,我们得到的输出org.xiaochao.SomeClass@4e50df2eObject的默认实现:

  • org.xiaochao.SomeClassgetClass().getName() 得到的类名称。会带着包名
  • @是中间的连接符
  • 4e50df2e是当前实例的hashCode

如何正确输出对象

自定义toString来输出对象

想要自定义输出对象的内容,我们需要实现toString()方法才行,比如说:

class SomeClass {
    private String field;

    @Override
    public String toString() {
        return "field: " + field;
    }
}

这样就可以得到一个比较好看的结果了:

field: myfield value

输出对象更好的方法

当类的数量比较多,或者是属性比较多时,自行手写toString()就很麻烦了,这里介绍几个简单的方法。

通过idea自动生成

idea可以自动生成类的toString方法,鼠标放到类里面,按住Alt+Insert,在弹出的窗口选择toString(),选择要输出的字段,就可以一键生成了。

生成结果如下:

@Override
public String toString() {
    return "SomeClass{" +
            "field='" + field + '\'' +
            '}';
}

通过lombok生成

lombok非常强大,可以通过添加注解的方式直接生成toString()

在maven中添加依赖:

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

在代码中使用:

import lombok.ToString;

@ToString
class SomeClass {
    private String field;
}

输出结果:

SomeClass(field=myfield value)

可以看到效果也是很不错的。

使用commons-lang3工具输出对象

Apache Commons-lang3 提供了非常多的实用工具。当我们拿到一个不是我们自己写的类时,可以通过它的反射工具ReflectionToStringBuilder直接打印出来对象的值,而且还可以打印对象中的对象的值。

在maven中添加依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

使用:

ReflectionToStringBuilder.toString(someClass)

输出结果:

SomeClass@37bba400[field=myfield value]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值