java BigDecimal和RoundingMode的疑惑

哎哎哎哎啊 发布于 2012/11/21 10:30
阅读 1K+
收藏 1

以下的例子看源码后的疑问:

例子如下:

BigDecimal bd = new BigDecimal(6.876);

bd = bd.setScale(3, RoundingMode.UP);

然后进入BigDecimal的源码看到的是调用的这个方法:

public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
        return setScale(newScale, roundingMode.oldMode);
    }

方法调用没什么问题,但是产生的第一个疑问:

roundingMode.oldMode这个为什么可以这样调用,因为RoundingMode的源码中对这个变量是这样定义的:

final int oldMode;

仅此一句而已,这里oldMode为什么可以直接用roundingMode.oldMode这样调用?实例. 有这样的用法吗?我自己创建了一个跟RoundingMode一模一样的类,但是.的时候没有这个

第二个疑问:

return setScale(newScale, roundingMode.oldMode);

这里调用的是BigDecimal类的这个方法:

public BigDecimal setScale(int newScale, int roundingMode) {}
这里第二个参数是int型,也就是说roundingMode.oldMode为int型,但是RoundingMode中的oldMode只做了声明,并没有初始化,这里难道是运行的时候默认赋值0了,但是赋值0也不对嘛,如果这样的话,roundingMode就永远是0了,而不是我传进来的RoundingMode的值了,这是什么个道理,希望高手可以解答一下
加载中
0
享开发
享开发

1,在java中objectName.methodName 或者objectName.fieldName是最正常不用过的写法.估计楼主的疑惑主要是由于平时用getter用多了,一时忘记这种用法了.代码final int oldMode;中没有访问修饰符,所以同一个包的其它类使用objectName.fieldName是没有问题的

2,final的意义在于运行的时候值或者引用不允许改变,所以final变量 可以在实例化的时候在构造方法中进行初始化.

0
蒋运军
蒋运军

建议你看一下enum的用法你就知道了

这里已经有实例化一个enum的对象了。

或者你看看源码吧

UP(BigDecimal.ROUND_UP) 


private RoundingMode(int oldMode) {
        this.oldMode = oldMode;
    }
0
陶邦仁
陶邦仁

可以把源码贴上来,帮你分析分析

0
哎哎哎哎啊
哎哎哎哎啊
恩 明白了 是我对enum的理解不够 
返回顶部
顶部