第8天
1.接口
1)也是一种引用数据类型----类也是引用数据类型
2)由interface来定义----类是用class来定义
3)接口中只能包含常量和抽象方法(默认的),可以看成是只包含抽象方法的抽象类----方法权限都是公开的
4)接口不能被实例化-----接口不能new对象
5)接口是需要被实现/继承的,实现类/派生类:必须重写接口中的所有抽象方法
6)一个类可以实现多个接口(用逗号隔开)------一个类只能继承一个父类
若又继承又实现,必须先继承后实现
7)一个接口可以继承另一个接口
2.设计规则
1)将派生类所共有的属性和行为,抽到超类中------抽共性
2)所有派生类的行为都一样,设计为普通方法
所有派生类的行为都不一样,设计为抽象方法
3)将部分派生类所共有的行为,抽到接口中
符合“既是...也是...”的原则时,使用接口
接口是对继承单根性的扩展--------实现多继承
项目推进:
Shoot射击游戏第一天:
1.创建了6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.给6个对象类添加构造方法,并测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.在FlyingObject超类中设计构造方法
Shoot射击游戏第四天:
1.将小敌机、大敌机、小蜜蜂数组合为FlyingObject数组,并测试
2.在6个派生类重写FlyingObject类的step()
3.画窗口
Shoot射击游戏第五天:
1.给类中成员添加访问控制修饰符
2.给6个对象类准备图片属性
Shoot射击游戏第六天:
1.设计窗口的宽和高为常量,适当地方做修改
2.画对象:
1)想画对象需要获取对象的图片,每个对象都得得图片,
说明获取图片为共有行为,所以设计在FlyingObject超类中,每个对象获取图片的行为都不一样,所以设计为抽象方法
---在FlyingObject中设计抽象方法getImage()获取对象的图片
2)获取图片时需要考虑对象状态,因为不同状态下获取的图片是不同的,
所有对象都有状态,所以状态需要设计在FlyingObject超类中,状态一般都设计为常量,state变量当前状态
---在FlyingObject超类中设计LIFE、DEAD、REMOVE常量,state变量
获取图片时需要判断对象的状态,每个对象都得判断状态,所以将判断状态行为设计在FlyingObject超类中,
每个对象判断状态的行为都是一样的,所以设计为普通方法
---在FlyingObject超类中设计isLife()、isDead()、isRemove()
3)重写getImage()获取对象图片
3.1)天空Sky,返回image即可
3.2)子弹Bullet:
3.2.1)若活着的,返回image即可
3.2.2)若死了的,则删除
3.3)英雄机Hero:
3.3.1)若活着的,返回images[0]和images[1]来回切换
3.4)小敌机Airplane:
3.4.1)若活着的,返回images[0]即可
3.4.2)若死了的,返回images[1]到images[4]轮换,4后则删除
3.5)大敌机BigAirplane:
3.5.1)若活着的,返回images[0]即可
3.5.2)若死了的,返回images[1]到images[4]轮换,4后则删除
3.6)小蜜蜂Bee:
3.6.1)若活着的,返回images[0]即可
3.6.2)若死了的,返回images[1]到images[4]轮换,4后则删除
4)前3步获取了对象的图片,则可以开画了,每个对象都能画,
所以画对象的行为为共有的行为,所以设计在FlyingObject超类中,每个对象画的行为都是一样的,所以设计为普通方法
---在FlyingObject中设计paintObject()画对象
5)因为天空需要画两张图,所以在Sky中重写画对象
在Sky中重写paintObject()画对象
6)在World类中重写paint(),调用对象的paintObject()
Shoot射击游戏第七天:
1.敌人入场:
1)敌人是由窗口产生的,所以在World中设计nextOne()生成敌人对象
2)敌人入场为定时发生的,所以在run中调用enterAction()实现敌人入场
在enterAction()中:
每400毫秒,获取敌人对象,enemies扩容,并将敌人装在最后一个元素上
2.子弹入场:
1)子弹是由英雄机发射出来的,所以在Hero中设计shoot()生成子弹对象
2)子弹入场为定时发生的,所以在run中调用shootAction()实现子弹入场
在shootAction()中:
每300毫秒,获取子弹对象,bullets扩容,数组的追加
3.飞行物移动:
1)飞行物移动为所有对象所共有的行为,所以在FlyingObject中设计抽象step()实现飞行物移动,所有派生类中重写step()飞行物移动
2)飞行物移动为定时发生的,所以在run中调用stepAction()实现飞行物移动
在stepAction()中:
天空动,遍历敌人敌人动,遍历子弹子弹动
Shoot射击游戏第八天:
1.英雄机随着鼠标移动:
1)英雄机移动为英雄机的行为,所以在Hero中设计moveTo()实现英雄机随着鼠标动
2)英雄机随着鼠标移动为事件触发的,所以在侦听器重写mouseMoved()鼠标移动事件
在mouseMoved()中:
获取鼠标的x和y坐标,英雄机动
2.删除越界的敌人和子弹:
1)在FlyingObject中设计outOfBounds()实现敌人的越界检查
在Bullet中重写超类的outOfBounds()实现子弹的越界检查
2)删除越界的为定时发生的,所以在run中调用outOfBoundsAction()实现删除越界敌人和子弹
在outOfBoundsAction()中:
声明不越界敌人/子弹数组,遍历enemies/bullets,
判断若不越界,则将不越界对象添加到不越界敌人/子弹数组中
最后,将不越界敌人/子弹数组复制到enemies/bullets中
3.设计Enemy得分接口,Airplane和BigAirplane实现接口
设计Award奖励接口,Bee实现接口
* 补充内容:
swing中基于事件的
1)事件:发生了一个事
2)事件处理:发生事之后所做的操作
3)侦听器:
3.1)有一个侦听器对象
3.2)将侦听器装到面板去
例如:
事件 事件处理
鼠标点击 启动状态变为运行状态
鼠标移动 英雄机随着动
鼠标移出 运行状态器变为暂停状态
鼠标移入 暂停状态变为运行状态
例如:
interface Inter1{
double PI=3.14; //默认public static final
void test(); //默认public abstract
int num; //编译错误,常量必须声明同时初始化
void say(){};//编译错误,抽象方法不能有方法体
}
interface Inter2{
void show();
}
abstract class Aoo{
abstract void sayHi();
}
class Boo extends Aoo implements Inter1,Inter2{
public void test(){}
public void show(){}
void sayHi(){}
}