在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
。我可能做了一些愚蠢的事情,但这里发生了什么?
答案 0 :(得分:2)
您正在调用以下表达式中的static
format
方法
"# instance_method:%s thread:%d".format(testStr, testNum);
即。使用参数testStr
格式化testNum
。由于"hmm"
中没有占位符,因此只需评估为"hmm"
。
使用实例调用static
方法在java中有效,但应该避免,因为它很容易导致混淆。表达式的类型用于确定在这种情况下调用的方法。