初学Java第十五天

本文详细介绍了Java中的多态性概念,包括对象多态和行为多态,以及向上造型的原理和类型转换的注意事项。通过实例展示了如何在实际编程中运用多态,包括使用instanceof关键字进行类型判断,以及避免ClassCastException的方法。同时,文章还提供了代码示例,演示了如何在多态场景下进行类型转换和操作。
摘要由CSDN通过智能技术生成

笔记:

1. 多态:

   - 意义:

     - 同一个对象被造型为不同的类型时,有不同的功能

       ---对象多态:我、你、水-------------------所有对象都是多态的(明天再详细讨论)

     - 同一类型的引用指向不同的对象时,有不同的实现

       ---行为多态:cut(),move(),getImage()......---------所有抽象方法都是多态的

   - 向上造型:

     - 超类型的引用指向派生类的对象
     - 能点出来什么,看引用的类型
     - 能造型成为的类型有:超类+所实现的接口

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

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

   - 强转时若不满足如上条件,则发生ClassCastException类型转换异常

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

   ```java
   public class MultiTypeDemo {
       public static void main(String[] args) {
           Aoo o = new Boo(); //向上造型
           Boo o1 = (Boo)o; //引用o指向的对象,就是Boo
           Inter o2 = (Inter)o; //引用o指向的对象,实现了Inter接口
           //Coo o3 = (Coo)o; //运行时发生ClassCastException类型转换异常
           if(o instanceof Coo){
               Coo o4 = (Coo)o;
           }else{
               System.out.println("o不是Coo类型");
           }
       }
   }
   interface Inter{
   }
   class Aoo{
   }
   class Boo extends Aoo implements Inter{
   }
   class Coo extends Aoo{
   }
   ```

   

## 精华笔记:

1. 多态:

   - 意义:

     - 同一个对象被造型为不同的类型时,有不同的功能

       ---对象多态:我、你、水-------------------所有对象都是多态的(明天再详细讨论)

     - 同一类型的引用指向不同的对象时,有不同的实现

       ---行为多态:cut(),move(),getImage()......---------所有抽象方法都是多态的

   - 向上造型:

     - 超类型的引用指向派生类的对象
     - 能点出来什么,看引用的类型
     - 能造型成为的类型有:超类+所实现的接口

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

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

   - 强转时若不满足如上条件,则发生ClassCastException类型转换异常

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

   

## 补充:

1. 碰撞检测图:

   ![碰撞检测图](C:\Users\TEDU\Desktop\ooDay09\碰撞检测图.png)

 参考:

1. 深水炸弹入场(下半段):

   参考代码:

   ```java
   package day09;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import java.awt.Graphics;
   import java.util.Arrays;
   import java.util.Random;
   import java.util.Timer;
   import java.util.TimerTask;
   import java.awt.event.KeyAdapter;
   import java.awt.event.KeyEvent;
   //整个游戏世界
   public class World extends JPanel {
       public static final int WIDTH = 641;
       public static final int HEIGHT = 479;
   
       private Battleship ship = new Battleship(); //战舰
       private SeaObject[] submarines = {}; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
       private Mine[] mines = {}; //水雷
       private Bomb[] bombs = {}; //深水炸弹
   
       /** 随机生成潜艇 */
       public SeaObject nextOne(){
           Random rand = new Random();
           int type = rand.nextInt(20);
           if(type<10){
               return new ObserveSubmarine();
           }else if(type<15){
               return new TorpedoSubmarine();
           }else{
               return new MineSubmarine();
           }
       }
   
       private int subEnterIndex = 0;
       /** 潜艇入场 */
       public void submarineEnterAction(){ //每10毫秒走一次
           subEnterIndex++;
           if(subEnterIndex%40==0){ //每400毫秒
               SeaObject obj = nextOne();
               submarines = Arrays.copyOf(submarines,submarines.length+1);
               submarines[submarines.length-1] = obj;
           }
       }
       
       private int mineEnterIndex = 0;
       /** 雷(鱼雷、水雷)入场 */
       public void MineEnterAction(){
           mineEnterIndex++;
           if(mineEnterIndex%100==0){
               for(int i=0;i<submarines.length;i++){
                   if(submarines[i] instanceof MineSubmarine){
                       MineSubmarine ms = (MineSubmarine)submarines[i];
                       Mine obj = ms.shootMine();
                       mines = Arrays.copyOf(mines,mines.length+1);
                       mines[mines.length-1] = obj;
                   }
               }
           }
       }
       
       /** 海洋对象移动 */
       public void moveAction(){
           for(int i=0;i<submarines.length;i++){
               submarines[i].move();
           }
           for(int i=0;i<mines.length;i++){
               mines[i].move();
           }
           for(int i=0;i<bombs.length;i++){
               bombs[i].move();
           }
       }
       
       /** 删除越界的对象 */
       public void outOfBoundsAction(){
           for(int i=0;i<submarines.length;i++){
               if(submarines[i].isOutOfBounds()){
                   submarines[i] = submarines[submarines.length-1];
                   submarines = Arrays.copyOf(submarines,submarines.length-1);
               }
           }
   
           for(int i=0;i<mines.length;i++){
               if(mines[i].isOutO

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值