[英]Why is format method from NumberFormat class calling subclass format method?
我有一個 Main.java 並且在主要方法中我有以下代碼:
totalSalaries = 14000;
System.out.printf("The total payout should be %s%n", currencyInstance.format(totalSalaries));
我試圖在調試模式下運行上面的語句,以了解格式化方法如何被調用的遍歷。
當你進入上面的格式化方法時,它又調用下面的屬於 NumberFormat class 的格式化方法(其中 NumberFormat 擴展 Format)
public final String format(long number) {
return format(number, new StringBuffer(),
DontCareFieldPosition.INSTANCE).toString();
}
然后,單擊此返回塊中上面(NumberFormat 類的)格式方法,它似乎落在下面,它是 DecimalFormat class 的一部分(其中 DecimalFormat 擴展了 NumberFormat)。
@Override
public StringBuffer format(long number, StringBuffer result,
FieldPosition fieldPosition) {
fieldPosition.setBeginIndex(0);
fieldPosition.setEndIndex(0);
return format(number, result, fieldPosition.getFieldDelegate());
}
有人可以解釋一下為什么 NumberFormat class 正在調用它的子類 DecimalFormat 的格式方法嗎? 應該不可能吧? 謝謝你的幫助
首先要觀察的是NumberFormat
是一個抽象的 class:
public abstract class
NumberFormat
這意味着當您調用NumberFormat.getCurrencyInstance();
您將得到的是NumberFormat
的具體子類的一個實例——在大多數情況下,它可能是一個DecimalFormat
實例。
NumberFormat
中的format(long number)
方法是
public final String format(long number) {
return format(number, new StringBuffer(),
DontCareFieldPosition.INSTANCE).toString();
}
它調用在NumberFormat
中聲明為抽象方法的方法format(long number, StringBuffer toAppendTo, FieldPosition pos)
:
public abstract StringBuffer format(long number,
StringBuffer toAppendTo,
FieldPosition pos);
要使 class 成為可實例化的,它不能有任何抽象方法——如果它擴展了一個抽象基類 class,它必須實現其父 class 的所有抽象方法。如果您查看DecimalFormat
的實現,它會實現該方法:
public StringBuffer format(long number, StringBuffer result, FieldPosition fieldPosition) { fieldPosition.setBeginIndex(0); fieldPosition.setEndIndex(0); return format(number, result, fieldPosition.getFieldDelegate()); }
您在調試器中看到的(它逐步執行NumberFormat
中的format
方法,然后調用DecimalFormat
中的format
方法)是由於在NumberFormat
class 中聲明了方法format(long number)
。然而,currencyInstance 始終是DecimalFormat
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.