簡體   English   中英

為什么 NumberFormat class 中的格式方法調用子類格式方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM