【Java SE 代码回顾】——day05_私有属性、公有方法、switch

简介: 【Java SE 代码回顾】——day05_私有属性、公有方法、switch

这个系列是对javaSE课程代码的回顾,所有Demo都是亲自动手实现的,并做了小小的change,为了方便自己理解和后期复习,代码里加了大量的注释。现对所有知识点的代码进行复习整理,进一步理解、完善代码,对注释进行补充。其中重要的知识点会单独说明,但主要以代码为主。


说明:博客是对学习内容的巩固,很多注释是为了自己理解,所以不会很专业。


------------------------------------------------------游戏模拟------------------------------------------------  

package cn.tjpu.javase05.lol.Player;
/**
 * 实现一个游戏
 * 要求:
 *在LOL游戏中,游戏中的用户应该用一个类来进行描述,比如,有以下属性信息:
 *玩家的游戏账号(比如: "小丸子")
玩家所在的对局ID(比如: "艾欧尼亚-1001")
玩家所使用的英雄角色(比如: 易大师或者阿狸或蘑菇....)
玩家所装配的装备(装备应该可以是多个,比如"无尽之刃"、"狂徒铠甲"等)
玩家助攻数
玩家击杀人头数
玩家斩杀小兵数
玩家的本局游戏实时得分(游戏得分=助攻数*10+击杀人头数*20+小兵数*2+装备件数*5)
玩家的历史累计得分
玩家的英雄等级:[20,40)-->1级
             [40,60)-->2级
             [60,)-->3级
 *写这个类的核心思想: 有些属性,可以简单赋值 ,有些属性,不能简单赋值,需要经过很复杂的内部逻辑处理之后才赋值
 *所以通常应该把属性全部修饰成私有的,然后暴露出get和set之类方法来让使用这个类的人去操作对象上的数据 
 *好处:写这个类的人,可以把内部数据处理逻辑封装起来,增加了类的内聚性,增加了数据逻辑的安全性,同时,降低了使用者的复杂度
 */
import java.util.ArrayList;
public class Player {
  // 玩家属性,设置成私有防止外部直接调用
  private String account;
  private String missionId;
  private String heroName;
  //装备不止一个
  private ArrayList<String> equipments = new ArrayList<String>();
  private int attack;
  private int kills;
  private int killedSoliders;
  private int missionScore;
  private int amountScore;
  private int heroLeval;
  // 设置玩家账号的方法
  public void setAccount(String account) {
    this.account = account;
  }
  // 设置对局id的方法
  public void setMissionId(String missionId) {
    this.missionId = missionId;
  }
  // 设置玩家使用英雄角色的方法
  public void setHeroName(String heroName) {
    this.heroName = heroName;
  }
  //设置历史总分的方法
  public void setAmountScore(int amountScore) {
    this.amountScore = amountScore;
  }
  // 增加装备的方法
  public void addEquipment(String equipment) {
    //equipments是一个list
    this.equipments.add(equipment);
    // 每增加一件装备本局实时得分+5分,实时得分只能根据其他因素计算得打,不能由玩家自己设置
    this.missionScore += 5;//本局实时得分还包括其他因素,所以累加
    // 每增加一件装备历史累计得分+5分
    this.amountScore += 5;
    // 更新用户等级
    this.setHeroLeval();
  }
  // 增加助攻数的方法
  public void addAttack() {
    this.attack++;
    // 每增加一次助攻本局实时得分+10分
    this.missionScore += 10;
    // 每增加一次助攻历史累计得分+10分
    this.amountScore += 10;
    // 更新用户等级
    this.setHeroLeval();
  }
  // 增加击杀人头数的方法
  public void addKills() {
    this.kills++;
    // 每击杀一个人头本局实时得分+20分
    this.missionScore += 20;
    // 每杀一个人头历史累计得分+20分
    this.amountScore += 20;
    // 更新用户等级
    this.setHeroLeval();//得分变了用户等级就要更新,且该功能封装在类里,玩家不能更改
  }
  // 增加杀小兵的方法
  public void addKilledSoliders() {
    this.killedSoliders++;
    // 每杀一个小兵本局实时得分+2分
    this.missionScore += 2;
    // 每杀杀一个小兵历史累计得分+2分
    this.amountScore += 2;
    // 更新用户等级
    this.setHeroLeval();
  }
  // 设置玩家本局英雄等级,根据实时得分计算玩家等级
  private void setHeroLeval() {
    if (this.missionScore > 20 && this.missionScore <= 40) {
      this.heroLeval = 1;
    }
    if (this.missionScore > 40 && this.missionScore <= 60) {
      this.heroLeval = 2;
    }
    if (this.missionScore > 60) {
      this.heroLeval = 3;
    }
  }
  // 为了让外部文件调用该类内的私有属性,需通过公有方法来得到值
  public String getAccount() {
    return account;
  }
  public String getMissionId() {
    return missionId;
  }
  public String getHeroName() {
    return heroName;
  }
  public ArrayList<String> getEquipments() {
    return equipments;
  }
  public int getAttack() {
    return attack;
  }
  public int getKills() {
    return kills;
  }
  public int getKilledSoliders() {
    return killedSoliders;
  }
  public int getMissionScore() {
    return missionScore;
  }
  public int getAmountScore() {
    return amountScore;
  }
  public int getHeroLeval() {
    return heroLeval;
  }
}
package cn.tjpu.javase05.lol.Player;
/**
 * 游戏测试类
 */
