169 多态

6 篇文章 0 订阅

169 多态

同一个对象在不同时刻表现出来的不同形态。

例如,猫是猫,猫也是动物。

Cat = new Cat();

Animal = new Cat();

【多态的前提和体现】

1.有继承or实现关系——什么叫实现?后面讲

2.有方法重写

3.有父类引用指向子类对象

//项目myDuoTai,包itheima01

//思路:创建3个类——猫类、动物类、测试类

//创建多态的前提——继承、重写、父类引用指向子类对象——然后测试

package itheima01

public class Animal{

public void eat(){

System.out.println("这是eat方法:动物吃东西");

}

}



package itheima01;

public class Cat extends Animal{

//便捷输入:此处直接写方法名,系统可提示相关的可重写的方法,如eat

@override

public void eat{

//super.eat;

System.out.println("这是重写后的cat的eat方法:猫吃鱼");

}

}



package itheima01

public class AnimalDemo{

public static void main(String[]args){

//这就是父类引用指向子类对象

Animal a = new Cat();

}

}

170 多态中的访问特点

知识点

编译看(父类引用指向子类对象的)左边,执行看(父类引用指向子类对象的)右边

思路

3个类:动物类、猫类、测试类

动物类:1个变量、1个方法

猫类:继承动物类,2个变量、1个重写的方法、1个独有的方法

测试类:父类引用指向子类对象,调用父类、子类中的变量、方法

知识点

(成员变量)编译看左边,运行看左边

(成员方法)编译看左边,运行看右边

这里指的是创建对象语句的左边和右边,例如Animal a = new Cat;

编译看左边,指的是左边的类or方法里有的,方可编译成功,否则报错

执行看右边,指的是执行结果以右边为准,例如cat里的eat写屏“猫吃鱼”,animal里的eat写屏“动物吃东西”。Animal a = new Cat;的运行结果是“猫吃鱼”,运行cat类的结果


//project/myDuoTai,package/itheima02E170

package itheima02E170;



public class AnimalDemo {

    public static void main(String[] args) {

        Animal a = new Cat();

        System.out.println(a.age);

        //(引用weight)报错了,因为编译看左边,左边的animal里没有weight

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

        a.eat();

        //(调用catchmouse)报错了,因为编译看左边,左边的animal里没有catchmouse

        // a.catchMouse();

    }

}

171 多态的好处和弊端

好处

提高了程序的扩展性。定义方法的时候,使用父类作为方法参数,使用方法时将以子类运行

弊端

不可调用子类独有的方法

project/myDuoTai

package/itheima03

4 class/Animal,AnimalDemo,AnimalOperator,Cat

思路

动物类:包含eat方法。

猫类:继承动物类,重写eat方法。

动物操作类:包含useanimal方法,带参,参数为cat

测试类:包含main方法,创建动物操作类对象并调用方法

package itheima03E171;



public class Animal {

    public void eat(){

        System.out.println("动物吃东西");

    }

}

package itheima03E171;

public class Cat extends Animal{

    @Override

    public void eat() {

        System.out.println("猫吃鱼");

    }

}
package itheima03E171;

public class Dog extends Animal{

    @Override

    public void eat() {

        System.out.println("狗吃骨头");

    }

    public void lookdoor(){//lookdoor是子类dog独有的方法

        System.out.println("狗能看门");

    }

}
package itheima03E171;

public class Pig extends Animal{

    @Override

    public void eat() {

        System.out.println("猪吃白菜");

    }

}
package itheima03E171;

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 c=new Cat

        //Animal d=new Dog

        a.eat();

        //(调用lookdoor)报错了,因为lookdoor是子类dog类独有的方法

        //a.lookdoor();



    }

}
package itheima03E171;

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

    }

}

//useAnimal方法使用animal为参数可一次性解决问题,调用时仍需分别创建对象并调用重写的方法才可以达到调用目的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值