Java语言程序设计:第7章 对象群体的组织
第七章第七章 对象群体的组织对象群体的组织JAVA语言程序设计目录目录l7.1 对象数组对象数组l7.3 集合(集合(Collection, Map)l7.4 本章小结本章小结27.1 对象数组对象数组l数组数组在Java提供的存储及随机访问对象序列的各种方法中,数组是效率最高的一种l类型检查l边界检查优点l数组知道其元素的类型l编译时的类型检查l大小已知代价l数组对象的大小是固定的,在生存期内大小不可变3l对象数组对象数组数组元素是类的对象所有元素具有相同的类型每个元素都是一个对象的引用对象数组7.1 对象数组对象数组(续续)4l静态初始化:在声明和定义数组的同时对数组元素静态初始化:在声明和定义数组的同时对数组元素进行初始化,例如:进行初始化,例如:BankAccountaccounts=newBankAccount(“Zhang,100.00),newBankAccount(“Li,2380.00),newBankAccount(“Wang,500.00),newBankAccount(“Liu,175.56),newBankAccount(“Ma,924.02);l动态初始化:使用运算符动态初始化:使用运算符new,需要经过两步:需要经过两步:首先给数组分配空间typearrayName=newtypearraySize;然后给每一个数组元素分配空间arrayName0=newtype(paramList);arrayNamearraySize-1=newtype(paramList);7.1.1 用数组存储对象用数组存储对象(续续) 对象数组的初始化对象数组的初始化对象数组5l使用数组存储一个班的学生信息及考试成绩。学生使用数组存储一个班的学生信息及考试成绩。学生信息包括学号、姓名、三门课(英语、数学、计算信息包括学号、姓名、三门课(英语、数学、计算机)的成绩及总成绩。机)的成绩及总成绩。l首先声明学生类首先声明学生类Student属性包括l学号(id),姓名(name),英语成绩(eng),数学成绩(math),计算机成绩(comp),总成绩(sum)方法包括l构造方法,get方法,set方法,toString方法,equals方法,compare方法(比较两个学生的总成绩,结果分大于,小于,等于),sum方法(计算总成绩)实现Serializable接口,以便对象持久化,7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组6importjava.io.*;publicclassStudentimplementsSerializableprivateStringid;/学号privateStringname;/姓名privateinteng;/英语成绩privateintmath;/数学成绩privateintcomp;/计算机成绩privateintsum;/总成绩publicStudent(Stringid,Stringname,inteng,intmath,intcomp)this.id=id;this.name=name;this.eng=eng;this.math=math;p=comp;sum();/计算总成绩7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组7publicStudent(Students)this.id=s.id;this.name=newString(s.name);this.eng=s.eng;this.math=s.math;p=p;sum();/计算总成绩publicvoidsetId(Stringid)this.id=id;publicvoidsetName(Stringname)this.name=name;7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组8publicvoidsetEng(inteng)this.eng=eng;sum();/计算总成绩publicvoidsetMath(intmath)this.math=math;sum();/计算总成绩publicvoidsetComp(intcomp)p=comp;sum();/计算总成绩publicStringgetId()returnid;7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组9publicStringgetName()returnname;publicintgetEng()returneng;publicintgetMath()returnmath;publicintgetComp()returncomp; publicintgetSum()returnsum;voidsum()this.sum=eng+math+comp;7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组10publicStringtoString()returngetId()+t+getName()+t+getEng()+t+getMath()+t+getComp()+t+getSum();publicbooleanequals(Objectx)if(this.getClass()!=x.getClass()returnfalse;Studentb=(Student)x;return(this.getId().equals(b.getId(); /比较成绩大小,当前对象成绩比参数对象成绩大时返回1,相等时返回0,其它返回-1.publicintcompare(StudentA)if(this.getSum()A.getSum()return1;elseif(this.getSum()=A.getSum()return0;elsereturn-1;7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组11l下面声明班级类下面声明班级类StudentClass:属性包括l班级名称(name),容量(capacity),学生(students),实际人数(size)。方法包括l构造方法,get方法,set方法,toString方法。public class StudentClassprivate String name; /班级名称班级名称static int capacity = 40; /最大容量最大容量private Student students; /学生学生private int size; /实际人数实际人数7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组12publicStudentClass(Stringname,intsize)this.name=name;this.size=size;students=newStudentcapacity;publicStringgetName()returnname;publicintgetCapacity()returncapacity;publicStudentgetStudents()returnstudents;7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组13publicintgetSize()returnsize;publicvoidsetName(Stringname)this.name=name;publicvoidsetCapacity(intcapacity)this.capacity=capacity;publicvoidsetSize(intsize)this.size=size;publicvoidsetStudents(Studentstudents)for(inti=0;isize;i+)this.studentsi=newStudent(studentsi);7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组14publicStringtoString()Strings;s=班级:+name+t+容量:+capacity+t+实际人数:+size+nn;s=s+“学号”+“t”+“姓名”+“t”+“英语”+“t”+“数学”+“t”+“计算机”+t+总成绩n;for(inti=0;isize;i+)s=s+studentsi.getId()+t+studentsi.getName()+t+studentsi.getEng()+t+studentsi.getMath()+t+studentsi.getComp()+t+studentsi.getSum()+n;returns;7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组15l下面声明测试类下面声明测试类Tester1(其中其中Keyboard类的声明见第类的声明见第3章例章例3-12),为测试简单,仅生成具有),为测试简单,仅生成具有5名学生的班级,名学生的班级,5名学生的信息从键盘输入,为了避免以后再重复输入,名学生的信息从键盘输入,为了避免以后再重复输入,可将输入的学生信息保存到文件可将输入的学生信息保存到文件中中import java.io.*;public class Tester1public static void main(String args)Student students;StudentClass aClass = new StudentClass(软件软件0201,5); students=new Student5;for (int i=0; i5; i+) studentsi = new Student(getAStudent(i+1);aClass.setStudents(students);System.out.println(aClass);7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组16/将学生信息保存到文件将学生信息保存到文件stu.ser中。中。try FileOutputStream fo = new FileOutputStream(stu.ser); ObjectOutputStream so = new ObjectOutputStream(fo); for (int i=0; i5; i+) so.writeObject(studentsi); so.close(); catch(Exception e) System.out.println(e) ; 7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组17public static Student getAStudent(int i)Student studenti; System.out.println(输入第输入第 + i + 个学生的信息个学生的信息:); System.out.print(学号学号:); String id = Keyboard.getString(); System.out.print(姓名姓名:); String name = Keyboard.getString(); System.out.print(英语成绩英语成绩:); int eng = Keyboard.getInteger(); System.out.print(数学成绩数学成绩:); int math = Keyboard.getInteger(); System.out.print(计算机成绩计算机成绩:); int comp = Keyboard.getInteger(); studenti = new Student(id,name,eng,math,comp); return studenti; 7.1.1 用数组存储对象用数组存储对象(续续) 例例7_1对象数组18l运行结果如下(其中学生信息的输入只显示一部分):运行结果如下(其中学生信息的输入只显示一部分):输入第1个学生的信息:学号:250201姓名:李红英语成绩:88数学成绩:76计算机成绩:60输入