public class PlayerTest {
  public static void main(String[] args) {
    // 创建一个玩家并初始化(给属性赋值)
    Player player1 = new Player();
    player1.setAccount("醪糟小丸子");
    player1.setMissionId("艾欧尼亚-1001");
    player1.setHeroName("阿狸");
    player1.setAmountScore(1000);// 历史得分
    /*
     * 使用该对象的一些功能,计算等级
     */
    // 购买装备
    player1.addEquipment("狂徒铠甲");
    // 击杀人头
    // player1.addKills();
    // 助攻
    player1.addAttack();
    // 增加装备
    player1.addEquipment("无尽之刃");
    // 射杀小兵
    player1.addKilledSoliders();
    // 打印玩家本局实施得分,历史总分,英雄等级
    System.out.println("本局实时得分" + player1.getMissionScore());
    System.out.println("历史总分" + player1.getAmountScore());
    System.out.println("本局英雄等级" + player1.getHeroLeval());
    System.out.println("------------------------------------------");
    /*
     * 根据规则,功能方法使用的越多,等级就会上升
     */
    // 购买装备
    player1.addEquipment("狂徒铠甲");
    player1.addEquipment("无尽之刃");
    // 击杀人头
    player1.addKills();
    player1.addKills();
    player1.addKills();
    // 助攻
    player1.addAttack();
    player1.addAttack();
    player1.addAttack();
    // 增加装备
    player1.addEquipment("狂徒铠甲");
    // 射杀小兵
    player1.addKilledSoliders();
    player1.addKilledSoliders();
    player1.addKilledSoliders();
    // 打印玩家本局实施得分,历史总分,英雄等级
    System.out.println("本局实时得分" + player1.getMissionScore());
    System.out.println("历史总分" + player1.getAmountScore());
    System.out.println("本局英雄等级" + player1.getHeroLeval());
  }
}
package cn.tjpu.javase05.shop;
/**
 * 商品类
 */
public class Product {
  private String PId;
  private String PName;
  private float price;
  private int Number;
  public Product() {
  }
  //可以用带参构造函数给实例化出来的对象一次性赋值
  public Product(String PId, String PName, float price, int Number) {
    this.PId = PId;
    this.PName = PName;
    this.Number = Number;
    this.price = price;
  }
  //得到某个属性的值
  public String getPId() {
    return PId;
  }
  //单独为某个属性赋值,单独修改某个属性
  public void setPId(String pId) {
    PId = pId;
  }
  public String getPName() {
    return PName;
  }
  public void setPName(String pName) {
    PName = pName;
  }
  public float getPrice() {
    return price;
  }
  public void setPrice(float price) {
    this.price = price;
  }
  public int getNumber() {
    return Number;
  }
  public void setNumber(int number) {
    Number = number;
  }
  // toString是一个用来把对象内部数据拼装成字符串的方法(可按照自己的需要修改)
  public String toString() {
    return this.getPId() + "," + this.getPName() + "," + this.getPrice()
        + "," + this.getNumber();
  }
}

