概述:同一对象,在不同时刻表现出来的不同形态
例:猫
可以说猫是猫:猫 cat = new 猫();
也可以说猫是动物:猫 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态。
多态的前提和体现:
有继承/实现关系
有方法重写
有父类引用指向子类对象
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
//有继承
public class Cat extends Animal{
//方法重写
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class AnimalDemo {
public static void main(String[] args) {
//有父类引用指向子类对象
Animal a = new Cat();
}
}
多态中成员访问特点
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边
因为成员方法有重写,而成员变量没有
多态的好处和弊端
好处:提高了程序的扩展性
具体体现:定义方法时,使用父类型作为参数,将来在使用时,使用具体的子类型参与操作。
弊端:不能使用子类的特有功能
public class AnimalOperator {
public void useAnimal(Animal a){
a.eat();
}
}
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("狗吃骨头");
}
}
public class Pig extends Animal {
public void eat(){
System.out.println("猪吃白菜");
}
}
public class AnimalDemo {
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);
}
}
多态中的转型
向上转型:从子到父,父类引用指向子类对象
Animal a = new Cat();
向下转型:从父到子,父类引用转为子类对象
Cat c = (Cat)a;
案例:猫和狗
需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试。
//动物类
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("动物吃东西");
}
}
public class Cat extends Animal{
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
public void eat(){
System.out.println("猫吃鱼");
}
}
public class Dog extends Animal{
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
public void eat(){
System.out.println("狗吃骨头");
}
}
public class AnimalDemo {
public static void main(String[] args) {
//创建猫类
Animal a = new Cat(); //无参
a.setName("加菲");
a.setAge(3);
System.out.println(a.getName() + "," + a.getAge());
a.eat();
a = new Cat("汤姆",5); //带参
System.out.println(a.getName() + "," + a.getAge());
a.eat();
System.out.println("-----------------");
//创建狗类
Animal b = new Dog();
b.setName("旺财");
b.setAge(3);
System.out.println(b.getName() + "," + b.getAge());
b.eat();
b = new Dog("大黄",5);
System.out.println(b.getName() + "," + b.getAge());
b.eat();
}
}



