1 重点关注
2 课程内容
3 代码演练
3.1 核心代码 覆盖toString方法
/** * %d 整数类型(十进制) * %03d 如果小于3位,前方补0 * * 按照指定格式打印 * * @author weidoudou * @date 2022/7/7 8:29 * @param * @return java.lang.String **/ @Override public String toString(){ return String.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber); }
3.2 反例 未覆盖toString方法
实例:
package com.ddwei.test.core.chapter10.demo1; import java.util.HashMap; import java.util.Map; public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(short areaCode, short prefix, short lineNumber) { rangeCheck(areaCode, 999, "area code"); rangeCheck(prefix, 999, "prefix"); rangeCheck(lineNumber, 9999, "line number"); this.areaCode = (short)areaCode; this.prefix = (short)prefix; this.lineNumber = (short)lineNumber; } private static void rangeCheck(int arg,int max,String name) { if(arg < 0 || arg > max) throw new IllegalArgumentException(name +": "+ arg); } @Override public boolean equals(Object obj) { //1、使用==操作符检查“参数是否为这个对象的引用” if(obj == this) return true; //2、使用instanceof操作符检查“参数是否为正确的类型” if(!(obj instanceof PhoneNumber)) return false; //3、把参数转化成正确的类型 PhoneNumber pn = (PhoneNumber)obj; //4、对于该类的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配(其实就是比较两个对象的值是否相等了) return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode; } public static void main(String[] args) { short s1 = 707; short s2 = 867; short s3 = 5309; PhoneNumber phoneNumber = new PhoneNumber(s1,s2,s3); System.out.println(phoneNumber.toString()); } }
测试结果:
com.ddwei.test.core.chapter10.demo1.PhoneNumber@7699a589
Process finished with exit code 0
3.3 正例 覆盖toString方法
实例:
package com.ddwei.test.core.chapter10.demo2; public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(short areaCode, short prefix, short lineNumber) { rangeCheck(areaCode, 999, "area code"); rangeCheck(prefix, 999, "prefix"); rangeCheck(lineNumber, 9999, "line number"); this.areaCode = (short)areaCode; this.prefix = (short)prefix; this.lineNumber = (short)lineNumber; } private static void rangeCheck(int arg,int max,String name) { if(arg < 0 || arg > max) throw new IllegalArgumentException(name +": "+ arg); } @Override public boolean equals(Object obj) { //1、使用==操作符检查“参数是否为这个对象的引用” if(obj == this) return true; //2、使用instanceof操作符检查“参数是否为正确的类型” if(!(obj instanceof PhoneNumber)) return false; //3、把参数转化成正确的类型 PhoneNumber pn = (PhoneNumber)obj; //4、对于该类的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配(其实就是比较两个对象的值是否相等了) return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode; } /** * %d 整数类型(十进制) * %03d 如果小于3位,前方补0 * * 按照指定格式打印 * * @author weidoudou * @date 2022/7/7 8:29 * @param * @return java.lang.String **/ @Override public String toString(){ return String.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber); } public static void main(String[] args) { short s1 = 007; short s2 = 867; short s3 = 5309; PhoneNumber phoneNumber = new PhoneNumber(s1,s2,s3); System.out.println(phoneNumber.toString()); } }
测试结果:
(007) 867-5309
Process finished with exit code 0