首页 > 试题广场 >

根据下面这个程序的内容,判断哪些描述是正确的:( ) pub

[不定项选择题]
根据下面这个程序的内容,判断哪些描述是正确的:( )
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));
    }
}

  • 这段程序有编译错误
  • 语句1输出为:Hello, tommy
  • 语句2输出为:Hello, tommy
  • 语句1输出为:Welcome, tommy
  • 语句2输出为:Welcome, tommy
  • 根据选用的Java编译器不同,这段程序的输出可能不同
没意思没意思  上边是s o顺序  调用方法就变成o s了   真的没意思
发表于 2019-09-16 18:48:02 回复(33)
Java语言是静态多分派,动态单分派的。
如果是重载方法之间的选择,则是使用静态类型。
如果是父类与子类之间的重写方法的选择,则是使用动态类型。
如A a = new B(); 会使用类型B去查找重写的方法,使用类型A去查找重载的方法。
所以此题的输出分别为
Welcome, tommy
Hello, tommy

发表于 2020-07-06 16:32:17 回复(8)

单纯从函数的重载来看这个题没什么好说的,但是Object和String存在继承关系,所以这题就考的就是关于函数重载可能出现的二义性:编译器不知道选择哪一个函数。因为无论是s还是o都可以选择public static void sayHello(Object to)。

如果代码出现了这种可能出现二义性的代码,编译器就会去寻找最适配的选项进行执行,所以s会选择public static void sayHello(String to),因为s选择这一个方法可以不经过任何的隐式转化,所以在这里选择这一个方法最适配。

编辑于 2020-04-04 14:55:54 回复(3)
重载:静态分派,按照静态类型(外观类型)查找。 重写,动态分派,按照实际类型(运行时类型)查找方法。
发表于 2021-04-15 10:59:37 回复(0)
这个题错的牛逼,我答案看了半天都没看懂错在哪,结果一看一个so 一个os呵呵了 有多少人和我一样
发表于 2020-08-12 15:28:08 回复(1)
这一题是我想多了。方法的调用首先以参数类型最符合作为原则。
发表于 2019-12-03 15:38:35 回复(0)
这道题的话,我从深入理解Java虚拟机里面有看到过一道话,就是Java其实是一种偷懒的语言,这边写了两个方法,两个方法的参数一个是Object,一个是String,此时String是Object的子类,但是在同类之中比配的话,如果一个方法比配合适了,就不会去比配它的子类,直接使用这个方法
发表于 2020-03-26 22:08:42 回复(0)
这道题为什么没有人从多态的角度来分析呢?那样的话,会发现语句2根本不知道在调用哪一个方法,因为object是string类的父类啊。
发表于 2020-02-02 16:49:11 回复(5)
1. 精准匹配,优先选择参数类型相同的方法。 2. 向上匹配,没有参数类型相同,查找是否有其父类。 3. java重载是静态匹配,编译的时候按照左值类型匹配,调用哪个方法已经在编译的时候已经确定了。 如果没有Object的重载类,用Object类型调用应该是会报错,找不到方法。 个人观点,勿喷,如果有不对的请指点。
发表于 2020-08-24 19:44:30 回复(1)
发表于 2019-09-08 13:55:57 回复(2)
分享一下我的想法。
首先sayHello是静态的,也就是说如果一个类调用这个方法,那么就在编译的时候就已经确定了需要调用的哪一个,也就是说一个是String一个是Object,那么为什么有一个是welcome呢,因为都知道一句话就是编译看父类运行看子类,这里再编译的时候已经确定了是Object,所以下面运行的时候就会去调用相对应的方法。
发表于 2022-08-18 16:57:04 回复(1)
方法调用的静态分派,静态分派依据参数声明类型,在编译期就已经确定调用的方法
发表于 2022-01-05 09:45:08 回复(0)
这道题目考眼力
发表于 2021-02-03 14:05:47 回复(1)
输在了细心上˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚
发表于 2019-12-19 18:34:42 回复(2)
这题真🐶
发表于 2022-10-15 15:16:19 回复(0)
***了啊,没看清顺序😁😁😁
发表于 2022-03-09 09:32:32 回复(0)
就近原则
发表于 2022-01-11 11:08:24 回复(0)
文字游戏
发表于 2021-02-03 09:50:40 回复(0)
这是方法重载,不是子类重写,故选匹配的
发表于 2020-12-29 00:07:26 回复(0)
这道题两个问题 第一: 方法的匹配,什么类型jvm回去自动匹配什么类型的方法,就近原则, 第二: String.fomart(“”,“”)方法的使用, 该方法用于替换基本类型数据的值(覆盖), 这个方法的两个参数,左边参数(第一个参数),可以哟多个值,第一个值的作用是在所替换的值前或者后添加参数,这个值可以写在字符替换符(占位符)前,前代表前边添加,后边代表后边添加添加值,后边的参数比如说是java语言定义的字符替换符,这个字符替换符取决于你所要替换值得参数个数(不是被替换值得参数个数)。 第二个参数,他的作用就是覆盖字符替换符所占有的位置。
发表于 2020-12-24 06:34:26 回复(0)