【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("没有该选项,重新选择");
      }
    }
  }
}
相关文章
|
4天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
20 3
|
29天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
52 24
|
11天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
49 2
|
25天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
66 5
|
25天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
49 5
|
28天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
1月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
41 4
|
1月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
31 4
|
27天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
26 1
|
25天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。