网站首页 > 精选教程 正文
原文
5.2.5 toString 方法
Object 中还有一个重要的方法,就是 toString 方法,它会返回一个字符串,表示这个对象的值。下面是一个典型的例子。Point 类的 toString 方法将返回类似下面的字符串:
java.awt.Point[x=10,y=20]
绝大多数(但不是全部)toString 方法都遵循这样的格式:首先是类名,随后是一对方括号括起来的字段值。下面是 Employee 类中的 toString 方法的一个实现:
public String toString(){
return"Employee[name=" +name
+",salary="+salary
+",hireDay="+ hireDay
+ "]";
}
十"]";实际上,最好通过调用 getClass().getName()获得类名的字符串,而不要将类名硬编码写到toString方法中。
public String toString(){
return getClass().getName()
+"[name=" + name
+",salary="+ salary
+",hireDay="+ hireDay
+"]";
}
这样的 toString方法也适用于子类。当然,设计子类的程序员应该定义自己的 toString方法,并加入子类的字段。如果超类使用了 getClass().getName(),那么子类只要调用 super.toString()就可以了。例如,下面是Manager类中的toString方法:
public class Manager extends Employee
public String toString(){
return super.toString()+"[bonus="+ bonus+"]";
}
现在,Manager对象将打印为:
Manager[name=...,salary=.. .,hireDay=..][bonus=...]
toString 方法无处不在,这有一个重要的原因:只要对象与一个字符中通过操作符“+"拼接起来,Java 编译器就会自动地调用 toString 方法来获得这个对象的字符中描述。例如:
var p= new Point(10,20);
String message = "The current position is"+ p;// automatically invokes p.toString()
提示:可以不写为x.toString(),而写作““+x。这条语句将一个空串与X的字符串表示(也就是x.toString()) 拼接起来。与toString不同的是,即使x是基本类型,这条语句也能正常工作。
如果x是一个任意对象,并调用
System.out.println(x);
println 方法就会简单地调用 x.toString(),并打印得到的字符串
Object 类定义了 toString 方法,会打印对象的类名和散列码。例如,调用
System.out.printIn(System.out)
将生成以下输出:
java.io.PrintStream@2f6684
之所以得到这样的结果,是因为 PrintStream类的实现者没有覆盖 toString 方法
警告: 令人烦恼的是,数组继承了 Object 类的 toString 方法,更有甚者,数组类型将采用一种古老的格式打印。例如:
int[ ] luckyNumbers = { 2, 3, 5, 7, 11,13} ;
String s =""+ luckyNumbers;
会生成字符串“[I@la46e3”(前缀 [I 表示这是一个整型(int)数组)。补教方法是调用静态方法Arrays.toString。以下代码:
String s = Arrays.toString(luckylumbers);
将生成字符串“[2,3,5,7,11,13]"。
要想正确地打印多维数组 (即数组的数组),则需要调用 Arrays.deepToString 方法。
toString方法是一种非常有用的调试工具。在标准类库中,许多类都定义了 toString方法,以便用户能够获得有关对象状态的有用信息。这在记录日志消息时尤其有用:
System.out.println("Current position ="+ position);
在第7章中将会看到,更好的解决方法是使用 Logger 类的一个对象并调用
Logger.global.info("Current position ="+ position);
提示:强烈建议为你自定义的每一个类添加 toString 方法。这样做不仅自己受益,而且使用这个类的其他程序员也会从这个日志记录支持中受益匪浅。
程序清单 5-4 的程序测试了 Employee 类(见程序清单5-5)和 Manager类(见程序清单5-6)的 equals、hashCode和 toString 方法。
程序清单5-4 equals/EqualsTest.java
package equals;
/**
* This program demonstrates the equals method.
* @version 1.12 2012-01-26
* @author Cay Horstmann
*/
public class EqualsTest
{
public static void main(String[] args)
{
var alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
var alice2 = alice1;
var alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
var bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
System.out.println("alice1 == alice2: " + (alice1 == alice2));
System.out.println("alice1 == alice3: " + (alice1 == alice3));
System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
System.out.println("alice1.equals(bob): " + alice1.equals(bob));
System.out.println("bob.toString(): " + bob);
var carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
var boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
boss.setBonus(5000);
System.out.println("boss.toString(): " + boss);
System.out.println("carl.equals(boss): " + carl.equals(boss));
System.out.println("alice1.hashCode(): " + alice1.hashCode());
System.out.println("alice3.hashCode(): " + alice3.hashCode());
System.out.println("bob.hashCode(): " + bob.hashCode());
System.out.println("carl.hashCode(): " + carl.hashCode());
}
}
程序清单5-5 equals/Employee.java
package equals;
import java.time.*;
import java.util.Objects;
public class Employee
{
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, double salary, int year, int month, int day)
{
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public LocalDate getHireDay()
{
return hireDay;
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
public boolean equals(Object otherObject)
{
// a quick test to see if the objects are identical
if (this == otherObject) return true;
// must return false if the explicit parameter is null
if (otherObject == null) return false;
// if the classes don't match, they can't be equal
if (getClass() != otherObject.getClass()) return false;
// now we know otherObject is a non-null Employee
var other = (Employee) otherObject;
// test whether the fields have identical values
return Objects.equals(name, other.name)
&& salary == other.salary && Objects.equals(hireDay, other.hireDay);
}
public int hashCode()
{
return Objects.hash(name, salary, hireDay);
}
public String toString()
{
return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay="
+ hireDay + "]";
}
}
程序清单5-6 equals/Manager.java
package equals;
public class Manager extends Employee
{
private double bonus;
public Manager(String name, double salary, int year, int month, int day)
{
super(name, salary, year, month, day);
bonus = 0;
}
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
public void setBonus(double bonus)
{
this.bonus = bonus;
}
public boolean equals(Object otherObject)
{
if (!super.equals(otherObject)) return false;
var other = (Manager) otherObject;
// super.equals checked that this and other belong to the same class
return bonus == other.bonus;
}
public int hashCode()
{
return java.util.Objects.hash(super.hashCode(), bonus);
}
public String toString()
{
return super.toString() + "[bonus=" + bonus + "]";
}
}
java.lang.Object JDK1.0
- Class getClass()
- 返回一个类对象,其中包含有关对象的信息。本章稍后会看到 Java 提供了类的运行时表示,封装在 Class 类中。
- boolean equals(0bject otherObject)
- 比较两个对象是否相等,如果两个对象指向相同的存储区域,则这个方法返回 true:否则,返回 false。要在你自己的类中覆盖这个方法。String toString()
- String toString()
- 返回一个字符申,表示这个对象的值。要在你自己的类中覆盖这个方法
java.lang.Class JDK1.0
- String getName()
- 返回这个类的名字
- Class getSuperclass()
- 以 class 对象的形式返回这个类的超类
猜你喜欢
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.3相等测试与继承
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.4 hashCode方法
- 2024-11-28 Java入门书单
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3.7 隐式参数与显式参数
- 2024-11-28 全网最完整的免费java教程讲义系列(四)——java的流程控制
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.6 对象构造 4.6.1重载
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 3.10 数组
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3 自定义类
- 2024-11-28 2019年Java核心技术我整理了200多页pdf,今天分享给你
- 2024-11-28 java 核心技术12版卷1 - 1.3 Java applet 与 Internet
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)