今日学习面向对象三大特征中的多态

1. 多态

  • 多态的定义:多态性就是指父类的某个方法被其子类重写时,可以各自产生各自的功能行为;字面上理解,多种形态。例如小明是学生,它既有学生的形态,也有人的形态。一个对象有多种形态称为对象的多态性,当然方法也有多态性,例如方法的重载和方法的重写
  • 多态的前提:1.继承2.重写3.父类变量(引用)指向子类对象(上转型)父类名称 对象名 = new 子类名称();
  • 上转型:父类的变量→子类对象称为上转型,父类名称 对象名 = new 子类名称();意义就相当与子类对象要体现出父类的形态,即小范围转向大范围。上转型一定安全、成功。但是对象一旦向上转型为父类,那么就无法调用子类原本的特有内容。
  • 下转型:子类的变量→父类对象称为下转型。子类名称 对象名 = (子类名称)父类对象,含义将父类对象还原成原本的子类对象。向下转型不一定成功,大范围转向小范围。注意:要还原成本来的子类对象。
  • 多态中成员变量的使用特点:
    1.要通过对象名称直接访问成员变量,就看创建对象的等号左边是谁优先使用谁,没有就向上(父类)查找。
    例如:有一个class Fu和一个class Zi,两个类中有同名属性num,Zi类中num的属性值为10;Fu类中num属性值为20
    Fu obj = new Zi();//上转型,子类对象obj要体现Fu类的形态
    System.out.println(obj.num);//此时输出的就是Fu类中的num的属性值
    2.若是通过成员方法访问成员变量,看这个成员方法属于谁就优先用谁,没有就向上(父类)查找,但是这个成员方法被覆盖重写了,就用重写之后的成员方法。
    例如:有一个class Fu和一个class Zi,两个类中有同名属性num,Zi类中num的属性值为10;Fu类中num属性值为20,两个类中有两个成员方法showNum,Zi类重写了此成员方法
public void showNum(){System.out.println(num);}
//以上是成员方法
Fu obj = new Zi();//上转型,子类对象obj要体现Fu类的形态
obj.showNum();//若是重写了就是输出的Zi的num,没重写就是Fu的num
//即看成员方法属于谁就用谁,没有就向上查找。
  • 多态中成员方法的使用特点:
    看new的是谁就优先访问谁的成员方法,没有就向上(父类)查找。
    编译看左边,运行看右边。(=等号的左右)
    例如:有一个class Fu和一个class Zi,Zi类和Fu类都有method成员方法,Fu类有自己的methodFu成员方法,Zi类有自己的methodZi成员方法,Zi类重写了Fu类的method成员方法
public void method(){System.out.println("父类方法");}
public void method(){System.out.println("子类方法");}
public void methodZi(){System.out.println("子类特有方法");}
public void methodFu(){System.out.println("父类特有方法");}
Fu obj = new Zi();//多态
obj.method();//输出子类方法
obj.methodZi();//报错的,编译时Fu类中没有,向上找也没有
obj.methodFu();//输出父类特有方法
  • 成员变量与成员方法的小技巧
    成员变量:编译看左边,运行看左边。
    成员方法:编译看左边,运行看右边。