Java面向对象--多态

多态

笔记要点


多态:同一个对象拥有多种形态

作用:把不同的数据类型进行统一,让程序有超强的扩展性


小知识点:

1. 把子类的对象赋值给父类的变量 --> 向上转型
   
   缺点:屏蔽掉子类中特有的方法
   
2. 把父类的变量转化回子类的变量 --> 向下转型

   向下转型有可能有风险,java要求必须要写强制类型转换
   
   语法:(转换之后的数据类型)变量

实践代码


Client类
public class Client {
  public static void main(String[] args) {
//        Cat c = new Cat();
//        Dog d = new Dog();
//
//        Person p = new Person();
//        p.feedCat(c);
//        p.feedDog(d);
      Cat c = new Cat(); // 创建一只猫
      // 可以把猫当作动物来看,把子类的对象赋值给对象的引用(变量)向上转型
      // 向上转型会屏蔽掉子类中特有的方法
      Animal cat = new Cat();
      Animal dog = new Dog();
      Animal elephant = new Elephant();

      // 向下转型前,站在动物的角度是不能抓老鼠的
      //cat.catchMouse();
//      Person person = new Person();
//      person.feed(cat);
//      person.feed(dog);
//      person.feed(elephant);

      // 多态: 把不同的数据类型进行统一

      // 向下转型
      Cat cc = (Cat) cat;
      cc.catchMouse(); // 猫又可以抓老鼠了

    }
}

Animal类
public class Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

Person类
public class Person {
    public void feed(Animal animal) { //接受到的所有动物都是animal
        animal.eat();
    }
//    public void feedCat(Cat c) {
//        c.eat();
//    }
//    public void feedDog(Dog d) {
//        d.eat();
//    }
//    public void feedElephant(Elephant e) {
//        e.eat();
//    }
}

Cat类
// 猫是一种动物 --> 继承关系
public class Cat extends Animal{
    public void eat() {
        System.out.println("猫吃鱼");
    }
    public void catchMouse() {
        System.out.println("猫喜欢抓老鼠");
    }
}

Dog类
public class Dog  extends Animal{
    public void eat() {
        System.out.println("狗吃骨头");
    }
}

Elephant类
public class Elephant extends Animal{
    public void eat() {
        System.out.println("大象吃香蕉");
    }
}

posted @ 2020-04-26 16:53  哨音  阅读(134)  评论(0编辑  收藏  举报