第八天 自定义类型&方法&集合混合使用【悟空教程】 第08天 自定义类型&方法&集合混合使用 自定义引用类型与int、double等数据类型相同,均是一种数据类型。当方法定义参数与返回值类型时,可以定位基本数据类型,也可以定义为引用数据类型,二者在定义上没有任何差别。 基本类型与引用类型传参过程中,仅仅是值的数据类型不同。 如: 基本类型int传参时,赋值为10,是一个具体数值 引用类型Person传参时,赋值为new Person(),是一个地址值,如0x8372 1.定义方法,基本类型作为参数 如:求两个数的和 /* 定义方法,基本类型作为参数 如:求两个整数的和 */ public class Test1 { public static void main(String[] args) { int a = 10; int b = 20; int he = sum(a,b); System.out.println(he); System.out.println(a); System.out.println(b); } //求两个整数的和 参数 两个整数 返回值 一个整数 public static int sum(int a, int b){ a = 2 * a; b = 2 * b; int he = a + b; return he; } } 2.定义方法,数组作为参数 如:打印数组中所有偶数 /* 定义方法,数组作为参数 如:打印数组中所有偶数 */ public class Test2 { public static void main(String[] args) { int[] arr ={3,8,2,5,0}; showOuShu(arr); } //打印数组中所有偶数 参数 一个整数数组 返回值 无 public static void showOuShu(int[] arr){ int count = 0; //遍历数组,依次获取数组中每个数值,判断这个数值是否为偶数,如果是则打印 for(int i = 0 ;i<arr.length;i++){ //依次获取数组中每个数值 int number = arr[i]; //判断这个数值是否为偶数 if(number % 2 ==0){ //如果是则打印 System.out.println(number); count++; } } System.out.println("偶数个数:"+count); } } 3.定义方法,集合作为参数 如:打印集合中所有偶数 /* 定义方法,集合作为参数 如:打印集合中所有偶数 */ //导入ArrayList import java.util.ArrayList; public class Test3 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(3); list.add(8); list.add(2); list.add(5); list.add(0); showOuShu(list); } //打印集合中所有偶数 参数 一个存储整数的集合 返回值 void /* 遍历集合 依次获取集合中所有的数据 判断数据是否为偶数 如果是 则打印 */ public static void showOuShu(ArrayList<Integer> list){ //遍历集合 for(int i = 0 ;i < list.size();i++){ //依次获取集合中所有的数据 int number = list.get(i); //判断数据是否为偶数 if(number % 2 == 0){ System.out.println(number); } } } } 4.定义方法,自定义数据类型作为参数 如:将一个人的年龄增长10岁 public class Person { String name; int age; } /* 定义方法,自定义数据类型作为参数 如:将一个人的年龄增长10岁 */ public class Test4 { public static void main(String[] args) { Person p = new Person(); addAge(p); System.out.println("---------------------------"); System.out.println(p.age); } //将一个人的年龄增长10岁 参数 一个人 返回值 void public static void addAge(Person p){ p.age+=10; System.out.println(p.age); } } 同样,我们也可以尝试各种数据类型作为返回值使用。 当基本类型传参时,栈内存中,各个方法内的变量互不相关,仅存在一个相互赋值的动作。 当引用类型传参时,各个方法内的引用变量指向同一个堆内存中的对象,任何一个引用修改了对象,其他引用再使用时,均访问的是修改后的变量。 /* 自定义数据类型 Animal类 属性 姓名 String 年龄 int 种类 String */ public class Animal { String name; int age; String kind; } /* 定义一个方法 从一群小动物中,找出所有年龄大于3的小动物,将这些小动物放在一个集合中,并返回,在main方法中遍历返回的集合,打印所有年龄大于3的小动物的信息 */ //导入ArrayList import java.util.ArrayList; public class Test5 { public static void main(String[] args) { //存储所有动物的集合 ArrayList<Animal> list = new ArrayList<Animal>(); //向集合中添加动物 Animal a1 = new Animal(); a1.name = "柳岩"; a1.age = 38; a1.kind = "女人"; Animal a2 = new Animal(); a2.name = "点点"; a2.age = 3; a2.kind = "斑点狗"; Animal a3 = new Animal(); a3.name = "小白"; a3.age = 2; a3.kind = "白痴猫"; Animal a4 = new Animal(); a4.name = "小金"; a4.age = 4; a4.kind = "金丝猴"; //将所有动物存储到集合中 list.add(a1); list.add(a2); list.add(a3); list.add(a4); //调用检查年龄的方法 返回一个年龄大于3的动物的集合 ArrayList<Animal> checkList = checkAnimals(list); //遍历返回的集合,打印所有年龄大于3的小动物的信息 for(int i = 0 ;i < checkList.size();i++){ //依次获取每个年龄大于3的小动物 Animal thisA = checkList.get(i); System.out.println("姓名:"+thisA.name); System.out.println("年龄:"+thisA.age); System.out.println("品种:"+thisA.kind); System.out.println("------------------------"); } } /* 1.定义一个动物类 2.定义方法 方法参数 一个存储所有动物的集合 返回值 一个存储所有年龄大于三的动物的集合 a.定义一个集合用来存储年龄大于3的动物 b.遍历所有动物的集合,依次获取每个动物 c.判断每个动物的年龄是否大于3 d.如果大于3,将当前这个动物存储到年龄大于三的动物的集合 e.返回 年龄大于3的动物的集合 */ public static ArrayList<Animal> checkAnimals(ArrayList<Animal> list){ //定义一个存储年龄大于3动物的集合 ArrayList<Animal> checkList = new ArrayList<Animal>(); //遍历所有动物的集合 list for(int i = 0 ;i < list.size();i++){ //依次获取每个动物 Animal thisA = list.get(i); //判断每个动物的年龄是否大于3 if(thisA.age >3){ //将当前这个动物存储到年龄大于三的动物的集合 checkList.add(thisA); } } //返回 年龄大于3的动物的集合 return checkList; } } 将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对象。 a) 案例回顾 在超市购物小票案例中,我们封装了三个方法,在switch中为3个case执行用户选择的三个不同的操作:1输入购买数量 2打印购物小票 3退出系统 而所有的变量均”零散地”定义在成员位置。 b) 重构内容分析 1:将原来的成员位置零散定义的变量,封装为商品项GoodsItem对象。 2:将所有使用变量值的地方全部改为使用GoodsItem对象 c) 实现步骤 定义Person类 定义Person类,包含成员变量名称、年龄、地址 重构使用到变量的逻辑 将所有使用到成员位置商品属性的代码处,均由直接使用改为通过对象名访问对象属性的方式。 /* 自定义数据类型 商品项类 属性 商品名称 String 商品id String 商品单价 double 商品数量 int 商品金额 double */ public class GoodsItem { //商品名称 String name; //商品id String id; //商品单价 double price ; //商品数量 int number; //商品金额 double money; } /* 使用switch语句完成三个分支的代码逻辑 当用户输入1时,让用户输入所要购买的商品数量 当用户输入2时,给用户打印出对应的购物小票 当用户输入3时,退出系统 1.定义商品数据 2.提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统 3.接收用户输入的选择 4.使用switch进行判断 5.整体是一个死循环 代码重构 1.定义一个商品项类 2.在成员位置创建两个商品对象 3.给两个商品对象的属性赋值 定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无 4.修改购买方法和打印小票方法 因为里边访问的变量都不存在了 需要改成商品对象去访问属性的方式 */ //导入Scanner import java.util.Scanner; public class Supermarket { //定义少林寺酥饼核桃商品对象 static GoodsItem sls = new GoodsItem(); //定义然光Q移商品对象 static GoodsItem rg = new GoodsItem(); public static void main(String[] args) { //调用init方法 用来初始化数据 init(); while(true){ //提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统 System.out.println("请输入您的操作:1.输入商品数量 2.打印购物小票 3.退出系统"); //接收用户输入的选择 使用Scanner完成 // Scanner sc = new Scanner(System.in); //调用nextInt方法 接收用户的选择 // int choose = sc.nextInt(); //调用键盘录入整数方法enterNumber接收用户输入的选择 int choose = enterNumber(); //使用switch进行判断用户的选择 switch(choose){ case 1: //调用buy方法 完成用户输入商品数量 buy(); break; case 2: //调用printTicket方法 打印购物小票 printTicket(); break; case 3: System.out.println("爱买不买,下次带钱来!!"); System.exit(0); break; default: System.out.println("你瞎啊!"); break; } } } //定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无 public static void init(){ //给少林寺对象赋值 sls.name = "少林寺酥饼核桃"; sls.id = "090115"; sls.price = 15.50; //给然光对象赋值 rg.name = "然光Q移"; rg.id = "090028"; rg.price = 16.00; } //定义一个键盘录入整数的方法 方法名 enterNumber 需要的数据 无 返回的数据 一个用户输入的整数 public static int enterNumber(){ Scanner sc = new Scanner(System.in); int number = sc.nextInt(); return number; } //将用户输入商品数量封装成方法 方法名 buy 需要的数据 无 返回的数据 无 public static void buy(){ Scanner sc = new Scanner(System.in); //依次让用户给每个商品的数量重新赋值 System.out.println("请输入少林寺酥饼核桃的购买数量:"); sls.number = sc.nextInt(); sls.money = sls.number*sls.price; System.out.println("请输入然光Q移的购买数量:"); rg.number = sc.nextInt(); rg.money = rg.number*rg.price; } //打印购物小票方法 方法名 printTicket 需要的数据 无 返回的数据 无 public static void printTicket(){ //===============票头========================= System.out.println(" 欢 迎 光 临"); System.out.println("品名 售价 数量 金额"); System.out.println("-------------------------------------"); //===============票体========================= System.out.println(sls.name+"("+sls.id+")"+" "+sls.price+" * "+sls.number+" = "+sls.money); System.out.println(rg.name+"("+rg.id+")"+" "+rg.price+" * "+rg.number+" = "+rg.money); System.out.println("-------------------------------------"); //===============票脚========================= //项数 int lineNumber = 2; //总数量 int totalNumber = sls.number + rg.number; //总金额 double totalMoney = sls.money + rg.money; System.out.println(lineNumber+" 项商品 共计:"+totalNumber+" 件"); System.out.println("总计:"+totalMoney); } } 将本日第二章内容所有的Person对象放置到集合中使用。 a) 重构内容分析 1:将原来的成员位置的多个商品项GoodsItem对象封装到一个ArrayList集合中 2:将所有使用变量值的地方全部改为先从集合中后去对象,再使用GoodsItem对象获取属性值的方式。 b) 实现步骤 成员位置定义ArrayList集合 定义方法,用于为集合赋值,准备要操作的数据。 重构使用到变量的逻辑 将所有使用到成员位置商品项的代码处,均由使用对象名访问对象属性的方式改为先从集合中获取对象,再获取属性值的方式。 当使用自定义类型时,将数据与数据之间产生了合理必要的联系:一个商品的属性应都属于一个商品,则可以以一个商品作为数据操作的基本单位。 当使用集合时,由原来成员位置定义多个对象改为定义一个集合对象。所有使用数据的地方循环遍历即可,无论有再多新数据的产生,其代码不需要更改。 /* 自定义数据类型 商品项类 属性 商品名称 String 商品id String 商品单价 double 商品数量 int 商品金额 double */ public class GoodsItem { //商品名称 String name; //商品id String id; //商品单价 double price ; //商品数量 int number; //商品金额 double money; } /* 使用switch语句完成三个分支的代码逻辑 当用户输入1时,让用户输入所要购买的商品数量 当用户输入2时,给用户打印出对应的购物小票 当用户输入3时,退出系统 1.定义商品数据 2.提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统 3.接收用户输入的选择 4.使用switch进行判断 5.整体是一个死循环 代码重构 准备数据 1.定义一个商品项类 2.在成员位置定义一个集合 用来存储所有商品 3.为成员位置的集合初始化商品 4.修改购买和打印小票方法 将商品对象从集合中取出来,访问商品对象的属性 */ //导入Scanner import java.util.Scanner; //导入ArrayList import java.util.ArrayList; public class Supermarket2 { //在成员位置定义一个集合 用来存储所有商品 static ArrayList<GoodsItem> list = new ArrayList<GoodsItem>(); public static void main(String[] args) { //调用init方法 用来初始化数据 init(); while(true){ //提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统 System.out.println("请输入您的操作:1.输入商品数量 2.打印购物小票 3.退出系统"); //接收用户输入的选择 使用Scanner完成 int choose = enterNumber(); //使用switch进行判断用户的选择 switch(choose){ case 1: //调用buy方法 完成用户输入商品数量 buy(); break; case 2: //调用printTicket方法 打印购物小票 printTicket(); break; case 3: System.out.println("爱买不买,下次带钱来!!"); System.exit(0); break; default: System.out.println("你瞎啊!"); break; } } } //定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无 public static void init(){ //定义少林寺酥饼核桃商品对象 GoodsItem sls = new GoodsItem(); //给少林寺对象赋值 sls.name = "少林寺酥饼核桃"; sls.id = "090115"; sls.price = 15.50; //定义然光Q移商品对象 GoodsItem rg = new GoodsItem(); //给然光对象赋值 rg.name = "然光Q移"; rg.id = "090028"; rg.price = 16.00; //定义人参果商品对象 GoodsItem rsg = new GoodsItem(); //给然光对象赋值 rsg.name = "人参果"; rsg.id = "090001"; rsg.price = 111111.00; //将商品对象添加到集合中 list.add(sls); list.add(rg); list.add(rsg); } //定义一个键盘录入整数的方法 方法名 enterNumber 需要的数据 无 返回的数据 一个用户输入的整数 public static int enterNumber(){ Scanner sc = new Scanner(System.in); int number = sc.nextInt(); return number; } //将用户输入商品数量封装成方法 方法名 buy 需要的数据 无 返回的数据 无 public static void buy(){ Scanner sc = new Scanner(System.in); /* 遍历存储商品的集合list,依次获取每个商品 让用户给每个商品的数量赋值 计算每个商品的金额 */ for(int i = 0 ;i < list.size();i++){ //依次获取每个商品 GoodsItem thisItem = list.get(i); System.out.println("请输入"+thisItem.name+"商品的购买数量:"); //让用户给每个商品的数量赋值 thisItem.number = sc.nextInt(); //计算每个商品的金额 thisItem.money = thisItem.number * thisItem.price; } } //打印购物小票方法 方法名 printTicket 需要的数据 无 返回的数据 无 public static void printTicket(){ //===============票头========================= System.out.println(" 欢 迎 光 临"); System.out.println("品名 售价 数量 金额"); System.out.println("-------------------------------------"); //===============票体========================= /* 遍历商品集合,依次获取每个商品,打印每个商品的属性 */ for(int i = 0 ;i<list.size();i++){ //依次获取每个商品 GoodsItem thisItem = list.get(i); //依次获取每个商品 System.out.println(thisItem.name+"("+thisItem.id+")"+" "+thisItem.price+" * "+thisItem.number+" = "+thisItem.money); } //System.out.println(sls.name+"("+sls.id+")"+" "+sls.price+" * "+sls.number+" = "+sls.money); //System.out.println(rg.name+"("+rg.id+")"+" "+rg.price+" * "+rg.number+" = "+rg.money); System.out.println("-------------------------------------"); //===============票脚========================= //项数 int lineNumber = list.size(); //总数量 int totalNumber = 0; //总金额 double totalMoney = 0.0; /* 遍历商品集合 ,依次获取每个商品 将每个商品的数量累加 将每个商品的金额累加 */ //遍历商品集合 for(int i = 0 ;i < list.size();i++){ //依次获取每个商品 GoodsItem thisItem = list.get(i); //总数量 totalNumber += thisItem.number; //总金额 totalMoney += thisItem.money; } System.out.println(lineNumber+" 项商品 共计:"+totalNumber+" 件"); System.out.println("总计:"+totalMoney); } } 使用Eclipse完成day07超市购物小票案例。 package cn.javahelp2; /* * 自定义数据类型 商品项类 * * 属性 * * 商品id String * 商品名称 String * 商品单价 double * 商品数量 int * 商品金额 double */ public class GoodsItem { String id; String name; double price; int number; double money; } package cn.javahelp2; import java.util.ArrayList; import java.util.Scanner; /* * 使用switch语句完成三个分支的代码逻辑 * 当用户输入1时,让用户输入所要购买的商品数量 * 当用户输入2时,给用户打印出对应的购物小票 * 当用户输入3时,退出系统 * * 分析 * 准备数据 * 1.定义一个商品类 * 2.在成员位置定义一个集合 用来存储所有商品 * 3.定义一个方法 init方法 为集合初始化数据 * 完成整体流程 * 4.提示用户输入相对应的操作 1.购买 2.打印小票 3.退出购买 * 5.接收用户输入的操作 * 调用Scanner的nextInt方法 * 6.使用switch对用户的操作进行判断 * 7.整体流程是一个死循环 * 完成每个方法 * 8.完成购买方法 为集合中每个商品的数量赋值 * 9.完成打印小票方法 * 票头 死数据打印 * 票体 依次打印集合中每个商品的属性 * 票脚 求和 * */ public class Supermarket { //在成员位置定义一个集合 用来存储所有商品 static ArrayList<GoodsItem> list = new ArrayList<GoodsItem>(); public static void main(String[] args) { //调用init方法为商品集合初始化数据 init(); //整体流程是一个死循环 while(true){ //提示用户输入相对应的操作 1.购买 2.打印小票 3.退出购买 System.out.println("请输入相对应的操作: 1.购买 2.打印小票 3.退出系统"); //接收用户输入的操作 Scanner sc = new Scanner(System.in); int choose = sc.nextInt(); //使用switch对用户的操作进行判断 switch (choose) { case 1: buy(); break; case 2: printTicket(); break; case 3: System.out.println("爱买不买,下次带钱来!"); System.exit(0); break; default: System.out.println("你瞎啊?这都看不到么!!"); break; } } } //完成打印小票方法 /* * 票头 * 死数据打印 * 票体 * 依次打印集合中每个商品的属性 * 遍历集合,依次获取每个商品,打印每个商品的属性信息 * 票脚 * 项数 集合的长度 * 求总数量 所有商品数量的和 * 总金额 所有商品金额的和 * 遍历集合,依次获取每个商品 * 商品数量累加 * 商品金额累加 */ public static void printTicket() { //票头 System.out.println(" 欢迎欢迎 !! 热烈欢迎!!"); System.out.println("商品名称 商品单价 商品数量 商品金额"); System.out.println("---------------------------------------"); //票体 遍历集合,依次获取每个商品,打印每个商品的属性信息 for (int i = 0; i < list.size(); i++) { //依次获取每个商品 GoodsItem thisItem = list.get(i); //打印每个商品的属性信息 System.out.println(thisItem.name+"("+thisItem.id+")"+" "+thisItem.price+" * "+thisItem.number+" = "+thisItem.money); } System.out.println("---------------------------------------"); //票脚 //项数 int lineNumber = list.size(); //总数量 int totalNumber = 0; //总金额 double totalMoney = 0.0; //遍历集合,依次获取每个商品 for (int i = 0; i < list.size(); i++) { //依次获取每个商品 GoodsItem thisItem = list.get(i); //求总数量 totalNumber += thisItem.number; //求总金额 totalMoney += thisItem.money; } System.out.println(lineNumber+" 项商品 共计:"+totalNumber+"件"); System.out.println("总价:"+totalMoney+"元"); } //完成购买方法 为集合中每个商品的数量赋值 /* * 1.创建Scanner对象 * 2.遍历集合,依次获取每个商品,让用户为每个商品的数量赋值,计算商品金额 */ public static void buy() { //创建Scanner对象 Scanner sc = new Scanner(System.in); //遍历集合,依次获取每个商品,让用户为每个商品的数量赋值,计算商品金额 for (int i = 0; i < list.size(); i++) { //依次获取每个商品 GoodsItem thisItem = list.get(i); //让用户为每个商品的数量赋值 System.out.println("请输入"+thisItem.name+"商品的购买数量:"); thisItem.number = sc.nextInt(); //计算商品金额 thisItem.money = thisItem.number * thisItem.price; } } //定义一个方法 init方法 为集合初始化数据 /* * 创建商品对象 给商品对象的属性赋值 * 将商品对象添加到成员位置的集合中 */ public static void init(){ // 创建商品对象 给商品对象的属性赋值 GoodsItem sls = new GoodsItem(); sls.id = "090018"; sls.name = "少林寺酥饼核桃"; sls.price = 15.50; GoodsItem rg = new GoodsItem(); rg.id = "090025"; rg.name = "然光Q移"; rg.price = 16.00; GoodsItem rsg = new GoodsItem(); rsg.id = "090001"; rsg.name = "人参果"; rsg.price = 16000.00; //将商品对象添加到成员位置的集合中 list.add(sls); list.add(rg); list.add(rsg); } } |
|