黑马程序员-学习笔记之 多态

来源:互联网 发布:js跨域请求 编辑:程序博客网 时间:2024/06/06 18:57

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


利用多态可以使程序具有良好的扩展性,并可以对这个类的所有子类的对象进行通用的处理。这其中利用的是“向上转型”。比如现在要绘制一个平行四边形,在平行四边形中定义一个方法draw(),具体实现代码如下:

public class Parallelogram{//平行四边形类public void draw(Parallelogram p)//定义draw()方法,参数为本类对象{//绘图语句}}
这时,如果要定义个绘制正方形的方法,就要从新定义一个正方形类来处理正方形对象,这样做会导致代码冗余。

但如果定义一个四边形类,让它所有的子类对象,用“向上转型”的方法,使每个继承四边形类的对象作为draw()方法的参数。代码如下所示:

public class Quadrangle {// 实例化保存四边形对象的数组对象private Quadrangle[] qtest = new Quadrangle[6];private int nextIndex = 0;public void draw(Quadrangle q) { // 定义draw()方法,参数为四边形对象if (nextIndex < qtest.length) {qtest[nextIndex] = q;System.out.println(nextIndex);nextIndex++;}}public static void main(String[] args) {// 实例化两个四边形对象,用于调用draw()方法Quadrangle q = new Quadrangle();q.draw(new Square()); // 以正方形对象为参数调用draw()方法// 以平行四边形对象为参数调用draw()方法q.draw(new Parallelogramgle());}}class Square extends Quadrangle { // 定义一个正方形类,继承四边形类public Square() {System.out.println("正方形");}}// 定义一个平行四边形类,继承四边形类class Parallelogramgle extends Quadrangle {public Parallelogramgle() {System.out.println("平行四边形");}}
它的运行结果:


上面说了这么多,那到底什么是多态呢?多态可以这么理解,多态就是事物存在的多种体现形态。多态具有以下几个特点:

一、多态的体现:

父类的引用指向了自己的子类对象

父类的引用也可以接收自己的子类对象

二、多态的前提:

类与类之间必须要有关系:要么是继承,要么是实现,最重要的前提是:子父类之间存在覆盖。

三、多态的好处:

多态的出现,可以大大提高程序的扩展性

四、多态的缺点:

多态虽然可以大大提高程序的扩展性,但它也有弊端,就是只能使用父类的引用访问父类中的成员。

以下程序是多态的一个实例:

abstract class Animal{abstract void eat();}class Cat extends Animal{public void eat(){System.out.println("吃鱼");}public void catchMouse(){System.out.println("抓老鼠");}}class Dog extends Animal{public void eat(){System.out.println("吃骨头");}public void kanJia(){System.out.println("看家");}}class Pig extends Animal{public void eat(){System.out.println("饲料");}public void gongDi(){System.out.println("拱地");}}//-----------------------------------------class DuoTaiDemo2 {public static void main(String[] args) {function(new Dog());function(new Cat());}public static void function(Animal a){a.eat();if(a instanceof Cat){Cat c = (Cat)a;c.catchMouse();}else if(a instanceof Dog){Dog c = (Dog)a;c.kanJia();}}}
运行结果:


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

0 0