Java多态
来源:互联网 发布:怎么看淘宝店家链接 编辑:程序博客网 时间:2024/06/07 14:39
概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。
原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
好处:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。//多态的真正作用,
可以用在方法的参数中和方法的返回类型中。
下面有父类Animal
和两个子类Dog
和Cat
说明多态的特性:
public static void main(String[] args) { Animal a=new Dog(); a.eat(); a=new Cat(); a.eat(); /** * Output: dog eat bone cat eat fish */ /** * Animal a = new Dog(); Animal b = new Cat(); 多态就产生了; 对象有两种类型 (1) 编译类型 (2)运行类型 编译类型:声明变量的类型,Animal,表示把对象看做什么类型 运行类型 = 对象的真是类型 编译类型必须是运行类型的父类; 当编译类型和运行类型不同的时候,多态就出现了。 多态 : 对象有多种形态,对象可以存在不同的形式; 多态的前提:可以是继承关系,也可以实现关系(接口和实现类),在开发中多指第二种; 多态的特点:把对象赋给父类变量,在运行时期会表示具体的子类特征 */ //需求:一个饲养员喂养猫和狗,用多态实现 /* * 没有多态时:1.在Person类中定义一个喂养狗的方法feed(Dog d); * 2.在Person类中定义一个喂养猫的方法feed(Cat d); * 当没有多态时,有多少种动物就需要创建多少种方法,不方便 * * 有多态时,只需要创建一个feed(Animal a)方法,即可。 * 当把不同的子类都当做父类类型来看待, * 可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码达到通用编程,以适应需求的不断变化 * */ //代码实现 Person p=new Person(); p.feed(new Dog()); p.feed(new Cat()); /* * Output : feed... dog eat bone feed... cat eat fish */ }}class Animal{ public void eat(){ System.out.println("eat food"); }}class Dog extends Animal{ public void eat(){ System.out.println("dog eat bone"); }}class Cat extends Animal{ public void eat(){ System.out.println("cat eat fish"); }}class Person{ //没有多套时要定义好多特定的方法 public void feed(Dog d){ System.out.println("feed..."); d.eat();//Dog eat method } public void feed(Cat c){ System.out.println("feed..."); c.eat();//Cat eat method } //利用多态,把子类对象当作父类的的一个特殊对象看待,简化编程 public void feed(Animal a){ System.out.println("feed..."); a.eat();//Cat eat method }
0 0
- Java学习 java -- 多态
- java多态
- java多态
- java多态
- java多态
- Java多态
- java多态
- JAVA@多态
- Java多态
- java 多态
- Java多态
- java多态
- [Java] 多态
- JAVA多态
- Java多态
- java多态
- java 多态
- java多态
- 面试中的排序算法总结
- (15.1.23)Guitar-Structure
- SpringMvc运行原理
- 349. Intersection of Two Arrays
- HandlerThread详解
- Java多态
- 58. Length of Last Word
- AS Error:Failed to resolve: javax.inject:javax.inject:1问题解决
- android 无预加载的viewpager
- [机器学习篇]基于Scikit learn库中KNN,SVM算法的笔迹识别
- Ubuntu下 sqlitebrowser 查看 Android Sqlite数据库
- UML常用图的几种关系的总结
- 拦截器与过滤器的区别
- sublime快捷键