Java基础(六)——自定义类(定义、使用、内存分配图)、 ArrayList集合(可变长数组,创建、常用方法)、改进版随机点名器、库存管理案例

目录

第一章 引用数据类型(类)

1.1引用数据类型分类:

1.2自定义数据类型概述

1.3类的定义与使用

第二章 ArrayList集合

2.1集合的创建

2.2集合常用方法

例1:随机点名器

例2:库存管理案例


第一章 引用数据类型(类)

1.1引用数据类型分类:

引用数据类型有三种:数组,类,接口。

引用数据类型(类)可以又分为:

第一种:Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供我们使用。

第二种:自定义的类,即我们自己创建的类,可以在类中包含多个方法与属性,来供我们使用。

 

1.2自定义数据类型概述

在Java中,我们将现实生活的的事物抽象成了代码。自定义的数据类型()来描述现实生活中的事物。类是引用数据类型

例如:描述一个人,我们可以写一个类来定义,属性有姓名,身高等。

 

1.3类的定义与使用

通过类Phone创建出来的变量p,它相当于我们生活中的一个盒子,里面包含了它能够使用的属性。通过 p.属性名 就可以对属性进行操作。

运行TestPhone.java时,计算机先编译生成了TestPhone.class文件,再 编译了Phone.class文件。

程序运行时,是方法数据区先有数据的。

方法数据区、方法栈、堆中的内容变化:

  • 方法数据区:TestPhone.class先进入——>类中的main方法进入——>Phone.class进入——>Phone.class中的属性color、brand、size进入。
  • 方法栈:main方法进栈,运行(运行到new Phone)
  • 堆:运行到new Phone(),为Phone对象开辟空间(有了首地址),进入堆,Phone对象的三个属性随之进入堆,并且系统为其初始化。之后将首地址传给p。
  • 全局:运行到Phone p=new Phone()时,JVM在堆内存,开辟空间(有了内存空间),存储Phone对象,Phone对象的三个属性随之进入栈,系统初始化之后将地址赋给p。方法栈中执行程序下一步,开始为三个属性赋值操作,进入堆内存,修改相应位置的值。修改之后,JVM将内存地址传递给引用类型p,此时变量p中保存的就是内存中的地址。p.属性都是堆内存中的变量。

对象内存图: 

 

两个对象的内存图:

创建引用类似变量时,只要new了,堆内存中就会开辟一个新的内存空间,并且内存中有自己的属性(类似盒子)。

 

第二章 ArrayList集合

在前面我们学习了数组,数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变。

为了保存这些数目不确定的元素,JDK中提供了一系列特殊的类,这些类可以存储任意类型的元素,并且长度可变,统称为集合。在这里,我们先介绍ArrayList集合,其他集合在后续课程中学习。

ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类)。在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。

 

2.1集合的创建

创建集合的常用格式在此说明一下:

  • 导包:import java.util.ArrayList;
  • 创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型:

          ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();

  • 注意:“<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型;

         例如: ArrayList<integer> 变量名 = new ArrayList<integer>(); //此种形式是对的

                     ArrayList<int> 变量名 = new ArrayList<in>();                   //此种形式是错的

下面给出8种基本数据类型所对应的引用数据类型表示形式:

 

package day6;
import java.util.ArrayList;
/*
ArrayList集合的使用
也是引用数据类型
步骤:
  1. 导入包 java.util包中
	 2. 创建引用类型的变量
	   数据类型< 集合存储的数据类型>  变量名 = new 数据类型 <集合存储的数据类型>  ();
	   集合存储的数据类型: 要将数据存储到集合的容器中
	   创建集合引用变量的时候,必须要指定好,存储的类型是什么
	   
	   ArrayList<String> array = new ArrayList<String>();
	  
	 3. 变量名.方法 
	 
	 注意: 集合存储的数据,8个基本类型对应8个引用类型
	 存储引用类型,不存储基本类型
*/
public class ArrayListDemo {
	public static void main() {
	ArrayList<String> array = new ArrayList<String>();
	ArrayList<Integer> array1 = new ArrayList<Integer>();
	ArrayList<Phone> array2 = new ArrayList<Phone>();
	
	}
}

 

