Java OOP 5 特种部队

一、内容回顾
  1. 类和对象
  2. 封装
  3. 继承
  4. 多态
  5. 抽象类和抽象方法
  6. 接口
  7. 面向对象设计原则
二、难点突破
  • 面向对象编程特性

    • 封装、继承、多态
  • 抽象类和抽象方法

  • 接口

  • 面向对象设计原则

三、知识梳理——类和对象
  • 类和对象

    • 面向对象程序设计的基本步骤
    • 类图
    • this关键字
  • 构造方法

    • new关键字
    • 构造方法的特点
    • 构造方法的执行过程
  • 方法重载

    • 方法重载的特点
  • static 关键字

    • static 属性
    • 常量
    • static 方法
  • 封装

    • 概念、特点、作用
    • 封装的步骤
    • 使用封装重构类的属性和方法
    • 访问修饰符
      • private
      • 默认修饰符
      • protected
      • public
四、知识梳理——继承
  • 继承
    • 概念、特点、应用场合
    • is a 关系
    • 单继承
    • Object类
    • Object类的常用方法
    • 方法重写
    • 方法重写的规则
    • super关键字
    • IntelliJ IDEA 工具实现对父类方法的重写操作
    • @Override
    • 子类继承父类时构造方法的调用规则
    • 多级继承
五、知识梳理——多态
  • 多态
    • 概念、特点、优势、应用场合
    • 向上转型
    • 使用父类作为方法形参实现多态
    • 使用父类作为方法返回值实现多态
    • 向下转型
    • instanceof运算符
六、知识梳理——抽象类
  • 抽象类

    • 概念、特点、优势、应用场合
    • abstract关键字
    • 抽象类与普通类的区别
  • 抽象方法

    • 抽象方法的定义、特点
    • 抽象方法与普通方法的区别
  • final修饰符

  • abstract 和private、static和final

七、知识梳理——接口
  • 接口

    • 概念、特点、优势、应用场合
    • interface关键字
    • implement关键字
    • 多继承
  • 面向对象设计原则

八、综合练习

需求描述

  • 练习1:“特种部队”游戏
    • 设计类结构,并完成编码
    • 实现游戏初始化
    • 实现双方对战
欢迎来到特种部队!
********战前准备********
请录入昵称:aiden
1.雨潇生 2.醉清风 3.如梦令 请选择对战玩家(1~3):1
>>>玩家信息: 姓名=雨潇生,血量=100,是否持枪=true
>>>玩家信息: 姓名=aiden,血量=100,是否持枪=true
********开始对战********
---第1回合---
雨潇生向aiden开了一枪
>>>弹夹状态:29/30
aiden向雨潇生开了一枪
>>>弹夹状态:29/30

>>>玩家信息: 姓名=雨潇生,血量=85,是否持枪=true
>>>玩家信息: 姓名=aiden,血量=85,是否持枪=true
是否继续对战(输入y继续,其他键退出)?y
---第2回合---
雨潇生向aiden开了一枪
>>>弹夹状态:28/30
aiden向雨潇生开了一枪
>>>弹夹状态:28/30

>>>玩家信息: 姓名=雨潇生,血量=74,是否持枪=true
>>>玩家信息: 姓名=aiden,血量=83,是否持枪=true
是否继续对战(输入y继续,其他键退出)?n
退出江湖!
  • 练习2:实现冰箱功能显示
******普通冰箱*********
这是一款型号为BCD-160W的西门子冰箱。
普通冰箱冷藏温度设定为-2~8度。
普通冰箱冷藏温度设定为-15~-25度。
通过手动调整温度转盘将西门子BCD-160W冰箱冷藏温度设定为0度!
通过手动调整温度转盘将西门子BCD-160W冰箱冷冻温度设定为-26度!

******智能冰箱*********
这是一款型号为BCD-330WD的海尔冰箱。
智能冰箱冷藏室正在通过气味自动将不新鲜的食材调动到距离冰箱门近的地方。
智能冰箱冷冻室正在自动智能除霜!
海尔BCD-330WD冰箱通过电脑温控系统将冷藏温度设定为1。
海尔BCD-330WD冰箱通过电脑温控系统将冷冻温度设定为-22。
海尔BCD-330WD冰箱正在统计食材存量,并通知附近超市上门补货。
海尔BCD-330WD正在统计食材种类、保质期,根据用户偏好推荐食谱显示在大屏幕。
九、阶段1:设计类结构并完成编码

需求说明

  • 玩家初始化

  • 装配枪弹

  • 双方对战

  • 根据需求,设计“特种部队”游戏的类结构,并完成编码

  • 分析需求归纳出类及属性

  • 分析类的方法

十、阶段2:实现游戏初始化

