关于重写 toString() 方法

本文详细解析了Java中所有类都是Object的子类这一特性,并通过实例展示了为何需要重写toString()方法。文章以创建Persion类为例,说明如何自定义toString()方法以更符合实际需求。

 学习Java的人都知道,Java所有类都是object的子类。所以,所有的Java对象都可以调用object类提供的方法。其中,toString()就是其中一个。下面讲解一下为什么会有重写toString()方法一说。

 

首先,我们先来创建一个Persion类,它只简单的包含 firstname 和 lastname,当然,加上它的setter 和 getter 法。放在com.bean包下:

package com.bean;

public class Persion {
	private String firstname;
	private String lastname;
	public String getFirstname() {
		return firstname;
	}
	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}
	public String getLastname() {
		return lastname;
	}
	public void setLastname(String lastname) {
		this.lastname = lastname;
	}

}

 接下来,新建一个类,名为Test,让它包含main函数:

package com.override;

import com.bean.Persion;
public class Test {

	public static void main(String[] args) {
		Persion p = new Persion();
		p.setFirstname("Fire");
		p.setLastname("Water");
		System.out.println(p.toString());
	}

}

 可以看到,运行之后,结果为:

com.bean.Persion@c17164

 

   注:打印一个对象,可以直接System.out.println(p);其实java会自动调用p 的 toString() 方法。

 

 但是我们一般想要的结果并不是这样,因为object类的toString()方法总是返回对象的实现类类名 + @ + hashCode值。这显然不能满足我们的需求。像这里,我们是希望能打印出p的全名出来,这时,就需要重写toString()方法,因为重写了toString()之后,那么p在调用toString()方法的时候,会优先调用自己类里的toString()方法。

修改后的类如下:

 

package com.bean;

public class Persion {
	private String firstname;
	private String lastname;
	public String getFirstname() {
		return firstname;
	}
	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}
	public String getLastname() {
		return lastname;
	}
	public void setLastname(String lastname) {
		this.lastname = lastname;
	}
                //重写toString方法
	public String toString(){
		return firstname + " " + lastname;
	}
}

 

这时,打印出来的结果就是

 

Fire Water

 

当然,可根据不同的需求来编写如何打印对象。

在使用 Lombok 的 `@Data` 注解时,该注解默认会为类生成 `toString()` 方法,该方法将类中的所有非静态字段包含在返回的字符串中。如果需要自定义 `toString()` 方法的行为,可以通过以下几种方式实现: ### 1. 手动重写 `toString()` 方法 如果在类中手动定义了 `toString()` 方法,Lombok 将不会自动生成该方法。这种方式适用于需要对输出格式进行精确控制的场景。例如: ```java import lombok.Data; @Data public class Person { private String name; private int age; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` ### 2. 使用 `@ToString` 注解单独控制 Lombok 提供了 `@ToString` 注解,允许开发者对 `toString()` 方法的生成进行更细粒度的控制。例如,可以排除某些字段,或者调用父类的 `toString()` 方法。例如: ```java import lombok.Data; import lombok.ToString; @Data @ToString(exclude = "age") public class Person { private String name; private int age; } ``` 在上述示例中,`age` 字段将不会包含在生成的 `toString()` 方法的输出中[^2]。 ### 3. 使用 `@ToString(callSuper = true)` 调用父类方法 如果当前类继承自某个父类,并且希望在生成的 `toString()` 方法中包含父类的字段,可以通过设置 `callSuper = true` 来实现: ```java import lombok.Data; import lombok.ToString; @Data @ToString(callSuper = true) public class Student extends Person { private String studentId; } ``` 在这种情况下,`Student` 类的 `toString()` 方法不仅会包含自身的字段,还会包含父类 `Person` 的字段[^2]。 ### 4. 禁用 Lombok 生成的 `toString()` 方法 如果希望完全禁用 Lombok 生成的 `toString()` 方法,可以通过在类上添加 `@ToString(doNotUseGetters = true)` 或者直接手动重写 `toString()` 方法来覆盖 Lombok 的行为[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值