首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个核心java代码的输出是什么?

这个核心java代码的输出是什么?
EN

Stack Overflow用户
提问于 2015-09-11 16:00:37
回答 4查看 121关注 0票数 5
代码语言:javascript
运行
复制
public void getData(Object o[]) {
    System.out.println("In Side Array");
}

public void getData(Object o) {
    System.out.println("In Side Object");
}

public static void main(String[] args) {
    new JavaEx().getData(null);
}

这里是打印数组块为什么,为什么不打印对象块?

EN

回答 4

Stack Overflow用户

发布于 2015-09-11 16:54:50

两个getData方法都可以处理null参数。在这种情况下,Java会尝试选择处理更具体类型的方法。

根据定义,Object是所有Java类的超类,因此在这种情况下,Object[] (也是一个Object)是更具体的类型,而getData(Object o[])是更具体的方法。这就是Java选择这种方法的原因。

票数 4
EN

Stack Overflow用户

发布于 2015-09-11 17:09:53

根据JLS(Java Language Specification)确定方法签名时间

  1. 第一阶段执行重载解析,不允许装箱或取消装箱转换,也不允许使用可变大小方法调用。如果在此阶段期间未找到适用的方法,则处理继续到第二阶段。
  2. 第二阶段执行重载解析,同时允许装箱和拆箱,但仍排除使用可变大小方法调用。如果在此阶段找不到适用的方法,则处理继续到第三阶段。
  3. 第三阶段允许重载与可变大小方法、装箱和取消装箱相结合。

在您的示例中:

当您通过传递参数null来调用方法getData()时,编译器转到第一阶段,在不执行任何装箱的情况下找到方法签名。

因此输出是"In Side Array"

票数 1
EN

Stack Overflow用户

发布于 2015-09-11 17:11:39

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

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

非正式的直觉是,如果第一个方法处理的任何调用可以传递给另一个方法,而不会出现编译时类型错误,则一个方法比另一个方法更具体。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32518471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档