同一方法可以根据发送对象的不同而采取多种不同的行为方式
一个对象实际类型是确定的 但指向其引用类型却有很多
好比如你的 父亲 有三个儿子 儿子总有一方面长得和爹比较像
大儿子 皮肤比较黑 二儿子 皮肤比较黄 三儿子 皮肤比较白
有一种方法 一种一种判断
if skin == "黄" 是二儿子 if skin == "黑" 是大儿子 if skin == "白" 是三儿子
利用多态 不需要一个个判断 看到皮肤颜色就知道是谁
是因为Java实例方法是基于运行时的实际类型的动态调用 而非变量的声明类型
基类
package com.oop.demo09; // 父亲类 public class Father { public void getSkin(){ System.out.println("...."); } }
大儿子
package com.oop.demo09; public class First extends Father { @Override public void getSkin() { System.out.println("我是老大 皮肤 比较黑"); } }
二儿子
package com.oop.demo09; public class Second extends Father { @Override public void getSkin() { System.out.println("二儿子 皮肤 比较黄"); } }
三儿子
package com.oop.demo09; public class Third extends Father { @Override public void getSkin() { System.out.println("三儿子 皮肤比较白"); } }
测试类
package com.oop; import com.oop.demo09.Father; import com.oop.demo09.First; import com.oop.demo09.Second; import com.oop.demo09.Third; public class Applcation { public static void main(String[] args) { Father father = new Father(); father.getSkin(); System.out.println("===================="); Father father1 = new First(); father1.getSkin(); System.out.println("===================="); Father father2 = new Second(); father2.getSkin(); System.out.println("===================="); Father father3 = new Third(); father3.getSkin(); /* * Father father3 = new Third(); * 父类的引用指向子类的实例 * * Third继承自Father 它拥有Father的非private得属性和方法 * 其他子类也是一样的 * * 将Father得引用 指向Third得实例 完全ok * */ } }
输出
没有每次判断 皮肤颜色 来 打印输出 不用管他是哪个儿子 只需要跟getSkin打交道就好了
利用多态的方式 即 一个类的多种形态 下面继承树