多态
概述: 同一个对象,在不同时刻表现出来的不同形态。
这里父类引用指向子类对象解释说明:
父类为Animal,子类为Cat
Animal a=new Cat();
多态成员的访问特点
//父类
package myday;
public class Animal {
public String name="animal";
public void eat() {
System.out.println("动物吃东西");
}
}
//子类
package myday;
public class Cat extends Animal{
public String name="cattt";
public int age;
public void eat() {
System.out.println("猫吃鱼");
}
}
//测试
package myday;
public class Demo {
public static void main(String[] args) {
Animal cat=new Cat();
System.out.println(cat.name);//输出:animal
System.out.println(cat.age);//报错
//虽然cat的Cat类的,Cat类中有变量age
//但Animal类中没有age
//系统编译时会看左边Animal类中是否有该变量
//没有则会报错
//变量的编译,运行都是看左边
//方法的编译看左,执行看右
}
}
多态的好处和弊端
当我们有多个动物要完成同一个动作时,每增加一种动物的类,AnimalAll中就要重新定义一个方法。
package myday;
public class Cat {
public void eat() {
System.out.println("猫吃鱼");
}
}
package myday;
public class Dog {
public void eat() {
System.out.println("狗吃骨头");
}
}
//动物操作类
package myday;
public class AnimalAll {
public void useAnimal(Cat c) {
c.eat();
}
public void useAnimal(Dog d) {
d.eat();
}
}
//测试类
package myday;
public class Demo {
public static void main(String[] args) {
Cat c=new Cat();
Dog d=new Dog();
AnimalAll a=new AnimalAll();
a.useAnimal(c);//c相当于Cat类,传到AnimalAll的方法中
a.useAnimal(d);//d相当于Dog类,传到AnimalAll的方法中
//输出 猫吃鱼
// 狗吃骨头
}
}
利用多态改进:
//父类
package myday;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
//子类
package myday;
public class Cat extends Animal{
public void eat() {
System.out.println("猫吃鱼");
}
}
package myday;
public class Dog extends Animal{
public void eat() {
System.out.println("狗吃骨头");
}
}
//动物操作类
package myday;
public class AnimalAll {
public void useAnimal(Animal c) {
//传入Cat c时,相当于Animal c=new Cat();
//调用方法时编译看左,执行看右
//Dog d同理
c.eat();
}
}
//测试类
package myday;
public class Demo {
public static void main(String[] args) {
Cat c=new Cat();
Dog d=new Dog();
AnimalAll a=new AnimalAll();
a.useAnimal(c);
a.useAnimal(d);
//输出 猫吃鱼
// 狗吃骨头
}
}
多态中,不能访问子类特有功能。
若想使用子类的特有方法:
Cat c=new Cat();
c.playGame();//这样就可以调用子类中特有的playGame方法。
多态中的转型
向上转型
由子到父
父类引用指向子类对象
//父类
package myday;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
//子类
package myday;
public class Cat extends Animal{
public void eat() {
System.out.println("猫吃鱼");
}
}
//测试
package myday;
public class Demo {
public static void main(String[] args) {
Animal c=new Cat();//向上转型
a.eat();
}
}
向下转型
从父到子
父类引用转为子类对象
结合上面提到的,多态中不能调用子类特有的功能,只能重新创建一个子类对象,这样做很麻烦,所以可以用向上转型解决。
Animal c=new Cat();
//此时的对象c不能调用Cat类中特有的功能
//解决方法:向上转型
Cat a=(Cat)c;//强制转换,将父类引用强转为子类对象
注意:不能将其他子类的父类引用强制转换为该类对象。
比如不能将Dog类的父类引用强制向下转型为Cat类的对象,否则输出ClassCastException(类型转换异常)。