需求说明

  • 实现玩家初始化和装备初始化

  • 包含录入玩家昵称,选择对手,装配弹夹,玩家持枪等操作

  • 显示玩家信息

  • 运行效果图

    在这里插入图片描述

玩家初始化

  • 创建玩家对象,初始化昵称、血量

装备初始化

  • 分别创建机枪、弹夹对象,将弹夹装满子弹,玩家手持机枪,并向机枪装配已满弹的弹夹

  • 需要调用已实现玩家类、弹夹类中相关方法

十一、阶段3:实现双方对战

需求说明

  • 在每回合中交战玩家分别向对方射击,最先打败对手的一方获胜
    • 因子弹伤害值为1~15间随机数,每次交战玩家损失血量为等值随机数
    • 每个回合中,均需计算弹夹剩余子弹数和玩家剩余血量,并输出
    • 循环交战,每次询问“是否继续对战”
    • 当玩家主动结束对战或有一方被击败时,将退出游戏
    • 运行效果
      在这里插入图片描述
欢迎来到特种部队!
********战前准备********
请录入昵称:aiden
1.雨潇生 2.醉清风 3.如梦令 请选择对战玩家(1~3):1
>>>玩家信息: 姓名=雨潇生,血量=100,是否持枪=true
>>>玩家信息: 姓名=aiden,血量=100,是否持枪=true
********开始对战********
---第1回合---
雨潇生向aiden开了一枪
>>>弹夹状态:29/30
aiden向雨潇生开了一枪
>>>弹夹状态:29/30

>>>玩家信息: 姓名=雨潇生,血量=96,是否持枪=true
>>>玩家信息: 姓名=aiden,血量=95,是否持枪=true
是否继续对战(输入y继续,其他键退出)?y
---第2回合---
雨潇生向aiden开了一枪
>>>弹夹状态:28/30
aiden向雨潇生开了一枪
>>>弹夹状态:28/30

>>>玩家信息: 姓名=雨潇生,血量=84,是否持枪=true
>>>玩家信息: 姓名=aiden,血量=86,是否持枪=true
是否继续对战(输入y继续,其他键退出)?n
退出江湖!

功能源码

1.定义玩家类 Player

package com.aiden.gungame;

/**
 * 玩家类
 */
public class Player {
    private String name;//昵称
    private int blood = 100;//血量
    private Gun gun;//机枪
    
    public int getBlood() {
        return blood;
    }
    public String getName() {
        return name;
    }
    
    public Player(){}
    
    public Player(String name){
        this(name,100);
    }
    
    public Player(String name,int blood){
        this.name = name;
        this.blood = blood;
    }

    /**
     * 持枪
     * @param gun
     */
    public void holdGun(Gun gun){
        this.gun = gun;
    }
    /**
     * 射击
     * @param enemy 对手
     */
    public void shootEnemy(Player enemy){
        System.out.printf("%s向%s开了一枪\n",this.name,enemy.name);
        if(gun == null){
            System.out.println(">>>"+name+"没有枪,无法进行射击!");
            return;
        }
        gun.shootEnemy(enemy);
    }

    /**
     * 装弹夹
     * @param clip
     */
    public void loadClip(Clip clip){
        if(gun == null){
            System.out.println(">>>"+name+"没有枪,无法装弹夹!");
            return;
        }
        gun.loadClip(clip);
    }
    //计算损失
    public void damage(int hurt){
        if(blood == 0){
            System.out.println(">>>"+name+"已死亡,请勿鞭尸!");
            return;
        }
        blood-=hurt;
        if(blood<=0){
            blood = 0;
            System.out.println(">>>"+name+"已经死亡!");
        }
    }
    public void showPlayer(){
        boolean isHoldGun = gun!=null;
        System.out.printf(">>>玩家信息: 姓名=%s,血量=%d,是否持枪=%b\n",name,blood,isHoldGun);
    }
}

2.定义枪类 Gun

package com.aiden.gungame;
/**
 * 枪类
 */
public class Gun {
    private Clip clip;//弹夹
    public Gun(){
        this(null);
    }
    public Gun(Clip clip){
        this.clip = clip;
    }

    /**
     * 装弹夹
     * @param clip
     */
    public void loadClip(Clip clip){
        this.clip = clip;
    }

    /**
     * 开枪
     * @param enemy
     */
    public void shootEnemy(Player enemy){
        if(clip == null){
            System.out.println(">>>枪械没有弹夹,放了一个空枪!");
            return;
        }
        Bullet bullet = clip.popBullet();
        if(bullet == null){
            System.out.println(">>>枪械的弹夹已空,放了一个空枪!");
            return;
        }
        bullet.hitEnemy(enemy);
    }

    /**
     * 显示枪械信息
     */
    public void showGun(){
        if(clip!=null){
            System.out.println(">>>枪械信息:有弹夹");
        }else{
            System.out.println(">>>枪械信息:无弹夹");
        }
    }
}


