NumberFormat nf=NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
double er = 1254.697;
String tr = nf.format(er);
System.out.println (tr);搞不懂,不是说抽象类不能实例化吗?为什么这里可以。
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
double er = 1254.697;
String tr = nf.format(er);
System.out.println (tr);搞不懂,不是说抽象类不能实例化吗?为什么这里可以。
NumberFormat.getNumberInstance()
难道说可以通过抽象类的方法获得它的实例?
return getInstance(Locale.getDefault(), NUMBERSTYLE);
}// =======================privates=============================== private static NumberFormat getInstance(Locale desiredLocale,
int choice) {
/* try the cache first */
String[] numberPatterns = (String[])cachedLocaleData.get(desiredLocale);
if (numberPatterns == null) { /* cache miss */
ResourceBundle resource = LocaleData.getLocaleElements(desiredLocale);
numberPatterns = resource.getStringArray("NumberPatterns");
/* update cache */
cachedLocaleData.put(desiredLocale, numberPatterns);
}
DecimalFormatSymbols symbols = new DecimalFormatSymbols(desiredLocale);
int entry = (choice == INTEGERSTYLE) ? NUMBERSTYLE : choice;
DecimalFormat format = new DecimalFormat(numberPatterns[entry], symbols);
if (choice == INTEGERSTYLE) {
format.setMaximumFractionDigits(0);
format.setDecimalSeparatorAlwaysShown(false);
format.setParseIntegerOnly(true);
} else if (choice == CURRENCYSTYLE) {
format.adjustForCurrencyDefaultFractionDigits();
} return format;
}
首先抽象类不能创建抽象类的实例,这里调用抽象类的静态方法NumberFormat.getNumberInstance();
从上面代码中可以看到NumberFormat.getNumberInstance()返回了DecimalFormat 类型的format,而DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。
所以实际上是创建了一个子类实例返回,后用抽象的父类类型NumberFormat来转换子类实例format。
所以不违背抽象类不能创建抽象类的实例这条规则!!如有不对,请指教