Java 基础 21 多态

1.1 多态的概述和代码体现

  • 多态概述
    • 某一个事物,在不同时刻表现出来的不同状态。
  • 举例
    • 猫可以是猫的类型。猫 m = new 猫();
    • 同时猫也是动物的一种,也可以把猫称为动物
      • 动物 d = new 猫();
      • 水在不同时刻的状态
  • 多态的前提和体现
    • 有继承关系
    • 有方法重写
    • 有父类引用指向子类对象

1.1.1案例代码

package com.itheima_01;
/*
 * 多态:同一个对象,在不同时刻体现出来的不同状态。
 * 举例:
 *      猫:猫是猫,猫是动物。
 *      水:液体,固体,气体。
 * 
 * Java中多态的前提:
 *      A:有继承关系
 *      B:有方法重写
 *      C:有父类引用指向子类对象
 *          Fu f = new Fu();
 *          Zi z = new Zi();
 * 
 *          Fu f = new Zi();
 */
public class DuoTaiDemo {
    public static void main(String[] args) {
        //有父类引用指向子类对象
        Animal a = new Cat();
    }
}

1.2 多态中成员的访问特点

1.2.1多态中成员访问特点

  • 成员变量访问特点

    • 编译看左边,运行看左边
  • 成员方法访问特点

    • 编译看左边,运行在左

1.2.2示例代码

package com.itheima_02;
/*
 * 多态中成员的访问特点:
 *      A:成员变量
 *          编译看左边,执行看左边。
 *      B:成员方法
 *          编译看左边,执行看右边。
 * 
 *      为什么成员变量和成员方法的访问不一样呢?
 *          因为成员方法有重写,而变量没有。
 */
public class DuoTaiDemo {
    public static void main(String[] args) {
        //多态
        Animal a = new Cat();
        System.out.println(a.age);
        //System.out.println(a.weight);
        
        a.eat();
        //a.playGame();
    }
}

package com.itheima_02;

public class Cat extends Animal {
    public int age = 20;
    public int weight = 10;
    
    public void eat() {
        System.out.println("猫吃鱼");
    }
    
    public void playGame() {
        System.out.println("猫捉迷藏");
    }
}
package com.itheima_02;

public class Animal {
    public int age = 40;
    
    public void eat() {
        System.out.println("吃东西");
    }
}

1.3多态的好处和弊端

  • 多态的好处
    -提高了程序的扩展性
  • 多态的弊端
    • 不能访问子类特有功能
    • 那么如何访问子类的特有功能呢?
      • 通过多态中的转型

示例代码

package com.itheima_03;
/*
 * 多态的好处:提高了程序的扩展性
 *      具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。
 * 多态的弊端:不能使用子类的特有功能
 */
public class DuoTaiDemo {
    public static void main(String[] args) {
        AnimalOperator ao = new AnimalOperator();
        Cat c = new Cat();
        ao.useAnimal(c);
        
        Dog d = new Dog();
        ao.useAnimal(d);
        
        Pig p = new Pig();
        ao.useAnimal(p);
    }
}

package com.itheima_03;

public class AnimalOperator {
    /*
    public void useAnimal(Cat c) { //Cat c = new Cat();
        c.eat();
    }
    
    public void useAnimal(Dog d) { //Dog d = new Dog();
        d.eat();
    }
    */
    
    public void useAnimal(Animal a) { //Animal a = new Cat();
        a.eat();
        //a.lookDoor();
    }
}

package com.itheima_03;

public class Cat extends Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
package com.itheima_03;

public class Dog extends Animal {
    public void eat() {
        System.out.println("狗吃骨头");
    }
    
    public void lookDoor() {
        System.out.println("狗看门");
    }
}
package com.itheima_03;

public class Pig extends Animal {
    public void eat() {
        System.out.println("猪吃白菜");
    }
}

1.4 多态中的转型问题

  • 向上转型
    • 从子到父
    • 父类引用指向子类对象
  • 向下转型
    • 从父到子
    • 父类引用转为子类对象

1.4.1示例代码

package com.itheima_04;
/*
*   向上转型
*       从子到父
*       父类引用指向子类对象
*   向下转型
*       从父到子
*       父类引用转为子类对象
*/
public class DuoTaiDemo {
    public static void main(String[] args) {
        //多态
        Animal a = new Cat(); //向上转型
        a.eat();
        
        //a.playGame();
        //多态的弊端:无法访问子类特有方法
        //现在我就想使用子类特有方法,怎么办呢?
        //创建子类对象就可以了
        /*
        Cat c = new Cat();
        c.eat();
        c.playGame();
        */
        //现在的代码虽然可以访问子类的特有功能,但是不合理
        //因为我们发现内存中有两个猫类的对象
        //这个时候,我们得想办法把多态中的猫对象还原
        //这个时候,就要使用多态中的转型了
        //父类引用转为子类对象
        Cat c = (Cat)a;
        c.eat();
        c.playGame();
    }
}
package com.itheima_04;

public class Cat extends Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }
    
    public void playGame() {
        System.out.println("猫捉迷藏");
    }
}
package com.itheima_04;

public class Animal {
    public void eat() {
        System.out.println("吃东西");
    }
}

3.5多态中的内存图

Java 基础 21 多态_第1张图片
Polymorphism.png

你可能感兴趣的:(Java 基础 21 多态)