3.定义弹夹类 Clip

package com.aiden.gungame;
/**
 * 弹夹类
 */
public class Clip {
    private Bullet[] magazine;//弹仓
    private int capacity = 30;//弹夹容量
    private int surplus=0;//子弹盈余
    public Clip(){
        this(30);
    }
    public Clip(int capacity){
        this.magazine = new Bullet[capacity];
        this.surplus = 0;
    }
    //装子弹
    public void pushBullet(Bullet bullet){
        if(surplus == capacity){
            System.out.println(">>>弹夹已满,请勿重复装弹!");
            return;
        }
        magazine[surplus] = bullet;
        surplus++;
    }
    //卸子弹
    public Bullet popBullet(){
        if(surplus == 0){
            System.out.println(">>>弹夹已空,无法弹出子弹!");
            return null;
        }
        Bullet bullet = magazine[surplus - 1];
        magazine[surplus - 1] = null;
        surplus--;
        showClip();
        return bullet;
    }
    //显示弹夹信息
    public void showClip(){
        System.out.printf(">>>弹夹状态:%d/%d\n",surplus,capacity);
    }
}

4.定义子弹类 Bullet

package com.aiden.gungame;
/**
 * 子弹类
 */
public class Bullet {
    //private int hurt = 10;//子弹的伤害值
    public Bullet(){
    }

    //子弹击中敌人
    public void hitEnemy(Player enemy){
        int hurt = (int)(Math.random()*15+1);
        enemy.damage(hurt);
    }
}

5.定义测试类 TestGungame

package com.aiden.gungame;
import java.util.Scanner;

/**
 * 测试类
 */
public class TestGungame {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        System.out.println("欢迎来到特种部队!");
        System.out.println("********战前准备********");
        Player p1 =new Player();
        System.out.print("请录入昵称:");
        String name = in.next();
        System.out.print("1.雨潇生 2.醉清风 3.如梦令 请选择对战玩家(1~3):");
        int num = in.nextInt();
        switch(num){
            case 1:
                p1 = new Player("雨潇生",100);
                break;
            case 2:
                p1 = new Player("醉清风",100);
                break;
            case 3:
                p1 = new Player("如梦令",100);
                break;
            default:
                System.out.println("您的输入有误!");
                break;
        }
        Player p2 = new Player(name,100);

        Gun gun1 = new Gun();
        Gun gun2 = new Gun();
        //玩家持枪
        p1.holdGun(gun1);
        p2.holdGun(gun2);
        //装配弹夹、子弹
        Clip clip1 = new Clip();
        Clip clip2 = new Clip();
        for(int i = 1;i <= 30;i++){
            clip1.pushBullet(new Bullet());
            clip2.pushBullet(new Bullet());
        }
        p1.loadClip(clip1);
        p2.loadClip(clip2);
        //显示信息
        p1.showPlayer();
        p2.showPlayer();
        int i = 0;  //回合数
        System.out.println("********开始对战********");
        boolean isExit = false;   //是否退出游戏
        while(true){
            System.out.println("---第"+(i+1)+"回合---");
            i++;
            p1.shootEnemy(p2);
            if(p2.getBlood()==0) {
                System.out.println(p1.getName()+"获胜!");
                System.out.println("退出江湖!");
                return;
            }
            p2.shootEnemy(p1);
            if(p1.getBlood()==0) {
                System.out.println(p2.getName()+"获胜!");
                System.out.println("退出江湖!");
                return;
            }
            System.out.println();
            p1.showPlayer();
            p2.showPlayer();
            System.out.print("是否继续对战(输入y继续,其他键退出)?");
            if(!(in.next().equals("y"))){
                System.out.println("退出江湖!");
                return;
            }
        }
    }
}
十二、冰箱功能显示

需求说明

  • 使用面向对象技术模拟普通冰箱、智能冰箱相应功能,并显示信息

  • 所有冰箱都具有品牌、型号的特征,能够冷藏和冷冻食品

  • 普通冰箱具有温度调节功能

  • 智能冰箱具有温度调节、食品管理、物联云服务功能功能

  • 运行效果图

    在这里插入图片描述

运用继承的知识,分别创建冰箱类及其子类普通冰箱和智能冰箱,定义其属性和方法

不同冰箱的功能创建为接口

普通冰箱和智能冰箱通过实现不同接口,完成各自功能


功能源码

1.定义冰箱类 Fridge

package com.aiden.fridge.factory;

/**
 * 冰箱
 */
public class Fridge {
    private String brand;  //品牌
    private String type;   //型号
    public  Fridge(){}
    public  Fridge(String brand,String type){
        this.brand=brand;
        this.type=type;
    }

    //冷藏
    public  void coldStorage(){
        System.out.println("冰箱能够对食品进行冷藏保鲜。");
    }

