NumberFormat nf=NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
double er = 1254.697;
String tr = nf.format(er);
System.out.println (tr);搞不懂,不是说抽象类不能实例化吗?为什么这里可以。

解决方案 »

  1.   

    没有实例化呀!只是通过getNumberInstance()获得了一个对象!
      

  2.   

    是不能用new实例化吧这里并没有调用new生成新实例呀
      

  3.   

    nf是NumberFormat的实例吗?
    NumberFormat.getNumberInstance()
    难道说可以通过抽象类的方法获得它的实例?
      

  4.   

    在sun jdk 5.0中 java.text.NumberFormat.java  public final static NumberFormat getInstance() {
            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。
       所以不违背抽象类不能创建抽象类的实例这条规则!!如有不对,请指教
      

  5.   

    程序没问题啊,就是没有实例化,只是通过getInstance()得到一个对象而已,