
1.什么是多态
多态的概念呢比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
2.多态的必要条件
为了实现运行期的多态,或者说是动态绑定,需要满足三个条件。
即有类继承或者接口实现、子类要重写父类的方法、父类的引用指向子类的对象。
简单来一段代码解释下:
public class Parent{ public void call(){ sout(“I m Parent”); }}public class Son extends Parent{// 1.有类继承或者接口实现 public void call(){// 2.子类要重写父类的方法 sout(“I m Son”); }}public class Daughter extends Parent{// 1.有类继承或者接口实现 public void call(){// 2.子类要重写父类的方法 sout(“I m Daughter”); }}public class Test{ public static void main(String[] args){ Parent p = new Son(); //3.父类的引用指向子类的对象 Parent p1 = new Daughter(); //3.父类的引用指向子类的对象 } |
这样,就实现了多态,同样是Parent类的实例,p.call 调用的是Son类的实现、p1.call调用的是Daughter的实现。
有人说,你自己定义的时候不就已经知道p是son,p1是Daughter了么。但是,有些时候你用到的对象并不都是自己声明的啊 。
比如Spring 中的IOC出来的对象,你在使用的时候就不知道他是谁,或者说你可以不用关心他是谁。根据具体情况而定。
3.多态的转型
3.1 向上转型
向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
3.2 向下转型
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。
3.3 为什么要转型
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点”小麻烦”。所以,想要调用子类特有的方法,必须做向下转型。
简单来一段代码解释下:
public abstract class Animal {public String name = “123”; public abstract void eat();}public class Cat extends Animal {@Override public void eat() { System.out.println(“猫吃鱼”); }// 子类特有方法 public void catchMouse() { System.out.println(“猫抓老鼠”); }}public class Dog extends Animal {@Override public void eat() { System.out.println(“狗吃狗粮”); }public void watchHouse() { System.out.println(“狗看家”); }} |
定义测试类:
public class test {public static void main(String[] args) {// 对象的向上转型,就是:父类引用指向之类对象。 Animal animal = new Cat(); // 本来创建的时候是一只猫 animal.eat(); // 猫吃鱼// animal.catchMouse(); // 错误写法!// 向下转型,进行“还原”动作 Cat cat = (Cat) animal; cat.catchMouse(); // 猫抓老鼠 Dog dog = (Dog) animal; }} |
多态实际上是提供了另一个维度的接口与实现分离,以解耦做什么和怎么做。多态不仅能改善代码的组织,提高代码的可读性,而且能创建有扩展性的程序——无论在最初创建项目时还是在添加新特性时都可以”生长”的程序。
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/186660.html