• Java自学-接口与继承 多态


    Java的多态

    操作符的多态
    +可以作为算数运算,也可以作为字符串连接

    类的多态
    父类引用指向子类对象

    示例 1 : 操作符的多态

    同一个操作符在不同情境下,具备不同的作用
    如果+号两侧都是整型,那么+代表 数字相加
    如果+号两侧,任意一个是字符串,那么+代表字符串连接

    package charactor;
       
    public class Hero {
        public String name;
        protected float hp;
     
        public static void main(String[] args) {
             
            int i = 5;
            int j = 6;
            int k = i+j; //如果+号两侧都是整型,那么+代表 数字相加
             
            System.out.println(k);
             
            int a = 5;
            String b = "5";
             
            String c = a+b; //如果+号两侧,任意一个是字符串,那么+代表字符串连接
            System.out.println(c);
             
        }
           
    }
    

    示例 2 : 观察类的多态现象

    观察类的多态现象:

    1. i1和i2都是Item类型
    2. 都调用effect方法
    3. 输出不同的结果

    多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态

    观察类的多态现象

    package property;
     
    public class Item {
        String name;
        int price;
     
        public void buy(){
            System.out.println("购买");
        }
        public void effect() {
            System.out.println("物品使用后,可以有效果 ");
        }
         
        public static void main(String[] args) {
            Item i1= new LifePotion();
            Item i2 = new MagicPotion();
            System.out.print("i1  是Item类型,执行effect打印:");
            i1.effect();
            System.out.print("i2也是Item类型,执行effect打印:");
            i2.effect();
        }
     
    }
    package property;
     
    public class LifePotion extends Item {
        public void effect(){
            System.out.println("血瓶使用后,可以回血");
        }
    }
    package property;
     
    public class MagicPotion extends Item{
     
        public void effect(){
            System.out.println("蓝瓶使用后,可以回魔法");
        }
    }
    

    示例 3 : 类的多态条件

    要实现类的多态,需要如下条件

    1. 父类(接口)引用指向子类对象
    2. 调用的方法有重写

    那么多态有什么作用呢? 通过比较不使用多态与使用多态来进一步了解

    示例 4 : 类的多态-不使用多态

    如果不使用多态,
    假设英雄要使用血瓶和魔瓶,就需要为Hero设计两个方法

    useLifePotion
    useMagicPotion

    除了血瓶和魔瓶还有很多种物品,那么就需要设计很多很多个方法,比如
    usePurityPotion 净化药水
    useGuard 守卫
    useInvisiblePotion 使用隐形药水
    等等等等

    package charactor;
     
    import property.LifePotion;
    import property.MagicPotion;
       
    public class Hero {
        public String name;
        protected float hp;
     
        public void useLifePotion(LifePotion lp){
            lp.effect();
        }
        public void useMagicPotion(MagicPotion mp){
            mp.effect();
        }
     
        public static void main(String[] args) {
             
            Hero garen =  new Hero();
            garen.name = "盖伦";
         
            LifePotion lp =new LifePotion();
            MagicPotion mp =new MagicPotion();
             
            garen.useLifePotion(lp);
            garen.useMagicPotion(mp);
             
        }
           
    }
    

    示例 5 : 类的多态-使用多态

    如果物品的种类特别多,那么就需要设计很多的方法
    比如useArmor,useWeapon等等

    这个时候采用多态来解决这个问题
    设计一个方法叫做useItem,其参数类型是Item
    如果是使用血瓶,调用该方法
    如果是使用魔瓶,还是调用该方法
    无论英雄要使用什么样的物品,只需要一个方法即可

    package charactor;
     
    import property.Item;
    import property.LifePotion;
    import property.MagicPotion;
       
    public class Hero {
        public String name;
        protected float hp;
     
        public void useItem(Item i){
            i.effect();
        }
     
        public static void main(String[] args) {
             
            Hero garen =  new Hero();
            garen.name = "盖伦";
         
            LifePotion lp =new LifePotion();
            MagicPotion mp =new MagicPotion();
             
            garen.useItem(lp);
            garen.useItem(mp);     
             
        }
           
    }
    

    练习Java的多态

    1. 设计一个接口
      接口叫做Mortal,其中有一个方法叫做die

    2. 实现接口
      分别让ADHero,APHero,ADAPHero这三个类,实现Mortal接口,不同的类实现die方法的时候,都打印出不一样的字符串

    3. 为Hero类,添加一个方法,在这个方法中调用 m的die方法。

      public void kill(Mortal m)

    4. 在主方法中
      首先实例化出一个Hero对象:盖伦
      然后实例化出3个对象,分别是ADHero,APHero,ADAPHero的实例
      然后让盖伦 kill 这3个对象

  • 相关阅读:
    【JSP】上传图片到数据库中
    【MySQL】ERROR 1005: Can't create table (errno: 150)的错误解决办法
    【汇编】16进制转换成10进制(三种方法)
    书单
    C实现一个NTP客户端,可以从指定IP的NTP服务器获取时间戳
    crosss compile VLC with OpenMAX on ARM board(RockChip RK3399),in order to use Hard Acceleration when decode video
    win7结束进程 时,提示“拒绝访问”、“没有此任务的实例运行”怎么办?
    驱动文件中只有cat/inf/dll文件,怎么安装
    MFC开发中添加自定义消息和消息响应函数
    MFC中开发ocx控件,html容器收不到ocx的事件Event
  • 原文地址:https://www.cnblogs.com/jeddzd/p/11509839.html
Copyright © 2020-2023  润新知