本帖最后由 ACmen.XH 于 2018-4-4 21:53 编辑
重载(overload) 最近学了Java基础中的重载,加上最近粗略看了一本关于介绍JVM的一本书,笔者就分享一下自己拙见,若有还需改善或者错误的地方,还请大家指正. 众所周知,Java是一门面向对象的程序语言,相信大家应该了解面向对象的三个基本特征:继承,封装,多态.此处的知识就和多态有些关系,编译器在重载时是通过参数的静态类型而不是实际类型作为判断依据的,并且静态类型是编译期可知的,因此,在编译阶段,javac编译器会根据参数的静态类型决定使用哪个重载版本,接下来看段代码: public class Overload { public static void sayHello(Object arg) { System.out.println("hello Object"); } public static void sayHello(int arg) { System.out.println("hello int"); } public static void sayHello(long arg) { System.out.println("hello long"); } public static void sayHello(Character arg) { System.out.println("hello Character"); } public static void sayHello(char arg) { System.out.println("hello char"); } public static void sayHello(char... arg) { System.out.println("hello char..."); } public static void sayHello(Serializable arg) {//Serializable是Character实现的一个接口 System.out.println("hello Serializable"); } public static void main(String[] args) { sayHello('a'); } } 这段代码输出结果: hello char 这很好理解,因为’a’ 是char类型的数据,自然会寻找到参数类型为char的方法,但是把sayHello(char arg)注释掉之后,输出结果是: hello int 这里发生了一次自动类型转换,因为’a’还可以代表数字97,继续把sayHello(int arg)注释之后,输出结果是: hello long 这是发生了两次自动转换,’a’转换为97之后进一步转换成97L类型,剩下的读者如果有兴趣可以自己尝试,产生这种”模糊”的情况主要是字面量不需要定义,没有显式的静态类型,它的静态类型只能通过语言上的规则去推断,不过自动类型转换只能向上转换,不能向下转换,比如long类型的数据不能自动转换成int类型的数据,因为这种转换是不安全的. 当然这种极端情况几乎是不会出现的,除了用来当做面试题为难求职者之外,实际工作中也没什么用途,就算开发者对重载的理解很深刻也不应该写出这样的代码......
|