实验11 泛型与集合
- 格式:pdf
- 大小:50.15 KB
- 文档页数:1
第2章集合与泛型2.1 集合概述所谓集合是特殊元素们的一种聚合。
集合的元素被称为是成员。
集合有两个最重要的属性,一个是集合成员都是无序的,另一个则是集合的成员不会出现超过一次。
在计算机科学领域内集合扮演着非常重要的角色,但是不把集合包含作为C#语言的一种数据结构。
2.1.1 集合的定义人们把集合定义成相关成员的无序聚集,而且集合中的成员不会出现超过一次。
集合书写成用一对闭合大括号包裹成员列表的形式,例如{0,1,2,3,4,5,6,7,8,9}。
只要全部成员只书写一次,就可以按照任意顺序书写集合,所以此前的集合实例还可以写成{9,8,7,6,5,4,3,2,1,0}或其他任意成员组合的形式。
为了使用集合需要知道一些有关集合的定义。
1. 不包含任何成员的集合称为空集合。
全域是所有可能成员的集合。
2. 如果两个集合包含完全一样的成员,那么就认为这两个集合相等。
3. 如果第一个集合的全部成员都包含在第二个集合内,就认为第一个集合是第二个集合的子集。
2.1.2 集合的操作下面描述了在集合上执行的基本操作。
1. 联合:由第一个集合中的所有成员和第二个集合中不包含在第一个集合的成员组成的新集合。
2. 交叉:由既属于第一个集合又属于第二个集合的成员组成的新集合。
3. 差异:由属于第一个集合但不属于第二个集合的成员组成的新集合。
2.2 集合类ArrayList是与数组相当的集合类。
还有其他类型的集合:队列、栈、有序表和哈希表,如下所示:●ArrayList 动态数组●Queue 队列●Stack 栈●BitArray 位数组●Hashtable 散列表●SortedList 有序表集合类位于System.Collections命名空间,集合类可以组合为集合,存储Object类型的元素。
2.3 集合的一种实现HashTable类是.NET框架类库中较为有效的数据结构之一,它的存取速度较其它类而2.1 泛型概述泛型(Generic Type)是.NET Framework 2.0的一大特性。
第一个问题:怎么才能了解JAVA集合类?集合类是什么?数组是集合的一种,是集合的一个子集,你理解了数组就理解了集合.理解集合类集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
(1)集集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。
集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。
它实现的是SortedSet接口,也就是加入了对象比较的方法。
通过对集中的对象迭代,我们可以得到一个升序的对象集合。
(2)列表列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介绍。
(3)映射映射与集或列表有明显区别,映射中每个项都是成对的。
映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。
关键字应该是唯一的。
关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。
理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。
集合类简介java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍集:1. HashSet:使用HashMap的一个集的实现。
泛型与集合的注意事项⼀.List,List<Object>,List<?>三者区别1.List(1)List可以接受任意泛型赋值List list = new ArrayList();List list1 = new ArrayList<Object>();List list2 = new ArrayList<Integer>();(2)List可以赋值给任意类型注意遍历时可能会出现类型转换异常,这是由于list中可能存放不同类型数据导致转换不了List list = new ArrayList();list.add(111);list.add(222);List<Integer> list1 = list;list1.forEach(System.out::println);将 list.add(222) 改为 list.add("222") 再执⾏就会出错Exception in thread "main" ng.ClassCastException: ng.String cannot be cast to ng.Integerat java.util.ArrayList.forEach(ArrayList.java:1249)at code.TestDemo.main(TestDemo.java:16)2.List<Object>(1)List<Object>可以接受List赋值List list = new ArrayList();List<Object> list2 = list;(2)确定类型的集合是不可以相互赋值的List<Object>不可以赋值给List<Integer>,同时List<Integer>也不可以赋值给List<Object> 3.List<?>List<?>在接受了其他泛型赋值之后,可以删除和清除元素 list2.remove(0); , list2.clear();List<?>在接受了其他泛型赋值之后,不可以添加元素 list2.add(1); 但可以添加null元素 list2.add(null);List<?>可以获取元素但必须使⽤Object来接收,需要修改内部数据需判断之后强制类型转换再修改List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);List<?> list2 = list;list2.remove(0);list2.clear();1 List<?> list2 = new ArrayList<T>() {2 {3 add(new T(1));4 add(new T(2));5 add(new T(3));6 }7 };89 list2.add(null); //可以添加null元素10 Object obj = list2.get(1);1112if (obj instanceof T) { //强制类型装换后可以改变内部数据13 T t = (T) obj;14 System.out.println(t.i);15 t.i = 3;16 }1718 obj = list2.get(1);19if (obj instanceof T) {20 System.out.println(((T) obj).i);21 }⼆.<? extends T>和<? super T>1.<? extends T>(1)只允许接受T类型或T类型的⼦类赋值List<Integer> list1 = new ArrayList<>();List<Number> list2 = new ArrayList<>();List<? extends Number> list = list1;list = list2;(2)不能使⽤add⽅法添加新元素,只能添加null不能 list.add(1);List<Integer> list1 = new ArrayList<>();list1.add(1);list1.add(2);List<? extends Number> list = list1;list.add(null);(3)取出元素只能使⽤T类型以及T类型的⽗类接收List<Integer> list1 = new ArrayList<>();list1.add(1);list1.add(2);List<? extends Number> list = list1;Number number = list.get(0);Object number1 = list.get(0);2.<? super T>(1)只允许接受T类型或T类型的⽗类赋值List<Integer> list1 = new ArrayList<>();List<Number> list2 = new ArrayList<>();List<? super Integer> list = list1;list = list2;(2)只能使⽤add⽅法添加T类型元素或T类型的⼦类型元素List<Integer> list1 = new ArrayList<>();List<? super Integer> list = list1;list.add(new Integer(1));(3)取出类型只能使⽤Object类型接收List<Object> list1 = new ArrayList<>();list1.add(new Animal());list1.add(new Person());list1.add(new Man());List<? super Man> list = list1;Object obj = list1.get(1);三.注意事项1.List<Parent> 与 List<Child>没有⽗⼦关系也不是同⼀个关系1 List<Number> list = new ArrayList<Integer>(); //报错1public static class MyList<T> {2 List<T> list = new ArrayList<>();34// 把输⼊参数塞给⾃⼰,类似于⽣产操作5public void pushList(List<T> t) {6 list.addAll(t);7 }89// 把⾃⼰的内容塞给输⼊参数,类似于让输⼊参数做消费。
泛型集合方法
嘿,朋友们!今天咱来聊聊“泛型”“集合”还有“方法”这些超厉害的东西!
就比如说泛型吧,你可以把它想象成一个超级灵活的盒子!哇塞,啥都能往里装!比如说,你要创建一个可以放各种不同类型东西的容器,这时候泛型就派上大用场啦!“为啥不直接指定类型呢?”你可能会问。
嘿嘿,那可不一样哦!就好比你有个盒子,今天你可能想装苹果,明天也许就想装橙子啦,泛型就让你的代码变得像孙悟空一样神通广大,能应对各种不同的情况!
再来说说集合。
集合就像是一个大部队,里面有好多好多成员呢!想象一下,你有一堆玩具,把它们放在一个箱子里,这箱子就是集合呀!可以轻松地对这些成员进行各种操作,增删改查,易如反掌!比如你有一群朋友的名单,你就可以用集合来管理他们,多方便!
还有方法呢,方法就像是一个个小魔法!当你需要做一件事情的时候,就调用对应的方法。
好比你饿了,就调用“做饭”这个方法,嘿,马上就能有吃的啦!
有一次,我和小伙伴在写代码的时候,就为了用泛型还是不用泛型争论起来。
我就觉得泛型简直太棒了,那么灵活,以后修改也方便呀!他还不太理解,我就给他详细解释,最后他恍然大悟!“原来泛型这么好啊!”他惊叹道。
总之,泛型、集合和方法,它们就像是代码世界里的黄金搭档,相互配合,让我们的编程之路变得更加精彩!它们能让我们的代码更简洁、更强大、更高效!这难道还不让人兴奋吗?所以呀,大家一定要好好掌握它们,让它们为我们的代码增光添彩!。
浙江大学城市学院实验报告课程名称面向对象程序设计实验项目名称集合框架与泛型学生姓名专业班级学号一. 实验目的和要求1. 了解Java集合框架的接口和实现类2. 理解泛型类、泛型接口、泛型方法的特点3. 掌握List<E>接口及其实现类LinkedList<E>、ArrayList<E>4. 了解Set<E>接口及其实现类HashSet<E>、TreeSet<E>5. 了解Map<K,V>及其实现类HashMap<K,V>、TreeMap<K,V>二. 实验内容1. 分析Java集合框架的接口和实现类的组成2. 分析泛型类、泛型接口、泛型方法的特点3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象)4. 选作-编程实现:设计学生管理类StudentManager(用Set集合管理学生对象)5. 选作-编程实现:设计学生管理类StudentManager(用Map管理学生对象)三. 实验结果与分析(可将程序运行结果截屏,也可分析运行结果)1. 分析Java集合框架的接口和实现类的组成请查阅书籍和Java帮助文档,说明Java集合框架的接口组成以及它们的继承关系,并针对每个接口给出具体的实现类。
答:2. 分析泛型类、泛型接口、泛型方法的特点请查阅书籍和Java帮助文档,举例说明泛型类、泛型接口、泛型方法的特点。
答:3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象)。
StudentManager类的功能包括添加学生、查询学生、删除学生、统计学生成绩等。
需要设计表示学生对象的Student类,并用LinkedList或ArrayList集合来管理可被数量的学生对象。
另外还需要设计测试类Test来验证StudentManager的功能。
集合类和泛型⼀、集合类集合类和数组同是容器,有何不同?1.数组的长度是固定的,集合类的长度不固定2.数组存储基本类型,集合类存储对象,集合中不能存基本数据类型。
集合容器因为内部数据结构不同,有多种具体容器。
不断向上抽取,就形成了集合框架。
框架的顶层为Collection接⼝。
(⼀)LIst有序的Collection,此处有序是指数据存⼊的顺序。
特点:1.有序,存⼊和取出的顺序⼀致2.所有元素有⾓标(素引)LIst常见的特有⽅法有⼀个共同的特点,就是可以操作⾓标。
List list=new ArrayList();list.add("a1");list.add("a2");Iterator it=list.Iterator();while(it.hasNext()){Object obj=it.Next();if (obj.equals("a2")){list.add("a3");}}上述代码在执⾏时是错误的,因为List类的迭代器在使⽤时容器长度是固定的,不能在迭代时修改容器的长度。
要修改上述错误,我们不能在迭代时修改容器的长度,但是我们可以修改迭代器的长度。
可以使⽤Iterator接⼝的⼦接⼝ListIterator来实现。
代码如下:List list=new ArrayList();list.add("a1");list.add("a2");Iterator it=list.listIterator(); //使⽤列表迭代器while(it.hasNext()){Object obj=it.Next();if (obj.equals("a2")){it.add("a3"); //使⽤迭代器的插⼊⽅法}}List接⼝的有三种:(⼀般除了Vector外,都是不同步的。
如何使用泛型与泛型集合泛型是一种在编程中广泛应用的概念,它使得代码更灵活,可重用,并提高了代码的类型安全性。
在这篇文章中,我们将详细介绍什么是泛型以及如何使用泛型和泛型集合。
一、什么是泛型泛型是一种参数化类型的概念,它可以在类、接口、方法中使用。
它允许我们在编译时指定类型参数的具体类型,从而实现代码的重用和灵活性。
泛型的主要优点是:1.类型安全:使用泛型可以在编译时进行类型检查,避免运行时出现类型错误。
2.代码重用:泛型允许我们编写通用的算法和数据结构,在不同的类型上重用。
3.程序可读性提高:泛型代码可以提高程序的可读性和可维护性,因为代码中的类型信息更明确。
二、使用泛型1.声明泛型类在 Java 中,我们可以通过在类名后面使用尖括号插入类型参数来声明泛型类。
例如:```public class GenericClass<T>private T value;public T getValureturn value;}public void setValue(T value)this.value = value;}```上面的代码中,`GenericClass` 是一个泛型类,`<T>` 表示类型参数,可以在类的其他成员中使用这个类型参数。
2.使用泛型类使用泛型类时,需要通过实际类型替换类型参数。
例如:```GenericClass<Integer> genericClass = new GenericClass<>(;genericClass.setValue(10);System.out.println(genericClass.getValue(); // 输出 10```在上面的代码中,`GenericClass<Integer>` 表示实际的类型参数是`Integer`,所以 `setValue` 方法只接受 `Integer` 类型的参数。
实验报告课程名称.NET程序设计实验项目.NET集合与泛型专业计科班级 1 姓名学号指导教师实验成绩年月日一、实验目的(介绍本次实验的预期目标,完成的功能)1.初步掌握常用集合的创建和操作方法。
2.初步掌握索引器的定义与使用。
3.初步掌握泛型接口、泛型类、泛型属性和泛型方法的使用。
4.初步理解C#程序的特点。
二、实验过程(介绍实验中涉及的关键过程,如核心算法、数据结构等)1.编写一个电脑信息类:包括电脑的型号、价格和出厂日期。
程序应根据用户输入的型号来显示相应的电脑信息。
要求使用Hashtable对象存储电脑信息,并且按照型号排列输出,可以输入一个型号,程序检查判断集合中是否存在该型号的电脑,如果存在则显示具体信息。
并可以通过输入型号,删除某型号的电脑。
选择“文件”→“新建”→“项目”菜单命令,弹出“新建项目”对话框,在“模板”列表框中选择“控制台应用程序”。
首先创建一个Computer类,属性有电脑型号、价格、出厂日期,构造函数里赋值。
代码如图1-1所示:图1-1 Computer类源代码然后写一个静态方法,将电脑的详细信息再作为一个元素存在Hashtable 集合中。
代码如图1-2所示:图1-2 “输入电脑信息”方法源代码编写一个按型号排序电脑信息的静态方法,借助ArrayList的排序功能来实现,并且在屏幕打印出排序后的电脑信息。
如图1-3所示:图1-3 “按电脑型号排序”方法源代码编写一个查询电脑信息的静态方法,用户需要输入电脑型号,如果存在该型号的电脑就在屏幕打印该电脑的详细信息,如果不存在就提示用户“您所输入的型号不存在!”。
如图1-4所示:图1-4 “查询电脑信息”方法源代码编写一个删除电脑信息的静态方法,用户需要输入电脑型号,如果存在该型号的电脑就删除对应的电脑信息,并提示“该型号电脑信息已删除!”。
如果不存在就提示用户“您所输入的型号不存在!”。
如图1-5所示:图1-5 “删除电脑信息”方法源代码最后编写了一个菜单方法,用户可以在屏幕输入选项来执行相应功能。
集合及泛型的使用实验1、在main方法中运用ArrayList实现三人斗地主游戏中的发牌功能,具体如下:(1) 创建两个String类型数组,其中一个用于存储牌的花色("黑桃", "红桃", "梅花", "方块"四种花色),一个用于存储牌的数字("A", "2", "3", "4",..."K"十三种数字);(2) 创建一个ArrayList集合作为牌盒,先将不同花色不同数字的牌循环添加到集合中,最后别忘了将”大王”,”小王”也添加到ArrayList集合中;(3) 用Collections工具类的shuffle()方法洗牌。
如:Collections.shuffle(al) //al为一集合对象,该方法用于打乱al中元素的顺序(4) 创建三个ArrayList集合作为三个人的牌的集合,并循环发牌,共发51张牌,留三张底牌;(5) 打印出三个人的牌和集合中留的三张底牌。
mport java.util.ArrayList;import java.util.Collections;import java.util.List;public class PokerTest{public static void main(String[] args){ArrayList<String> box = new ArrayList<String>();String[] arr = {"黑桃","红桃","梅花","方块"};String[] arr2 = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};for (int i = 0; i < arr.length; i++){for (int j = 0; j < arr2.length; j++){box.add(arr[i]+arr2[j]);}box.add("大王");box.add("小王");}Collections.shuffle(box);ArrayList<String> zhangsan = new ArrayList<String>();ArrayList<String> lisi = new ArrayList<String>();ArrayList<String> me = new ArrayList<String>();for (int i = 0; i < box.size()-3; i++) {if(i%3 == 0) {zhangsan.add(box.get(i));}else if(i%3 == 1) {lisi.add(box.get(i));}else if(i%3 == 2) {me.add(box.get(i));}}System.out.println("zhangsan:"+zhangsan);System.out.println("lisi:"+lisi);System.out.println("me:"+me);System.out.println("底牌:");System.out.println(box.get(box.size()-1));System.out.println(box.get(box.size()-2));System.out.println(box.get(box.size()-3));}}2、按要求完成功能:(1) 设计Employee类,该类有成员变量(属性)工号—eno(String类型)、姓名—name(String类型)、年龄—age(int类型)、工资—salary(double类型)等,且为私有的,该类有对成员变量(属性)初始化的构造方法、设置成员变量(属性)的set方法以及获得成员变量(属性)的get方法;(2) 创建3个Employee对象,基本信息如下:工号姓名年龄工资001 张三 25 3000002 李四 27 4000003 王五 28 5500(3) 创建泛型的Map集合,保存以上三个Employee对象,其中Key为工号,value为Employee对象,对该Map进行遍历,输出所有职工信息。
Java语言程序设计C实验报告集合框架及泛型机制学生姓名专业、班级指导教师成绩计算机与信息工程学院年月日一、实验目的学习课程相关章节知识,通过上机练习,掌握以下知识:1.掌握List接口下ArrayList及LinkedList的使用方法。
2.掌握Map接口下HashMap 及HashTable的使用方法3.掌握集合中泛型的使用二、实验内容利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息,字段如下: id ,name,age,实现步骤:(1)创建类,类图如下:(2)在main方法编写逻辑代码(3)运行程序并测试结果package com、cn;public class Student {private String name;private int age;private String id;public String getName() {return name;}public void setName(String name) {this、name = name;}public int getAge() {return age;}public void setAge(int age) {this、age = age;}public String getId() {return id;}public void setId(String id) {this、id = id;}public Student(String name, int age, String id) {super();this、name = name;this、age = age;this、id = id;}public void sayHi(){System、out、println("name="+this、getName()+"age="+this、getAge()+" "+"id="+this、getId());}}//Databace类package com、cn;import java、util、Collection;import java、util、HashMap;import java、util、Iterator;public class Databace {private Student a;public Databace() {super();map=new HashMap<String,Student>();}public Student getA() {return a;}public void setA(Student a) {this、a = a;}HashMap<String,Student> map;public void delete(){System、out、println("请输入要删除表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){map、remove(id);Collection<Student> c=map、values();Iterator<Student> it=c、iterator();while(it、hasNext()){a=it、next();a、sayHi();}}else{System、out、println("表中没有该元素");}}public void insert(){System、out、println("按顺序输入id、age、name");String name=Test、sc、next();int age=Test、sc、nextInt();String id=Test、sc、next();a=new Student(name,age,id);map、put(id, a);System、out、println("成功的插入一条记录");}public void update(){System、out、println("请输入要修改表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){map、remove(id);System、out、println("按顺序输入name,age,id");id=Test、sc、next();String name=Test、sc、next();int age=Test、sc、nextInt();a=new Student(id,age,name);map、put(id, a);}else{System、out、println("表中没有该元素");}}public void select(){System、out、println("请输入要查询的方式1、查询单行2、查询全部");int i=Test、sc、nextInt();switch(i){case 1:{System、out、println("请输入要查询表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){a=map、get(id);a、sayHi();}else{System、out、println("表中没有该元素");}}break;case 2:{Collection<Student> c=map、values();Iterator<Student> it=c、iterator();while(it、hasNext()){a=it、next();a、sayHi();}}break;}}}//testpackage com、cn;import java、util、*;public class Test {/*** @param args*/public static Scanner sc=new Scanner(System、in);public static void main(String[] args){// TODO Auto-generated method stuint i=0;Databace d=new Databace();while(i==0){System、out、println("1、储存学生信息");System、out、println("2、查询学生信息");System、out、println("3、修改学生信息");System、out、println("4、删除学生信息");System、out、println("退出");int j=Test、sc、nextInt();switch(j){case 1:d、insert();break;case 2:d、select();break;case 3:d、update();break;case 4:d、delete();break;default:i=1;}}}}提示:用id做map集合的键部分,用student对象做map集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
实验十泛型与集合框架1.实验目的1、掌握LinkedList<E>类和Collections类提供的用于排序和查找链表中的数据的方法2、掌握用散列映射来存储数据3、掌握TreeSet<E>类的使用2.实验内容1、根据附录里的源代码,按照注释要求,完成代码填空,使程序能够运行得出结果。
1)实验1 按身高排序2)实验2 英汉小字典3)实验3 演出节目单4)实验4输出args[]中的单词2、设计编写程序完成以下任务。
1)仿照实验1编写TV类,要求通过实现Comparable接口规定该类的对象的大小关系,按price值得大小确定大小关系,即电视机按其价格确定之间的大小关系。
2)从控制台输入若干个单词(输入回车结束)放入集合中,将这些单词排序后(忽略大小写)打印出来。
知识点:List接口的实现类、String常用方法3)请使用LinkedList来模拟一个队列(先进先出的特性):(1)拥有放入对象的方法void put(Object o)(2)取出对象的方法Object get()(3)判断队列当中是否为空的方法boolean isEmpty();并且,编写测试代码,验证你的队列是否正确。
知识点:List接口的实现类LinkedList常用方法4)在一个列表中存储以下元素:apple,grape,banana,pear(1)返回集合中的最大的和最小的元素(2)将集合进行排序,并将排序后的结果打印在控制台上知识点:Collections类中的方法3.实验步骤略4.评分标准1.A——内容功能完善,编程风格好,人机接口界面好;2.B——内容功能完善,编程风格良好,人机接口界面良好;3.C——完成必做内容;4.D——能完成必做内容;5.E——未按时完成必做内容,或者抄袭(雷同者全部为E).参照书上实验按模版要求,将【代码】替换为Java程序代码,编写好完整的程序文档,最后运行得到的相关文件,把实验所得文件一起打包上交。
实验11泛型与集合
实验目的及要求:
(1)熟悉泛型的概念及用法;
(2)熟悉java的集合框架原理;
(3)掌握常用的集合及泛型类的用法:LinkedList<E>、HashSet<E>、HashMap<K,V>、TreeMap<K,V>、 TreeSet<E>;
实验内容:
(1)定义一个泛型类Instrument<E >,其中包括一个泛型方法void play(E x)。
定义两种乐器类:Cello、Violin可以进行演奏。
定义一个测试类进行测试。
(2)输入10个数字保存到List中,并按倒序显示出来。
(3)编写一个程序,把学生名和考试分数录入到Map中,并按分数显示前三名学生的名字。
要求定义Student类,封装学生名和考试分数2个属性及方法。