5
回答
java 方法重载的问题,求解释
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
package opg;

public class Test1 {

	public void test(Object o){
		System.out.println("o");
	}
	public void test(String s){
		System.out.println("s");
	}
	public static void main(String[] args) {
		
		new Test1().test(null);
	}

}

请问这个程序的执行结果为"s",求解释!!!

<无标签>
举报
haopeng
发帖于5年前 5回/411阅
共有5个答案 最后回答: 5年前

String比Object更“特定”。具体可以看Java语言规范(JLS)

Java语言规范(JLS)15.12节 方法调用表达式。

JLS 15.12.2节编译期确定方法签名分为以下几个步骤:

1)不允许拆装箱及使用可变元数方法进行重载解析,即可由类型宽化(扩展基本转换、扩展引用转换)确定的匹配元数方法。(确保较老语言版本中任何有效的方法调用不会因为引入隐式拆装箱、可变元数方法而被当成不明确的)

2)允许拆装箱但不允许使用可变元数方法进行重载解析,即可由方法调用转换确定的匹配元数方法。(确保如果存在一个可用固定元数方法,可变元数方法就不会被调用)

3)允许拆装箱及使用可变元数方法进行重载解析。

以上每个步骤中,如果存在多个符合的方法,则需在它们中选择最特定的方法。

JLS 5.3节方法调用转换规定可包括以下转换:

同一性转换:如int->int, Object->Object

扩展基本转换:如short->int

扩展引用转换:如String->Object

装箱转换,可后接扩展引用转换:如int->Integer->Number

拆箱转换,可后接扩展基本转换:如Short->short->int

顶部