多态是我们面向对象的三大特性之一,我们先来了解一下多态的概念,多态是同一个行为具有多个不同表现形式或形态的能力。多态简单来讲就是多种形态,当去完成某个行为时,不同的对象会出现不同的状态。
1、多态实现的条件
多态要满足以下几个条件:
1、必须要在继承的条件下
2、子类必须对方法进行重写
3、通过父类的引用调用重写的方法
多态的体现:在代码运行时,调用不同类的对象,会调用相应的类中的方法
在这里我们可以看到代码,发现我们一共创建了三个类,而在这三个类中,Father继承了Person,
son也继承了Person,接下来我们对两个类中继承下来的walk方法进行重写,紧接着就是从40行到43行里面,分别去引用两种类的对象,再去调用walk方法,最后我们可以看到结果,son走了一小步,而father却走了一大步,这就是多态的体现。
2、重写
重写也被称为覆盖,重写是子类对父类的非静态,非private和final修饰,非构造方法等实现过程进行重新编写,返回值和形参不能变,即外壳不变,核心重写。
首先我们要了解重写的规则:
1、方法的重写,首先必须是重写父类的方法,且原型必须一致:返回值类型 方法名 (参数列表)要完全一致
2、被重写的方法返回值类型可以不同,但必须是具有父子关系的
这里我对Person类中的walk方法进行了修改,将返回值的类型修改Person,对Son类中的walk方法返回值的类型修改成了Son,这样的话对方法的重写也没有报错
3、访问权限不能比父类重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为protected
4、父类被static、private修饰的方法、构造方法都不能被重写
5、重写的方法可以用@overrid注解俩显示指定,有了这个注解能帮我们进行一些合法性校验。
重写和重载的区别
重写和重载只有一个相同的点就是方法名相同
3、向上转型和向下转型
3.1、向上转型
向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
语法格式:父类类型 对象名 = new 子类类型()
Person是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换
这个就是向上转型,但这只是属于向上传参的一种叫直接传参
另外两种叫:方法传参,方法返回
这个就是方法传参了,当我们通过方法去调用不同类中的方法,去形成多态
如红色圈中所演示的一样,这就是方法返回,创建方法时返回类型是父类类型,通过引用子类对象,然后再调用方法walk,最后形成多态
向上转型的优点:让代码实现更简单灵活。
向上转型的缺点:不能调用子类特有的方法。
3.2、向下转型
当我们给son这个类中添加自己的方法时,当我们去调用父类去引用之类对象时,调用子类特有的方法时发生了报错
所以向上转型是不能调用子类特有的方法
当我们去通过父类去引用子类对象时,然后再强转成子类时,我们去调用子类特有的方法,就可以发现可以被调用
向下转型的缺点:向下转型用的很少,而且通常很不安全,所以一般是不建议用的。
既然这给向下转型这么危险,那么我们又可以怎么安全的去使用呢?
3.3、instanceof的使用
通过这个instanceof我们可以对son这个对象进行一个检验,检验它是否是Son这个类去引用的,如过引用真确,则返回true,否者则返回false
这样就可以进行成功的向下转型。