问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁能详细解释一下Java运行时多态性的实现??本人对多态有点困惑..拜托各位大神

发布网友 发布时间:2022-05-10 11:27

我来回答

1个回答

热心网友 时间:2023-10-08 21:11

运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态性的实现。 一、通过继承中超类对象引用变量引用子类对象来实现 举例说明: //定义超类superA class superA { int i = 100; void fun() { System.out.println(“This is superA”); } } //定义superA的子类subB class subB extends superA { int m = 1; void fun() { System.out.println(“This is subB”); } } //定义superA的子类subC class subC extends superA { int n = 1; void fun() { System.out.println(“This is subC”); } } class Test { public static void main(String[] args) { superA a; subB b = new subB(); subC c = new subC(); a=b; a.fun(); (1) a=c; a.fun(); (2) } } 运行结果为: This is subB This is subC 上述代码中subB和subC是超类superA的子类,我们在类Test中声明了3个引用变量a, b, c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。也许有人会问:“为什么(1)和(2)不输出:This is superA”。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 所以,不要被上例中(1)和(2)所迷惑,虽然写成a.fun(),但是由于(1)中的a被b赋值,指向了子类subB的一个实例,因而(1)所调用的fun()实际上是子类subB的成员方法fun(),它覆盖了超类superA的成员方法fun();同样(2)调用的是子类subC的成员方法fun()。 另外,如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性。具体的实现方法同上例。 不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了。 二、通过接口类型变量引用实现接口的类的对象来实现 接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。 举例说明: //定义接口InterA interface InterA { void fun(); } //实现接口InterA的类B class B implements InterA { public void fun() { System.out.println(“This is B”); } } //实现接口InterA的类C class C implements InterA { public void fun() { System.out.println(“This is C”); } } class Test { public static void main(String[] args) { InterA a; a= new B(); a.fun(); a = new C(); a.fun(); } } 输出结果为: This is B This is C 上例中类B和类C是实现接口InterA的两个类,分别实现了接口的方法fun(),通过将类B和类C的实例赋给接口引用a而实现了方法在运行时的动态绑定,充分利用了“一个接口,多个方法”展示了Java的动态多态性。 需要注意的一点是:Java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。 结束语:以上就是java运行时多态性的实现方法,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,毕竟Java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 LED灯带怎样制作与之匹配的电源? c++多态性与继承例子 JAVA基础多态性~!! 解梦梦见我老公的姐姐输了很多钱 好久没用现金的你,再次看到现金是何感受? 樱桃对人有什么好处? 华为手机封面壁纸怎么换 为什么吃樱桃有5大好处? 多态的原理是什么? 梦见别人输了9万好不好 樱桃的好处有哪些? 梦见别人输了很多钱,别人真的会输很多钱吗? 晒婆婆给零花钱的说说 樱桃对人体有哪些好处 为什么零钱太多,存个钱也遭别人白眼、抱怨。。。 甘肃省与宁夏回族自治州是什么关系 网易手机邮箱怎么手机收不到信箱收到 按照126邮箱提示 我把手机号输入给对方发邮件 形容零花钱珍贵的句子 钱的说说心情短语 手把肉怎么做 100米长的白光led灯带,如何换成开关电源, led灯带用什么电源 c++多态的实现方式有哪些? LED彩灯条,要怎么选用电源,是怎么计算的,知道的麻烦说下,谢谢 ,急急 山茶花的介绍是什么? 有关山茶花的资料. 有关于山茶花的资料 英语翻译茶花百科知识 茶花的介绍 java开发的支付系统能对接到php吗 在国企工作稳定吗 国企劳务派遣工稳定吗? 多少伏的电压可以电死人? 为什么人都要进入国企工作?国企就那么好吗? 多节电池能否电死人? 为什么电能电死人,而电池电不死人 货币基金交易需要手续费吗? 5v8a能电死人吗? 两节干电池能“触死”人吗? 干电池水中能电死人吗