Java语言是静态多分派,动态单分派的。

本文解析了一段Java代码中方法重载的实现细节,通过具体示例解释了如何根据参数类型选择合适的方法,并讨论了向上匹配及二义性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

  1. 精准匹配,优先选择参数类型相同的方法。
  2. 向上匹配,没有参数类型相同,查找是否有其父类。
  3. 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语言定义的字符替换符,这个字符替换符取决于你所要替换值得参数个数(不是被替换值得参数个数)。 第二个参数,他的作用就是覆盖字符替换符所占有的位置。

### 解决Spyglass无法打开的问题 当遇到Spyglass无法正常启动的情况时,可以尝试以下几个方法来解决问题。 对于`feature could not be checked out`错误,解决方案涉及更新授权文件。具体操作是在命令行环境中使用最新的`Synopsys.dat`文件替换原有虚拟机中的同名文件[^1]: ```bash cp /path/to/new/Synopsys.dat /original/path/ ``` 之后再次尝试通过命令行启动Spyglass: ```bash spyglass ``` 如果收到 `[Error] Another session is already running or previous run had some issues` 的提示,则表明当前工作目录下存在正在运行的vc_spyglass实例或者是上次执行过程中出现了未处理的问题。此时应该先终止任何已存在的Spyglass进程,或者切换到其他路径重新开始会话[^2]: ```bash ps aux | grep spyglass # 查找并结束所有相关进程 kill -9 PID # 使用找到的PID号杀死特定进程 cd /new/directory # 或者简单地改变当前的工作目录 spyglass # 尝试重启工具 ``` 另外,在某些场景下,移除批处理模式参数也可以帮助排除因自动化脚本引起的异常情况。例如修改启动指令如下所示[^4]: ```bash spyglass –project training.prj –goals cdc/cdc_setup & ``` 尽管Lint检查并非总是必要的,但在开发流程中保持良好的实践习惯有助于提前发现潜在风险,减少后期维护成本。因此建议尽可能修复所有的警告信息而不是依赖于偶然性的成功编译结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值