面向对象
1. OO 面向对象(Object Oriented)
OOA:面向对象的分析
OOD:面向对象的设计
OOAD:面向对象分析和设计(二合一 ,开发效率更高)
OOP:面向对象编程!(重点)
本阶段项目会大量用到我们之前所学习的基础语法!所以多练 1.为了写代码不报错 2.为了更好学习面向对象
对象和类
类:抽象的不具体,在程序中表示的是模板,泛指一类事物的代表。
对象:具体的,真实存在的!能看的到的!
分析项目的对象:
一个战舰,一堆深水炸弹,一堆侦察潜艇,一堆水雷潜艇,一堆鱼雷潜艇,一堆水雷,一堆鱼雷。
(ObserverSubmarine)侦察潜艇
举例:
OS1 -------- x y width height speed
OS2 -------- x y width height speed
OS3 -------- x y width height speed
OS4 -------- x y width height speed
…
OS100 -------- x y width height speed
100个侦察潜艇 就要100个对应的数据(代码冗余)
1.使用类来解决:
类 对象
月饼模板 月饼
如何创建类,对象,访问对象的内容。
以生活的角度考虑:先有类再有对象!
以编程的角度考虑:先有对象再有类!
1.如何创建类
类中包含对象所共有的数据/属性 ------------------变量
类中包含对象所共有的行为/方法 ------------------方法
class Person{//人类模板
//数据(属性/变量)
int age;//年龄
String name;//名字
char sex;//性别
//行为(方法)
void play(){//玩的行为
}
void sleep(){//睡觉的行为
}
void eat(){//吃的行为
}
}
-----------------------------------------------------------
class car{//车类
//变量
String color;//颜色
String type;//型号
double price;//价格
//行为
void run(){//向前运动
}
void back(){//向后运动
}
void stop(){//停车
}
}
-----------------------------------------------------------
class ObserverSubmarine{ //侦察潜艇类 代表所有侦察潜艇对象
//所有侦察对象所共有的(数据)变量
int x;
int y;
int width;
int heiht;
int speed;
//所有侦察对象所共有的(行为)方法
void step(){
}
}
成员变量:声明在类的里面方法的外面的变量,称之为成员变量,作用域是在整个类体中!
局部变量:声明在方法中的变量叫做局部变量,作用域,只在声明的那个方法里面!
package oo.day01;
/**
* 学生类:代表所有学生对象的模板
* 类中存放所有学生对象共有的属性和行为
*/
public class Student {
//属性
String name;//名字 ----成员变量
int age;//年龄
int stuID;//学号
//------------------------
//行为
void study() {//学习
System.out.println(name + "在学习....");
}
void sayHi() {//打招呼
System.out.println("大家好,我叫" + name + ",今年已经" + age + "岁了!我的学号:"+stuID);
}
}
自定义的类也是一种数据类型,是引用数据类型!
2.如何创建对象
//创建对象的语法
Scanner s = new Scanner(); //创建一个扫描器对象
数据类型 变量名 赋值号 创建一个学生对象
Student s1 = new Student();//创建一个学生对象 将对象存到s1这个变量中。
Student zs = new Student();//创建一个学生对象 将对象存到zs这个变量中。
Student ls = new Student();//创建一个学生对象 将对象存到ls这个变量中。
3.访问对象
package oo.day01;
/**
* 学生的测试类:
*/
public class StudentTest {
public static void main(String[] args) {
//创建一个学生类对象
//类型 变量名 = 创建对象的语法(new 类型())
Student zs = new Student();//创建一个学生对象 zs
//zs这个变量能打点调用什么,取决于当前zs这个变量类型有什么
zs.name = "张三";
zs.age = 18;
zs.stuID = 1001;
zs.study(); //调用zs这个对象的学习方法
zs.sayHi(); //调用zs这个对象的打招呼方法
//----------------------------------
Student ls = new Student();
ls.name = "李四";
ls.age = 30;
ls.stuID = 2001;
ls.study();//调用ls这个对象的学习方法!
ls.sayHi();//调用ls这个对象的打招呼的方法!
//总结:哪个对象打点调用方法,那么方法里面用的数据就是那个对象的!
}
}
2.项目需求
深海杀手项目分析:
(1)对象分析(识别对象):战舰、深水炸弹、侦察潜艇(银色的)、水雷潜艇(绿色的)、鱼雷潜艇(金黄色的)、水雷、鱼雷
(2)对象职责(分配职责):战舰(玩家):发射深水炸弹。
2.1深水炸弹:可以攻击(侦察潜艇、水雷潜艇、鱼雷潜艇),若打到时
1.被打倒的潜艇消失,深水炸弹消失。
2.打到侦察潜艇玩家+10分,打到鱼雷潜艇玩家+40分 ---加分
3.打到水雷潜艇+1条命 ---加命
水雷潜艇:发射水雷,水雷可以攻击战舰,若打到时
1.水雷需要消失
2.战舰减一条命(命数为0时,游戏结束)
鱼雷潜艇:发射鱼雷,鱼雷可以攻击战舰,若打到时
1.鱼雷需要消失
2.战舰减一条命(命数为0时,游戏结束)
(3)建立交互…
2.1在src下创建一个包:cn.aries.submarine
创建7个类:
战舰类:---------------------------Battleship
属性: x y width height speed life(命)
行为: void step(){
//通过键盘移动
}
深水炸弹类:------------------------Bomb
属性: x y width height speed
行为: void step(){
//y向下运动...
}
侦察潜艇类:------------------------ObserverSubmarine
属性: x y width height speed
行为: void step(){
//x向右运动
}
鱼雷潜艇类:------------------------TorpedoSubmarine
属性: x y width height speed
行为: void step(){
//x向右运动
}
水雷潜艇类:------------------------MineSubmarine
属性: x y width height speed
行为: void step(){
//x向右运动
}
水雷类:---------------------------Mine
属性: x y width height speed
行为: void step(){
//y向上运动
}
鱼雷类:---------------------------Torpedo
属性: x y width height speed
行为: void step(){
//y向上运动
}
创建GameWorld类
package cn.aries.submarine;
/**
* 游戏入口类 : 测试游戏运行
*/
public class GameWorld {
Battleship ship;//声明一个战舰类型的变量
Bomb bomb; //声明一个深水炸弹类型的变量
MineSubmarine ms;//声明一个水雷潜艇类型的变量
TorpedoSubmarine ts;//声明一个鱼雷潜艇类型的变量
ObserverSubmarine os;//声明一个侦察潜艇类型的变量
ObserverSubmarine os1;
Mine m;//声明一个水雷类型的变量
Torpedo t;//声明一个鱼雷类型的变量
/**
* 用于创建对象
*/
void action() {
ship = new Battleship();
ship.x = 100;
ship.y = 200;
ship.width = 40;
ship.height = 30;
ship.speed = 10;
bomb = new Bomb();
bomb.x = 200;
bomb.y = 300;
bomb.width = 10;
bomb.height = 11;
bomb.speed = 2;
ms = new MineSubmarine();
ms.x = 200;
ms.y = 300;
ms.width = 10;
ms.height = 11;
ms.speed = 2;
ts = new TorpedoSubmarine();
ts.x = 200;
ts.y = 300;
ts.width = 10;
ts.height = 11;
ts.speed = 2;
os = new ObserverSubmarine();//创建侦察潜艇对象 并将对象赋值给 os
os.x = 200;
os.y = 300;
os.width = 10;
os.height = 11;
os.speed = 2;
os1 = new ObserverSubmarine();//创建侦察潜艇对象 并将对象赋值给 os
os1.x = 200;
os1.y = 300;
os1.width = 10;
os1.height = 11;
os1.speed = 2;
m = new Mine();
m.x = 200;
m.y = 300;
m.width = 10;
m.height = 11;
m.speed = 2;
t = new Torpedo();
t.x = 200;
t.y = 300;
t.width = 10;
t.height = 11;
t.speed = 2;
}
public static void main(String[] args) {
GameWorld gw = new GameWorld();
gw.action();//调用action方法进行创建各类对象
}
}
/**
* 1.为什么要将各类的变量设计到main方法的外面?
* 答:作用域如果只在main中,只能在main中访问,不符合我们后续的设计需求。
* 2.为什么要单独创建action方法来进行创建对象
* 答:因为main方法是static方法,我们如果直接使用类的成员变量在main中是
* 无法访问的,所有需要单独定义一个方法来进行创建对象并测试。
* 3.为什么要先创建GameWorld类对象 再调用action方法
* 答:因为main是static的,在main中是无法直接调用action方法的,那么方法
* 可以通过对象的形式进行调用,所有在main创建类对象并调用action方法
*
* 关于static(静态)后续会讲....
*/
问题:在action中,初始化赋值对象的操作特别麻烦,每创建一个对象,都要依次对对象的属性初始化赋值。
解决: 我们可以通过构造方法来解决创建对象初始化特别麻烦的过程。