Java中的多态(二)---动态绑定(父类引用指向子类对象)

继上篇文章(java中的多态之一参数传递(深入体会,总结多方话语,连更三篇,此为一)-CSDN博客),这次我们说说让很多初学者甚至已经工作的人都困惑的一点---就是Java中常常使用父类引用指向子类对象,也就是Java的动态绑定

其实这个问题并不复杂,但为什么就感觉一会明白一会不明白。这个部分非常重要,是后面面向对象进阶,Java高阶的基础!很多设计模式都是以此为基础的!一定要拿下来!

接下来我从为什么要使用动态绑定,动态绑定是什么这两个方面去仔细论述一下这个问题。

动态绑定是什么?

动态绑定是指Java底层,父类对象可以动态的去绑定子类对象。

首先需要确立的一点就是,我们所阐述的多态全部都是建立在继承的基础上。即使是接口多态(就是接口引用指向实现类对象)也在某种意义上是继承的接口,这点必须要记住

假设我们现在创建一个父类并让十个子类去继承这个父类我们现在如果想要创建子类,可以有两种方式第一种就是直接new子类对象让子类引用直接指向子类对象,还有一种就是通过父类引用去指向子类对象其实到这里就有很多人会困惑为什么我不使用第一种方式,明明第一种非常的显而易见还不费脑,这个问题等下我仔细阐述,我们先着重讨论下第二种方式---这个是多态的核心,也是Java代码灵活性的一个体现!

Java是怎么去动态绑定的呢?为什么可以使用父类引用指向子类对象?这么做那方法是如何调用的

这个我们就要了解到Java底层加载类的顺序和方式,其实在Java中,我们子类继承父类,我们去new子类,底层并不是简单的只加载子类,它会先加载(是加载不是实例化!类加载是在栈区,创建的对象是在堆区)父类再去加载子类(很好理解,父亲都没加载怎么创建子类),因此当你在代码中使用父类引用指向子类对象时,你本质上就只是实例化了子类对象,换句话说你的父类只是被加载并没有实例化,这个非常重要!也就是说此时在jvm的堆区中仅仅只有子类对象的实例并没有父类对象的实例!一定要清楚这点!

然后我们再铺垫一个知识点,父类 变量名 = new 子类(),对于在代码中出现的这个形式,我们把父类称为编译类型,后面子类称为运行类型(一定要细细去品这个两个名称!)编译类型是你在编写代码时就已经确定的(你指定是父类引用,通俗来讲那么在代码编译阶段也就会认为你堆区中存在一个父类对象--看清楚,只是认为),但实际上我们先前提过,堆区中是没有父类对象的只有子类对象,因此,Java在运行时它会做一件事----它会先去堆区找父类对象,没有的话就找子类对象,又因为子类继承父类,调用方法也会是子类中的方法(这个方法分为两种,一种是继承父亲原有的方法,一种是重写父类的方法,如果子类没有重写,那么看起来就像是调用的父类方法,但实际上调用的是子类中的方法)

这样看起来就像是父类引用可以去动态的绑定子类对象,如果你有两个子类对象,你就可以使用这个父类引用去灵活切换指向子类对象,看起来就像是动态绑定一样!

当我们了解原理之后,其实就会发现,所谓动态绑定不过就是看堆区,堆区有对象且符合继承关系,它就可以绑定上,Java也不过就是在堆区中搜寻对象,仅此而已!

接下来,我们就要知道为什么Java费尽心力要去做这个动态绑定?我们明明使用1对1,子类对象指向子类就可以完成需求!

为什么要用动态绑定?

其实概括起来很简单,就是为了扩展类的灵活性!

看过我上篇文章的就会知道,允许我们动态绑定,那么我们方法中的形参就可以指定父类类型,不管是哪个子类传进来,我们都可以接收,但如果没有这个特性,那你有十个百个子类对象,你就要写对应的方法(形参必须指定为子类对象),这就太太太麻烦了!

再举一个例子就是,我们在后面spring框架学习中,我们会把对象交给spring框架管理,我们向框架申请子类对象,然后用父类引用可以很灵活的去绑定子类对象去完成需求(这个没有学习spring的朋友可以先不去考虑,只需要知道动态绑定是非常重要的,是后面学习很多编程思想的基础,搞不定这个,那面向对象进阶就很难下手的!一定要很清楚

好了,以上就是我对多态中动态绑定的阐述,欢迎讨论,看爽了记得点个赞,有疑问评论区留言,我们一起讨论!

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值