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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 遗失de心跳 初级黑马   /  2018-8-11 11:19  /  1283 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前言:
        
       多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
       多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。再举个比较形象的例子:
比如有一个函数是叫某个人来吃饭,函数要求传递的参数是人的对象,可是来了一个美国人,你看到的可能是用刀和叉子在吃饭,而来了一个中国人你看到的可能是用筷子在吃饭,这就体现出了同样是一个方法,可以却产生了不同的形态,这就是多态!

1.什么是多态?

概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。

2.为什么要用多态呢?

原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。


3.多态有什么好处?

有两个好处:

1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,

4.  多态中成员的访问特点:
               1.成员变量:编译看左边,执行看左边
               2.成员方法:编译看左边,执行看右边
               成员变量和成员方法的访问不一样是因为:成员方法有重写。

5.  多态的转型:向上转型:从子到父  从父类引用指向子类对象        
     例:Animal a=new Cat();
               向下转型:从父到子  从父类引用转为子类对象(强制转换) 目标类型+目标对象名=目标类型+原对象名           例:Cat c=(Cat) a;

以下是多态转型中的额一些具体实例:


package com.itheima_04;
/*
*        向上转型
*                从子到父
*                父类引用指向子类对象
*        向下转型
*                从父到子
*                父类引用转为子类对象
*/
public class DuoTaiDemo {
        public static void main(String[] args) {
                //多态
                Animal a = new Cat(); //向上转型
                a.eat();
               
                //a.playGame();
                //多态的弊端:无法访问子类特有方法
                //现在我就想使用子类特有方法,怎么办呢?
                //创建子类对象就可以了
                /*
                Cat c = new Cat();
                c.eat();
                c.playGame();
                */
                //现在的代码虽然可以访问子类的特有功能,但是不合理
                //因为我们发现内存中有两个猫类的对象
                //这个时候,我们得想办法把多态中的猫对象还原
                //这个时候,就要使用多态中的转型了
                //父类引用转为子类对象
                Cat c = (Cat)a;
                c.eat();
                c.playGame();
        }
}
package com.itheima_04;

public class Cat extends Animal {
        public void eat() {
                System.out.println("猫吃鱼");
        }
       
        public void playGame() {
                System.out.println("猫捉迷藏");
        }
}
package com.itheima_04;
public class Animal {
        public void eat() {
                System.out.println("吃东西");
        }
}

















0 个回复

您需要登录后才可以回帖 登录 | 加入黑马