根据下面这个程序的内容,判断哪些描述是正确的:( )
public class Test { public static void main(String args[]) { String s = "tommy"; Object o = s; sayHello(o); //语句1 sayHello(s); //语句2 } public static void sayHello(String to) { System.out.println(String.format("Hello, %s", to)); } public static void sayHello(Object to) { System.out.println(String.format("Welcome, %s", to)); } }
A. 这段程序有编译错误
B. 语句1输出为:Hello, tommy
C. 语句2输出为:Hello, tommy
D. 语句1输出为:Welcome, tommy
E. 语句2输出为:Welcome, tommy
F. 根据选用的Java编译器不同,这段程序的输出可能不同
正确答案: C D
- 精准匹配,优先选择参数类型相同的方法。
- 向上匹配,没有参数类型相同,查找是否有其父类。
- java重载是静态匹配,编译的时候按照左值类型匹配,调用哪个方法已经在编译的时候已经确定了。 如果没有Object的重载类,用Object类型调用应该是会报错,找不到方法。
这是方法重载,不是子类重写,故选匹配的。
Java语言是静态多分派,动态单分派的。
如果是(重载)方法之间的选择,则是使用静态类型。按照静态类型(外观类型)查找。
如果是父类与子类之间的(重写)方法的选择,则是使用动态类型。按照实际类型(运行时类型)查找方法。
如A a = new B(); 会使用类型B去查找重写的方法,使用类型A去查找重载的方法。
所以此题的输出分别为
Welcome, tommy
Hello, tommy
单纯从函数的重载来看这个题没什么好说的,但是Object和String存在继承关系,object是string类的父类。
关于函数重载可能出现的二义性:编译器不知道选择哪一个函数。因为无论是s还是o都可以选择public static void sayHello(Object to)。
如果代码出现了这种可能出现二义性的代码,编译器就会去寻找最适配的选项进行执行,所以s会选择public static void sayHello(String to),因为s选择这一个方法可以不经过任何的隐式转化,所以在这里选择这一个方法最适配。
第一: 方法的匹配,什么类型jvm回去自动匹配什么类型的方法,就近原则,
第二: String.fomart(“”,“”)方法的使用, 该方法用于替换基本类型数据的值(覆盖), 这个方法的两个参数,左边参数(第一个参数),可以多个值,第一个值的作用是在所替换的值前或者后添加参数,这个值可以写在字符替换符(占位符)前,前代表前边添加,后边代表后边添加添加值,后边的参数比如说是java语言定义的字符替换符,这个字符替换符取决于你所要替换值得参数个数(不是被替换值得参数个数)。 第二个参数,他的作用就是覆盖字符替换符所占有的位置。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)