当前位置: 首页 > 知识库问答 >
问题:

为什么输出是“字符串”。意外输出[重复]

方玄天
2023-03-14
 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初学者,我对上述程序的输出感到困惑。请给我解释一下输出的原因。

共有3个答案

冀胤运
2023-03-14

您使用的概念是重载,Objectjava中所有类的超类。因此,当您提供任何特定实现(在本例中为String)以及一般实现(在本例中为Object)时,那么JVM默认使用特定实现。如果您想尝试它,请替换abc(null);abc(123);

在这种情况下,输出将是“OBject”,因为JVM找不到integer的任何特定实现,所以它使用广义实现。

郦昆
2023-03-14

Java编译器选择最具体的重载方法将被选择。它被称为早期绑定。在这里,String扩展了Object类,因此它更具体。您可以参考官方Java语言规范

如果多个成员方法既可访问又适用于方法调用,则需要选择一个来为运行时方法调度提供描述符。Java编程语言使用选择最具体方法的规则。

乜胜泫
2023-03-14

早期绑定(在编译时绑定最特定的方法)。

重载方法时,将选择最具体的方法。在您的情况下,选择的顺序是字符串

在层次结构中,字符串比对象更具体。因此字符串被选中。事实上,对象是所有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