Java多态性是解耦与扩展的关键,通过Formattable接口统一格式化契约,各实现类自主决定打印逻辑,Printer仅依赖接口调用format(),支持策略扩展与toString自然融合。

Java中的多态性不是语法糖,而是解耦与扩展的关键。要设计通用的打印与格式化输出方法,核心在于让不同对象自己决定“怎么被打印”,而不是由调用方硬编码判断类型。
统一接口:定义可格式化的契约
不依赖具体类,而是面向行为抽象。定义一个 Formattable 接口,声明获取格式化字符串的能力:
public interface Formattable {
String format();
}
所有需要支持通用打印的类(如 User、Order、Product)都实现它。例如:
public class User implements Formattable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String format() {
return String.format("User{name='%s', age=%d}", name, age);
}
}
通用打印器:只认接口,不问实现
编写一个静态工具方法或工具类,参数类型是 Formattable,而非某个具体类:
立即学习“Java免费学习笔记(深入)”;
public class Printer {
public static void print(Formattable obj) {
System.out.println(obj.format());
}
public static void printList(List<Formattable> list) {
list.forEach(Printer::print);
}
}
这样调用时完全无需 instanceof 或 switch:
Printer.print(new User("Alice", 30));Printer.print(new Order("ORD-001", 299.99));Printer.printList(Arrays.asList(new User("Bob", 25), new Product("Laptop", 5999.0)));
按需定制格式:引入格式策略参数
若需同一对象支持多种输出风格(如 JSON、简略、详细),可升级接口为带格式标识的方法:
public interface Formattable {
String format(); // 默认格式
String format(String style); // 扩展格式
}
实现类内部根据 style 分支处理,外部仍保持统一调用入口。例如:
user.format("json") → {"name":"Alice","age":30}user.format("brief") → "Alice (30)"
避免在 Printer 中写 if-else 判断类型或风格,把决策权留给具体对象——这才是多态的本质。
配合 toString 的自然融合
让 format() 成为 toString() 的默认实现,既兼容 JDK 习惯,又不破坏多态结构:
public class User implements Formattable {
// ... 字段和构造方法
@Override
public String format() {
return String.format("User{name='%s', age=%d}", name, age);
}
@Override
public String toString() {
return format(); // 复用逻辑,不重复写
}
}
这样一来,日志打印、调试输出、集合 toString 等场景自动受益,无需额外适配。



















