11-JavaSE基础巩固练习:面向对象综合训练(文字版格斗游戏、对象数组练习)

面向对象综合训练

编程技巧

  • 先理解需求逻辑
  • 再开始书写代码

一、文字版格斗游戏

1、需求
  • 每个游戏角色的姓名、血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。
    • 比如角色如下:
      • 姓名为:乔峰,血量为:100
      • 姓名为:鸠摩智,血量为:100
    • 规则如下:
      • 回合制:
        • 乔峰打了鸠摩智一下,造成了XX点伤害,鸠摩智还剩下XXX点血量;
        • 鸠摩智打了乔峰一下,造成了XX点伤害,乔峰还剩下XXX点血量;
        • 乔峰K.O.了鸠摩智。

2、分析
  • 面向对象编程思路:
    • 创建角色类,定义角色的属性:姓名、血量
    • 提供有参和无参构造器
    • 提供全套的getXXX和setXXX方法,暴露其角色属性的取值和赋值
    • 定义角色的攻击行为方法
    • 创建游戏测试类,使用死循环,回合制的让双方不断互相攻击,直至有一方血量清零方可结束游戏。

3、简单的实现
  • 1、角色类

    package com.app.demo14_Object_oriented_cases01;
    
    import java.util.Random;
    
    /*
        定义角色类
     */
    public class Role {
        /*
            1、定义角色的属性:
                姓名、血量
         */
        private String name;
        private int blood;
    
    
        /*
            2、提供有参和无参构造器
         */
        public Role() {
    
        }
    
        public Role(String name, int blood) {
            this.name = name;
            this.blood = blood;
        }
    
    
        /*
            3、提供全套的getXXX和setXXX方法,暴露其角色属性的取值和赋值
         */
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getBlood() {
            return blood;
        }
    
        public void setBlood(int blood) {
            this.blood = blood;
        }
    
    
        /**
         * 4、定义角色的攻击行为
         * 思考:谁攻击谁?
         * 角色1:Role r1 = new Role();
         * 角色2:Role r2 = new Role();
         * 攻击:r1.攻击(r2);
         *
         * @param role 被攻击的角色对象
         */
        public void attack(Role role) {
            // a.随机一个攻击伤害: 比如角色的一次攻击伤害范围是 1~20
            Random rd = new Random();
            int hurt = rd.nextInt(20) + 1;
    
            // b.计算被攻击后的对方的剩余血量
            int remainingBlood = role.getBlood() - hurt;
    
            // c.判断对方的剩余血量:
            // 如果对方的剩余血量 小于 攻击伤害 时,此时剩余血量会变成负数,因此将剩余血量修改为0
            // 如果对方的剩余血量 大于 攻击伤害 时,剩余血量就不需要修改
            remainingBlood = remainingBlood < 0 ? 0 : remainingBlood;
    
            // d.修改对方的血量为计算后的剩余血量
            // 对方角色对象.setBlood(剩余的血量);
            role.setBlood(remainingBlood);
    
            // e.显示对战信息
            // 举例:乔峰用飞踢踢中了鸠摩智,造成了XX点伤害,鸠摩智还剩下XXX点血量
            // this: 表示自己
            System.out.println(this.getName() + "用飞踢踢中了" + role.getName()
                    + ",造成了" + hurt + "点伤害,"
                    + role.getName() + "还剩下" + remainingBlood + "点血量~");
        }
    }
    
  • 2、游戏测试类

    package com.app.demo14_Object_oriented_cases01;
    
    /*
        定义游戏测试类
     */
    public class GameTest {
        public static void main(String[] args) {
            // 1、创建两个游戏角色
            Role r1 = new Role("张飞", 100);
            Role r2 = new Role("刘备", 100);
    
            // 2、使用死循环让两个角色进行回合制战斗
            System.out.println("---------------" + r1.getName() + " VS " + r2.getName() + "---------------");
            while (true) {
                // 角色1 开始攻击 角色2
                r1.attack(r2);
                // 如果角色2血量为0时,说明角色2被角色1 K.O.了
                if (r2.getBlood() == 0) {
                    System.out.println(r1.getName() + "K.O.了" + r2.getName());
                    // 角色2被角色1KO了,游戏结束,跳出死循环
                    break;
                }
    
                // 角色2 反击 角色2
                r2.attack(r1);
                // 如果角色1血量为0时,说明角色1被角色2 K.O.了
                if (r1.getBlood() == 0) {
                    System.out.println(r2.getName() + "K.O.了" + r1.getName());
                    // 角色1被角色2KO了,游戏结束,跳出死循环
                    break;
                }
            }
        }
    }
    
  • 3、测试结果

    ---------------张飞 VS 刘备---------------
    张飞用飞踢踢中了刘备,造成了13点伤害,刘备还剩下87点血量~
    刘备用飞踢踢中了张飞,造成了3点伤害,张飞还剩下97点血量~
    张飞用飞踢踢中了刘备,造成了16点伤害,刘备还剩下71点血量~
    刘备用飞踢踢中了张飞,造成了3点伤害,张飞还剩下94点血量~
    张飞用飞踢踢中了刘备,造成了4点伤害,刘备还剩下67点血量~
    刘备用飞踢踢中了张飞,造成了12点伤害,张飞还剩下82点血量~
    张飞用飞踢踢中了刘备,造成了20点伤害,刘备还剩下47点血量~
    刘备用飞踢踢中了张飞,造成了6点伤害,张飞还剩下76点血量~
    张飞用飞踢踢中了刘备,造成了1点伤害,刘备还剩下46点血量~
    刘备用飞踢踢中了张飞,造成了4点伤害,张飞还剩下72点血量~
    张飞用飞踢踢中了刘备,造成了12点伤害,刘备还剩下34点血量~
    刘备用飞踢踢中了张飞,造成了19点伤害,张飞还剩下53点血量~
    张飞用飞踢踢中了刘备,造成了19点伤害,刘备还剩下15点血量~
    刘备用飞踢踢中了张飞,造成了12点伤害,张飞还剩下41点血量~
    张飞用飞踢踢中了刘备,造成了6点伤害,刘备还剩下9点血量~
    刘备用飞踢踢中了张飞,造成了2点伤害,张飞还剩下39点血量~
    张飞用飞踢踢中了刘备,造成了6点伤害,刘备还剩下3点血量~
    刘备用飞踢踢中了张飞,造成了3点伤害,张飞还剩下36点血量~
    张飞用飞踢踢中了刘备,造成了18点伤害,刘备还剩下0点血量~
    张飞K.O.了刘备
    
    Process finished with exit code 0
    
    

