根本原因
System.out.printf() 方法的第一个参数是格式字符串,后面的参数是要插入的值。
正确的用法
String id = "A123";
String name = "张三";
// 正确:第一个参数是格式字符串,包含占位符 %s
System.out.printf("ID=%s, name=%s\n", id, name);
// 输出:ID=A123, name=张三
错误分析
// 错误:第一个参数被当作格式字符串,但其中没有占位符
System.out.printf(id, name);
这种情况下:
id被当作格式字符串(比如"A123")name是要插入的值- 但由于格式字符串
"A123"中没有%s这样的占位符,所以name不会被输出
更清楚的例子
String id = "Hello %s"; // 格式字符串中有占位符
String name = "World";
System.out.printf(id, name);
// 输出:Hello World
// 这种情况下能输出两个,因为 id 字符串中包含了 %s
其他正确写法
// 方法1:使用 printf 的格式字符串
System.out.printf("ID=%s, name=%s\n", id, name);
// 方法2:使用字符串拼接
System.out.println("ID=" + id + ", name=" + name);
// 方法3:使用 String.format
String result = String.format("ID=%s, name=%s", id, name);
System.out.println(result);
// 方法4:使用 MessageFormat
System.out.println(MessageFormat.format("ID={0}, name={1}", id, name));
总结
printf 的第一个参数必须是包含占位符的格式字符串,后面的参数才会被替换进去。如果没有占位符,额外的参数就会被忽略。