2.2集合常用方法

ArrayList集合提供的一些常用方法:

方法补充:

package day6;
/*
集合ArrayList方法的补充

  add(int 索引,存储的元素) 将元素添加到指定的索引上
	 set(int 索引,修改后的元素) 将指定索引的元素,进行修改
	 remove(int 索引) 删除指定索引上的元素
	 clear() 清空集合中的所有元素
*/
import java.util.ArrayList;
public class ArrayListDemo_2 {
	public static void main(String[] args) {
		ArrayList<Integer> array = new ArrayList<Integer>();
		array.add(1);
		array.add(2);
		array.add(3);
		array.add(4);
		
		//向索引2上添加元素7
		array.add(2, 7);
		//System.out.println(array);//[1, 2, 7, 3, 4]

		//将第3个位置的元素改为3
		array.set(2, 3);
		//System.out.println(array);//[1, 2, 3, 3, 4]

		//删除第4个位置上的3
		array.remove(3);
		//System.out.println(array);//[1, 2, 3, 4]

		//清空
		array.clear();
		System.out.println(array);
	}

}

 

例1:随机点名器

定义Students类:

package day6;

public class Student {
		String name;
		int age;
	}

随机点名器:

改进:用集合来存储学生信息,可以添加删除。

集合中存储的是Student类

package day6;
import java.util.ArrayList;
import java.util.Random;

/*
随机点名器,集合改进 (学生的姓名和年龄)
现实中有学生这个事物,使用定义类的形式,描述学生事物
属性: 姓名,年龄

姓名存储了数组, 将容器换成是集合
String[] s = {"",""};
集合中,存储的是学生的姓名吗?  应该存储Student类型

存储学生:
   学生类型,存储到集合中
总览: 遍历集合
随机: 随机数,作为索引,到集合中找到元素
三个功能,共享的数据,集合容器,
定义三个方法,必须参数传递集合
*/

public class CallName {
	public static void main(String[] args) {
		ArrayList<Student> stu = new ArrayList<Student>();
		add(stu);
		//printArray(stu);
		RandomStudentName(stu);

}


public static void add(ArrayList<Student> array) {
	Student s1= new Student();
	Student s2= new Student();
	Student s3= new Student();
	Student s4= new Student();
	Student s5= new Student();
	s1.name = "张三";
	s1.age = 17;
	
	s2.name = "李四";
	s2.age = 18;
	
	s3.name = "王麻子";
	s3.age = 19;
	
	s4.name = "王五";
	s4.age = 15;
	
	s5.name = "李六";
	s5.age = 16;
	array.add(s1);
	array.add(s2);
	array.add(s3);
	array.add(s4);
	array.add(s5);
}

public static void printArray(ArrayList<Student> array) {
	for(int i=0;i<array.size();i++) {
		//array.get(i)获取的也是Student类型
		Student s = array.get(i);
		System.out.println(s.name+"  "+s.age);
	}
}

public static void RandomStudentName(ArrayList<Student> array) {
	Random ran = new Random();
	int number= ran.nextInt(array.size());
	Student m = array.get(number);
	System.out.println(m.name+"  "+m.age);
}
}

 

例2:库存管理案例

分析题目:

  • 商品信息之前是用多个数组存储的,现在用什么存储更好?

     商品信息用集合存储更好,不定长,可以添加,删除商品数目。

  • 集合存储的是什么?

    集合存储的是封装了商品数据的自定义类。

  • 查看商品信息(遍历操作)
  • 修改商品信息(取出+赋值操作)
  • 集合是个共享数据在main中定义(查询修改都使用集合的元素)