4、丰富的实现
  • 给角色加两个属性:性别、长相(随机的)

  • 加四个个数组:

    • 女性长相数组、男性长相数组、功夫招式数组、受伤描述数组
  • 角色类

    package com.app.demo14_Object_oriented_cases01_Plus;
    
    import java.util.Random;
    
    public class Role {
        // 角色属性:姓名、血量、性别、颜值
        private String name;
        private int blood;
        private char gender;
        private String faceScore;
    
        // 四个数组:女性颜值数组、男性颜值数组、功夫招式数组、受伤描述数组
        String[] girlFaceScoreArr = {"美艳绝伦", "沉鱼落雁", "亭亭玉立", "身材姣好", "相貌平平", "相貌简陋", "惨不忍睹"};
        String[] boyFaceScoreArr = {"风刘俊雅", "气宇轩昂", "相貌英俊", "五官端正", "相貌平平", "一塌糊涂", "面目狰狞"};
    
        String[] kungFuArr = {
                "%s使出了一招 [降龙十八掌],打向%s。",
                "%s使出了一招 [黑虎掏心],飞身自半空中变掌为爪锁向%s。",
                "%s大喝一声,身形下伏,一招 [猴子偷桃],抓向了%s。",
                "%s运气于掌,一瞬间掌心变得血红,一招 [掌心雷],推向%s。",
                "%s阴手翻起阳手跟进,一招 [没遮拦],结结实实的锤向%s。"
        };
    
        String[] injuryDescribeArr = {
                "结果%s退了半步,毫发无伤!",
                "结果给%s造成了一处淤伤!",
                "结果一击命中,%s痛得弯下了腰!",
                "结果%s脸色一下变得惨白,连退了好几步!",
                "结果 [轰] 的一声,%s口中鲜血狂喷而出!",
                "结果%s一声惨叫,像摊烂泥一样塌了下去!"
        };
    
        // 有参、无参构造器
        public Role() {
    
        }
    
        public Role(String name, int blood, char gender) {
            this.name = name;
            this.blood = blood;
            this.gender = gender;
            // 根据角色性别随机设定长相颜值
            setFaceScore(gender);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getBlood() {
            return blood;
        }
    
        public void setBlood(int blood) {
            this.blood = blood;
        }
    
        public char getGender() {
            return gender;
        }
    
        public void setGender(char gender) {
            this.gender = gender;
        }
    
        public String getFaceScore() {
            return faceScore;
        }
    
        /**
         * 根据角色的性别设定随机的长相颜值
         *
         * @param gender 角色性别
         */
        public void setFaceScore(char gender) {
            Random rd = new Random();
            if (gender == '男') {
                int index = rd.nextInt(boyFaceScoreArr.length);
                this.faceScore = boyFaceScoreArr[index];
            } else if (gender == '女') {
                int index = rd.nextInt(girlFaceScoreArr.length);
                this.faceScore = girlFaceScoreArr[index];
            } else {
                // 默认值
                this.faceScore = "惨不忍睹";
            }
        }
    
        /**
         * 定义角色的攻击行为
         *
         * @param role
         */
        public void attack(Role role) {
            // 给角色随机一个功夫招式
            Random rd = new Random();
            int index = rd.nextInt(kungFuArr.length);
            String kungFu = kungFuArr[index];
    
            // 显示一个角色攻击对方的效果
            // 例如:
            //      "%s使出了一招 [降龙十八掌],打向%s。"
            //      "张三使出了一招 [降龙十八掌],打向李四。"
            // 参数一(%s):我方;参数二(%s):对方
            System.out.printf(kungFu, this.getName(), role.getName());
            // System.out.printf:是不带换行的,因此攻击完,打印一个换行
            System.out.println();
    
            // 给角色随机一个伤害值: 1~30
            int hurt = rd.nextInt(30) + 1;
            // 计算对方剩余的血量
            int remainBlood = role.getBlood() - hurt;
    
            /*
                如果对方剩余的血量 小于 攻击伤害值,此时,对方的剩余血量为负数,将剩余的血量值修改为0
                如果对方剩余的血量 大于 攻击伤害值,此时,对方的剩余血量不需要修改
             */
            remainBlood = remainBlood < 0 ? 0 : remainBlood;
    
            // 每攻击完对方一次,更新对方的剩余血量
            role.setBlood(remainBlood);
    
    
            // 根据对方的剩余血量来显示受伤描述
            /*
                80~100的剩余血量,0索引的描述
                70~80的剩余血量,1索引的描述
                50~70的剩余血量,2索引的描述
                30~50的剩余血量,3索引的描述
                1~30的剩余血量,4索引的描述
                0的剩余血量,5索引的描述
             */
            if (remainBlood > 80 && remainBlood < 100) {
                System.out.printf(injuryDescribeArr[0], role.getName());
                System.out.print(this.getName() + "打出了" + hurt + "点伤害," + role.getName() + "剩余" + remainBlood + "点血量~");
    
            } else if (remainBlood > 70 && remainBlood <= 80) {
                System.out.printf(injuryDescribeArr[1], role.getName());
                System.out.print(this.getName() + "打出了" + hurt + "点伤害," + role.getName() + "剩余" + remainBlood + "点血量~");
    
            } else if (remainBlood > 50 && remainBlood <= 70) {
                System.out.printf(injuryDescribeArr[2], role.getName());
                System.out.print(this.getName() + "打出了" + hurt + "点伤害," + role.getName() + "剩余" + remainBlood + "点血量~");
    
            } else if (remainBlood > 30 && remainBlood <= 50) {
                System.out.printf(injuryDescribeArr[3], role.getName());
                System.out.print(this.getName() + "打出了" + hurt + "点伤害," + role.getName() + "剩余" + remainBlood + "点血量~");
    
            } else if (remainBlood > 1 && remainBlood <= 30) {
                System.out.printf(injuryDescribeArr[4], role.getName());
                System.out.print(this.getName() + "打出了" + hurt + "点伤害," + role.getName() + "剩余" + remainBlood + "点血量~");
    
            } else if (remainBlood == 0) {
                System.out.printf(injuryDescribeArr[5], role.getName());
                System.out.print(this.getName() + "打出了" + hurt + "点伤害," + role.getName() + "剩余" + remainBlood + "点血量~");
            }
    
            // 每显示一次受伤描述后,因为System.out.printf()无法换行,因此一个打印换行
            System.out.println();
        }
    }
    


  • 测试类

    package com.app.demo14_Object_oriented_cases01_Plus;
    
    import java.util.Scanner;
    
    public class GameTest {
        public static void main(String[] args) {
            // 1、创建角色
            System.out.println("---------------请选择我方英雄---------------");
            Role r1 = createRole();
            System.out.println("---------------请选择敌方英雄---------------");
            Role r2 = createRole();
    
            // 2、查看创建好的角色信息
            System.out.println("我方英雄信息:");
            queryRoleInfo(r1);
            System.out.println("敌方英雄信息:");
            queryRoleInfo(r2);
    
            // 3、我方 VS 敌方英雄
            myRoleVSHeRole(r1, r2);
        }
    
    
        /**
         * 英雄对战
         * @param myRole    我方英雄
         * @param heRole    敌方英雄
         */
        public static void myRoleVSHeRole(Role myRole, Role heRole) {
            int count = 0;  // 记录回合数
            System.out.println("----------------对战中----------------");
            while (true) {  // 回合制
                System.out.println("第" + (count + 1) + "回合:");
    
                // 我方 先攻击 敌方
                myRole.attack(heRole);
                // 判断敌方血量是否为0
                if (heRole.getBlood() == 0) {
                    System.out.println(myRole.getName() + "K.O.了" + heRole.getName());
                    break;
                }
    
                // 敌方 反击 我方
                heRole.attack(myRole);
                count++;
                // 判断我方血量是否为0
                if (myRole.getBlood() == 0) {
                    System.out.println(heRole.getName() + "K.O.了" + myRole.getName());
                    break;
                }
    
                // 每打完一个回合,打印换行
                System.out.println();
            }
        }
    
    
        /**
         * 查看角色信息
         *
         * @param role 角色对象
         */
        public static void queryRoleInfo(Role role) {
            System.out.println("姓名:" + role.getName()
                    + "\n血量:" + role.getBlood()
                    + "\n性别:" + role.getGender()
                    + "\n长相:" + role.getFaceScore()
            );
            System.out.println();
        }
    
    
        /**
         * 用户创建游戏角色
         *
         * @return 返回创建好的游戏角色
         */
        public static Role createRole() {
            // 创建键盘录入对象,用于从键盘录入英雄信息
            Scanner sc = new Scanner(System.in);
    
            // 创建一个空角色对象变量,用于接收英雄信息,封装成一个对象
            Role role;
    
            System.out.println("请输入角色姓名:");
            String name = sc.nextLine();
    
            while (true) {
                System.out.println("请输入角色性别(男/女):");
                String genders = sc.nextLine();
    
                if (genders.equals("男")) {
                    char gender = genders.charAt(0);
                    role = new Role(name, 100, gender);
                    break;
                } else if (genders.equals("女")) {
                    char gender = genders.charAt(0);
                    role = new Role(name, 100, gender);
                    break;
                } else {
                    System.out.println("您输入的性别有误!请重新输入~");
                }
            }
    
            // 创建完一个角色,打印换行
            System.out.println();
    
            // 角色创建完毕,返回创建好的角色对象
            return role;
        }
    }
    


  • 测试结果

    ---------------请选择我方英雄---------------
    请输入角色姓名:
    乔峰
    请输入角色性别(男/女):
    那地方
    您输入的性别有误!请重新输入~
    请输入角色性别(男/女):
    dfd
    您输入的性别有误!请重新输入~
    请输入角色性别(男/女):
    分
    您输入的性别有误!请重新输入~
    请输入角色性别(男/女):
    男
    
    ---------------请选择敌方英雄---------------
    请输入角色姓名:
    鸠摩智
    请输入角色性别(男/女):
    男
    
    我方英雄信息:
    姓名:乔峰
    血量:100
    性别:男
    长相:五官端正
    
    敌方英雄信息:
    姓名:鸠摩智
    血量:100
    性别:男
    长相:相貌平平
    
    ----------------对战中----------------
    第1回合:
    乔峰使出了一招 [降龙十八掌],打向鸠摩智。
    结果给鸠摩智造成了一处淤伤!乔峰打出了20点伤害,鸠摩智剩余80点血量~
    鸠摩智运气于掌,一瞬间掌心变得血红,一招 [掌心雷],推向乔峰。
    结果乔峰退了半步,毫发无伤!鸠摩智打出了7点伤害,乔峰剩余93点血量~
    
    第2回合:
    乔峰使出了一招 [降龙十八掌],打向鸠摩智。
    结果一击命中,鸠摩智痛得弯下了腰!乔峰打出了18点伤害,鸠摩智剩余62点血量~
    鸠摩智运气于掌,一瞬间掌心变得血红,一招 [掌心雷],推向乔峰。
    结果一击命中,乔峰痛得弯下了腰!鸠摩智打出了26点伤害,乔峰剩余67点血量~
    
    第3回合:
    乔峰阴手翻起阳手跟进,一招 [没遮拦],结结实实的锤向鸠摩智。
    结果鸠摩智脸色一下变得惨白,连退了好几步!乔峰打出了16点伤害,鸠摩智剩余46点血量~
    鸠摩智运气于掌,一瞬间掌心变得血红,一招 [掌心雷],推向乔峰。
    结果乔峰脸色一下变得惨白,连退了好几步!鸠摩智打出了18点伤害,乔峰剩余49点血量~
    
    第4回合:
    乔峰使出了一招 [降龙十八掌],打向鸠摩智。
    结果鸠摩智脸色一下变得惨白,连退了好几步!乔峰打出了12点伤害,鸠摩智剩余34点血量~
    鸠摩智大喝一声,身形下伏,一招 [猴子偷桃],抓向了乔峰。
    结果乔峰脸色一下变得惨白,连退了好几步!鸠摩智打出了14点伤害,乔峰剩余35点血量~
    
    第5回合:
    乔峰阴手翻起阳手跟进,一招 [没遮拦],结结实实的锤向鸠摩智。
    结果 [轰] 的一声,鸠摩智口中鲜血狂喷而出!乔峰打出了23点伤害,鸠摩智剩余11点血量~
    鸠摩智使出了一招 [黑虎掏心],飞身自半空中变掌为爪锁向乔峰。
    结果 [轰] 的一声,乔峰口中鲜血狂喷而出!鸠摩智打出了10点伤害,乔峰剩余25点血量~
    
    第6回合:
    乔峰使出了一招 [降龙十八掌],打向鸠摩智。
    结果鸠摩智一声惨叫,像摊烂泥一样塌了下去!乔峰打出了22点伤害,鸠摩智剩余0点血量~
    乔峰K.O.了鸠摩智
    
    Process finished with exit code 0
    
    



二、对象数组练习

1、对象数组练习1
  • 需求

    • 定义数组存储3个商品对象。
    • 商品的属性:商品的id、名字、价格、库存
    • 创建三个商品对象,并把商品对象存入到数组当中。
  • 分析

    • 需要一个商品类,用于将商品的信息封装成商品对象
    • 需要一个长度为3的对象数组,用于存储3个商品对象
    • 需要一个测试类,创建3个商品对象,存入数组中
  • 实现

    • 商品类

      package com.app.demo16_object_array1;
      
      /*
          商品类
       */
      public class Commodity {
          // 商品属性:id、名字、价格、库存
          private String id;
          private String commodityName;
          private double price;
          private int inventory;
      
          // 无参构造器
          public Commodity() {
      
          }
      
          // 有参构造器
          public Commodity(String id, String commodityName, double price, int inventory) {
              this.id = id;
              this.commodityName = commodityName;
              this.price = price;
              this.inventory = inventory;
          }
      
          /*
              生成全套的getXXX和setXXX方法,暴露其对象属性的取值和赋值
           */
          public String getId() {
              return id;
          }
      
          public void setId(String id) {
              this.id = id;
          }
      
          public String getCommodityName() {
              return commodityName;
          }
      
          public void setCommodityName(String commodityName) {
              this.commodityName = commodityName;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          public int getInventory() {
              return inventory;
          }
      
          public void setInventory(int inventory) {
              this.inventory = inventory;
          }
      }
      


    • 测试类

      package com.app.demo16_object_array1;
      
      /*
          面向对象综合训练:对象数组练习1
              需求:
                  定义数组存储3个商品对象。
                  商品的属性:商品的id、名字、价格、库存
                  创建三个商品对象,并把商品对象存入到数组当中。
       */
      public class ObjectArrayDemo1 {
          public static void main(String[] args) {
              // 1、定义长度为3的对象数组,用于存储3个商品对象
              Commodity[] commodities = new Commodity[3];
      
              // 2、创建3个商品对象,存入对象数组中
              commodities[0] = new Commodity("001", "宇智波鼬手办", 1000, 30);
              commodities[1] = new Commodity("002", "华为nova7", 2350.5, 200);
              commodities[2] = new Commodity("003", "机械键盘", 399.9, 3);
      
              // 3、遍历对象数组,查看商品信息
              System.out.println("所有商品信息:");
              for (Commodity commodity : commodities) {
                  System.out.println("编号: " + commodity.getId() +
                          ", 商品名称: " + commodity.getCommodityName() +
                          ", 商品价格: " + commodity.getPrice() +
                          ", 库存数量: " + commodity.getInventory());
              }
          }
      }
      


    • 测试结果:

      所有商品信息:
      编号: 001, 商品名称: 宇智波鼬手办, 商品价格: 1000.0, 库存数量: 30
      编号: 002, 商品名称: 华为nova7, 商品价格: 2350.5, 库存数量: 200
      编号: 003, 商品名称: 机械键盘, 商品价格: 399.9, 库存数量: 3
      
      Process finished with exit code 0
      
      


2、对象数组练习2
  • 需求

    • 定义数组存储3部汽车对象。
    • 汽车的属性:品牌、价格、颜色。
    • 创建3个汽车对象,数据通过键盘录入之后将其存入数组当中。
  • 分析

    • 需求一个汽车类,用于将汽车的信息封装成汽车对象
    • 需要一个对象数组,长度为3,用于存储3部汽车对象
    • 需求从键盘录入汽车对象的信息,将其封装成一个汽车对象,动态存入对象数组中
  • 实现

    • 汽车类

      package com.app.demo17_object_array2;
      
      /*
          汽车类
       */
      public class Car {
          // 汽车的属性:品牌、价格、颜色
          private String brand;
          private double price;
          private String colour;
      
          /*
              有参、无参构造器
           */
          public Car() {
      
          }
      
          public Car(String brand, double price, String colour) {
              this.brand = brand;
              this.price = price;
              this.colour = colour;
          }
      
      
          /*
              生成全套的get和set方法,暴露其对象属性的取值和赋值
           */
          public String getBrand() {
              return brand;
          }
      
          public void setBrand(String brand) {
              this.brand = brand;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          public String getColour() {
              return colour;
          }
      
          public void setColour(String colour) {
              this.colour = colour;
          }
      }
      


    • 测试类

      package com.app.demo17_object_array2;
      
      import java.util.Scanner;
      
      /*
          面向对象综合训练:对象数组2
          需求:
              定义数组存储3部汽车对象。
              汽车的属性:品牌、价格、颜色。
              创建3个汽车对象,数据通过键盘录入之后将其存入数组当中。
       */
      public class CarTest {
          public static void main(String[] args) {
              // 键盘录入汽车信息,参数length: 数组的长度,表示可以存储多少部汽车对象
              Car[] cars = createCars(3);
      
              // 查看所有汽车的信息
              System.out.println("\n所有汽车信息如下:");
              showCars(cars);
          }
      
          /**
           * 查看所有汽车的信息
           *
           * @param cars 接收一个汽车对象数组
           */
          public static void showCars(Car[] cars) {
              // 循环遍历汽车对象数组,查看所有汽车的信息
              for (Car car : cars) {
                  System.out.println("汽车品牌:" + car.getBrand() +
                          ", 汽车价格:" + car.getPrice() + "万元" +
                          ", 汽车颜色:" + car.getColour());
              }
          }
      
      
          /**
           * 创建汽车对象存入对象数组
           *
           * @param length 接收一个对象数组的长度:表示可以存储多少部汽车对象
           * @return 将存储有汽车对象的对象数组返回给调用处
           */
          public static Car[] createCars(int length) {
              // 1、定义对象数组,长度为length,用于存储length部汽车对象
              Car[] cars = new Car[length];
      
              // 2、创建键盘录入对象,用于从键盘录入汽车的信息
              Scanner sc = new Scanner(System.in);
      
              // 3、遍历数组,依次得到数组的每个元素索引位置
              for (int i = 0; i < cars.length; i++) {
                  // i: 依次表示数组的索引位置
                  // cars[i]: 依次表示数组的每个元素
                  // a: 每循环一次,创建一个汽车对象,用于将从键盘录入的汽车信息封装成一个汽车对象
                  Car car = new Car();
      
                  // b: 开始录入汽车的信息
                  System.out.println("--------录入第" + (i + 1) + "部汽车的信息--------");
                  System.out.println("请您录入汽车的品牌:");
                  String brand = sc.next();
                  System.out.println("请您录入汽车的价格(万元):");
                  double price = sc.nextDouble();
                  System.out.println("请您录入汽车的颜色:");
                  String colour = sc.next();
      
                  // c: 封装汽车的信息成一个汽车对象
                  car.setBrand(brand);
                  car.setPrice(price);
                  car.setColour(colour);
      
                  // d: 将封装好的汽车对象,存入对象数组中
                  cars[i] = car;
              }
      
              // 5、存储工作完成,返回满载而归的对象数组
              return cars;
          }
      }
      


    • 测试结果:

      --------录入第1部汽车的信息--------
      请您录入汽车的品牌:
      劳斯莱斯
      请您录入汽车的价格(万元):
      1900
      请您录入汽车的颜色:
      黑白
      --------录入第2部汽车的信息--------
      请您录入汽车的品牌:
      宝马
      请您录入汽车的价格(万元):
      400
      请您录入汽车的颜色:
      蓝白
      --------录入第3部汽车的信息--------
      请您录入汽车的品牌:
      梅赛德斯
      请您录入汽车的价格(万元):
      450.5
      请您录入汽车的颜色:
      七彩色
      
      所有汽车信息如下:
      汽车品牌:劳斯莱斯, 汽车价格:1900.0万元, 汽车颜色:黑白
      汽车品牌:宝马, 汽车价格:400.0万元, 汽车颜色:蓝白
      汽车品牌:梅赛德斯, 汽车价格:450.5万元, 汽车颜色:七彩色
      
      Process finished with exit code 0
      
      


3、对象数组练习3
  • 需求

    • 定义数组存储3部手机对象。
    • 手机的属性:品牌、价格、颜色。
    • 要求计算出3部手机的平均价格
  • 分析

    • 需要一个手机类,用于将1部手机信息封装成一个手机对象。
    • 需要一个数组,用于存储3部手机对象。
    • 需要得到所有手机的价格,计算出3部手机的平均值。
  • 实现

    • 手机类

      package com.app.demo18_object_array3;
      
      /*
          手机类
       */
      public class MobilePhone {
          /*
              定义手机的属性:品牌、价格、颜色
           */
          private String brand;
          private double price;
          private String colour;
      
          /*
              提供有参和无参构造器
           */
          public MobilePhone() {
      
          }
      
          public MobilePhone(String brand, double price, String colour) {
              this.brand = brand;
              this.price = price;
              this.colour = colour;
          }
      
      
          /*
              提供全套的getXXX和setXXX方法,
              暴露其属性的取值和赋值。
           */
          public String getBrand() {
              return brand;
          }
      
          public void setBrand(String brand) {
              this.brand = brand;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          public String getColour() {
              return colour;
          }
      
          public void setColour(String colour) {
              this.colour = colour;
          }
      }
      


    • 测试类

      package com.app.demo18_object_array3;
      
      import java.math.BigDecimal;
      import java.math.RoundingMode;
      import java.util.Scanner;
      
      /*
          测试类:
              面向对象综合训练:对象数组练习3
              需求:
                  定义数组存储3部手机对象。
                  手机的属性:品牌、价格、颜色。
                  要求计算出3部手机的平均价格。
       */
      public class MobilePhoneTest {
          public static void main(String[] args) {
              // 1、创建手机对象
              MobilePhone[] mobilePhones = createMobilePhones(3);
              if (mobilePhones == null) {
                  System.out.println("数组长度不能为0~");
              } else {
                  // 2、查看所有手机的信息
                  showMobilePhones(mobilePhones);
      
                  // 3、计算出所有手机的平均价格
                  BigDecimal averagePrice = mobilePhonesAveragePrice(mobilePhones);
                  System.out.println("\n所有手机的平均价格为:" + averagePrice + "元~");
              }
          }
      
      
          /**
           * 计算所有手机的平均价格
           *
           * @param mobilePhones  所有手机对象的数组
           * @return              返回所有手机的平均价格
           */
          public static BigDecimal mobilePhonesAveragePrice(MobilePhone[] mobilePhones) {
              // 1、定义数组,用于记录所有手机的价格
              double[] prices = new double[mobilePhones.length];
      
              // 2、遍历mobilePhones数组,依次得到每个手机对象
              for (int i = 0; i < mobilePhones.length;) {
                  // mobilePhones[i]: 依次表示数组中的每个手机对象
      
                  // a.依次得到每个手机的价格,存入prices数组中
                  for (int j = 0; j < prices.length; j++) {
                      // prices[j]: 依次表示每个手机的价格
                      // 依次将每个手机的价格存入prices数组中
                      prices[j] = mobilePhones[i].getPrice();
                      // 每存储成功一个手机的价格,让i自增,继续得到下一个手机对象
                      i++;
                  }
              }
      
              // 3、定义变量,分别表示手机的最高价格、最低价格、总价格、平均价格
              double maxPrice = prices[0];
              double minPrice = prices[0];
              double sumPrice = 0;
              BigDecimal averagePrice;
      
              // 4、遍历prices数组,依次得到每个手机的价格
              for (int i = 0; i < prices.length; i++) {
                  // a.求所有手机的最高价格
                  if (i >= 1 && prices[i] > maxPrice) {
                      // 如果当前这个手机的价格 大于 首个手机的价格,
                      // 则maxPrice替换成当前这个手机的价格。
                      maxPrice = prices[i];
                  }
      
                  // b.求所有手机的最低价格
                  if (i >= 1 && prices[i] < minPrice) {
                      // 如果当前这个手机的价格 小于 首个手机的价格,
                      // 则minPrice替换成当前这个手机的价格
                      minPrice = prices[i];
                  }
      
                  // c.统计所有手机的价格,求总价格
                  sumPrice += prices[i];
              }
      
              // 5、循环结束,说明手机的最高、最低价格、总价格已全部求出
              // 将double类型的总价格转换成BigDecimal类型
              BigDecimal sum = BigDecimal.valueOf(sumPrice);
              // 将double类型的最高价格转换成BigDecimal类型
              BigDecimal max = BigDecimal.valueOf(maxPrice);
              // 将double类型的最低价格转换成BigDecimal类型
              BigDecimal min = BigDecimal.valueOf(minPrice);
              // 将数组长度、2都转换成BigDecimal类型后,再做相减操作
              // 以下代码等价于: prices.length - 2
              BigDecimal number = BigDecimal.valueOf(prices.length).subtract(BigDecimal.valueOf(2));
      
              /*System.out.println("总价格:" + sum);
              System.out.println("最高价格:" + max);
              System.out.println("最低价格:" + min);*/
      
              // averagePrice = (sumPrice - maxPrice - minPrice) / (prices.length - 2);
              /*
                  6、计算平均价格,四舍五入后并保留1位小数
                  以下代码等价于: (总价格 - 最高价格 - 最低价格) / 个数(prices.length-2)
                  divide(number, 2, RoundingMode.DOWN):
                      参数一:除数;参数二:保留多少位小数;参数三:舍入模式
              */
              averagePrice = (sum.subtract(max).subtract(min)).divide(number, 1, RoundingMode.HALF_DOWN);
      
              // 计算完成,返回所有手机的平均价格
              return averagePrice;
          }
      
      
          /**
           * 查看所有手机的信息
           *
           * @param mobilePhones 手机对象数组
           */
          public static void showMobilePhones(MobilePhone[] mobilePhones) {
              // 1、判断手机对象数组是否为null
              if (mobilePhones == null) {
                  // 为null
                  System.out.println("您的手机对象数组不能为null~");
              } else {
                  // 不为null:遍历手机对象的数组,依次得到数组中每个手机对象
                  System.out.println("\n所有手机信息如下:");
                  for (MobilePhone mobilePhone : mobilePhones) {
                      System.out.println("手机品牌:" + mobilePhone.getBrand() +
                              ",手机价格:" + mobilePhone.getPrice() + "元" +
                              ",手机颜色:" + mobilePhone.getColour());
                  }
              }
          }
      
      
          /**
           * 创建手机对象
           *
           * @param length 数组的长度:表示可以存储多少部手机对象
           * @return 返回对象数组
           */
          public static MobilePhone[] createMobilePhones(int length) {
              // 1、数组的长度不能为0,否则返回null
              if (length == 0) {
                  return null;
              }
      
              // 2、定义数组,用于存储手机对象,长度为length
              MobilePhone[] mobilePhones = new MobilePhone[length];
      
              // 3、创建键盘录入对象,用于录入手机信息
              Scanner sc = new Scanner(System.in);
      
              // 4、遍历数组,依次得到每个元素的索引位置
              for (int i = 0; i < mobilePhones.length; i++) {
                  // i: 依次表示数组中每个元素的索引位置
                  // mobilePhones[i]: 依次表示数组中的每个元素
                  // a. 每循环一次,创建一个空的新手机对象,用于将录入的手机信息封装成一个手机对象
                  MobilePhone mobilePhone = new MobilePhone();
      
                  // b. 开始录入手机信息
                  System.out.println("---------录入第" + (i + 1) + "部手机的信息---------");
                  System.out.println("请您输入手机的品牌:");
                  String brand = sc.next();
                  mobilePhone.setBrand(brand);
      
                  System.out.println("请您输入手机的价格:");
                  double price = sc.nextDouble();
                  mobilePhone.setPrice(price);
      
                  // 选择手机的颜色
                  selectMobilePhone(mobilePhone, sc);
      
                  // c. 将手机信息封装成对象依次存入数组中
                  mobilePhones[i] = mobilePhone;
              }
      
              // 循环结束,存储工作完成,返回对象数组
              return mobilePhones;
          }
      
      
          /**
           * 选择手机的颜色
           *
           * @param mobilePhone 空的手机对象
           * @param sc          键盘录入对象
           */
          public static void selectMobilePhone(MobilePhone mobilePhone, Scanner sc) {
              while (true) {
                  System.out.println("请您选择手机的颜色:");
                  System.out.println("1.深海蓝\n2.茉莉绿\n3.珍珠白\n4.靓丽粉\n5.朱砂黑");
                  String colour = sc.next();
                  switch (colour) {
                      case "1":
                          mobilePhone.setColour("深海蓝");
                          return;
                      case "2":
                          mobilePhone.setColour("茉莉绿");
                          return;
                      case "3":
                          mobilePhone.setColour("珍珠白");
                          return;
                      case "4":
                          mobilePhone.setColour("靓丽粉");
                          return;
                      case "5":
                          mobilePhone.setColour("朱砂黑");
                          return;
                      default:
                          System.out.println("该颜色的手机还没有开发出来哦~ 请敬请等候~");
                          break;
                  }
              }
          }
      }
      


    • 测试结果:

      ---------录入第1部手机的信息---------
      请您输入手机的品牌:
      华为nova7
      请您输入手机的价格:
      3999.9
      请您选择手机的颜色:
      1.深海蓝
      2.茉莉绿
      3.珍珠白
      4.靓丽粉
      5.朱砂黑
      3
      ---------录入第2部手机的信息---------
      请您输入手机的品牌:
      iphone14_plus
      请您输入手机的价格:
      8999
      请您选择手机的颜色:
      1.深海蓝
      2.茉莉绿
      3.珍珠白
      4.靓丽粉
      5.朱砂黑
      4
      ---------录入第3部手机的信息---------
      请您输入手机的品牌:
      vivo
      请您输入手机的价格:
      5666
      请您选择手机的颜色:
      1.深海蓝
      2.茉莉绿
      3.珍珠白
      4.靓丽粉
      5.朱砂黑
      1
      
      所有手机信息如下:
      手机品牌:华为nova7,手机价格:3999.9元,手机颜色:珍珠白
      手机品牌:iphone14_plus,手机价格:8999.0元,手机颜色:靓丽粉
      手机品牌:vivo,手机价格:5666.0元,手机颜色:深海蓝
      
      所有手机的平均价格为:5666.0元~
      
      Process finished with exit code 0
      
      




4、对象数组练习4
  • 需求

    • 定义数组存储4个女朋友的对象。
    • 女朋友的属性:姓名、年龄、性别、爱好。
    • 要求:
      • 计算出所有女朋友的平均年龄。
      • 统计年龄比平均值低的女朋友有几个?并把他们的所有信息打印出来。
  • 分析

    • 需要一个女朋友类,用于将女朋友的信息封装成一个女朋友对象
    • 需要一个数组存储所有女朋友对象。
    • 需要求出最高年龄、最低年龄、总年龄,然后平均年龄 == (总年龄 - 最高年龄 - 最低年龄) / (个数)
    • 需要一个变量统计比平均年龄低的女朋友有几个
    • 需要打印出比平均年龄低的女朋友的信息
  • 实现

    • 女朋友类

      package com.app.demo19_object_array4;
      
      /*
          女朋友类
       */
      public class GirlFriend {
          /*
              定义女朋友的属性:
                  姓名、年龄、性别、爱好
           */
          private String name;
          private int age;
          private char gender;
          private String hobby;
      
          /*
              有参、无参构造器
           */
          public GirlFriend() {
      
          }
      
          public GirlFriend(String name, int age, char gender, String happy) {
              this.name = name;
              this.age = age;
              this.gender = gender;
              this.hobby = happy;
          }
      
          /*
              提供全套的getXXX和setXXX方法,
              暴露其属性的取值和赋值
           */
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          public char getGender() {
              return gender;
          }
      
          public void setGender(char gender) {
              this.gender = gender;
          }
      
          public String getHobby() {
              return hobby;
          }
      
          public void setHobby(String hobby) {
              this.hobby = hobby;
          }
      }
      


    • 测试类

      package com.app.demo19_object_array4;
      
      import java.util.Scanner;
      
      /*
          面向对象综合训练:对象数组练习4
          需求:
              - 定义数组存储4个女朋友的对象。
              - 女朋友的属性:姓名、年龄、性别、爱好。
              - 要求:
                - 1、计算出所有女朋友的平均年龄。
                - 2、统计年龄比平均值低的女朋友有几个?并把他们的所有信息打印出来。
       */
      public class GirlFriendTest {
          public static void main(String[] args) {
              // 1、创建一个女朋友对象的数组,用于存储多个女朋友对象
              GirlFriend[] girlFriends = createGirlFriends(4);
      
              // 2、查看所有女朋友的信息
              showGirlFriends(girlFriends);
      
              // 3、计算出所有女朋友的平均年龄
              int averageAge = girlFriendsAverAgeAge(girlFriends);
              System.out.println("所有女朋友的平均年龄为:" + averageAge + "岁");
      
              // 4、统计年龄比平均年龄低的女朋友有几个?并把这些女朋友的信息打印出来
              underAverAgeAgeGirlFriends(girlFriends, averageAge);
          }
      
      
          /**
           * 统计年龄比平均年龄低的女朋友个数
           *
           * @param girlFriends 所有女朋友年龄的数组
           * @param averageAge  所有女朋友的平均年龄
           */
          public static void underAverAgeAgeGirlFriends(GirlFriend[] girlFriends, int averageAge) {
              // 1、判断数组参数是否为null
              if (girlFriends == null) {
                  // 为null
                  System.out.println("您的数组不能为null~");
                  return; // 结束方法
              }
      
              // 2、定义计数器,用于记录比平均年龄低的女朋友有多少个
              int count = 0;
      
              // 3、遍历数组,依次得到每个女朋友对象
              System.out.println("\n低于平均年龄的女朋友信息如下:");
              for (int i = 0; i < girlFriends.length; i++) {
                  // a.判断当前女朋友的年龄 是否小于 平均年龄
                  if (girlFriends[i].getAge() < averageAge) {
                      // 小于,开始计数
                      count++;
                      // 打印当前这个女朋友的信息
                      System.out.println("姓名:" + girlFriends[i].getName() +
                              ",年龄:" + girlFriends[i].getAge() + "岁" +
                              ",性别:" + girlFriends[i].getGender() +
                              ",爱好:" + girlFriends[i].getHobby());
                  }
              }
      
              // 4、循环结束,低于平均年龄的女朋友统计完成,输出个数
              System.out.println("\n低于平均年龄的女朋友有" + count + "个。");
          }
      
      
          /**
           * 计算所有女朋友的平均年龄
           *
           * @param girlFriends 所有女朋友对象的数组
           * @return 返回所有女朋友的平均年龄
           */
          public static int girlFriendsAverAgeAge(GirlFriend[] girlFriends) {
              // 1、判断数组是否为null
              if (girlFriends == null) {
                  System.out.println("您的数组不能为null~");
                  return 0;
              }
      
              // 2、定义数组,用于存储所有女朋友的年龄
              int[] ages = new int[girlFriends.length];
      
              // 3、遍历girlFriends数组,依次得到每个女朋友对象
              for (int i = 0; i < girlFriends.length; ) {
                  // girlFriends[i]: 依次表示每个女朋友对象
      
                  // 4、遍历ages数组,依次存入每个女朋友的年龄
                  for (int j = 0; j < ages.length; j++) {
                      // 依次存入年龄
                      ages[j] = girlFriends[i].getAge();
                      // 存入成功后,让i自增,继续得到下一个女朋友的对象
                      i++;
                  }
              }
      
              // 5、定义变量,分别表示:最高年龄、最低年龄、总年龄
              int maxAge = ages[0];
              int minAge = ages[0];
              int sumAge = 0;
      
              // 6、遍历ages数组,依次得到每个女朋友的年龄
              for (int age : ages) {
                  // 求所有女朋友的最高年龄
                  if (age > maxAge) {
                      maxAge = age;
                  }
      
                  // 求所有女朋友的最低年龄
                  if (age < minAge) {
                      minAge = age;
                  }
      
                  // 求所有女朋友的总年龄
                  sumAge += age;
              }
      
              System.out.println("最高年龄:" + maxAge + "岁");
              System.out.println("最低年龄:" + minAge + "岁");
              System.out.println("总年龄:" + sumAge + "岁");
      
              // 7、计算平均年龄后返回给调用处
              return (sumAge - maxAge - minAge) / (ages.length - 2);
          }
      
      
          /**
           * 查看所有女朋友的信息
           *
           * @param girlFriends 女朋友对象的数组
           */
          public static void showGirlFriends(GirlFriend[] girlFriends) {
              // 1、判断数组是否为null
              if (girlFriends == null) {
                  System.out.println("您的数组不能为null~");
                  return;
              }
      
              // 2、遍历数组,依次得到每个女朋友对象
              System.out.println("\n所有女朋友的信息如下:");
              for (GirlFriend girlFriend : girlFriends) {
                  // 输出信息
                  System.out.println("姓名:" + girlFriend.getName() +
                          ",年龄:" + girlFriend.getAge() + "岁" +
                          ",性别:" + girlFriend.getGender() +
                          ",爱好:" + girlFriend.getHobby());
              }
          }
      
      
          /**
           * 创建女朋友对象
           *
           * @param length 数组的长度:表示可以存储多少个女朋友对象
           * @return 返回存储有女朋友对象的数组
           */
          public static GirlFriend[] createGirlFriends(int length) {
              // 1、数组的长度不能为0
              if (length == 0) {
                  System.out.println("您的数组长度不能为0~");
                  return null;
              }
      
              // 2、定义数组,用于存储女朋友对象,长度为length
              GirlFriend[] girlFriends = new GirlFriend[length];
              // [0, 1, 2, 4]
      
              // 3、创建键盘录入对象,用于录入女朋友的信息
              Scanner sc = new Scanner(System.in);
      
              // 4、录入女朋友的信息
              // 遍历数组,依次得到每个元素的索引位置
              for (int i = 0; i < girlFriends.length; i++) {
                  // a.创建一个空的女朋友对象,用于封装录入的女朋友信息
                  GirlFriend girlFriend = new GirlFriend();
      
                  System.out.println("-----开始录入第" + (i + 1) + "个女朋友的信息-----");
                  // 录入姓名
                  System.out.println("请输入女朋友的姓名:");
                  String name = sc.next();
                  girlFriend.setName(name);
      
                  // 录入年龄
                  try {
                      while (true) {
                          System.out.println("请输入女朋友的年龄:");
                          int age = sc.nextInt();
      
                          // 判断输入的年龄是否为负数 或 大于200岁
                          if (age < 0 || age > 200) {
                              // 是负数 或 大于200岁
                              System.out.println("您输入的年龄是非法的~ 请重新输入!");
                          } else if (age < 200){
                              // 年龄合法,录入年龄
                              girlFriend.setAge(age);
                              break;
                          }
                      }
                  } catch (Exception e) {
                      System.out.println("您输入的年龄数据有误~ 该女朋友的年龄将设为默认值:0岁");
                  }
      
      
                  // 录入性别
                  while (true) {
                      System.out.println("请输入女朋友的性别:");
                      String gender = sc.next();
      
                      // 判断录入的性别是否为 女
                      if (gender.equals("女")) {
                          // 是,则提取性别封装进女朋友对象
                          char newGender = gender.charAt(0);
                          girlFriend.setGender(newGender);
                          // 封装完成,跳出循环
                          break;
                      } else {
                          // 不是,则循环让用户重新录入性别
                          System.out.println("您输入的性别有误~ 请重新输入!");
                      }
                  }
      
                  // 录入爱好
                  System.out.println("请输入女朋友的爱好:");
                  String happy = sc.next();
                  girlFriend.setHobby(happy);
      
                  // 将封装好的女朋友对象,依次存入数组中
                  girlFriends[i] = girlFriend;
              }
      
              // 5、循环结束,返回存储有女朋友对象的数组
              return girlFriends;
          }
      }
      


    • 测试结果

      -----开始录入第1个女朋友的信息-----
      请输入女朋友的姓名:
      张靓颖
      请输入女朋友的年龄:
      19
      请输入女朋友的性别:
      男
      您输入的性别有误~ 请重新输入!
      请输入女朋友的性别:
      大家
      您输入的性别有误~ 请重新输入!
      请输入女朋友的性别:
      女
      请输入女朋友的爱好:
      唱歌、跳舞、服装
      -----开始录入第2个女朋友的信息-----
      请输入女朋友的姓名:
      刘亦菲
      请输入女朋友的年龄:
      20
      请输入女朋友的性别:
      女
      请输入女朋友的爱好:
      打游戏、演戏、唱歌
      -----开始录入第3个女朋友的信息-----
      请输入女朋友的姓名:
      杨幂
      请输入女朋友的年龄:
      28
      请输入女朋友的性别:
      女
      请输入女朋友的爱好:
      美食、旅游、逛街
      -----开始录入第4个女朋友的信息-----
      请输入女朋友的姓名:
      田馥甄
      请输入女朋友的年龄:
      22
      请输入女朋友的性别:
      女
      请输入女朋友的爱好:
      爱唱小幸运
      
      所有女朋友的信息如下:
      姓名:张靓颖,年龄:19岁,性别:女,爱好:唱歌、跳舞、服装
      姓名:刘亦菲,年龄:20岁,性别:女,爱好:打游戏、演戏、唱歌
      姓名:杨幂,年龄:28岁,性别:女,爱好:美食、旅游、逛街
      姓名:田馥甄,年龄:22岁,性别:女,爱好:爱唱小幸运
      最高年龄:28岁
      最低年龄:19岁
      总年龄:89岁
      所有女朋友的平均年龄为:21岁
      
      低于平均年龄的女朋友信息如下:
      姓名:张靓颖,年龄:19岁,性别:女,爱好:唱歌、跳舞、服装
      姓名:刘亦菲,年龄:20岁,性别:女,爱好:打游戏、演戏、唱歌
      
      低于平均年龄的女朋友有2个。
      
      Process finished with exit code 0
      
      


5、对象数组练习5
  • 需求

    • 定义长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同。

    • 学生的属性:学号、姓名、年龄。

    • 要求

      • 1、再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
      • 2、添加完毕之后,遍历所有学生信息。
      • 3、通过id删除学生信息:存在则删除、不存在提示该学生不存在,删除失败。
      • 4、删除完毕之后,遍历所有学生信息。
      • 5、查询数组id为 “112” 的学生,如果存在,则将他的年龄+1岁。
    • 分析

      • 1、需要定义一个学生类,用于将学生信息封装成一个学生对象。
      • 2、需要定义一个数组,长度为3,用于存储学生对象。
      • 3、需要初始化几个学生对象存入数组。
      • 4、需要实现添加学生的功能:
        • 4-1、录入学生学号:
          • 判断学号的唯一性:
            • 如果存在,则提示:“该学生学号已存在!”,重新录入学号;
            • 如果不存在,则判断数组是否已存满:
              • 如果已存满,则创建一个新数组,长度是老数组长度+1,还需将老数组的全部学生对象拷贝到新数组中
                • 然后继续录入学生信息:
                • 录入学生姓名
                • 录入学生年龄:
                  • 判断年龄合法性:年龄要求大于等于0岁,并小于等于200岁。
                • 将学生对象添加进数组。
              • 如果未存满,则继续录入学生信息:
                • 录入学生姓名
                • 录入学生年龄:
                  • 判断年龄合法性:年龄要求大于等于0岁,并小于等于200岁。
                • 将学生对象添加进数组。
      • 5、需要实现查看所有学生信息的功能:
        • 5-1、判断当前学生对象是否不为null:
          • 不为null,则打印该学生的信息
          • 为null,则继续查看下一个
      • 6、需要实现根据学号删除学生信息的功能:
        • 6-1、判断当前学生对象是否不为null:
          • 不为null,则判断学号是否一样:
            • 一样,则返回该学生在数组中的索引位置
            • 不一样,则继续判断下一个学生
        • 6-2、循环结束,说明该学生不存在,返回-1
        • 6-3、判断返回结果是否大于等于0:
          • 是,则说明该学生存在,将该学生对象删除
          • 不是,则提示:”该学生不存在,删除失败!“
      • 7、需要实现根据学号查询学生信息的功能:
        • 7-1、判断当前学生对象是否不为null:
          • 不为null,则判断学号是否一样:
            • 一样,则返回该学生在数组中的索引位置
            • 不一样,则继续判断下一个学生
        • 7-2、循环结束,说明该学生不存在,返回-1
        • 7-3、判断返回结束是否大于等于0:
          • 是,则说明该学生存在,则拿出该学生的年龄+1岁,再将+1岁后的年龄塞回去。
          • 不是,则说明该学生不存在,修改失败!
    • 实现

      • 学生类:

        package com.app.demo20_object_array5;
        
        /*
            1、需要定义一个学生类,用于将学生信息封装成一个学生对象。
         */
        public class Student {
            // 学生属性:学号、姓名、年龄
            private String id;
            private String name;
            private int age;
        
            public Student() {
        
            }
        
            public Student(String id, String name, int age) {
                this.id = id;
                this.name = name;
                this.age = age;
            }
        
            public String getId() {
                return id;
            }
        
            public void setId(String id) {
                this.id = id;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public int getAge() {
                return age;
            }
        
            public void setAge(int age) {
                this.age = age;
            }
        }
        


      • 测试类:

        package com.app.demo20_object_array5;
        
        import java.util.Scanner;
        
        /*
            测试类
         */
        public class Test {
            public static void main(String[] args) {
                // 2、需要定义一个数组,长度为3,用于存储学生对象。
                Student[] students = new Student[3];
        
                // 3、需要初始化几个学生对象存入数组。
                students[0] = new Student("jj01", "张飞", 34);
                students[1] = new Student("jj02", "关羽", 12);
        
                // 主页面
                homePage(students);
            }
        
        
            /**
             * 主界面
             *
             * @param students 学生对象数组
             */
            public static void homePage(Student[] students) {
                // 1、创建键盘录入对象
                Scanner sc = new Scanner(System.in);
        
                while (true) {
                    System.out.println("------学生管理界面------");
                    System.out.println("1、添加学生信息");
                    System.out.println("2、根据学号删除学生信息");
                    System.out.println("3、根据学号修改学生年龄(+1岁)");
                    System.out.println("4、查看所有学生的信息");
                    System.out.println("5、退出界面");
                    System.out.println("请您选择:");
                    String command = sc.next();
                    switch (command) {
                        case "1":
                            // 4、需要实现添加学生的功能
                            students = addStudent(students, sc);
                            break;
                        case "2":
                            // 根据学号删除学生信息
                            deleteByStudentId(students, sc);
                            break;
                        case "3":
                            // 根据学号修改学生年龄+1岁
                            updateByStudentId(students, sc);
                            break;
                        case "4":
                            // 查看所有学生的信息
                            showStudents(students);
                            break;
                        case "5":
                            System.out.println("成功退出学生管理界面~");
                            return;
                        default:
                            System.out.println("该功能未开发!请敬请等候~~");
                    }
                }
            }
        
        
            /**
             * 实现根据学号修改学生信息的功能
             * @param students      学生对象数组
             * @param sc            键盘录入对象
             */
            public static void updateByStudentId(Student[] students, Scanner sc) {
                if (students == null || sc == null) {
                    System.out.println("您的学生对象数组或键盘录入对象不能为null~");
                    return;
                }
        
                System.out.println("-------根据学号修改学生年龄-------");
        
                // 1、输入要修改的学生的学号
                System.out.println("请您输入要修改的学生的学号:");
                String id = sc.next();
        
                // 2、获取该学生对象在数组中的索引位置
                int index = getStudentIndex(students, id);
                // 判断该学生对象的索引是否大于等于0
                if (index >= 0) {
                    // 是,则说明学生存在
                    // 得到该学生对象,接收一下
                    Student student = students[index];
                    // 原本的年龄
                    System.out.println("学生" + student.getName() + "的原年龄为:" + student.getAge() + "岁");
        
                    // 拿出该学生的年龄属性,+1岁
                    int age = students[index].getAge() + 1;
                    // 再将新的年龄塞回去
                    students[index].setAge(age);
                    System.out.println("学号为" + id + "的学生年龄修改成功~");
                    System.out.println("学生" + students[index].getName() + "修改后的年龄为:" + student.getAge() + "岁");
                }else {
                    // 不是,则说明该学生不存在,修改失败
                    System.out.println("您要修改的学生不存在!修改失败~");
                }
            }
        
        
            /**
             * 实现根据学号删除学生信息的功能
             * @param students      学生对象数组
             * @param sc            键盘录入对象
             */
            public static void deleteByStudentId(Student[] students, Scanner sc) {
                if (students == null || sc == null) {
                    System.out.println("您的学生数组或键盘录入对象不能为null~");
                    return;
                }
        
                System.out.println("-------根据学号删除学生信息-------");
        
                // 1、录入要删除的学生学号
                System.out.println("请您输入要删除的学生的学号:");
                String id = sc.next();
        
                // 2、获取该学生对象在数组中的索引位置
                int index = getStudentIndex(students, id);
                // 判断该学生对象索引是否大于等于0
                if (index >= 0) {
                    // 是,则删除该学生对象:将该元素赋值为null
                    students[index] = null;
                    System.out.println("学号为" + id + "的学生已成功删除~");
                }else {
                    // 不是,则说明该学生不存在,删除失败!
                    System.out.println("您要删除的学生不存在!删除失败~");
                }
            }
        
        
            /**
             * 实现获取指定学号的学生对象在数组中的索引位置
             * @param students      学生对象数组
             * @param id            学生学号
             * @return              返回学生对象在数组中的索引位置
             */
            public static int getStudentIndex(Student[] students, String id) {
                if (students == null || id == null) {
                    System.out.println("您的学生数组或学生学号不能为null~");
                    return 0;
                }
        
                // 1、遍历学生对象数组,依次获取每个学生对象
                for (int i = 0; i < students.length; i++) {
                    // 每获取到一个学生对象,接收一下
                    Student student = students[i];
        
                    // 判断当前学生对象是否不为null:
                    if (student != null) {
                        // 不为null,拿到当前学生对象的学号
                        String stuId = student.getId();
                        // 判断学号是否一样:
                        if (id.equals(stuId)) {
                            // 一样,则返回该学生在数组中的索引位置
                            return i;
                        }
        
                        // 不一样,则继续判断下一个学生
                    }
                }
        
                // 2、遍历结束,说明仍然找不到要删除的学生,返回-1
                return -1;
            }
        
        
            /**
             * 实现查看所有学生信息的功能
             *
             * @param students 学生对象数组
             */
            public static void showStudents(Student[] students) {
                if (students == null) {
                    System.out.println("您的学生对象数组不能为null~");
                    return;
                }
        
                System.out.println("-------查看所有学生的信息-------");
                // 1、遍历学生对象数组,依次获取每个学生对象
                for (int i = 0; i < students.length; i++) {
                    // 每获取到一个学生对象,接收一下
                    Student student = students[i];
                    // 当该学生对象不为null时,才打印该学生信息
                    if (student != null) {
                        System.out.println("学号:" + student.getId() +
                                "\t姓名:" + student.getName() +
                                "\t年龄:" + student.getAge() + "岁");
                    }
                }
            }
        
        
            /**
             * 实现添加学生的功能
             *
             * @param students 学生对象数组
             * @param sc       键盘录入对象
             */
            public static Student[] addStudent(Student[] students, Scanner sc) {
                if (students == null || sc == null) {
                    System.out.println("学生数组或键盘录入对象不能为null~");
                    return null;
                }
        
                System.out.println("-------添加学生信息界面-------");
        
                //4-1、录入学生学号:
                while (true) {
                    System.out.println("请您输入学生学号:");
                    String id = sc.next();
        
                    // a.判断学号的唯一性:
                    boolean flag = containsId(students, id);
                    if (flag) {
                        // 如果存在,则提示:“该学生学号已存在!”,重新录入学号;
                        System.out.println("该学号的学生已存在~ 请重新录入学号!");
                    } else {
                        // 如果不存在,则判断数组是否已存满:
                        // 获取数组中有多少个元素
                        int count = getArrayCount(students);
                        // 判断数组中的元素个数 是否与 数组长度相等
                        if (count == students.length) {
                            // 相等,说明数组已存满,则创建一个新数组,长度是老数组长度+1
                            Student[] newStudents = new Student[students.length + 1];
                            // 需将老数组的全部学生对象拷贝到新数组中
                            for (int i = 0; i < students.length; i++) {
                                newStudents[i] = students[i];
                            }
        
                            // 然后继续录入学生信息:
                            // 录入学生姓名
                            System.out.println("请您输入学生姓名:");
                            String name = sc.next();
        
                            // 录入学生年龄:
                            System.out.println("请您输入学生年龄:");
                            int age = sc.nextInt();
                            // 判断年龄合法性:年龄要求大于等于0岁,并小于等于200岁。
                            if (age >= 0 && age <= 200) {
                                // 封装学生信息进学生对象
                                Student student = new Student(id, name, age);
                                // 将学生对象添加进新数组。
                                newStudents[count] = student;
                                System.out.println("名叫" + name + "的学生添加成功~");
                                // 添加成功后,返回新数组
                                return newStudents;
                            }
        
                        } else {
                            // 不相等,说明数组未存满,则继续录入学生信息:
                            // 录入学生姓名
                            System.out.println("请您输入学生姓名:");
                            String name = sc.next();
        
                            // 录入学生年龄:
                            System.out.println("请您输入学生年龄:");
                            int age = sc.nextInt();
                            // 判断年龄合法性:年龄要求大于等于0岁,并小于等于200岁。
                            if (age >= 0 && age <= 200) {
                                // 封装学生信息进学生对象
                                Student student = new Student(id, name, age);
                                // 将学生对象添加进数组。
                                /*
                                    1、比如现在数组中有2个学生对象,有一个空位:
                                        [学生1, 学生2, null]
                                      索引:0     1     2
                                    2、此时count计数:2
                                    3、students[count] = student:
                                       就是把当前封装好的学生对象放进2索引的位置,由于2索引位置为null,因此添加成功
                                 */
                                students[count] = student;
                                System.out.println("名叫" + name + "的学生添加成功~");
                                // 添加成功后,返回原数组
                                return students;
                            }
                        }
                    }
                }
            }
        
        
            /**
             * 获取数组的元素个数
             *
             * @param students 学生对象数组
             * @return 返回数组的元素个数
             */
            public static int getArrayCount(Student[] students) {
                if (students == null) {
                    System.out.println("您的学生数组不能为null");
                    return 0;
                }
        
                // 1、定义计数器,用于统计数组的元素个数
                int count = 0;
        
                // 2、遍历学生对象数组,依次获取每个学生对象
                for (int i = 0; i < students.length; i++) {
                    // 每获取到一个学生对象,接收一下
                    Student student = students[i];
                    // 判断当前学生对象是否不为null
                    if (student != null) {
                        // 不为null,则说明该索引位置存在元素,开始统计
                        count++;
                    }
                }
        
                // 3、遍历结束,说明统计完成,返回数组的元素个数
                return count;
            }
        
        
            /**
             * 判断学生学号的唯一性
             *
             * @param students 学生对象数组
             * @param id       学生学号
             * @return 存在返回true,不存在返回false
             */
            public static boolean containsId(Student[] students, String id) {
                // 1、遍历学生对象数组,依次获取每个学生对象
                for (int i = 0; i < students.length; i++) {
                    // 每获取到一个学生对象,接收一下
                    Student student = students[i];
                    // 判断当前学生对象是否不为null
                    if (student != null) {
                        // 不为null,则获取到当前学生对象的学号,接收一下
                        String stuId = student.getId();
        
                        // 判断学号是否一样
                        if (stuId.equals(id)) {
                            // 一样,说明学生存在,返回true
                            return true;
                        }
                    }
                }
        
                // 2、遍历结束,仍然找不到该学号的学生,返回false
                return false;
            }
        }
        


      • 测试结果:

        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        1
        -------添加学生信息界面-------
        请您输入学生学号:
        jj01
        该学号的学生已存在~ 请重新录入学号!
        请您输入学生学号:
        jj02
        该学号的学生已存在~ 请重新录入学号!
        请您输入学生学号:
        jj03
        请您输入学生姓名:
        张三
        请您输入学生年龄:
        28
        名叫张三的学生添加成功~
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        4
        -------查看所有学生的信息-------
        学号:jj01	姓名:张飞	年龄:34岁
        学号:jj02	姓名:关羽	年龄:12岁
        学号:jj03	姓名:张三	年龄:28岁
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        1
        -------添加学生信息界面-------
        请您输入学生学号:
        jj04
        请您输入学生姓名:
        李四
        请您输入学生年龄:
        39
        名叫李四的学生添加成功~
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        4
        -------查看所有学生的信息-------
        学号:jj01	姓名:张飞	年龄:34岁
        学号:jj02	姓名:关羽	年龄:12岁
        学号:jj03	姓名:张三	年龄:28岁
        学号:jj04	姓名:李四	年龄:39岁
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        2
        -------根据学号删除学生信息-------
        请您输入要删除的学生的学号:
        jj05
        您要删除的学生不存在!删除失败~
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        2
        -------根据学号删除学生信息-------
        请您输入要删除的学生的学号:
        jj01
        学号为jj01的学生已成功删除~
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        4
        -------查看所有学生的信息-------
        学号:jj02	姓名:关羽	年龄:12岁
        学号:jj03	姓名:张三	年龄:28岁
        学号:jj04	姓名:李四	年龄:39岁
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        3
        -------根据学号修改学生年龄-------
        请您输入要修改的学生的学号:
        jj01
        您要修改的学生不存在!修改失败~
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        3
        -------根据学号修改学生年龄-------
        请您输入要修改的学生的学号:
        jj03
        学生张三的原年龄为:28岁
        学号为jj03的学生年龄修改成功~
        学生张三修改后的年龄为:29岁
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        4
        -------查看所有学生的信息-------
        学号:jj02	姓名:关羽	年龄:12岁
        学号:jj03	姓名:张三	年龄:29岁
        学号:jj04	姓名:李四	年龄:39岁
        ------学生管理界面------
        1、添加学生信息
        2、根据学号删除学生信息
        3、根据学号修改学生年龄(+1岁)
        4、查看所有学生的信息
        5、退出界面
        请您选择:
        5
        成功退出学生管理界面~
        
        Process finished with exit code 0
        
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值