老师,实现接口的类的实例调用他类中的方法时,其实调用的都是他的实现类中的方法?

老师,实现接口的类的实例调用他类中的方法时,其实调用的都是他的实现类中的方法?

老师,实现接口的类的实例调用他类中的方法时,其实调用的都是他的实现类中的方法?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
芝芝兰兰 2019-10-20 10:37:47

同学你好。

1、Dao 和 DaoImpl 的关系:是接口与实现类的关系。

因为一般的接口可以有多个实现类。所以使用接口来声明实例对象,等到运行到new时才真正知道具体是哪个实现类。这一过程表现了运行时多态。此时这个实例对象调用的方法是new这里指定的实现类实现的。

http://img1.sycdn.imooc.com//climg/5dabc4400946b78b05590310.jpg


2、而JDK的动态代理是一个代理类,这个proxy实例是通过反射机制仿造了一个Impl的“增强版”,传入的参数实际上是UserDaoImpl的实例。

http://img1.sycdn.imooc.com//climg/5dabc6a20933e74707650109.jpg

http://img1.sycdn.imooc.com//climg/5dabc66109aed15c13030264.jpg

通过这个proxy调用的方法如何执行,同样要由代理类来决定:

http://img1.sycdn.imooc.com//climg/5dabc54d0923187607130221.jpg

代理类的规则是所有的方法都通过invoke实现调用。

这里的invoke通过反射,知道了指定调用的方法method,以及这个方法指定的参数们args。根据自己实现的规则进行增强,而直到return method.invoke(userDao,args)时,才是真正的执行方法之时。这里的userDao实际上是创建这个proxy时传入的UserDaoImpl的实例,所以执行的方法还是UserDaoImpl中实现的方法

http://img1.sycdn.imooc.com//climg/5dabc77509388ab209690246.jpg


如果解答了同学的疑问,望采纳~

祝学习愉快~


提问者 精慕门618366 2019-10-20 00:23:00

老师,我很困惑实现接口的类到底是userdao类,还是userdaoImpl类?通常我们不是称userdaoImpl为实现了userdao类吗?
还有jdk动态代理是只能对实现接口的类进行代理,但是那个代理类使用的是userdao。

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师