我花了很长时间与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
方法是有效的,但应避免使用它,因为它很容易引起混乱。表达式的类型用于确定在这种情况下调用的方法。