1.多态
多态:一种事物的多种状态
* 青蛙卵 ---> 蝌蚪 --->青蛙 --->食物 --->屎
2.多态的规则
多态的规则(前提)
* 1.类和类之间 必须要有关系(继承关系)
* 2.必须要有方法的重写(否则多态没有意义)
* 3.(核心)父类的引用(指针) 指向 子类的对象(子类的对象)
/* 需求: 创建 动物类 猫类 狗类
* 都有一个吃的方法 动物类 动物吃饭
* 猫 猫吃鱼
* 狗 狗吃骨头
*/
class Animal {
public void eat() {
System.out.println("我在吃饭");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("猫在吃鱼");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("狗在啃骨头");
}
}
public static void main(String[] args) {
//本类的引用(指针) 指向 本类的对象(空间)
Cat cat = new Cat();
cat.eat();
//多态的对象创建方式
//父类指针指向子类空间
Animal aCat = new Cat();
aCat.eat();
Animal aDog = new Dog();
aDog.eat();
}
3.多态成员变量的使用与成员方法的使用
多态 如何使用成员变量?
* 父类的引用 只能 访问 子类空间中 属于父类的那块空间
* 编译:
* 编译时 要查看 父类中是否有这个属性 没有就编译错误
*
* 运行:
* 运行时 访问的是父类中 这个成员变量
* 结论:当使用多态形式创建对象时访问成员变量时 编译和运行都是看父类的属性(记)
*
* 多态 调用成员方法
* 编译:编译时 需要看父类中 是否有该方法 没有就报错
* 有就编译通过
* 运行:调用的是 子类重写父类的方法
* 结论:编译看父类 运行看子类(记)
4.多态的好处与弊端
多态的好处:
* 1.减少代码量 提高工作效率 复用性强
* 相当于提高了代码 可维护性(指的是继承)
* 2.(核心)提高方法的扩展性
*
* 多态的弊端:
* 当使用多态的方式创建对象时
* 无法直接调用 子类中 特有的方法
*
多态调用子类的特有方法注意:
* 必须先有 向上转转型 才能向下转型
public static void main(String[] args) {
//多态创建对象
//提升了骗子的逼格
//提升子类对象类型 ---向上转型
Person p = new Pianzi();
p.speak();
//如何调用子类的特有方法
//把装成人的骗子 打回原形
//向下转型 ---强制类型转换
Pianzi pZ =(Pianzi) p;
//调用子类的特有方法
pZ.hit();
}
}
class Person{
public void speak(){
System.out.println("聊天");
}
}
class Pianzi extends Person{
public void speak(){
System.out.println("洗脑");
}
//特有方法
public void hit(){
System.out.println("打人 威胁人");
}
}
5.多态的核心提升扩展性
武器 --打
* 剑 --- 舞 --- 练剑
* 刀 --- 砍 --- 练刀
* 杖 --- 抡
* 枪 --- 射
* 手里剑 --- 扔
* 捡装备的方法(武器类)
* (重写的方法)
* (每个装备特有的方法)
*
* 武器类 武器 = 剑
* 武器.重写方法();
*
* 判断一下 传进来的参数 是什么类型
* 剑 --->剑类型
*
*/
public class Demo04 {
public static void main(String[] args) {
//测试方法是否扩展
Jian jian = new Jian();
fun(jian);
Dao dao = new Dao();
fun(new Dao());//匿名对象
}
//使用多态的方法
public static void fun(WuQi wuQi){
//WuQi wuQi = jian 向上转型
//调用 子类中重写的方法
wuQi.hit();
/*多态调用子类的特有方法注意:
必须先有 向上转转型 才能向下转型 */
//判断一下类型
//根据具体类型 进行 向下转型
//判断 wuQi是否属于 Jian(类名)这个类的对象
if (wuQi instanceof Jian){
//该武器 就是一把剑
//向下转型
Jian j = (Jian)wuQi;
//调用 特有方法
j.lianJian();
}else if(wuQi instanceof Dao){
Dao d = (Dao)wuQi;
d.lianDao();
}
}
}
class WuQi{
// 打
public void hit(){
System.out.println("武器打");
}
}
class Jian extends WuQi{
@Override
public void hit() {
System.out.println("剑----舞一下");
}
//特有的方法
public void lianJian(){
System.out.println("练习剑法");
}
}
class Dao extends WuQi{
@Override
public void hit() {
System.out.println("刀---砍人");
}
public void lianDao(){
System.out.println("练习刀法");
}
}