一、什么是多态
多态不但可以改善代码的组织结构和可读性,还能够创建可扩展的程序(即无论在项目最初创建时还是在需要添加新功能时都可以”生长“的程序)。之所以可以进行扩展,是因为在多态中默认忘记了对象类型,比如类Shap,无论是Circle(圆形)、Square(正方形)还是Triangle(三角形)都可以说是一种Shape,也就是继承中常提到的”is-a“关系,此时如果继续添加一个Rhombus(菱形)类仍然满足这种关系,所以当进行向上转型时都可以说是一个Shape类,即忽视了具体类型,多态实例如下:
- class Shape{
- public draw(){}
- public clear(){}
- }
- class Trangle extends Shape{
- //重写父类方法
- public draw(){
- System.out.print("Draw Trangle");
- }
- public clear(){
- System.out.print("Clear Trangle");
- }
- }
- class Circle extends Shape{
- //重写父类方法
- public draw(){
- System.out.print("Draw Circle ");
- }
- public clear(){
- System.out.print("Clear Circle ");
- }
- }
- //可以进行扩展Square、Rhombus……
- public class Test{
- public static void main(String[] args){
- Shape[] shape = {new Trangle(),new Circle()};//多态,忽视Trangle和Circle的具体类型而一并看作为Shape类型
- for(Shape s:shape){
- s.draw();
- s.clear();
- }
- }
- }
- out:
- Draw Trangle
- Clear Trangle
- Draw Circle
- Clear Circle
**补充一点**:
既然有向上转型肯定就有向下转型,但是由于子类的方法不只包含所有的基类方法,还可能拥有基类没有的方法,所以在向下转型时很可能出现丢失方法的情况以致于转型失败,具体实例如下:
- class Useful{
- public void f(){}
- public void g(){}
- }
- class MoreUserful extends Useful{
- public void f(){}//重写父类方法
- public void g(){}//重写父类方法
- public void u(){}//子类包含基类没有的方法
- }
- public class Test{
- public static void main(String[] args){
- Useful[] u={new Useful(),new MoreUseful()}; //多态(包含向上转型)
- u[0].f();
- u[1].g();
- //若要通过父类调用子类方法,需要向下转型
- (MoreUseful)u[0].u();//报错ClassCastException异常
- (MoreUseful)u[1].u();//向下转型成功!
- }
- }