我花了很长时间与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。我可能在做一些愚蠢的事情,但是这是怎么回事?

最佳答案

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

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


即您使用参数testStr格式化testNum。由于"hmm"中没有占位符,因此仅求值为"hmm"

在Java中,使用实例调用static方法是有效的,但应避免使用它,因为它很容易引起混乱。表达式的类型用于确定在这种情况下调用的方法。

09-10 05:51