笔记:
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