JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

java 核心技术-12版 卷Ⅰ- 5.2.5 toString 方法

wys521 2024-11-28 09:01:00 精选教程 18 ℃ 0 评论

原文

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 对象的形式返回这个类的超类

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表