    //冷冻
    public  void freezing(){
        System.out.println("冰箱能够通过冷冻让食品保质期更长。");
    }

    public void info(){
        System.out.println("这是一款型号为"+type+"的"+brand+"冰箱。");
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }

}

2.定义物联云服务接口 物联云服务

package com.aiden.fridge.factory;

/**
 * 物联云服务
 */
public interface CloudService {
    //服务
    void service();
}

3.定义食品管理接口 FoodManage

package com.aiden.fridge.factory;

/**
 * 食品管理
 */
public interface FoodManage {
    //显示食品信息
    void ShowFoodInfo();
}

4.定义温度控制接口 TemperControl

package com.aiden.fridge.factory;

/**
 * 温度控制
 */
public interface TemperControl {
    //调节冷藏温度
    void AdjustColdTemper(int temperature);
    //调节冷冻温度
    void AdjustFreezTemper(int temperature);
}

5.定义普通冰箱实现类 CommonFridge 该类继承 Fridge并实现 TemperControl接口

package com.aiden.fridge.impl;


import com.aiden.fridge.factory.Fridge;
import com.aiden.fridge.factory.TemperControl;

/**
 * 普通冰箱
 */
public class CommonFridge extends Fridge implements TemperControl {
    public CommonFridge(){};
    public CommonFridge(String brand,String type){
        super(brand,type);
    }

    @Override
    public void coldStorage(){
        System.out.println("普通冰箱冷藏温度设定为-2~8度。");
    }

    @Override
    public void freezing() {
        System.out.println("普通冰箱冷藏温度设定为-15~-25度。");
    }

    @Override
    public void AdjustColdTemper(int temperature) {
        System.out.println("通过手动调整温度转盘将"+this.getBrand()+this.getType()+"冰箱冷藏温度设定为"+temperature+"度!");
    }

    @Override
    public void AdjustFreezTemper(int temperature) {
        System.out.println("通过手动调整温度转盘将"+this.getBrand()+this.getType()+"冰箱冷冻温度设定为"+temperature+"度!");
    }
}

6.定义智能冰箱 IntelligentFridge 该类继承 Fridge并实现 FoodManage接口, CloudService接口, TemperControl接口

package com.aiden.fridge.impl;

import com.aiden.fridge.factory.CloudService;
import com.aiden.fridge.factory.FoodManage;
import com.aiden.fridge.factory.Fridge;
import com.aiden.fridge.factory.TemperControl;

/**
 * 智能冰箱
 */
public class IntelligentFridge extends Fridge implements CloudService, FoodManage, TemperControl {
    
    public IntelligentFridge(){
        
    };
    
    public IntelligentFridge(String brand,String type){
        super(brand,type);
    }
    
    @Override
    public void coldStorage() {
       System.out.println("智能冰箱冷藏室正在通过气味自动将不新鲜的食材调动到距离冰箱门近的地方。");
    }

    @Override
    public void freezing() {
        System.out.println("智能冰箱冷冻室正在自动智能除霜!");
    }

    @Override
    public void AdjustColdTemper(int temperature) {
        System.out.println(this.getBrand()+this.getType()+"冰箱通过电脑温控系统将冷藏温度设定为"+temperature+"。");
    }

    @Override
    public void AdjustFreezTemper(int temperature) {
        System.out.println(this.getBrand()+this.getType()+"冰箱通过电脑温控系统将冷冻温度设定为"+temperature+"。");
    }
    @Override
    public void service() {
        System.out.println(this.getBrand()+this.getType()+"冰箱正在统计食材存量,并通知附近超市上门补货。");

    }

    @Override
    public void ShowFoodInfo() {
        System.out.println(this.getBrand()+this.getType()+"正在统计食材种类、保质期,根据用户偏好推荐食谱显示在大屏幕。");

    }
}

7.定义测试类 FridgeTest

package com.aiden.fridge.test;

import com.aiden.fridge.impl.CommonFridge;
import com.aiden.fridge.impl.IntelligentFridge;

public class FridgeTest {
    
    public static void main(String[] args){
        
        System.out.println("******普通冰箱*********");
        CommonFridge coFridge = new CommonFridge("西门子","BCD-160W");
        coFridge.info();
        coFridge.coldStorage();
        coFridge.freezing();
        coFridge.AdjustColdTemper(0);
        coFridge.AdjustFreezTemper(-26);
        
        System.out.println();
       
        System.out.println("******智能冰箱*********");
        IntelligentFridge inFridge = new IntelligentFridge("海尔","BCD-330WD");
        inFridge.info();
        inFridge.coldStorage();
        inFridge.freezing();
        inFridge.AdjustColdTemper(1);
        inFridge.AdjustFreezTemper(-22);
        inFridge.service();
        inFridge.ShowFoodInfo();
    }
}
十三、本章总结

 [

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