package day6;
import java.util.ArrayList;
import java.util.Scanner;
public class Shopp1 {
	public static void main(String[] args) {
		ArrayList<Goods> good = new ArrayList<Goods>();
		//添加商品信息
		addGoods(good);
		while(true) {
			int number = chooseFunction();
			switch(number) {
			case 1:
				printStore(good);
				break;
				
			case 2:
				//进入修改库存功能,调用修改库存的方法,传递集合
				update(good);
				break;
				
			case 3:
				return ;	
			default:
				 System.out.println("无此功能");
				 break;
			}
		}
	}
	//方法写在main外
	/*
	   定义方法,将商品的信息存储到集合中
	   集合是所有方法的共享数据,参数传递
	*/
	public static void addGoods(ArrayList<Goods> array) {
		Goods g1 = new Goods(); 
		Goods g2 = new Goods(); 
		g1.name="肥皂";
		g1.size=10;
		g1.count=20;
		g1.price=7.99;
		
		g2.name="皂粉";
		g2.size=15;
		g2.count=25;
		g2.price=29.99;
		
		array.add(g1);
		array.add(g2);
	}
	/*
	   定义方法,查看库存清单,遍历集合
	*/
	public static void printStore(ArrayList<Goods> array) {
		System.out.println("----------商场库存清单----------");
		System.out.println("名称     价格    库存数    大小");
		int totalCount = 0 ;
		double totalMoney = 0;
		for(int i=0;i<array.size();i++) {
			Goods s1 = array.get(i);
			totalCount += s1.count ;
			totalMoney +=s1.count*s1.price;
			System.out.println(s1.name+"   "+s1.price+"  "+s1.count+"   "+s1.size);
		}	
		System.out.println("总库存数: "+totalCount);
		System.out.println("商品库存总金额: "+totalMoney);
	}
	
	/*
	  方法定义,修改库存
	  键盘的输入,将Goods中的属性值,修改每个商品的库存数
	*/
	public static void update(ArrayList<Goods> array) {
		Scanner sc = new Scanner(System.in);
		
		for(int i = 0 ;  i < array.size(); i++) {
			Goods g = array.get(i);
			System.out.println("请输入"+g.name+"的库存数:");
			g.count=sc.nextInt();
		}	
	}
	/*
	   定义方法,实现选择菜单,用户根据功能选择菜单
	*/
	public static int chooseFunction(){
		System.out.println("-------------库存管理------------");
		System.out.println("1.查看库存清单");
		System.out.println("2.修改商品库存数量");
		System.out.println("3.退出");
		System.out.println("请输入要执行的操作序号:");
		Scanner sc = new Scanner(System.in);
		int number = sc.nextInt();
		return number;
	}
}

运行结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是如何在Java定义一个商品,并将其添加到ArrayList集合中。 首先,我们需要定义一个商品,可以包含商品的名称、价格、描述等属性。以下是一个简单的商品的示例: ``` public class Product { private String name; private double price; private String description; public Product(String name, double price, String description) { this.name = name; this.price = price; this.description = description; } public String getName() { return name; } public double getPrice() { return price; } public String getDescription() { return description; } } ``` 上面的代码定义了一个Product,它有三个属性:name、price、description,以及一个构造函数和三个getter方法分别用于获取属性值。 接下来,我们可以创建一个ArrayList集合,并将商品对象添加到集合中。示例如下: ``` import java.util.ArrayList; public class Main { public static void main(String[] args) { // 创建一个商品列表 ArrayList<Product> productList = new ArrayList<>(); // 创建一些商品对象并添加到列表中 Product product1 = new Product("iPhone 12", 7999.00, "最新款苹果手机"); Product product2 = new Product("华为Mate 40", 5999.00, "华为旗舰手机"); productList.add(product1); productList.add(product2); // 遍历商品列表并输出商品信息 for (Product product : productList) { System.out.println("商品名称:" + product.getName()); System.out.println("商品价格:" + product.getPrice()); System.out.println("商品描述:" + product.getDescription()); } } } ``` 上面的代码创建了一个商品列表productList,并向其中添加了两个商品对象product1和product2。然后,使用for-each循环遍历商品列表,并输出每个商品的名称、价格和描述信息。 希望这个示例能回答你的问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值