在String实例上调用格式

时间:2016-06-24 22:41:16

标签: java

在scala花了很长时间后,我一直在看java 8。当我在浏览时陷入scala模式时,我写了类似"# instance_method:%s thread:%d".format(testStr, testNum);"的内容。很奇怪编译器没有抱怨,即使我在String文档中找不到名为“format”的实例方法(事实证明我没有意识到静态方法的文档在这里是相关的)。所以下面的代码:

public class Weird{
    public static void main(String[] args){
        String testStr = "hmm";
        Long testNum = 7L;
        String weird = "# instance_method:%s thread:%d".format(testStr, testNum);
        String msg = String.format("# static:%s thread:%d", testStr, testNum);
        System.err.println(weird);
        System.err.println(msg);
    }
}   

给出了输出:

hmm
# static:hmm thread:7

因此"# instance_method:%s thread:%d".format(testStr, testNum);评估为testStr。我可能做了一些愚蠢的事情,但这里发生了什么?

1 个答案:

答案 0 :(得分:2)

您正在调用以下表达式中的static format方法

"# instance_method:%s thread:%d".format(testStr, testNum);

即。使用参数testStr格式化testNum。由于"hmm"中没有占位符,因此只需评估为"hmm"

使用实例调用static方法在java中有效,但应该避免,因为它很容易导致混淆。表达式的类型用于确定在这种情况下调用的方法。