---------------------------------------------------售货系统模拟----------------------------------------------  

package cn.tjpu.javase05.shop;
/**
 * 商品类
 */
public class Product {
  private String PId;
  private String PName;
  private float price;
  private int Number;
  public Product() {
  }
  //可以用带参构造函数给实例化出来的对象一次性赋值
  public Product(String PId, String PName, float price, int Number) {
    this.PId = PId;
    this.PName = PName;
    this.Number = Number;
    this.price = price;
  }
  //得到某个属性的值
  public String getPId() {
    return PId;
  }
  //单独为某个属性赋值,单独修改某个属性
  public void setPId(String pId) {
    PId = pId;
  }
  public String getPName() {
    return PName;
  }
  public void setPName(String pName) {
    PName = pName;
  }
  public float getPrice() {
    return price;
  }
  public void setPrice(float price) {
    this.price = price;
  }
  public int getNumber() {
    return Number;
  }
  public void setNumber(int number) {
    Number = number;
  }
  // toString是一个用来把对象内部数据拼装成字符串的方法(可按照自己的需要修改)
  public String toString() {
    return this.getPId() + "," + this.getPName() + "," + this.getPrice()
        + "," + this.getNumber();
  }
}
package cn.tjpu.javase05.shop;
/**
 * 商品管理类
 * 1.封装所有商品数据
 * 2.在该类中创建操作商品数据的方法
 * 商品列表及其方法
 */
import java.util.ArrayList;
public class ProductMange {
  // 创建一个用来存放商品的列表,私有变量,只能通过公有方法来往里面填数据取数据
  private ArrayList<Product> prdts = new ArrayList<>();
  // 通过公有方法往商品列表里加商品
  public void addProduct(Product product) {
    this.prdts.add(product);
  }
  // 取列表中所有商品的方法
  public ArrayList<Product> getPrds() {
    return this.prdts;
  }
  // 通过给定商品名取商品列表中的商品数据的所有信息
  public Product getProductByName(String name) {
    // 遍历list中的所有商品,找到商品名与传入参数一致的那一个
    for (int i = 0; i < prdts.size(); i++) {
      if (prdts.get(i).getPName().equals(name)) {
        return prdts.get(i);// 找到的第i个商品
      }
    }
    return null;
  }
  // 打印所有商品信息
  public void showProduct() {
    for (int i = 0; i < prdts.size(); i++) {
      System.out.println("商品信息:" + prdts.get(i));
    }
  }
}
package cn.tjpu.javase05.shop;
/**
 * 造商品信息的类
 */
public class CreatProducts {
  //创建一个给商品对象赋值的方法
  public static  void Creat(ProductMange prodts) {
      //造商品数据(无参构造)
      Product prodt1=new Product();
      prodt1.setPId("001");
      prodt1.setPName("牛奶");
      prodt1.setPrice(5.5f);
      prodt1.setNumber(0);
      Product prodt2=new Product();
      prodt2.setPId("002");
      prodt2.setPName("面包");
      prodt2.setPrice(8.5f);
      prodt2.setNumber(0);
      //有参构造
      Product prodt3=new Product("003","火腿",1.5f,0);
      Product prodt4=new Product("004","巧克力",7.5f,0);
      Product prodt5=new Product("005","可乐",3.5f,0);
      //在商品列表中添加商品
      prodts.addProduct(prodt1);
      prodts.addProduct(prodt2);
      prodts.addProduct(prodt3);
      prodts.addProduct(prodt4);
      prodts.addProduct(prodt5);
  }
}
package cn.tjpu.javase05.shop;
/**
 * 购物车管理类
 */
