java面向对象09-多态

本文探讨了Java编程中的多态性概念,包括对象多态和行为多态,以及向上造型和类型转换的规则。强调了接口在提高代码复用性、扩展性和维护性方面的优势,并通过示例展示了如何利用接口处理不同类型对象的方法调用,以实现灵活的代码设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 多态:多种形态

   - 意义:

     - 同一个对象被造型为不同的类型时,有不同的功能------所有对象都是多态的(明天详细理解)

       ----对象多态:我、你、水......

     - 同一类型的引用指向不同的对象时,有不同的实现------所有抽象方法都是多态的

       ----行为多态:cut()、getImage()、move()、getScore()......

   - 向上造型/自动类型转换:

     - 超类型的引用指向派生类的对象(前面是超类型,后面是派生类型)
     - 能点出来什么,看引用的类型(这是规定)
     - 能向上造型成为的类型有:超类+所实现的接口

   - 强制类型转换,成功的条件只有如下两种:

     - 引用所指向的对象,就是该类型
     - 引用所指向的对象,实现了该接口或继承了该类

   - 强转若不符合如上条件,则发生ClassCastException类型转换异常

     建议:在强转之前一定要先通过instanceof来判断引用的对象是否是该类型

     > 强转时若符合如上的两个条件,则instanceof返回true,若不符合则返回false

     > 何时需要强转:你想访问的东西在超类中没有,那就需要强转

     public class MultiType {
         public static void main(String[] args) {
             //条件1:引用所指向的对象,就是该类型
             //条件2:引用所指向的对象,实现了该接口或继承了该类
             Aoo o = new Boo(); //向上造型
             Boo o1 = (Boo)o;     //引用o所指向的对象,就是Boo类型-------符合条件1
             Inter o2 = (Inter)o; //引用o所指向的对象,实现了Inter接口---符合条件2
             //Coo o3 = (Coo)o; //运行时会发生ClassCastException类型转换异常
     
             //判断o是否是Coo类型(与强转成功条件完全匹配)
             if(o instanceof Coo){ //false
                 Coo o4 = (Coo)o; //instanceof若为true,则强转一定成功
             }else{
                 System.out.println("o不是Coo类型");
             }
     
         }
     }
     interface Inter{  }
     class Aoo{  }
     class Boo extends Aoo implements Inter{  }
     class Coo extends Aoo{  }

## 补充:

1. 体会接口的好处:

   //复用性好、扩展性好、维护性好------------------高质量代码
   //被撞的是ObserveSubmarine-----调用ObserveSubmarine的getScore()-----10分
   //被撞的是TorpedoSubmarine-----调用TorpedoSubmarine的getScore()-----40分
   //被撞的是NuclearSubmarine-----调用NuclearSubmarine的getScore()-----100分
   if(s instanceof EnemyScore){ //------适用于所有实现EnemyScore接口的
       EnemyScore es = (EnemyScore)s;
       score += es.getScore();
   }
   //被撞的是MineSubmarine--------调用MineSubmarine的getLife()---------1
   //被撞的是NuclearSubmarine-----调用NuclearSubmarine的getLife()------3
   if(s instanceof EnemyLife){ //-------适用于所有实现EnemyLife接口的
       EnemyLife el = (EnemyLife)s;
       int num = el.getLife();
       ship.addLife(num);
   }
                                         
   //复用性差、扩展性差、维护性差------------------垃圾代码
   if(s instanceof ObserveSubmarine){ //---------只能适用于ObserveSubmarine的
       ObserveSubmarine os = (ObserveSubmarine)s;
       score += os.getScore();
   }
   if(s instanceof TorpedoSubmarine){ //---------只能适用于TorpedoSubmarine的
       TorpedoSubmarine ts = (TorpedoSubmarine)s;
       score += ts.getScore();
   }      
   if(s instanceof MineSubmarine){    //---------只能适用于MineSubmarine的
       MineSubmarine ms = (MineSubmarine)s;
       int num = ms.getLife();
       ship.addLife(num);
   }
   if(s instanceof NuclearSubmarine){ //---------只能适用于NuclearSubmarine
       NuclearSubmarine ns = (NuclearSubmarine)s;
       score += ns.getScore();
       int num = ns.getLife();
       ship.addLife(num);
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值