第2节多态

多态中成员访问特点

  • 成员变量:编译看左边,执行看左边
  • 成员方法:编译看左边,执行看右边

  为什么成员变量和成员方法访问不一样呢?

  • 因为成员方法有重写,而成员变量没有
package itheima_06;

public class Animal {
    public int age = 40;

    public void eat(){
        System.out.println("动物吃东西");
    }
}
Animal
package itheima_06;

public class Cat extends Animal {

    public int age = 20;
    public int weight = 10;

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void playGame() {
        System.out.println("猫捉迷藏");
    }
}
Cat
package itheima_06;
/*
* 测试类
* */

public class AnimalDemo {
    public static void main(String[] args) {
        //有父类引用指向子类对象
        Animal a=new Cat();

        System.out.println(a.age);
        //System.out.println(a.weight);

        a.eat();
        //a.palyGame();
    }
}

 

多态的好处和弊端

  • 多态的好处:提高了程序得到扩展性
    •  具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
  • 多态的弊端:不能使用子类的特有功能
package itheima_07;

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

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

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

    public void lookDoor(){
        System.out.println("狗看门");
    }
}
Dog
package itheima_07;
/*
* 动物操作类
* */
public class AnimalOperator {

    /*
    public void useAnimal(Cat c){ //Cat c=new Cat();
        c.eat();
    }

    public void useAnimal(Dog d){
        d.eat();
    }*/

    public void useAnimal(Animal a){
        //Animal a=new Cat();
        //Animal a=new Dog();
        //编译看左边,执行看右边
        a.eat();

        //a.lookdoor();
    }

}
AnimalOperator
package itheima_07;
/*
* 测试类
* */

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);
    }
}

 

 

多态中的转型

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

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

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

    public void playGame(){
        System.out.println("猫捉迷藏");
    }
}
Cat
package itheima_08;

public class AnimalDemo {
    public static void main(String[] args) {
        //多态
        Animal a=new Cat();//向上转型
        a.eat();
        //a.playGame();

        /*
        //创建Cat类的对象
        Cat c=new Cat();
        c.eat();
        c.playGame();
        */

        Cat c=(Cat)a;//向下转型
        c.eat();
        c.playGame();
    }
}

 

posted @ 2021-02-28 18:08  Testtext  阅读(65)  评论(0)    收藏  举报