什么是多态
同一方法可以根据发送对象的不同而采取多种不同的行为方式
一个对象实际类型是确定的 但指向其引用类型却有很多
注意事项
- 多态是方法的多态 属性没有多态
- 父类和子类 有联系 类型转换异常 ClassCastException
- 存在的条件
- 继承关系
- 方法需要重写
- 父类的引用指向子类对象
场景假设
好比如你的 父亲 有三个儿子 儿子总有一方面长得和爹比较像
大儿子 皮肤比较黑 二儿子 皮肤比较黄 三儿子 皮肤比较白
有一种方法 一种一种判断
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打交道就好了
利用多态的方式 即 一个类的多种形态 下面继承树
小结
- 多态实现的基础 就是 继承 没有继承没有多态
- Java实例方法是基于运行时的实际类型的动态调用 而非变量的声明类型
- 多态 一个类的多种表现形式 一般用于接口