首页 > 编程知识 正文

方法重载的具体匹配规则,java中什么叫方法重载

时间:2023-05-03 09:57:31 阅读:158079 作者:1352

3358 www.Sina.com/http://www.Sina.com/public class overload { publicstaticvoidsayhello (object arg ) system.out.out } publicstaticvoidsayhello (char arg ) system.out.println ) (Hellochar ); } publicstaticvoidsayhello (long arg ) system.out.println ) (HelloLong ); } publicstaticvoidsayhello (char . arg ) system.out.println ) ' Hellochar . ' ); } publicstaticvoidsayhello (character arg ) system.out.println (hello character ); } publicstaticvoidsayhello (serializable arg ) system.out.println (hello serializable ); } publicstaticvoidmain (string [ ] args ) overload.sayhello ) a ); }

上面的代码执行后输出

首先看一段代码hello char

这样就很明白了。 ‘a’是char类型,自然会寻找参数为char的重载方法。 如果注释掉sayhello(chararg )方法,其输出将为hello int。 此时,如果‘a’继续注释掉可以进行自动类型转换的SayHello(intarg )方法,则输出为(hello long )

此时,发生两次自动变换,将‘a’变换为整数97,然后再变换为更长的整数97L,一致的参数类型为long过载。 代码中没有写入其他类型的重载,如浮点、双精度等,但实际上自动转换会持续多次,并与char-int-long-float -双精度匹配。 但是,它不匹配byte和short类型的过载。 因为char转向byte和short转型是不安全的。 如果继续注释SayHello(longarg )方法,输出将类似于以下内容:

空心拉链

这次发生了自动打包。 因为’a’包装为其包类型java.long. Character,所以匹配的参数会因Character过载而继续注释掉sayhello(characterarg )方法输出为) hello Serializable )。hello Serializable出现在java.long.Serializable通过java.long.Character类实现的接口中这是因为找到了由包装类实现的接口类型,然后再次进行了自动转换。 可以将char转换为int,但不会将Character转换为Interger。 它只需要安全地转换为实现的接口或父类。 Character还实现了另一个接口Java.long.comparable serializable。 如果同时发生两个参数分别为可序列化和可兼容可序列化的重载方法,则它们的优先级相同。 编译器无法确定自动转换为哪个类型,表示类型不明确,拒绝编译。 调用程序时显示的指定字面量的静态类型(如say hello (comparableserializablearg ) )必须通过编译。 注释掉SayHello(serializablearg )后,输出结果如下所示。

hello object

这是char装箱对父类的变革,如果有多个父类,则会按继承关系从下到上进行搜索,越接近上层,优先级越低。 即使调用方法的参数为null,该规则也适用。 如果也注释掉SayHello(Objectarg ),则输出结果将与以下内容类似:

哈罗查尔斯.

由于还剩一种七种重载方法,因此可以看出边缘长度参数的重载优先级最低。

以上过程说明了在编译时静态分配目标的过程。 这个过程也是实现java语言过载的本质。 这里只是选择了char类型,感兴趣的人请尝试使用其他类型。 感兴趣的人也请读一下《深入理解java虚拟机》这本书。 这里有很深的解释。 我也从这本书中作为参考。 如有错误,欢迎各位指正。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。