java从入门到精通----OOP 2
一、Shoot射击游戏第一天:
1)创建了6个对象类,并创建World类测试
正课:
1.什么是类?什么是对象?
1)现实世界是由很多对象组成的
基于对象抽出了类
2)对象:真实存在的单个个体
类:类型/类别,代表一类个体
3)类中可以包含:
3.1)所有对象所共有的属性/特征----------------成员变量
3.2)所有对象所共有的行为---------------------方法
4)一个类可以创建多个对象
同一类型所创建出来的对象,结构相同,数据不同
5)类是对象的模板,对象是类具体的实例
2.如何创建类?如何创建对象?如何访问成员?
练习:
1)将今天的内容重写两次
2)oo.day02中设计Student和StudentTest
当日事当日毕
class Hero{ //英雄机
width,height,x,y,life,doubleFire
void step(){} //切换图片
void moveTo(){} //随着鼠标移动
}
class Airplane{
width,height,x,y,speed
void step(){}
}
MeShoot
cn.tedu.shoot
Hero
Airplane
BigAirplane
Bee
Bullet
Sky
World
1)先找对象:英雄机、天空、小敌机、大敌机、小蜜蜂、子弹
2)抽类:Hero、Sky、Airplane、BigAirplane、Bee、Bullet
3)设计类中的成员变量和方法(下周讲业务再详细做)
4)创建对象并测试
角色:
英雄机、子弹、小敌机、大敌机、小蜜蜂、天空
关系:
1)英雄机可以发射子弹
2)子弹可以射击小敌机、大敌机、小蜜蜂
3)小敌机、大敌机、小蜜蜂可以撞英雄机
4)英雄机、子弹、小敌机、大敌机、小蜜蜂都在天空上飞
规则:
1)英雄机可以单倍火力(火力值为0)或双倍火力(火力值大于0)
2)子弹打中小敌机-----------------玩家得1分
子弹打中大敌机-----------------玩家得3分
子弹打中小蜜蜂-----------------英雄机得奖励(1条命或40火力值)
子弹发射一次双倍火力,则火力值减2
3)小敌机、大敌机、小蜜蜂与英雄机撞上后
英雄机减命同时清空火力值-----英雄机命数为0则游戏结束
引用
类(数据类型) 引用类型变量 指向 对象
Student zs = new Student();
数据类型 引用 指向 对象
Student zs = new Student();
基本类型变量(变量)
int a = 5;
赋值
new Student();----------------------一般不这样做
Student zs = new Student();
zs.name = "zhangsan";
zs.age = 25;
引用类型----------默认值null
oo.day01
Student
StudentTest
类 对象
月饼模子 月饼
Student zs = new Student();
zs.name = "zhangsan";
zs.age = 25;
zs.address = "河北廊坊";
zs.stuId = "001";
zs.eat();
zs.sleep();
zs.study();
zs.abc = 250; //编译错误,没有abc属性
Student ls = new Student();
ls.name = "lisi";
ls.age = 26;
ls.address = "黑龙江佳木斯";
ls.stuId = "002";
ls.eat();
ls.sleep();
ls.study();
class Student{ //学生
String name;
int age;
String address;
String stuId;
void eat(){}
void sleep(){}
void study(){}
}
Student zs = new Student();
Student ls = new Student();
Student ww = new Student();
class Teacher{ //老师
String name;
int age;
String address;
double salary;
void eat(){}
void sleep(){}
void play(){}
void teach(){}
}
class Student{ //学生
String name;
int age;
String address;
String stuId;
void eat(){}
void sleep(){}
void study(){}
}
class Dog{ //狗
String color;
String type;
void 叫(){}
void 看门(){}
}
class Car{ //汽车
String type;
String color;
double price;
void run(){}
void back(){}
void stop(){}
}
对象 类
WKJ 老师
GKK
XY
张三 学生
李四
王五
小花 狗
小黑
小强
马六 汽车
奥迪
奥拓
class Emp{ //Emp就是我自己造的一个数据类型,名为Emp
String name;
int age;
double salary;
void print(){
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("工资:"+salary);
}
}
面向过程的结构化程序设计弊端:
1)缺乏对数据的封装
2)数据与方法(操作数据)的分离
基本类型-------------------只能装一个数据
数组类型-------------------必须数据类型相同
自己造数据类型-------------想装什么就装什么
class Emp{ //Emp就是我自己造的一个数据类型,名为Emp
String name;
int age;
double salary;
void print(){
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("工资:"+salary);
}
}
class Test{ //测试类
public static void main(String[] args){
Emp e = new Emp(); //创建了一个雇员对象
e.name = "zhangsan";
e.age = 25;
e.salary = 5000;
e.print();
}
}
高质量的代码:
复用性好、扩展性好、维护性好、
可移植性好、健壮性好、可读性好、效率好...
开发经理
抽了4个人,花费2个月的时间-----------设计了一套架构
福州夜间施工-----加功能(30万)
我一个人,每天最多一个小时---------干了5天
清华思路------------环保、GIS、MIS
40、50人-----项目多
一个组5个人左右
OA办公系统(产品)-------国家机关
Java-------------重做
A:加一些东西
B:加一些东西
C:加一些东西
产品:可以适应很多家公司的
项目:只能适应一家公司的
面向对象:OO
面向对象分析------OOA
面向对象设计------OOD
面向对象分析与设计-----OOAD
面向对象编程------OOP--------------你们所参与的
晕乎乎的----------------------正常的
不晕:
1)什么也不懂
2)自以为不晕------------------很不错很不错的了
迭代的
语言基础:
1.固定的(画一个圆形)
2.去银行取钱
面向对象:
1.抽象的(画一个图形)
2.向着社会主义社会发展
射击游戏项目
理论+项目
面向对象------讲9天+1天
二、Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
回顾:
1.什么是类?什么是对象?
2.如何创建类?如何创建对象?如何访问成员?
笔记:
0.方法的签名:方法名+参数列表
1.方法的重载(Overload):
1)发生在一个类中,方法名称相同,参数列表不同
2)编译器在编译时会根据方法的签名自动绑定调用的方法
2.构造方法:
1)常常给成员变量赋初值
2)与类同名,没有返回值类型
3)在创建(new)对象时被自动调用
4)若自己不写构造方法,则编译器默认一个无参构造方法,
若自己写了构造方法,则不再默认提供
5)构造方法可以重载
3.this:指代当前对象,哪个对象调用方法指的就是哪个对象
只能用在方法中,方法中访问成员变量之前默认有个this.
this的用法:
1)this.成员变量名-----------------访问成员变量
2)this.方法名()-------------------调用方法(一般不用)
3)this()--------------------------调用构造方法
4.null:空,没有指向任何对象
若引用的值为null,则该引用不能再进行任何操作了,
若操作则发生NullPointerException空指针异常
5.引用类型变量之间画等号:
1)指向同一个对象
2)通过一个引用对数据的修改会影响另一个引用对数据的访问
eg: 房子钥匙
基本类型变量之间画等号:
1)赋值
2)对一个变量的修改不会影响另一个变量的值
eg: 身份证复印件
练习:
1)在oo.day03包中创建Stu和StuTest
2)将今天的所有项目代码重做两次
今天的图画一下
NullRefDemo
房子:对象
房子钥匙:引用
配一把钥匙:引用
内存管理:由JVM来管理的
1)堆:所有new出来的对象(包括成员变量)
2)栈:所有的局部变量
3)方法区:.class字节码文件(包括方法)
x = (int)(Math.random()*100);
Random rand = new Random();
x = rand.nextInt(400-49); //0到350之间的
class Student {
String name;
int age;
String address;
Student(String name){
this(name,0);
}
Student(String name,int age){
this(name,age,null);
}
Student(String name,int age,String address){
this.name = name;
this.age = age;
this.address = address;
}
}
Student zs = new Student();
zs.name = "zhangsan";
zs.age = 25;
zs.address = "LF";
zs.study();
zs.sayHi();
Student ls = new Student();
ls.name = "lisi";
ls.age = 27;
ls.address = "JMS";
ls.study();
ls.sayHi();
Student zs = new Student("zhangsan",25,"LF");
Student ls = new Student("lisi",26,"JMS");
class Student {
String name;
int age;
String address;
Student(String name,int age,String address){
this.name = name; //ls.name="lisi";
this.age = age; //ls.age=26;
this.address = address; //ls.address="JMS";
}
void study(){
System.out.println(name+"在学习...");
}
void sayHi(){
System.out.println("大家好,我叫"+name+",今年"+age+"岁了,家住"+address);
}
}
成员变量和局部变量是可以同名的,用时采用就近原则
成员变量和局部变量同名时,this不能省略
Student zs = new Student("zhangsan",25,"LF");
Student ls = new Student("lisi",26,"JMS");
Student ww = new Student();
class Student{
String name;
int age;
String address;
Student(){
}
//给成员变量赋初值
Student(String name1,int age1,String address1){
name = name1;
age = age1;
address = address1;
}
}
class Student{
String name;
int age;
String address;
//给成员变量初始化
Student(String name1,int age1,String address1){
name = name1;
age = age1;
address = address1;
}
}
Student zs = new Student("zhangsan",25,"LF");
Student ls = new Student("lisi",26,"JMS");
Student zs = new Student();
zs.setInfo("zhangsan",25,"LF");
Student ls = new Student();
ls.setInfo("lisi",26,"JMS");
Student zs = new Student();
zs.name = "zhangsan";
zs.age = 25;
zs.address = "河北廊坊";
Student ls = new Student();
ls.name = "lisi";
ls.age = 26;
ls.address = "黑龙江佳木斯";
//1)创建了一个学生对象
//2)给成员变量赋默认值
//3)调用了Student类的构造方法
Student zs = new Student();
void println(){
}
void println(int a){
}
void println(double b){
}
void println(char c){
}
void println(boolean b){
}
void println(String s){
}
System.out.println();
System.out.println(23);
System.out.println(45.67);
System.out.println('女');
System.out.println(true);
System.out.println("Hello");
三、
Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
回顾:
1.方法的重载(Overload):
1)发生在一个类中,方法名相同,参数列表不同
2)编译器在编译时会根据方法的签名自动绑定调用的方法
2.构造方法:构造函数、构造器、构建器
给成员变量赋初值,与类同名、没有返回值类型,
创建对象时被自动调用
若自己不写,则默认无参的,若自己写了,则不再默认提供
可以重载
3.this:指代当前对象,哪个对象调用方法它指的就是哪个对象
this.成员变量名--------------访问成员变量
this.方法名()----------------调用方法
this()-----------------------调用构造方法
4.null:空,没有指向任何对象
对null操作会发生NullPointerException空指针异常
5.引用类型变量之间画等号: 指向同一个对象,影响
基本类型变量之间画等号: 赋值,不影响
笔记:
1.引用类型数组:
1)Student[] stus = new Student[3];
stus[0] = new Student("zhangsan",25,"LF");
stus[1] = new Student("lisi",26,"JMS");
stus[2] = new Student("wangwu",27,"SD");
stus[1].age = 36; //给stus中第2个元素的年龄赋值为36
2)Student[] stus = new Student[]{
new Student("zhangsan",25,"LF"),
new Student("lisi",26,"JMS"),
new Student("wangwu",27,"SD")
};
3)int[][] arr = new int[3][];----------数组的数组
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[2];
arr[1][0] = 100; //给arr中第2个元素中的第1个元素赋值为100
4)int[][] arr = new int[3][4];
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
arr[i][j] = 100;
}
}
2.继承:
1)作用:代码复用
2)通过extends来实现继承
3)超类:所有派生类所共有的属性和行为
派生类:派生类所特有的属性和行为
4)派生类继承超类后,派生类具有:超类的+派生类的
5)一个超类可以有多个派生类
一个派生类只能有一个超类-------单一继承
6)继承具有传递性
7)java规定:构造派生类之前必须先构造超类
在派生类的构造方法中若没有调用超类的构造方法
----------则默认super()调用超类的无参构造方法
在派生类的构造方法中若调用了超类的构造方法
----------则不再默认提供
super()调用超类构造方法,必须位于派生类构造的第1句
3.super:指代当前对象的超类对象
super的用法:
1)super.成员变量名-----------------访问超类的成员变量
2)super.方法名()-------------------调用超类的方法(明天下午讲)
3)super()--------------------------调用超类的构造方法
练习:
1.将今天的项目代码重写两次
2.oo.day04包中,要求:
1)创建Person超类,包含:
1.1)成员变量:name,age,address
1.2)构造方法:Person(3个参数){}
1.3)方法:sayHi()---输出name+age+address的值
2)创建Student类,继承Person,包含:
2.1)成员变量:stuId
2.2)构造方法:Student(4个参数){}
3)创建Teacher类,继承Person,包含:
2.1)成员变量:salary
2.2)构造方法:Teacher(4个参数){}
4)创建Doctor类,继承Person,包含:
2.1)成员变量:level
2.2)构造方法:Doctor(4个参数){}
5)创建Test类,在main()中:
5.1)创建Student数组,Teacher数组,Doctor数组,并填充数据
遍历三个数组,分别跟大家问好
SuperDemo
FlyingObject:飞行物
继承要符合is a(是一个)的关系
class Aoo{
int a;
}
class Boo extends Aoo{
int b;
}
class Coo extends Boo{
int c;
}
Coo o = new Coo();
o.c = 1;
o.b = 2;
o.a = 3;
class Person{----------------------------超类/父类
String name;
int age;
String address;
void eat(){}
void sleep(){}
}
class Student extends Person{------------派生类/子类
String stuId;
void study(){}
}
class Teacher extends Person{------------派生类/子类
double salary;
void teach(){}
}
class Doctor extends Person{-------------派生类/子类
String level;
void cut(){}
}
Teacher tea = new Teacher();
tea.salary/teach();
tea.name/age/address/eat()/sleep();
Student stu = new Student();
stu.stuId/study();
stu.name/age/address/eat()/sleep();
程序中的继承:
代码不用自己写,自己也能用
生活中的继承:
1)继承财产:
钱不用自己挣,自己也能花
2)继承皇位:
江山不用自己打,自己也能坐
3)继承工作:
工作不用自己找,自己也能干
3:为as的长度
4:为as中每个元素的长度
int[][] as = new int[3][4]; //3行4列
for(int i=0;i<as.length;i++){ //行
for(int j=0;j<as[i].length;j++){ //列
as[i][j] = 100;
}
}
i=0
j=0 00
j=1 01
j=2 02
j=3 03
i=1
j=0 10
j=1 11
j=2 12
j=3 13
i=1
j=0 20
j=1 21
j=2 22
j=3 23
//声明int[]型数组as,包含3个元素
//每个元素都是int[]型,默认值为null
int[][] as = new int[3][];
as[0] = new int[2];
as[1] = new int[3];
as[2] = new int[2];
//给as中第2个元素中的第1个元素赋值为100
as[1][0] = 100;
as----------------int[][]
as[0]-------------int[]
as[0][0]----------int
//声明double[]型数组ds,包含10个元素
//每个元素都是double[]型,默认值为null
double[][] ds = new double[10][];
int[] arr = new int[]{
2,
5,
8
};
Student[] stus = new Student[]{
new Student("zhangsan",25,"LF"),
new Student("lisi",26,"JMS"),
new Student("wangwu",27,"SD")
};
//声明Student数组stus,包含3个元素
//每个元素都是Student类型,默认值为null
Student[] stus = new Student[3];
int[] arr = new int[3];
arr[0] = 5;
Student[] stus = new Student[3]; //创建Student数组对象
stus[0] = new Student(); //创建Student对象
Airplane[] as = new Airplane[10];
//声明整型数组arr,包含3个元素
//每个元素都是int类型,默认值为0
int[] arr = new int[3];
//声明Airplane数组as,包含10个元素
//每个元素都是Airplane类型,默认值为null
Airplane[] as = new Airplane[10];
Bee[] bs = new Bee[20];
int[] arr = new int[3];
堆:new出来的对象(包括成员变量)
栈:局部变量
变量里面装值
引用里面装地址
局部变量若是基本类型,存值
引用类型,存地址
四、Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2.在6个派生类中重写step()
3.画窗口
回顾:
1.引用类型数组:
Student[] stus = new Student[3];
stus[0] = new Student();
int[][] arr = new int[3][];
arr[0] = new int[2];
2.继承:
代码复用,extends,
超类:共有的 派生类:特有的
派生类继承超类后,派生类具有:超类+派生类的
单一继承、传递性
构造派生类之前必须先构造超类
----派生类构造中若不调用超类构造,则默认super()调超类无参构造
----若派生类中调用了超类构造,则不再默认提供
3.super:指代当前对象的超类对象
super.成员变量名-------------访问超类的成员变量
super.方法名()---------------调用超类的方法
super()----------------------调用超类的构造方法
笔记:
1.向上造型:
1)超类型的引用指向派生类对象
2)能点出来什么,看引用的类型
2.方法的重写(Override):重新写、覆盖
1)发生在父子类中,方法名称相同,参数列表相同,方法体不同
2)重写方法被调用时,看对象的类型
3)重写遵循"两同两小一大"原则:
3.1)两同:
3.1.1)方法名相同
3.1.2)参数列表相同
3.2)两小:
3.2.1)派生类方法的返回值类型小于或等于超类方法的
3.2.1.1)void时,必须相等
3.2.1.2)基本类型时,必须相等
3.2.1.3)引用类型时,小于或等于
3.2.2)派生类方法抛出的异常小于或等于超类方法的------API讲异常时
3.3)一大:
3.3.1)派生类方法的访问权限大于或等于超类方法的------明天讲
3.重写与重载的区别:---------常见面试题
1)重写:
1.1)发生在父子类中,方法名称相同,参数列表相同,方法体不同
1.2)遵循"运行期绑定",看对象的类型来调用方法
2)重载:
2.1)发生在一个类中,方法名称相同,参数列表不同,方法体不同
2.2)遵循"编译期绑定",看引用/参数的类型来绑定方法
练习:
1.将今天的项目代码重做两次
1)将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2)在6个派生类中重写step()
3)画窗口
当日事当日毕
swing相关:
1)JFrame:框架(相框)
2)JPanel:面板(相板)
C/S:客户端/服务器
B/S:浏览器/服务器-----------------你们所参与的
C/S端-------本身java就没那么火过
C-----------微软是老大
java
OverrideOverloadDemo
编译期:.java源文件,经过编译,生成.class字节码文件--检测语法
运行期:JVM加载.class并运行.class
内存管理:由JVM来管理的
OverrideDemo
我继承了一个中餐馆
A:我还是想做中餐-----------------不需要重写
B:我想改做西餐-------------------需要重写
C:我想在中餐基础之上加西餐-------需要重写(先super后重写)
Boo o1 = new Boo();
o1.show();------------------222
Aoo o3 = new Boo();
o3.show();------------------222
Aoo o2 = new Aoo();
o2.show();------------------111
class Aoo{
void show(){
输出111
}
}
class Boo extends Aoo{
void show(){
输出222
}
}
class World{
FlyingObject[] enemies;
FlyingObject[] enemies = null;
FlyingObject[] enemies = {};
FlyingObject[] enemies = new FlyingObject[0];
}
for(int i=0;i<enemies.length;i++){
enemies[i].step();
}
小敌机、大敌机、小蜜蜂-------------敌人
FlyingObject[] fs = new FlyingObject[8];
fs[0] = new Bee();
FlyingObject o1 = new Airplane();
FlyingObject o2 = new BigAirplane();
FlyingObject o3 = new Bee();
FlyingObject o4 = new Hero();
FlyingObject o5 = new Sky();
FlyingObject o6 = new Bullet(100,200);
o1.FlyingObject类中有的
o2.FlyingObject类中有的
o3.FlyingObject类中有的
o4.FlyingObject类中有的
o5.FlyingObject类中有的
o6.FlyingObject类中有的
Person p1 = new Student();
Person p2 = new Teacher();
Person p3 = new Doctor();
p1.Person类中有的
p2.Person类中有的
p3.Person类中有的
Animal o3 = new Tiger();
o3.Animal类中有的
class Animal{ //动物
}
class Tiger extends Animal{ //老虎
}
//动物是动物
Animal o1 = new Animal();
//老虎是老虎
Tiger o2 = new Tiger();
//老虎是动物
Animal o3 = new Tiger();
//动物是老虎-----语义不通
Tiger o4 = new Animal(); //编译错误
class Animal{ //动物
}
class Tiger extends Animal{ //老虎
}
五、
Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2.在6个派生类中重写step()
3.画窗口
Shoot射击游戏第五天:
1.将类中的成员添加访问控制修饰符
2.设置图片属性
回顾:
1.向上造型:
1)超类型的引用指向派生类的对象
2)能点出来什么,看引用的类型
2.方法的重写(Override):
1)发生在父子类中,方法名称相同,参数列表相同,方法体不同
2)重写方法被调用时,看对象的类型
3.重写与重载的区别:
1)重写(Override):
1.1)发生在父子类中,方法名称相同,参数列表相同,方法体不同
1.2)"运行期"绑定,看对象类型来调用方法
2)重载(overload):
2.1)发生在一个类中,方法名称相同,参数列表不同,方法体不同
2.2)"编译期"绑定,看引用/参数类型来绑定方法
笔记:
1.package:
1)作用:避免类名冲突
2)包名可以有层次结构
3)类的全称为: 包名.类名
4)建议:包名所有字母都小写
import:
1)同包中的类可以直接访问,
不同包中的类不能直接访问,想访问只有如下两种方式:
1.1)先import声明类再使用类----建议
1.2)类的全称------------------太繁琐,不建议
2.访问控制修饰符:
1)public:公开的,任何类
2)private:私有的,本类
3)protected:受保护的,本类、子类、同包类
4)默认的:什么也不写,本类、同包类
说明:
1)类的访问修饰只能是public和默认的
2)类中成员的访问修饰如上四种都可以
3.final:最终的、不可改变的---------------应用率低
1)修饰变量:变量不能被改变
2)修饰方法:方法不能被重写
3)修饰类:类不能被继承
4.static:静态的
1)静态变量:
1.1)由static修饰
1.2)属于类,存储在方法区中,只有一份
1.3)常常通过类名点来访问
1.4)何时用:所有对象所共享的数据(图片、音频、视频等)
2)静态方法:
2.1)由static修饰
2.2)属于类,存储在方法区中,只有一份
2.3)常常通过类名点来访问
2.4)静态方法中没有隐式的this传递,
静态方法中不能直接访问实例成员
2.5)何时用:方法的操作仅与参数相关而与对象无关
3)静态块:
3.1)属于类,在类被加载期间自动执行,
因类只加载一次,所以静态块也只执行一次
3.2)何时用:加载/初始化静态资源(图片、音频、视频等)
5.static final常量:------今天自学,明天讲
练习:
1.将今天的项目代码重写两次
2.代码格式改好
异常
异常处理
需要对文件进行操作,对文件操作特别容易出现异常
------强制做文件操作时,必须要加入异常处理
窗口
想画对象,先有图片-------给6个对象类准备图片属性
能否将图片设计在超类FlyingObject中
--------------------------------------不能
private static BufferedImage image;
读图片
6个对象类的static块中-------都得去读图片
实例变量多还是静态变量多?----------------实例变量多
实例方法多还是静态方法多?----------------实例方法多
一般的方法都是与对象有关的
Arrays.sort(arr);----------------静态的
无论a1,a2,a3,...,a100中的哪一个对象
去sort(arr)最终的结果都是一样的
---说明sort()这个方法的执行仅与参数相关而与对象无关
假设sort()不是静态的:
Arrays a1 = new Arrays();
a1.sort(arr);
Arrays a2 = new Arrays();
a2.sort(arr);
Arrays a3 = new Arrays();
a3.sort(arr);
double a = Math.sqrt(25);------------静态的
无论m1,m2,m3,...,m100中的哪一个对象
去sqrt(25)最终的结果都是一样的
---说明sqrt()这个方法仅与参数相关而与对象无关
假设sqrt()不是静态的:
Math m1 = new Math();
double a = m1.sqrt(25); //5.0
Math m2 = new Math();
double b = m2.sqrt(25);
Math m3 = new Math();
double b = m3.sqrt(25);
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
double b = scan.nextDouble();---------------实例方法
double c = Math.random();
double d = Math.sqrt(25);
int[] b = Arrays.copyOf(a,6);
Arrays.sort(arr);
小敌机------------图片
map.jpg--------------------图片(只有一份)
意外.mp4-------------------音频(只有一份)
无间道2.avi----------------视频(只有一份)
成员变量:
1)实例变量:没有static,属于对象的,存储在堆中,
有几个对象就有几个
通过对象名点来访问
2)静态变量:由static修饰,属于类的,存储在方法区中,
只有一份
通过类名点来访问
堆:new出来的对象(包括实例变量)
栈:局部变量
方法区:.class字节码文件(包括方法、静态变量)
class Aoo{
int a;
static int b;
}
方法:
1)公开的---------------public
成员变量:
1)超类中的成员变量---------protected
2)普通类中的成员变量-------private
数据(变量)私有化(private),行为(方法)公开化(public)
class Card{
private String cardId;
private String cardPwd;
private double balance;
public boolean payMoney(double money){
if(balance>=money){
balance-=money;
return true;
}else{
return false;
}
}
public boolean checkPwd(String pwd){
if(cardPwd.equals(pwd)){
return true;
}else{
return false;
}
}
}
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
double b = scan.nextDouble();
String c = scan.next();
package java.util;
class Scanner{
Scanner(Stream s){
}
int nextInt(){
}
double nextDouble(){
}
String next(){
}
}
民生银行
A公司:
package a.b.c;
class Aoo{
}
B公司:
package a.b.c;
class Aoo{
}
可移植性
建议:
域名反写 . 项目名称 . 模块名称 . 类名
cn.tedu . aproject . stumanager .
cn.tedu . aproject . teachermanager .
cn.tedu . bproject
com.taobao .
package a.b.c.d.e;
class Aoo{
}
package a.b.c.d.e;
class Aoo{
}
项目 包 类
东日瑞景 4号楼2单元 601
访问控制修饰符-----------一个案例
static-------------------一个案例
六、
Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2.在6个派生类中重写step()
3.画窗口
Shoot射击游戏第五天:
1.将类中的成员添加访问控制修饰符
2.设置图片属性
Shoot射击游戏第六天:
1.画对象:
1)想画对象,得先去获取对象的图片,
每个对象都得获取图片,意味着获取图片行为为共有的行为,
所以需要将获取图片的行为设计在FlyingObject超类中,
每个对象获取图片的行为都是不一样的,
所以获取图片的行为设计为抽象方法
--------在FlyingObject类中设计抽象方法getImage()
2)在获取对象的图片时,需要去考虑对象的状态(生命周期),
状态分三种(活着的、死了的(未删除)、删除的),
在实际应用中,状态都应设计为常量,
每个对象都有状态,所以将状态设计在FlyingObject超类中,
--------在FlyingObject类中设计三个常量和变量(存储当前状态)
在获取图片时,需要去判断每个对象的状态,用于获取不同的图片,
所以对象状态判断的行为为共有的行为,设计在FlyingObject超类中,
每个对象判断状态的行为都是一样的,设计为普通方法
--------在FlyingObject类中设计isLife()/isDead()/isRemove()
3)在派生类中重写getImage()用于在不同状态下获取不同的图片
3.1)Sky天空,直接返回image
3.2)Bullet子弹:
3.2.1)若活着的,直接返回image
3.2.2)若死了的,就删除
3.3)Airplane小敌机:
3.3.1)若活着呢,返回第1张图片
3.3.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.4)Airplane小敌机:
3.4.1)若活着呢,返回第1张图片
3.4.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.5)Airplane小敌机:
3.5.1)若活着呢,返回第1张图片
3.5.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.6)Hero英雄机:
3.6.1)若活着呢,返回2张图片的切换
4)图片有了,就可以开画了,6个对象都可开画,属于共有的行为,
所以将画的行为设计在FlyingObject超类中,
所有对象画的行为都是一样的,所以设计为普通方法
--------在FlyingObject超类中设计普通方法paintObject()画对象
5)因为Sky天空是两张图,所以需要重写超类的paintObject()
--------在Sky类中重写paintObject()
6)画的行为完以后,只需要在窗口上调用即可
--------在World类中重写paint(),而后调用paintObject()
回顾:
1.package和import:
2.访问控制修饰符:
1)public:任何类
2)protected:本类、子类、同包类
3)默认的:什么也不写,本类、同包类
4)private:本类
3.final:不能变
变量不能被改变,方法不能被重写,类不能被继承
4.static:静态的
static,类,方法区,一份,类名点,
所有对象所共享的数据(图片、音频、视频等)
static,类,方法区,一份,类名点,
静态方法没有隐式this,不能直接访问实例成员
方法的操作仅与参数相关而与对象无关
static,类,在类被加载期间自动执行,一次
加载/初始化静态资源(图片、音频、视频等)
正课:
1.static final常量:
1)必须声明同时初始化
2)通过类名点来访问,不能被改变
3)建议:常量名所有字母都大写,多个单词用_分隔
4)编译器在编译时将常量直接替换为具体的值,效率高
5)何时用:数据永远不变,并且经常使用
2.抽象方法:
1)由abstract修饰
2)只有方法的定义,没有具体的实现(连{}都没有)
3.抽象类:
1)由abstract修饰
2)包含抽象方法的类必须是抽象类
不包含抽象方法的类也可以声明为抽象类-------我乐意
3)抽象类不能被实例化
4)抽象类都是需要被继承的,派生类:
4.1)重写抽象类中的所有抽象方法-----变不完整为完整
4.2)也声明为抽象类-----------------一般不这么做
5)抽象类的意义:
5.1)封装派生类所共有的属性和行为-----------代码复用
5.2)为所有派生类提供统一的类型-------------向上造型
5.3)可以包含抽象方法,为所有派生类提供统一的入口
派生类的具体实现不同,但入口是一致的
设计规则:
1)将所有派生类所共有的属性和行为,抽到超类中-------抽共性
2)所有派生类的行为都一样,设计为普通方法
所有派生类的行为都不一样,设计为抽象方法
3)
FlyingObject o = new Airplane();
FlyingObject o = new BigAirplane();
abstract class FlyingObject{
width,height,x,y
abstract void step();
}
class Airplane extends FlyingObject{
void step(){ //y向下 }
}
class Bee extends FlyingObject{
void step(){ //x和y都得变 }
}
class Bullet extends FlyingObject{
void step(){ //y向上 }
}
new FlyingObject(); //编译错误
new FlyingObject[5]; //正确
abstract class Aoo{
abstract void show();
}
class Boo extends Aoo{
void show(){ //重写----变不完整为完整
}
}
FlyingObject o = new FlyingObject(); //创建FlyingObject对象
FlyingObject[] o = new FlyingObject[3]; //创建FlyingObject数组对象
NUMBER
COUNT
SCORE
MY_SCORE
七、
Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2.在6个派生类中重写step()
3.画窗口
Shoot射击游戏第五天:
1.将类中的成员添加访问控制修饰符
2.设置图片属性
Shoot射击游戏第六天:
1.画对象:
1)想画对象,得先去获取对象的图片,
每个对象都得获取图片,意味着获取图片行为为共有的行为,
所以需要将获取图片的行为设计在FlyingObject超类中,
每个对象获取图片的行为都是不一样的,
所以获取图片的行为设计为抽象方法
--------在FlyingObject类中设计抽象方法getImage()
2)在获取对象的图片时,需要去考虑对象的状态(生命周期),
状态分三种(活着的、死了的(未删除)、删除的),
在实际应用中,状态都应设计为常量,
每个对象都有状态,所以将状态设计在FlyingObject超类中,
--------在FlyingObject类中设计三个常量和变量(存储当前状态)
在获取图片时,需要去判断每个对象的状态,用于获取不同的图片,
所以对象状态判断的行为为共有的行为,设计在FlyingObject超类中,
每个对象判断状态的行为都是一样的,设计为普通方法
--------在FlyingObject类中设计isLife()/isDead()/isRemove()
3)在派生类中重写getImage()用于在不同状态下获取不同的图片
3.1)Sky天空,直接返回image
3.2)Bullet子弹:
3.2.1)若活着的,直接返回image
3.2.2)若死了的,就删除
3.3)Airplane小敌机:
3.3.1)若活着呢,返回第1张图片
3.3.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.4)Airplane小敌机:
3.4.1)若活着呢,返回第1张图片
3.4.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.5)Airplane小敌机:
3.5.1)若活着呢,返回第1张图片
3.5.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.6)Hero英雄机:
3.6.1)若活着呢,返回2张图片的切换
4)图片有了,就可以开画了,6个对象都可开画,属于共有的行为,
所以将画的行为设计在FlyingObject超类中,
所有对象画的行为都是一样的,所以设计为普通方法
--------在FlyingObject超类中设计普通方法paintObject()画对象
5)因为Sky天空是两张图,所以需要重写超类的paintObject()
--------在Sky类中重写paintObject()
6)画的行为完以后,只需要在窗口上调用即可
--------在World类中重写paint(),而后调用paintObject()
Shoot射击游戏第七天:
1.敌人入场:
1)敌人是由窗口产生的,所以在World中设计nextOne()生成敌人对象
2)敌人入场为定时发生的,在run()中调用enterAction()实现敌人入场
在enterAction()中:
每400毫秒调用nextOne()获取敌人,enemies扩容,装在最后一个元素上
2.子弹入场:
1)子弹是由英雄机发射出来的,所以在Hero中设计shoot()生成子弹对象
2)子弹入场为定时发生的,在run()中调用shootAction()实现子弹入场
在shootAction()中:
每300毫秒调用hero的shoot()获取子弹,bullets扩容,数组追加
3.飞行物移动:
1)移动是所有对象所共有的行为,并且每个对象移动的形为都是不一样的,
所以在超类FlyingObject中设计了抽象方法step(),派生类重写step()
2)飞行物移动为定时发生的,在run()中调用stepAction()实现飞行物移动
在stepAction()中:
天空动,遍历敌人而后敌人动,遍历子弹而后子弹动
回顾:
1.static final常量:
必须声明同时初始化,类名点,不能改变
编译时直接被替换为具体的值,效率高
数据永远不变,经常使用
2.抽象方法:
abstract,只有方法的定义,没有具体的实现
3.抽象类:
abstract,包含抽象方法的类必须是抽象类
不能被实例化
是需要被继承的,派生类:
1)重写抽象类中的所有抽象方法
2)也声明为抽象类
意义:代码复用、向上造型、
可以包含抽象方法,为所有派生类提供统一的入口
派生类中重写的实现不同,但入口是一致的
正课:
1.成员内部类: 应用率低
1)类中套类,里面的称为Inner内部类,外面的称为Outer外部类
2)内部类通常只服务于外部类,对外不具备可见性
3)内部类通常是在外部类中创建的
4)内部类中可以直接访问外部类的成员(包括私有的)
内部类中有一个隐式的引用指向了创建它的外部类对象
eg: 外部类名.this.
2.匿名内部类:
1)若想创建一个类的对象,并且对象只被创建一次,
此时该类不必命名,称之为匿名内部类
2)jdk1.7(含)版本之前,匿名内部类中想访问外面的变量,
要求该变量必须是final的
常见面试题:
问:内部类有独立的.class吗?
答:有
功能实现步骤:
1.先写行为(方法):
1)若是某个对象特有的行为,则将行为设计在派生类中
若是所有对象共有的行为,则将行为设计在超类中
1.1)所有派生类行为都一样,设计为普通方法
1.2)所有派生类行为都不一样,设计为抽象方法,而后派生类重写
2.窗口调用:
1)定时触发的,在run()中调用
2)事件触发的,在侦听器中调用
3)画出来的,在paint()中调用
找问题最简单的方式就是打桩
System.out.println(数据);
Bullet[] bs = hero.shoot();
bullets = Arrays.copyOf(bullets,bullets.length+bs.length);
System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); //数组的追加
if(bs.length>2){
bullets[bullets.length-1] = bs[0];
bullets[bullets.length-2] = bs[1];
bullets[bullets.length-3] = bs[2];
}else if(bs.length>1){
bullets[bullets.length-1] = bs[0];
bullets[bullets.length-2] = bs[1];
}else{
bullets[bullets.length-1] = bs[0];
}
项目功能:
1)敌人入场----------------定时发生
2)子弹入场----------------定时发生
3)飞行物移动--------------定时发生
paint()调用的方式只有两种:
1)frame.setVisible(true);
2)repaint();
假设有5个敌人了,又来了一个
5个变6个
//生成敌人(小敌机、大敌机、小蜜蜂)对象
public FlyingObject nextOne(){
随机
}
敌人对象-------------------是由窗口创建出来的
----创建敌人对象的行为---------设计在窗口类World中
子弹对象-------------------是由英雄机发射出来的
----创建子弹对象的行为---------设计在英雄机类Hero中
敌人入场:
1)创建敌人对象
2)将对象添加到enemies数组中
子弹入场:
1)创建子弹对象
2)将对象添加到bullets数组中
项目功能:
1)敌人入场----------------定时发生
2)子弹入场----------------定时发生
3)飞行物移动--------------定时发生
TimerTask, long, long
timer.schedule(new TimerTask(){
public void run(){ //定时干的那个事----每10毫秒走一次
//敌人入场、子弹入场、飞行物移动、
}
},10,10);
第1个10:从程序启动到第一次触发的时间间隔
第2个10:从第一次触发到第二次触发的时间间隔
从第二次触发到第三次触发的时间间隔
从第三次触发到第四次触发的时间间隔
...
定时器------定时的干一件事
字母、数字、_和$符
NstInnerClassDemo$1.class
NstInnerClassDemo$2.class
NstInnerClassDemo$3.class
Mama$Baby.class
jdk1.0到1.7----------------内存管理几乎没有改变
jdk1.8---------------------内存管理做了相当一部分的修改
1.6
NstInnerClassDemo
Aoo o1 = new Aoo();
Boo o2 = new Boo(); //编译错误
class Aoo{
private int a=5;
void show(){
Boo o2 = new Boo();
}
class Boo{
void test(){
System.out.println(a);
System.out.println(Aoo.this.a);
System.out.println(this.a); //编译错误
}
}
}
八、
Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2.在6个派生类中重写step()
3.画窗口
Shoot射击游戏第五天:
1.将类中的成员添加访问控制修饰符
2.设置图片属性
Shoot射击游戏第六天:
1.画对象:
1)想画对象,得先去获取对象的图片,
每个对象都得获取图片,意味着获取图片行为为共有的行为,
所以需要将获取图片的行为设计在FlyingObject超类中,
每个对象获取图片的行为都是不一样的,
所以获取图片的行为设计为抽象方法
--------在FlyingObject类中设计抽象方法getImage()
2)在获取对象的图片时,需要去考虑对象的状态(生命周期),
状态分三种(活着的、死了的(未删除)、删除的),
在实际应用中,状态都应设计为常量,
每个对象都有状态,所以将状态设计在FlyingObject超类中,
--------在FlyingObject类中设计三个常量和变量(存储当前状态)
在获取图片时,需要去判断每个对象的状态,用于获取不同的图片,
所以对象状态判断的行为为共有的行为,设计在FlyingObject超类中,
每个对象判断状态的行为都是一样的,设计为普通方法
--------在FlyingObject类中设计isLife()/isDead()/isRemove()
3)在派生类中重写getImage()用于在不同状态下获取不同的图片
3.1)Sky天空,直接返回image
3.2)Bullet子弹:
3.2.1)若活着的,直接返回image
3.2.2)若死了的,就删除
3.3)Airplane小敌机:
3.3.1)若活着呢,返回第1张图片
3.3.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.4)Airplane小敌机:
3.4.1)若活着呢,返回第1张图片
3.4.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.5)Airplane小敌机:
3.5.1)若活着呢,返回第1张图片
3.5.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.6)Hero英雄机:
3.6.1)若活着呢,返回2张图片的切换
4)图片有了,就可以开画了,6个对象都可开画,属于共有的行为,
所以将画的行为设计在FlyingObject超类中,
所有对象画的行为都是一样的,所以设计为普通方法
--------在FlyingObject超类中设计普通方法paintObject()画对象
5)因为Sky天空是两张图,所以需要重写超类的paintObject()
--------在Sky类中重写paintObject()
6)画的行为完以后,只需要在窗口上调用即可
--------在World类中重写paint(),而后调用paintObject()
Shoot射击游戏第七天:
1.敌人入场:
1)敌人是由窗口产生的,所以在World中设计nextOne()生成敌人对象
2)敌人入场为定时发生的,在run()中调用enterAction()实现敌人入场
在enterAction()中:
每400毫秒调用nextOne()获取敌人,enemies扩容,装在最后一个元素上
2.子弹入场:
1)子弹是由英雄机发射出来的,所以在Hero中设计shoot()生成子弹对象
2)子弹入场为定时发生的,在run()中调用shootAction()实现子弹入场
在shootAction()中:
每300毫秒调用hero的shoot()获取子弹,bullets扩容,数组追加
3.飞行物移动:
1)移动是所有对象所共有的行为,并且每个对象移动的形为都是不一样的,
所以在超类FlyingObject中设计了抽象方法step(),派生类重写step()
2)飞行物移动为定时发生的,在run()中调用stepAction()实现飞行物移动
在stepAction()中:
天空动,遍历敌人而后敌人动,遍历子弹而后子弹动
Shoot射击游戏第八天:
1.英雄机随着鼠标移动:
1)英雄机移动是英雄机的行为,所以在Hero中设计moveTo(x,y)实现英雄机随着鼠标移动
2)英雄机随着鼠标移动是事件触发的,在侦听器中重写mouseMoved()鼠标移动事件
在mouseMoved()中:
获取鼠标的x和y坐标,而后英雄机随着动
2.删除越界的飞行物:
1)越界检查为所有飞行物都具备的行为,只是每个对象的具体行为不一样,
在超类FlyingObject中设计抽象方法outOfBounds(),6个派生类中分别重写
2)删除越界飞行物为定时发生的,所以在run()中调用outOfBoundsAction()
在outOfBoundsAction()中:
声明不越界敌人/子弹数组,遍历enemies/bullets,获取每个敌人或子弹
判断若不越界,则将对象添加到不越界敌人/子弹数组中,
将不越界敌人/子弹数组复制到enemies/bullets中
3.设计Enemy得分接口,而后Airplane和BigAirplane实现接口
设计Award奖励接口,而后Bee实现接口
回顾:
1.成员内部类:
类中套类,内部类对外不具备可见性,
内部类对象通常是在外部类中创建的,
内部类中可以直接访问外部类的成员(包括私有的)
内部类中有个隐式的引用指向了创建它的外部类对象
外部类名.this.
2.匿名内部类:
若想创建一个类的对象,并且对象只创建一次,
此时该类不必命名,称之为匿名内部类
笔记:
1.接口:
1)是一种数据类型(引用类型)
2)由interface定义的
3)只能包含常量和抽象方法
4)接口不能被实例化
5)接口是需要被实现/继承的,实现类/派生类:
必须重写接口中的所有抽象方法
6)一个类可以实现多个接口,用逗号分隔
若又继承又实现时,应先继承后实现
7)接口可以继承接口
设计规则:
1)将所有派生类所共有的属性和行为,抽到超类中---------抽共性
2)所有派生类的行为都一样,设计为普通方法
所有派生类的行为都不一样,设计为抽象方法
3)将部分派生类所共有的行为,抽到接口中
符合既是也是原则时,使用接口
接口是对继承的单根性的扩展-------------实现多继承
Enemy
Award
子弹打掉小敌机-------------------玩家得1分
子弹打掉大敌机-------------------玩家得3分
子弹打掉小蜜蜂-------------------英雄机得奖励(命、火力值)
子弹打掉大黄蜂-------------------英雄机得奖励、玩家得分
abstract class FlyingObject{
width,height,x,y,
step(),getImage()...
}
interface Enemy{ //得分接口
int getScore();
}
interface Award{ //奖励接口
int getAwardType();
}
class Bee extends FlyingObject implements Award{
public int getAwardType(){ }
}
class BigYellowBee extends FlyingObject implements Award,Enemy{
public int getAwardType(){ }
public int getScore(){ }
}
class Airplane extends FlyingObject implements Enemy{
public int getScore(){ return 1; }
}
class BigAirplane extends FlyingObject implements Enemy{
public int getScore(){ return 3; }
}
class Hero extends FlyingObject{
}
class Bullet extends FlyingObject{
}
class Sky extends FlyingObject{
}
类和类-------------------继承extends
接口和接口---------------继承extends
类和接口-----------------实现implements
Inter1 o1 = new Inter1(); //编译错误,接口不能实例化
Inter2 o2 = new Aoo(); //向上造型
Inter1 o3 = new Aoo(); //向上造型
interface Inter1{
void show();
}
interface Inter2 extends Inter1{
void test();
}
class Aoo implements Inter2{
public void test(){}
public void show(){}
}
interface Inter1{
void show();
}
interface Inter2{
void test();
}
abstract class Aoo{
abstract void say();
}
class Boo extends Aoo implements Inter1,Inter2{
public void show(){}
public void test(){}
void say(){}
}
interface Inter1{
void show();
void test();
}
class Aoo implements Inter1{
public void show(){}
public void test(){}
}
Inter1 o1 = new Inter1();
interface Inter1{
public static final int NUM = 5;
public abstract void show();
int COUNT = 6; //默认public static final
void test(); //默认public abstract
int nn; //编译错误,常量必须声明同时初始化
void say(){} //编译错误,抽象方法不能有方法体
}
abstract class Aoo{
}
设计规则:
1)
2)
3)
面向过程编程
面向对象编程
面向接口编程
只待了5天
接口、继承
派生类
效率-------------------硬件来解决
复用性、扩展性---------只能代码来解决
-----------------只要不越界的
public void outOfBoundsAction(){
int index = 0; //1)下标 2)不越界敌人个数
FlyingObject[] enemyLives = new FlyingObject[enemies.length];
for(int i=0;i<enemies.length;i++){
FlyingObject f = enemies[i];
if(!f.outOfBounds()){ //不越界
enemyLives[index] = f;
index++;
}
}
enemies = Arrays.copyOf(enemyLives,index);
}
共50个敌人,其中有20个越界了
---------------缩20次
------------------------看到越界的就删除
public void outOfBoundsAction(){
for(int i=0;i<enemies.length;i++){
FlyingObject f = enemies[i];
if(f.outOfBounds()){ //越界了
将f从enemies数组中删除(缩容)
}
}
}
删除越界的飞行物:
1)先写行为:
删除越界飞行物时,需要先判断飞行物是否越界
每个对象都需要做出判断,所以将判断越界行为设计在超类中
每个对象判断越界的行为都是不一样的,所以设计为抽象方法
而后每个派生类中重写抽象方法
2)页面调用:
swing相关的:
1)事件:发生了一个事
2)事件处理:发生事之后所做的操作
3)侦听器:
3.1)有一个侦听器
3.2)把侦听器装到窗口去
MouseAdapter l = new MouseAdapter(){
public void mouseMoved(MouseEvent e){
//英雄机随着鼠标移动
}
};
this.addMouseListener(l); //鼠标操作事件
this.addMouseMotionListener(l); //鼠标滑动事件
class Aoo extends MouseAdapter{
}
事件 事件处理
鼠标点击 启动状态变为运行状态
鼠标移动 英雄机随着鼠标动
鼠标移出 运行状态变为暂停状态
鼠标移入 暂停状态变为运行状态
项目功能:
1.英雄机随着鼠标动
2.删除越界的飞行物
3.设计两个接口
九、
Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2.在6个派生类中重写step()
3.画窗口
Shoot射击游戏第五天:
1.将类中的成员添加访问控制修饰符
2.设置图片属性
Shoot射击游戏第六天:
1.画对象:
1)想画对象,得先去获取对象的图片,
每个对象都得获取图片,意味着获取图片行为为共有的行为,
所以需要将获取图片的行为设计在FlyingObject超类中,
每个对象获取图片的行为都是不一样的,
所以获取图片的行为设计为抽象方法
--------在FlyingObject类中设计抽象方法getImage()
2)在获取对象的图片时,需要去考虑对象的状态(生命周期),
状态分三种(活着的、死了的(未删除)、删除的),
在实际应用中,状态都应设计为常量,
每个对象都有状态,所以将状态设计在FlyingObject超类中,
--------在FlyingObject类中设计三个常量和变量(存储当前状态)
在获取图片时,需要去判断每个对象的状态,用于获取不同的图片,
所以对象状态判断的行为为共有的行为,设计在FlyingObject超类中,
每个对象判断状态的行为都是一样的,设计为普通方法
--------在FlyingObject类中设计isLife()/isDead()/isRemove()
3)在派生类中重写getImage()用于在不同状态下获取不同的图片
3.1)Sky天空,直接返回image
3.2)Bullet子弹:
3.2.1)若活着的,直接返回image
3.2.2)若死了的,就删除
3.3)Airplane小敌机:
3.3.1)若活着呢,返回第1张图片
3.3.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.4)Airplane小敌机:
3.4.1)若活着呢,返回第1张图片
3.4.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.5)Airplane小敌机:
3.5.1)若活着呢,返回第1张图片
3.5.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.6)Hero英雄机:
3.6.1)若活着呢,返回2张图片的切换
4)图片有了,就可以开画了,6个对象都可开画,属于共有的行为,
所以将画的行为设计在FlyingObject超类中,
所有对象画的行为都是一样的,所以设计为普通方法
--------在FlyingObject超类中设计普通方法paintObject()画对象
5)因为Sky天空是两张图,所以需要重写超类的paintObject()
--------在Sky类中重写paintObject()
6)画的行为完以后,只需要在窗口上调用即可
--------在World类中重写paint(),而后调用paintObject()
Shoot射击游戏第七天:
1.敌人入场:
1)敌人是由窗口产生的,所以在World中设计nextOne()生成敌人对象
2)敌人入场为定时发生的,在run()中调用enterAction()实现敌人入场
在enterAction()中:
每400毫秒调用nextOne()获取敌人,enemies扩容,装在最后一个元素上
2.子弹入场:
1)子弹是由英雄机发射出来的,所以在Hero中设计shoot()生成子弹对象
2)子弹入场为定时发生的,在run()中调用shootAction()实现子弹入场
在shootAction()中:
每300毫秒调用hero的shoot()获取子弹,bullets扩容,数组追加
3.飞行物移动:
1)移动是所有对象所共有的行为,并且每个对象移动的形为都是不一样的,
所以在超类FlyingObject中设计了抽象方法step(),派生类重写step()
2)飞行物移动为定时发生的,在run()中调用stepAction()实现飞行物移动
在stepAction()中:
天空动,遍历敌人而后敌人动,遍历子弹而后子弹动
Shoot射击游戏第八天:
1.英雄机随着鼠标移动:
1)英雄机移动是英雄机的行为,所以在Hero中设计moveTo(x,y)实现英雄机随着鼠标移动
2)英雄机随着鼠标移动是事件触发的,在侦听器中重写mouseMoved()鼠标移动事件
在mouseMoved()中:
获取鼠标的x和y坐标,而后英雄机随着动
2.删除越界的飞行物:
1)越界检查为所有飞行物都具备的行为,只是每个对象的具体行为不一样,
在超类FlyingObject中设计抽象方法outOfBounds(),6个派生类中分别重写
2)删除越界飞行物为定时发生的,所以在run()中调用outOfBoundsAction()
在outOfBoundsAction()中:
声明不越界敌人/子弹数组,遍历enemies/bullets,获取每个敌人或子弹
判断若不越界,则将对象添加到不越界敌人/子弹数组中,
将不越界敌人/子弹数组复制到enemies/bullets中
3.设计Enemy得分接口,而后Airplane和BigAirplane实现接口
设计Award奖励接口,而后Bee实现接口
Shoot射击游戏第九天:
1.子弹与敌人的碰撞:
1)在超类FlyingObject中设计hit()实现敌人与子弹/英雄机的碰撞
在超类FlyingObject中设计goDead()实现飞行物去死
在Hero类中设计addLife()增命、addDoubleFire()增火力
2)子弹与敌人的碰撞为定时发生的,所以在run()中调用bulletBangAction()实现子弹与敌人的碰撞
在bulletBangAction()中:
遍历所有子弹,获取每个子弹,遍历所有敌人,获取每个敌人,
判断是否撞上了,若撞上了则:
2.1)子弹去死、敌人去死
2.2)若撞了小敌机和大敌机,则玩家得分
若撞了小蜜蜂,则英雄机得奖励
2.画分和画命:
1)在Hero类中设计getLife()获取命
2)在paint()方法中,画分和画命
回顾:
1.接口:
引用类型,interface定义,只能包含常量和抽象方法
不能被实例化,是需要被实现的,实现类:必须重写所有抽象方法
一个类可以实现多个接口,用逗号分隔,先继承后实现
接口可以继承接口
笔记:
1.多态:
1)意义:
1.1)同一类型的引用指向不同的对象时,有不同的实现
--------行为的多态:cut()、run()、step()...
1.2)同一个对象被造型为不同的类型时,有不同的功能
--------对象的多态:我、你、水...
2)向上造型/自动类型转换:
2.1)超类型的引用指向派生类的对象
2.2)能造型成为的类型有:超类+所实现的接口
2.3)能点出来什么,看引用的类型
3)强制类型转换,成功的条件只有如下两种:
3.1)引用所指向的对象就是该类型
3.2)引用所指向的对象实现了该接口/继承了该类
4)强转若不符合如上两个条件,则发生ClassCastException类型转换异常
建议:强转之前先通过instanceof来判断引用所指向的对象是否是该类型
1)打桩
2)快速定位错误位置
3)单元测试
4)Debug调试工具
若撞上了:
1)子弹去死,敌人去死
2)小敌机和大敌机------------玩家得分
小蜜蜂--------------------英雄机增命、增火力
int score = 0; //得分
public void bulletBangAction(){ //10毫秒
for(int j=0;j<enemies.length;j++){
FlyingObject f = enemies[j];
for(int i=0;i<bullets.length;i++){
Bullet b = bullets[i];
if(b.isLife() && f.isLife() && f.hit(b)){ //撞上了
b.goDead();
f.goDead();
if(f instanceof Enemy){
Enemy en = (Enemy)f;
score += en.getScore();
}
if(f instanceof Award){
Award aw = (Award)f;
int type = aw.getType();
switch(type){
case Award.DOUBLE_FIRE:
hero.addDoubleFire();
break;
case Award.LIFE:
hero.addLife();
break;
}
}
if(f instanceof Airplane){
Airplane a = (Airplane)f;
score += a.getScore();
}
if(f instanceof BigAirplane){
BigAirplane ba = (BigAirplane)f;
score += ba.getScore();
}
if(f instanceof BigYellowBee){
BigYellowBee byb = (BigYellowBee)f;
score += byb.getScore();
int type = byb.getType();
switch(type){
case Award.DOUBLE_FIRE:
hero.addDoubleFire();
break;
case Award.LIFE:
hero.addLife();
break;
}
}
if(f instanceof Bee){
Bee be = (Bee)f;
int type = be.getType();
switch(type){
case Award.DOUBLE_FIRE:
hero.addDoubleFire();
break;
case Award.LIFE:
hero.addLife();
break;
}
}
}
}
}
}
class BigYellowBee extends FlyingObject implements Enemy,Award{
public int getScore(){ return 5; }
public int getType(){ return ?; }
}
子弹与敌人的碰撞
class FlyingObject{ //敌人
public boolean hit(FlyingObject obj){
//this:敌人
//obj:子弹
}
}
英雄机与敌人的碰撞:
goDead()
MultiTypeDemo
Aoo o = new Boo();
Boo o1 = (Boo)o; //符合条件1
Inter1 o2 = (Inter1)o; //符合条件2
//Coo o3 = (Coo)o; //类型转换异常
if(o instanceof Boo){ //false
Boo o4 = (Boo)o;
}
System.out.println(o instanceof Boo); //true
System.out.println(o instanceof Inter1); //true
System.out.println(o instanceof Coo); //false
class Inter1{}
class Aoo{}
class Boo extends Aoo implements Inter1{}
class Coo extends Aoo{}
Airplane o1 = new Airplane();
FlyingObject o2 = new Airplane();
Enemy o3 = new Airplane();
我 me = new 我();
讲师 o1 = me;
孩子他妈 o2 = me;
老公的老婆 o3 = me;
o1.授课();
o2.揍他();
o3.咬他();
o3.收工资();
me.授课();
me.揍他();
me.咬他();
me.收工资();
interface 讲师{
void 授课();
}
interface 孩子他妈{
void 揍他();
}
interface 老公的老婆{
void 咬他();
void 收工资();
}
class 我 implements 讲师,孩子他妈,老公的老婆{
public void 授课(){}
public void 揍他(){}
public void 咬他(){}
public void 收工资(){}
}
动物 o1 = new 老虎();
动物 o2 = new 鸟();
动物 o3 = new 鱼();
o1.run(); //地
o2.run(); //天
o3.run(); //水
abstract class 动物{
abstract void run();
}
class 老虎 extends 动物{
void run(){在地上跑}
}
class 鸟 extends 动物{
void run(){在天上飞}
}
class 鱼 extends 动物{
void run(){在水里游}
}
人 p1 = new 理发师();
人 p2 = new 外科医生();
人 p3 = new 演员();
p1.cut(); //剪发
p2.cut(); //开刀
p3.cut(); //停止表演
abstract class 人{
abstract void cut();
}
class 理发师 extends 人{
void cut(){剪发}
}
class 外科医生 extends 人{
void cut(){开刀}
}
class 演员 extends 人{
void cut(){停止表演}
}
项目功能:
1)子弹与敌人的碰撞
2)画分和画命
十、
Shoot射击游戏第一天:
1.创建6个对象类,并创建World类测试
Shoot射击游戏第二天:
1.创建了6个对象类的构造方法,在World类中测试
Shoot射击游戏第三天:
1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.给FlyingObject超类设计了两个构造方法,6个派生类中分别调用
Shoot射击游戏第四天:
1.将小敌机数组、大敌机数组、小蜜蜂数组合为FlyingObject数组
2.在6个派生类中重写step()
3.画窗口
Shoot射击游戏第五天:
1.将类中的成员添加访问控制修饰符
2.设置图片属性
Shoot射击游戏第六天:
1.画对象:
1)想画对象,得先去获取对象的图片,
每个对象都得获取图片,意味着获取图片行为为共有的行为,
所以需要将获取图片的行为设计在FlyingObject超类中,
每个对象获取图片的行为都是不一样的,
所以获取图片的行为设计为抽象方法
--------在FlyingObject类中设计抽象方法getImage()
2)在获取对象的图片时,需要去考虑对象的状态(生命周期),
状态分三种(活着的、死了的(未删除)、删除的),
在实际应用中,状态都应设计为常量,
每个对象都有状态,所以将状态设计在FlyingObject超类中,
--------在FlyingObject类中设计三个常量和变量(存储当前状态)
在获取图片时,需要去判断每个对象的状态,用于获取不同的图片,
所以对象状态判断的行为为共有的行为,设计在FlyingObject超类中,
每个对象判断状态的行为都是一样的,设计为普通方法
--------在FlyingObject类中设计isLife()/isDead()/isRemove()
3)在派生类中重写getImage()用于在不同状态下获取不同的图片
3.1)Sky天空,直接返回image
3.2)Bullet子弹:
3.2.1)若活着的,直接返回image
3.2.2)若死了的,就删除
3.3)Airplane小敌机:
3.3.1)若活着呢,返回第1张图片
3.3.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.4)Airplane小敌机:
3.4.1)若活着呢,返回第1张图片
3.4.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.5)Airplane小敌机:
3.5.1)若活着呢,返回第1张图片
3.5.2)若死了呢,从第2张图到第5张图轮换,第5张图后可以删除了
3.6)Hero英雄机:
3.6.1)若活着呢,返回2张图片的切换
4)图片有了,就可以开画了,6个对象都可开画,属于共有的行为,
所以将画的行为设计在FlyingObject超类中,
所有对象画的行为都是一样的,所以设计为普通方法
--------在FlyingObject超类中设计普通方法paintObject()画对象
5)因为Sky天空是两张图,所以需要重写超类的paintObject()
--------在Sky类中重写paintObject()
6)画的行为完以后,只需要在窗口上调用即可
--------在World类中重写paint(),而后调用paintObject()
Shoot射击游戏第七天:
1.敌人入场:
1)敌人是由窗口产生的,所以在World中设计nextOne()生成敌人对象
2)敌人入场为定时发生的,在run()中调用enterAction()实现敌人入场
在enterAction()中:
每400毫秒调用nextOne()获取敌人,enemies扩容,装在最后一个元素上
2.子弹入场:
1)子弹是由英雄机发射出来的,所以在Hero中设计shoot()生成子弹对象
2)子弹入场为定时发生的,在run()中调用shootAction()实现子弹入场
在shootAction()中:
每300毫秒调用hero的shoot()获取子弹,bullets扩容,数组追加
3.飞行物移动:
1)移动是所有对象所共有的行为,并且每个对象移动的形为都是不一样的,
所以在超类FlyingObject中设计了抽象方法step(),派生类重写step()
2)飞行物移动为定时发生的,在run()中调用stepAction()实现飞行物移动
在stepAction()中:
天空动,遍历敌人而后敌人动,遍历子弹而后子弹动
Shoot射击游戏第八天:
1.英雄机随着鼠标移动:
1)英雄机移动是英雄机的行为,所以在Hero中设计moveTo(x,y)实现英雄机随着鼠标移动
2)英雄机随着鼠标移动是事件触发的,在侦听器中重写mouseMoved()鼠标移动事件
在mouseMoved()中:
获取鼠标的x和y坐标,而后英雄机随着动
2.删除越界的飞行物:
1)越界检查为所有飞行物都具备的行为,只是每个对象的具体行为不一样,
在超类FlyingObject中设计抽象方法outOfBounds(),6个派生类中分别重写
2)删除越界飞行物为定时发生的,所以在run()中调用outOfBoundsAction()
在outOfBoundsAction()中:
声明不越界敌人/子弹数组,遍历enemies/bullets,获取每个敌人或子弹
判断若不越界,则将对象添加到不越界敌人/子弹数组中,
将不越界敌人/子弹数组复制到enemies/bullets中
3.设计Enemy得分接口,而后Airplane和BigAirplane实现接口
设计Award奖励接口,而后Bee实现接口
Shoot射击游戏第九天:
1.子弹与敌人的碰撞:
1)在超类FlyingObject中设计hit()实现敌人与子弹/英雄机的碰撞
在超类FlyingObject中设计goDead()实现飞行物去死
在Hero类中设计addLife()增命、addDoubleFire()增火力
2)子弹与敌人的碰撞为定时发生的,所以在run()中调用bulletBangAction()实现子弹与敌人的碰撞
在bulletBangAction()中:
遍历所有子弹,获取每个子弹,遍历所有敌人,获取每个敌人,
判断是否撞上了,若撞上了则:
2.1)子弹去死、敌人去死
2.2)若撞了小敌机和大敌机,则玩家得分
若撞了小蜜蜂,则英雄机得奖励
2.画分和画命:
1)在Hero类中设计getLife()获取命
2)在paint()方法中,画分和画命
Shoot射击游戏第九天:
1.英雄机与敌人的碰撞:
1)借用FlyingObject中的hit()碰撞行为
借用FlyingObject中的goDead()去死行为
在Hero中设计subtractLife()减命、clearDoubleFire()清空火力值
2)因为英雄机与敌人碰撞为定时发生的,所以在run()中调用heroBangAction()实现碰撞
在heroBangAction()中:
遍历所有敌人,获取每个敌人,判断是否与英雄机撞上了,
若撞上了: 敌人去死、英雄机减命、英雄机清空火力值
2.检测游戏结束:
1)借用Hero的getLife()获取命
2)因为检测游戏结束为定时发生的,所以在run()中调用checkGameOver()实现检测结束
在checkGameOverAction()中:
判断英雄机的命数是否<=0,若为true则...
3.画状态:
1)设计了四个状态常量,当前状态state变量
设计了三个静态图片,在static块中初始化
2)在paint()中设计在不同状态下画不同的图片
3)将一堆action()设计为仅在运行状态下执行
将英雄机随着鼠标动设计为仅在运行状态下执行
4)重写mouseClicked()鼠标点击事件
重写mouseExited()鼠标点击事件
重写mouseEntered()鼠标点击事件
回顾:
1.多态:
1)意义:行为的多态、对象的多态
2)向上造型: 超类+所实现的接口
3)强转成功的条件:
3.1)引用所指向的对象就是该类型
3.2)引用所指向的对象实现了该接口/继承了该类
4)若不符合如上两个条件,则发生ClassCastException类型转换异常
建议在强转之前先instanceof来判断
正课:
1.内存管理:由JVM来管理
1)堆:
1.1)存储new出来的对象(包括实例变量)
1.2)垃圾:没有任何引用所指向的对象,
垃圾回收器(GC)不定时到内存中清扫垃圾,
回收过程是透明的(看不到的),不一定一发现垃圾就立刻回收,
调用System.gc()可以建议虚拟机尽快调度GC来回收垃圾
1.3)实例变量的生命周期:
创建对象时存在堆中,对象被回收时一并被回收
1.4)内存泄漏:不再使用的对象还没有被及时的回收
建议:不再使用的对象及时将引用设置为null
2)栈:
2.1)正在调用的方法中的局部变量(包括方法的参数)
2.2)调用方法时,在栈中为该方法分配一块对应的栈帧,
栈帧中存储方法中的局部变量(包括方法的参数),
方法调用结束时,栈帧被清除,局部变量一并被清除
2.3)局部变量的生命周期:
方法调用时存储在栈中,方法结束时与栈帧一并被清除
3)方法区:
3.1)存储.class字节码文件(包括方法、静态变量)
3.2)方法只有一份,通过this来区分具体的访问对象
设计规则:
1)将所有派生类所共有的属性和行为,抽到超类中-------抽共性
2)所有派生类的行为都一样,设计为普通方法
所有派生类的行为都不一样,设计为抽象方法
3)将部分派生类所共有的行为,抽到接口中
符合既是也是原则时,使用接口
接口是对继承的单根性的扩展------------多继承
面向对象三大特征:
1.封装:
1)类:封装的是对象的属性的行为
2)方法:封装一段特定的业务逻辑功能
3)访问控制修饰符:封装的是具体的访问权限
2.继承:
1)作用:代码复用
2)超类:所有派生类所共有的属性和行为
接口:部分派生类所共有的行为
派生类:派生类所特有的属性和行为
3)单一继承、多接口实现,传递性
3.多态:
1)行为多态(所有抽象方法都是多态的)
对象多态(所有对象都是多态的)
2)向上造型、强制类型转换、instanceof
3)多态的表现形式:
3.1)重写:根据对象的不同来多态
3.2)重载:根据参数的不同来多态
面向对象课程安排:
第一天:
1.知识点:
1)什么是类?什么是对象?
2)如何创建类?如何创建对象?如何访问成员?
2.项目:
1)创建6个对象类,并创建World类测试
第二天:
1.知识点:
1)方法的重载
2)构造方法
3)this
4)null和NullPointerException
5)引用类型之间画等号
2.项目:
1)给6个对象类添加构造方法,并测试
第三天:
1.知识点:
1)引用类型数组
2)继承
3)super
2.项目:
1)设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2)设计超类FlyingObject,6个对象类分别继承,并测试
3)给FlyingObject设计两个构造方法,6个对象类分别调用超类的构造方法
第四天:
1.知识点:
1)向上造型
2)重写、重写与重载的区别
2.项目:
1)将小敌机、大敌机、小蜜蜂数组合为FlyingObject数组
2)重写超类FlyingObject的step()方法
3)画窗口
第五天:
1.知识点:
1)package和import
2)访问控制修饰符
3)final,static,static final
2.项目:
1)将类中的所有成员添加访问控制修饰符
2)给6个对象类添加图片属性
3)设计窗口的宽和高为常量,适当地方做修改
第六天:
1.知识点:
1)抽象方法
2)抽象类
2.项目:
1)画对象
第七天:
1.知识点:
1)成员内部类
2)匿名内部类
2.项目:
1)敌人入场
2)子弹入场
3)飞行物移动
第八天:
1.知识点:
1)接口
2.项目:
1)英雄机随着鼠标移动
2)删除越界的飞行物
3)设计Enemy和Award接口,小敌机、大敌机、小蜜蜂分别实现接口
第九天:
1.知识点:
1)多态:意义、向上造型、强制类型转换、instanceof
2.项目:
1)子弹与敌人的碰撞
2)画分和画命
第十天:
1.知识点:
1)内存管理:堆、栈、方法区
2.项目:
1)英雄机与敌人的碰撞
2)检测游戏结束
3)画状态
1.何时用:当程序的运行结果与你的预期不同时,需要调试
2.调试方式:
1)打桩: System.out.println(数据);
2)Debug调试工具:
2.0)添加断点
2.1)四个键:
2.1.1)F5:单步调试(会进入到方法中)
2.1.2)F6:逐过程调试(不会进入到方法中)
2.1.3)F7:结束方法的调试(从方法中返回)
2.1.4)F8:直接跳到下一个断点(若后面无断点则结束调试)
2.2)会看两个东西:
2.2.1)会看变量
2.2.2)添加监视
若撞上了:
1)敌人去死
2)英雄机减命、英雄机清空火力值
hero.getLife()<=0
现在的是-------只要不越界就要
要的是:
A:不越界,并且,LIFE的
B:不越界,并且,LIFE的或DEAD的(不是REMOVE的)
class Airplane{
int width;
int height;
int x;
int y;
}
Airplane a1 = new Airplane();
a1.width =;
a1.height=;
a1.x=;
a1.y=;
Airplane a2 = new Airplane();
a2.width =;
a2.height=;
a2.x=;
a2.y=;
class Aoo{
void show(){}
}
class Boo extends Aoo{
void show(String name){} //方法的重载
}
System.out.println();
System.out.println(25);
System.out.println(35.6);
System.out.println('你');
System.out.println(true);
System.out.println("Hello");
Aoo o = new Aoo();
Object oo = new Aoo();
Object
class FlyingObject extends Object{
}
class Airplane extends FlyingObject{
}
Airplane a = new Airplane();
实例变量:
1)类中,方法外
2)创建对象时存在堆中,对象被回收时一并被回收
3)有默认值
局部变量:
1)方法中
2)方法调用时存储在栈中,方法结束时与栈帧一并被清除
3)没有默认值
Aoo o = new Aoo();-------------------a=0
o.show(5);---------------------------b=5
class Aoo{
int a;
void show(int b){
int c;
System.out.println(a); //0
System.out.println(b); //5
System.out.println(c); //编译错误
}
}
项目功能:
1.英雄机与敌人的碰撞
2.画状态
Debug调试: