A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ACmen.XH 初级黑马   /  2018-4-4 21:49  /  1383 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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类型的数据,因为这种转换是不安全的.
当然这种极端情况几乎是不会出现的,除了用来当做面试题为难求职者之外,实际工作中也没什么用途,就算开发者对重载的理解很深刻也不应该写出这样的代码......

2 个回复

倒序浏览
奔腾的黑马 来自手机 中级黑马 2018-4-4 22:06:48
沙发
厉害
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马