有关java中的重写和重载在多态上的表现

       在《深入理解JVM》第八章中写着:众所周知,java是一门面向对象的程序编程语言,因为java具备面向对象的三个基本特征:继承,封装和多态。java的多态特征带来的一些最基本的体现,如“重载”和“重写”在java虚拟机中是如何实现的,这里的实现当然不是语法上的如何写,而是虚拟里如何确定正确的目标方法。
       首先,让我们了解一下什么是静态类型什么是实际类型。
       例如现在有父类Human,子类Man继承父类Human。我们可以这样创建对象:Human man = new Man()。在这条语句中,man对象是被创建出来的一个具有多态特征的对象,他的静态类型/外观类型就是Human,他的实际类型就是Man。静态类型和实际类型在程序中都可以发生一些变化,区别是静态类型的变化仅仅在使用时发生,变量本身的静态类型不会被改变,并且最终的静态类型在是在编译期可知的;而实际类型变化的结果在运行期才可确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么。
       让我们通过代码进一步了解他们的区别:

//实际类型变化
Human man = new Man();
man = new Women();  //实际类型变为Women
//静态类型变化
Human man = new Man();
man = (Man)man;  //静态类型变为Man

1.静态分派
重载与静态分派相关,运行时是静态类型。虚拟机(准确的说是编译器)在重载时是通过参数的静态类型而不是实际类型作为判断依据的。而且静态类型是编译期可知的,因此,在编译阶段,Javac编译器会根据参数的静态类型决定使用哪个重载版本.。

例:

public static void sayHello(Man guy){
	System.out.println("类型是Man");
	
}

public static void sayHello(Human guy){
 System.out.println("类型是Human");
}


public static void main(String[] args) {
    Human man = new Man();
    Man man2 = new Man();
    sayHello(man);  //执行的结果是"类型是Human"
    sayHello(man2);  //执行的结果是"类型是Man"
}

2.动态分派
重写和动态分派相关,运行时看的是实际类型(实际上只要学过多态都能理解这一点,我就不做过多说明了)。根据对象的实际类型来调用相应的方法。如上例的man对象,他的实际类型是Man,在调用成员方法时,选择的是Man类中的方法(注意不可以是静态类型的方法,静态类型的方法属于父类,调用时选择的是父类中的方法)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值