public class Test{
public static void abc(String s) {
System.out.println("String");
}
public static void abc(Object s) {
System.out.println("OBject");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
abc(null);
}}
Output-String
我是java初学者,我对上述程序的输出感到困惑。请给我解释一下输出的原因。
您使用的概念是重载,Object
是java中所有类的超类。因此,当您提供任何特定实现(在本例中为String
)以及一般实现(在本例中为Object
)时,那么JVM默认使用特定实现。如果您想尝试它,请替换abc(null);
与abc(123);
在这种情况下,输出将是“OBject”,因为JVM找不到integer的任何特定实现,所以它使用广义实现。
Java编译器选择最具体的重载方法将被选择。它被称为早期绑定。在这里,String扩展了Object
类,因此它更具体。您可以参考官方Java语言规范
如果多个成员方法既可访问又适用于方法调用,则需要选择一个来为运行时方法调度提供描述符。Java编程语言使用选择最具体方法的规则。
早期绑定(在编译时绑定最特定的方法)。
重载方法时,将选择最具体的方法。在您的情况下,选择的顺序是字符串
在层次结构中,字符串比对象更具体。因此字符串被选中。事实上,对象是所有java对象中最不特定的
这是同样的JLS
http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5
如果多个成员方法既可访问又适用于方法调用,则需要选择一个来为运行时方法调度提供描述符。Java编程语言使用选择最具体方法的规则。
..... [规则]
我在Linux中使用的Java版本是: OpenJDK版本“16.0.2”2021-07-20 OpenJDK运行时环境(构建16.0.2+7) OpenJDK 64位服务器VM(构建16.0.2+7,混合模式) 这是我从Head-First Java书中编译的代码: 为什么那个特殊字符(%)会出现在字符串的末尾,我如何编写代码来去掉它?
问题内容: 当我执行以下代码时,输出为“ nullHelloWorld”。Java如何处理null? 问题答案: 您正在尝试将值连接到。这由“字符串转换”控制,当一个操作数是a时发生,该转换被JLS的5.1.11节覆盖: 现在只需要考虑参考值: 如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。
问题内容: 我正在做这样的事情: 基本上,我计算一个整数并输出大约10K-100K次的字符串,然后将结果写入system.out,每个结果都用换行符分隔。 最快的方法是什么? 问题答案: 感谢您的建议。我创建了一个测试程序来比较它们: 结果: Environment1 System.out.println:482 StringBuilder:210 BufferedoutputStream:86
我正在做这样的事情: 基本上,我计算一个整数并输出一个字符串大约10k-100k次,然后需要将结果写入System.out,每个结果用换行分隔。 最快的方法是什么?
我的理解是 x == 0 首先运行。但是 x 在计算时仍然是 -1 (y = y / x) == 0?否则它将除以零。我以为输出将是 -5,但日食说 5。我快疯了。
为什么以下代码的输出是科学符号? 产出:1.11E-8