第6天

1.static final 常量:

        1)必须声明同时初始化
        2)由类名点来访问,不能被改变
        3)建议:常量名所有字母都大写,多个单词用_分隔
        4)编译器在编译时将常量直接替换为具体的值,效率高
        5)何时用:数据永远不变(经常要改的或重新赋值的就不能用常量)、并且经常使用(只用一次或两三次就没必要用常量)

2.抽象方法:------保证向上造型的时候能够去调用父类中的抽象方法,然后去访问在子类中重写抽象方法过后的方法

     而向上造型的意义就是把子类数组统一到一个父类数组中
        1)由abstract修饰
        2)只有方法的定义,没有具体的实现(连{}都没有)

3.抽象类:

1)由abstract修饰

2)包含抽象方法的类必须是抽象类

3)抽象类中抽象方法没有方法体,所以是不完整的,因此不能被实例化---new的过程就是在实例化,也就是不能new对应类的对象

4)抽象类是需要被继承的(final不能被继承,abstract不被继承没有意义---所以final和abstract不能同时修饰),派生类:

    4.1)在派生类中重写抽象方法-----变不完整为完整,也就是说只要继承了抽象类就要重写抽象方法(强制子类必须重写,达到统一的效果)
    4.2)也声明为抽象类-----但声明过后的抽象类既不能new对象又是不完整的/需要被继承,一般不这么用

5)抽象类的意义:

    5.1)封装派生类共有的属性和行为-------代码复用
    5.2)为所有派生类提供统一的类型------向上造型
    5.3)可以包含抽象方法,为所有派生类提供统一的入口(能够在向上造型的时候点出来)
        派生类的具体实现不同,但入口是一致的

例如:

    private FlyingObject[] enemies= {};
    enemies=new FlyingObject[5];
    enemies[0]=new Airplane();//向上造型,小敌机为飞行物类
    enemies[i].step();---.step()为统一的入口

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()

* 补充内容:

设计规则:

 1)将所有派生类所共有的属性和行为,抽到超类中------抽共性 
 2)所有派生类的行为都一样,设计成普通方法
 所有派生类的行为都不一样,设计成抽象方法 
 3)下次再讲 

项目:

 1.常量后 
 2.画对象

 窗口的宽和高(400和700)永远不变而且经常使用,所以把它们设置成常量(在主窗口World类中)

 都小写--包 
 首字母大写---类 
 首字母小写----变量/对象 
 都大写----常量
 斜的-----静态的

 构造方法缺一个要素---返回值类型,连void都没有
 抽象方法缺一个要素---方法体,连大括号{}都没有