import java.util.ArrayList;
public class CartMange {
  // 创建一个购物车列表,用来装用户加入购物车的商品,私有静态变量,只能公有静态方法使用
  private static ArrayList<Product> car = new ArrayList<>();
  // 往购物车中加商品(公有静态方法),接收用户输入的字符串如:面包:3,可乐:2,火腿肠:4
  public static void addPrdtsToCart(String prdts, ProductMange prdtMg) {
    // 切割字符串(String prdts:用户从终端输入的字符串)
    String[] slipt = prdts.split(",");
    for (int i = 0; i < slipt.length; i++) {
      String[] prdtsAndNum = slipt[i].split(":");
      // 把从终端拿到的字符串都拆开后,就是一个个具体的值,因此要实例化一个商品,然后把这些值赋给对象
      Product p = new Product();
      p.setPName(prdtsAndNum[0]);
      p.setNumber(Integer.parseInt(prdtsAndNum[1]));
      /*
      // 补全商品信息
       * 
      // 方法1:利用的商品管理器中的数据 ArrayList<Product>
      // ProductMange prdtMg:商品管理类的一个对象
      prodts = prdtMg.getPrds(); // 调用方法,取出列表中所有商品
      for (int j = 0; j < prodts.size(); j++) {
        if (prodts.get(j).getPName().equals(prdtsAndNum[0])) {
          p.setPId(prodts.get(j).getPId());
          p.setPrice(prodts.get(j).getPrice());
        }
      }
      */
      // 方法2:直接调用产品管理类的方法
      Product pbn = prdtMg.getProductByName(prdtsAndNum[0]);
      p.setPId(pbn.getPId());
      p.setPrice(pbn.getPrice());
      // 将商品数据添加到购物车list
      car.add(p);
    }
  }
  // 打印购物车商品信息
  public static void showCar() {
    for (int i = 0; i < car.size(); i++) {
      System.out.println(car.get(i));
    }
  }
}
package cn.tjpu.javase05.shop;
/**
 * 自动售货系统的程序入口
 */
import java.util.Scanner;
public class ShopMenu {
  public static void main(String[] args) {
    // 创建ProductMange类对象,才可以调用里面的方法——>产品管理器
    ProductMange PrdtsMange = new ProductMange();
    // 利用工具方法为商品池添加商品数据
    CreatProducts.Creat(PrdtsMange);
    // 创建一个CartMange类的实例对象——>购物车管理器
    CartMange cartMange = new CartMange();
    // 和顾客的交互界面
    System.out.println("欢迎来到小丸子商店!请选择菜单!");
    System.out.println("1.浏览商品|2.购物|3.查看购物车|4.修改购物车|5.提交订单|6.付款|7.退出");
    // 接收顾客的输入
    Scanner scanner = new Scanner(System.in);
    // 用循环可以让顾客不断的选择菜单
    boolean flag = true;
    while (flag) {
      String option = scanner.nextLine();
      switch (option) {
      case "1":
        // 调用显示信息的方法
        PrdtsMange.showProduct();
        break;
      // 购物就是把用户输入的商品和数量放入购物车
      case "2":
        System.out.println("请输入您要购买的商品和数量。如:面包:3,可乐:2");
        String prdtsAndNum = scanner.nextLine();
        CartMange.addPrdtsToCart(prdtsAndNum, PrdtsMange);
        break;
      case "3":
        CartMange.showCar();
        break;
      case "4":
        System.out.println("修改购物车ing...");
        break;
      case "5":
        System.out.println("提交订单ing...");
        break;
      case "6":
        System.out.println("付款ing...");
        break;
      case "7":
        flag = false;
        break;
      default:
        System.out.println("没有该选项,重新选择");
      }
    }
  }
}
相关文章
|
1天前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
16 10
|
1天前
|
Java
Java String 避免空指针的方法
Java String 避免空指针的方法
5 0
|
2天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
12 1
|
2天前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
6 0
|
2天前
|
Java
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
14 4
|
2天前
|
Java
Java的取余如何编写代码
【5月更文挑战第9天】Java的取余如何编写代码
19 5
|
2天前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
2天前
|
Java
代码实例演示Java字符串与输入流互转
代码实例演示Java字符串与输入流互转
|
2天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
15 1
|
2天前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法