一篇文章让你掌握多态

图片

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

(0)
联系我们
联系我们
分享本页
返回顶部