何为多态
多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
啥意思呢?就是说,在继承的基础上,一个父亲与多个儿子,父亲善于运动,儿子继承了父亲的特点,也善于运动,但是每个儿子各不相同,这样就体现了多种形态,可能大儿子善于跑步,二儿子善于跳高等等。
对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。
本质上来说,方法的重载就是多态的一种特别的体现!
多态优势
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件
- 继承关系
- 方法重写
- 父类引用指向子类对象
父类引用指向子类,也就是这样:Parent p = new Child()
也就是向上转型
演示
我们先创建了三个类
父类
//父亲 public class Father { public void Sports(){ System.out.println("跑步"); } }
子类
//儿子一 public class Son1 extends Father { @Override public void Sports() { System.out.println("游泳"); } }
//儿子二 public class Son2 extends Father { @Override public void Sports() { System.out.println("跳高"); } }
测试类
入口(输出)类 public class Demo { public static void main(String[] args) { Father father = new Son1(); father.Sports(); //将对象更换成第二个儿子 father = new Son2(); father.Sports(); } }
看这个类,它new对象时,是通过Father
类new
出了它其中的儿子类,Son1
,而后,我调用了输出方法。
之后我跟换成第二个儿子,也调用输出方法。
结果
网络异常,图片无法展示
|
从这发现,它不是输出父类的方法,而是根据不同子类输出不同子类的方法
注意
我在子类添加一个方法,注意,父类没有相同方法,也就是说没有重写!!!
public class Son1 extends Father { @Override public void Sports() { System.out.println("游泳"); } public void eat(){ System.out.println("吃蛋白粉!"); } }
我们调用输出一下eat方法
网络异常,图片无法展示
|
转型
我们上面的方法是使用向上转型,相当于从小转大,不需要强转。
但是我如果想将小转到大呢?
我们可以这么写:子类类型 变量名=(子类类型) 父类类型的变量;
public class Demo { public static void main(String[] args) { Father father = new Son1(); Son1 son1 = (Son1)father; son1.eat(); } }
这样我们就可以直接通过子类对象访问子类方法了。
判断
Java为我们提供一个关键字instanceof
,它可以帮助我们避免了ClassCastException
类型转换异常的发生。
变量名instanceof
数据类型。
- 如果变量属于该数据类型或者其子类类型,返回true。
- 如果变量不属于该数据类型或者其子类类型,返回false。