目录
第一章 引用数据类型(类)
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;
}
}
运行结果: