每天且笔记的时间都到了第二天,现在继续回顾面向对象的知识点,前几篇文章里已经写了有关封装和继承的知识,这篇文章我们就着重看看java面向对象的最后一个特性:多态。
首先我们从多态的概念说起,多态可以理解为一个事物的多种表现形态,它在java中有两个体现:
第一就是方法的重载(overlode)和重写(overwrite)
第二就是对象的多态性(抽象类,接口,转型)
方法的重写和重载在之前已经说过了,那么什么是对象的多态性呢,其实从字面含义来理解对象的多态性就是一种对象的多种形态,在java中,子类可以替代父类的对象使用。
那么多态性就会有使用前提了,一共有两点,分别是:
(1)要继承,实现(接口)
(2)要有子类对父类方法的重写,使子类具有不同的方法实现
我们在这里就会用到一个很神奇的东西:转型,它分为上转型和下转型。
其中上转型是将父类的引用类型指向子类的对象,我们以一个例子来描述上转型:
首先,我们创建父类Animal,并在其中我创建了两个子类为Dog类和Cat类,在其中重写了eat()的方法,这样我们就满足了多态的两个前置条件:
package cn.hpe.www;
public class Animal {
public void eat() {
System.out.println("emmmmm....");
}
}
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 watchDoor() {
System.out.println("看家");
}
}
最后我们创建TestAnimal类来演示上转型的效果:
package cn.hpe.www; public class TestAnimal { public static void main(String[] args) { Animal cat = new Cat();
function(cat);function(dog);// dog.eat();function(animal);}public static void function(Animal a){a.eat();}} 记住,上转型就是将父类类型的引用指向子类,所以我们在这个main方法中直接使用了上转型,我们执行的方法其实实质性的子类重写的方法,这时我们输出的结果是:Animal dog = new Dog(); Animal animal = new Animal();
注意一点那就是子类对象的多态性,并不适用于属性,也不是用于静态方法。
那么有童鞋会问了,向下转型又是什么呢,向下转型就是父引用的对象转换为子类类型
我们还是举个例子,假设我在刚才的子类Dog类里添加一个父类没有的方法watchDoor(),在Cat里面我也加一个CatchMouse
那么我在调用的时候不能直接通父类调用抓老鼠和看门方法,因为父类中没有这两个方法,此时我们就需要进行下转型:
package cn.hpe.www; public class TestAnimal { static Animal cat = new Cat(); static Animal dog = new Dog(); static Animal animal = new Animal(); public static void main(String[] args) { function(cat); function(dog); // dog.eat(); function(animal); } public static void function(Animal a){ a.eat(); if(a instanceof Cat){ Cat c = (Cat) cat; c.catchMouse(); } if(a instanceof Dog){ Dog d = (Dog) dog; d.watchDoor(); } } }
向下转型时,要使用强转符:()这里用到了一个叫instanceof的东西,它是用来判断前后类是否一致,如果一致返回true不一致返回false
运行结果:
这样我们就可以在父类中调用子类中的对象了。
说了这么多,那多态有啥好处啊,它的主要好处有:
(1)可以增强程序的可扩展性及可维护性,使代码更加简洁。
(2)不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。