第八天 自定义类型&方法&集合混合使用【悟空教程】

版权声明:本文发布在【Java帮帮】微信公众号,转载请留言,未经允许不得转载。 https://blog.csdn.net/s1547823103/article/details/82840638

第八天 自定义类型&方法&集合混合使用【悟空教程】

第08天 自定义类型&方法&集合混合使用

第1章 引用类型作为参数与返回值

1.1 引用类型是一种数据类型

自定义引用类型与int、double等数据类型相同,均是一种数据类型。当方法定义参数与返回值类型时,可以定位基本数据类型,也可以定义为引用数据类型,二者在定义上没有任何差别。

基本类型与引用类型传参过程中,仅仅是值的数据类型不同。

如:

基本类型int传参时,赋值为10,是一个具体数值

引用类型Person传参时,赋值为new Person(),是一个地址值,如0x8372

1.2 引用类型定义方法与返回值为参数练习

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);

}

}

同样,我们也可以尝试各种数据类型作为返回值使用。

1.3 引用类型传参与基本类型传参区别

  • 当基本类型传参时,栈内存中,各个方法内的变量互不相关,仅存在一个相互赋值的动作。

  • 当引用类型传参时,各个方法内的引用变量指向同一个堆内存中的对象,任何一个引用修改了对象,其他引用再使用时,均访问的是修改后的变量。

/*

自定义数据类型 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;

}

}

 

第2章 综合案例---超市购物小票封装自定义类

2.0.1 案例介绍与演示

将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对象。

2.0.2 案例分析

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);

}

}

 

第3章 综合案例---超市购物小票数据使用集合

3.0.1 案例介绍与演示

将本日第二章内容所有的Person对象放置到集合中使用。

3.0.2 案例分析

a) 重构内容分析

1:将原来的成员位置的多个商品项GoodsItem对象封装到一个ArrayList集合中

2:将所有使用变量值的地方全部改为先从集合中后去对象,再使用GoodsItem对象获取属性值的方式。

b) 实现步骤

  • 成员位置定义ArrayList集合

  • 定义方法,用于为集合赋值,准备要操作的数据。

  • 重构使用到变量的逻辑

将所有使用到成员位置商品项的代码处,均由使用对象名访问对象属性的方式改为先从集合中获取对象,再获取属性值的方式。

3.0.3 自定义类型与集合的使用优点分析

当使用自定义类型时,将数据与数据之间产生了合理必要的联系:一个商品的属性应都属于一个商品,则可以以一个商品作为数据操作的基本单位。

当使用集合时,由原来成员位置定义多个对象改为定义一个集合对象。所有使用数据的地方循环遍历即可,无论有再多新数据的产生,其代码不需要更改。

/*

自定义数据类型 商品项类

属性

商品名称 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);

}

}

第4章 综合案例---超市购物小票(之前知识)

4.1 案例介绍与演示

使用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);

}

}

猜你喜欢

转载自blog.csdn.net/s1547823103/article/details/82840638
今日推荐