第7天

1.成员内部类

        1)类中套类,外面的称为Outer外部类,里面的称为Inner内部类
        2)内部类通常只服务于外部类,对外不具备可见性
        3)内部类对象通常是在外部类中创建的
        4)内部类可以直接访问外部类的成员(包括私有的)
        5)内部类中有个隐式的引用指向了创建它的外部类对象
           eg: 外部类名.this

2.匿名内部类:

        1)若想创建一个类(派生类)的对象,并且对象只创建一个,此时该类可以不必命名,称为匿名内部类
        2)匿名内部类若想访问外面的变量,该变量必须是final的(jkd1.8以前)

项目推进:

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()中:
    天空动,遍历敌人敌人动,遍历子弹子弹动

* 补充内容:

面试题:

问:内部类有独立的.class吗?
答:有

外部类$内部类.class

用于分隔常量多个单词
数字用于命名匿名内部类

项目功能:

1)敌人入场
2)子弹入场
3)飞行物移动

做功能的套路:

1)先写行为:
    1.1)若为某个对象所特有的行为,将方法设计在特定的类中
    1.2)若为所有对象所共有的行为,将方法设计在超类中
2)页面调用:
    2.1)定时发生的,都写在定时器中
    2.2)事件触发的,都写在侦听器中

敌人入场:

敌人是由窗口上面随机产生的,所以创建敌人行为设计在World类中

子弹入场

子弹是由英雄机发射出来的,所以创建子弹行为设计在Hero类中

飞行物移动

飞行物移动行为是所有对象共有的行为,所以飞行物移动行为设计在FlyingObject类中

当程序的运行结果与你所期望的结果不同时:

1)打桩:System.out.println(数据);-----看输出的数据和理论上的数据是不是一致
2)Debug调试:设置断点