1.多态
- 意义:
- 同一个对象被造型为不同的类型时,有不同的功能
----对象的多态:我、你、水......-------------所有对象都是多态的(明天总结时详细讨论)
- 同一类型的引用在指向不同的对象时,有不同的实现
----行为的多态:cut()、getImage()、move()......-----所有抽象方法都是多态的
- 向上造型/自动类型转换:
- 超类型的引用指向派生类的对象
- 能点出来什么,看引用的类型
- 能造型成为的类型有:超类+所实现的接口
- 强制类型转换,成功的条件只有如下两种:
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口或继承了该类
- 强转时若不符合如上两个条件,则发生ClassCastException类型转换异常
建议:在强转之前先通过instanceof判断引用的对象是否是该类型
> 何时强转:当你想访问的东西超类中没有,就需要强转(哪个类中有就转成哪个类型)
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){ //false
Coo o4 = (Coo)o;
}else{
System.out.println("o不是Coo类型");
}
}
}
interface Inter{
}
class Aoo{
}
class Boo extends Aoo implements Inter{
}
class Coo extends Aoo{
}
2. 潜艇游戏第九天:
1. 水雷入场:-------后半段
- 水雷对象是由水雷潜艇发射出来的,所以在MineSubmarine中设计shootMine()生成水雷对象
- 水雷入场为定时发生的,所以在run中调用mineEnterAction()实现水雷入场
在mineEnterAction()中:
每1000毫秒,遍历潜艇数组,判断若是水雷潜艇,则强转为水雷潜艇类型,
获取水雷对象obj,mines扩容,将obj添加到mines最后一个元素上
2. 炸弹与潜艇的碰撞:
- 在SeaObject中设计isHit()检测碰撞、goDead()去死
在Battleship中设计addLife()增命
- 炸弹与潜艇的碰撞为定时发生的,所以在run中调用bombBangAction()实现炸弹与潜艇的碰撞
在bombBangAction()中:
遍历所有炸弹得炸弹,遍历所有潜艇得潜艇,判断若都活着并且还撞上了:
潜艇去死、炸弹去死
判断若潜艇能得分,则强转为得分接口,增分
若潜艇能得命,则强转为得命接口,获取命数,战舰增命
3. 画分和画命:
- 在Battleship中设计getLife()获取命数
- 在World类的paint中: 画分和画命
2.1目录
2.1.1Battleship类
package cn.tedu.submarine;
import javax.swing.*;
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 = {};//炸弹数组
//玩家得分
private int score = 0;
public void action() {
KeyAdapter k = new KeyAdapter() {
/**
* 按键按下事件
* @param e
*/
@Override
public void keyPressed(KeyEvent e) {
//判断按的是不是空格键
if (e.getKeyCode() == KeyEvent.VK_LEFT){
ship.moveLeft();
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT){
ship.moveRight();
}
}
/**
* 重写keyReleased()按键抬起事件
* @param e
*/
@Override