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("吃东西");
}
}