
在java中,java.text.numberformat 是一个抽象类,它提供了一系列用于格式化和解析数字的抽象方法。由于它是抽象的,我们不能直接创建 numberformat 的实例。相反,我们通常通过其静态工厂方法来获取具体的实现类实例,例如 numberformat.getcurrencyinstance()。这个方法会根据当前的默认语言环境返回一个 numberformat 的具体子类实例,最常见的就是 java.text.decimalformat。
这意味着,当你编写如下代码时:
totalSalaries = 14000;
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
System.out.printf("The total payout should be %s%n", currencyInstance.format(totalSalaries));尽管 currencyInstance 变量的类型是 NumberFormat,但它实际指向的运行时对象是一个 DecimalFormat 的实例。这是Java多态性(Polymorphism)的一个经典体现。
当我们在 currencyInstance 对象上调用 format(long number) 方法时,调试器可能会显示一个看似矛盾的调用路径,即从 NumberFormat 类的方法跳到 DecimalFormat 类的方法。这正是Java中抽象类、final 方法和动态方法分派协同工作的结果。
让我们分解这个调用过程:
立即学习“Java免费学习笔记(深入)”;
初始调用: 你的代码调用的是 currencyInstance.format(totalSalaries)。由于 currencyInstance 实际是一个 DecimalFormat 实例,所以最终会执行 DecimalFormat 中的方法。
NumberFormat 中的 final 方法: NumberFormat 类中定义了一个 public final String format(long number) 方法。这个方法是 final 的,意味着子类不能重写它。它的实现如下:
public final String format(long number) {
return format(number, new StringBuffer(),
DontCareFieldPosition.INSTANCE).toString();
}这个 final 方法的内部,它又调用了 format(long number, StringBuffer toAppendTo, FieldPosition pos) 方法。
NumberFormat 中的抽象方法: 在 NumberFormat 类中,format(long number, StringBuffer toAppendTo, FieldPosition pos) 方法被声明为 public abstract:
public abstract StringBuffer format(long number,
StringBuffer toAppendTo,
FieldPosition pos);作为一个抽象方法,它没有具体的实现,必须由 NumberFormat 的具体子类来提供。
DecimalFormat 中的实现: 由于 DecimalFormat 是 NumberFormat 的一个具体子类,它必须实现所有继承的抽象方法。因此,DecimalFormat 中提供了 format(long number, StringBuffer result, FieldPosition fieldPosition) 方法的具体实现:
@Override
public StringBuffer format(long number, StringBuffer result,
FieldPosition fieldPosition) {
fieldPosition.setBeginIndex(0);
fieldPosition.setEndIndex(0);
return format(number, result, fieldPosition.getFieldDelegate());
}请注意,这个 DecimalFormat 中的 format 方法又进一步调用了其内部的另一个 format 方法,这通常是其核心格式化逻辑所在。
当你通过 currencyInstance.format(totalSalaries) 调用方法时,Java虚拟机(JVM)会执行以下步骤:
这就是为什么你在调试时会看到方法从父类 NumberFormat 跳转到子类 DecimalFormat 的现象。NumberFormat 中的 final 方法提供了一个统一的入口和一些公共逻辑,而将具体、可变的核心格式化逻辑委托给了其抽象方法,由子类实现。这种设计模式允许 NumberFormat 定义通用的行为框架,同时让子类提供特定于其实现的细节。
通过对 NumberFormat 和 DecimalFormat 中 format 方法调用链的分析,我们深入理解了Java中几个关键的面向对象概念:
这种设计使得Java的数字格式化API既灵活又强大,能够适应各种复杂的格式化需求,同时保持了清晰的类层次结构。
以上就是Java NumberFormat format 方法:深入理解多态与抽象类的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号