J 程 序 设 计任务5:学生基本信息管理模块实现 目录1、任务描述本任务采用面向对象程序编程方法来实现学生基本信息管理子模块的主要功能: 学生信息的添加、删除、修改和显示。完成本任务需要了解和掌握面向对象程序设计方法,掌握Java中类与对象的使用。 技术准备2.1 类与对象面向对象程序设计思想是一种更加符合人类思维习惯的编程思想,主要是针对大型软件设计而提出的,使得软件设计更加灵活,能够很好 地支持代码复用和设计复用,使代码具有更好的可读性和可扩展性,大幅度降低了软件开发的难度。Java完全采用了面向对象的程序设计思想, 是真正面向对象的高级编程语言,支持封装、继承、多态等面向对象的基本功能。2.1 类与对象面向对象程序设计中,程序的基本单元是类。 类是对具有相同属性和行为的一组实例对象的抽象,一个类包含数据(描述类的属性)和方法(对数据的操作)两部分。例如,每个学生都有学号、 姓名、成绩等属性,都有对这些属性的操作(例如设置学生信息、读取学生信息等)。因此,可以将描述学生属性的数据(学号、姓名、成绩)和对 数据进行操作的方法(设置学生信息、读取学生信息)封装在一起,形成一个学生类,每个学生都是学生类的一个具体实例对象。类与对象的关系就 如数据类型和数据之间的关系:类是对象的抽象;而对象则是类的具体实例。类中用于描述对象属性的数据称为成员变量,描述对象行为的操作称为 成员方法,成员变量和成员方法统称为类的成员。2.1 类与对象1. 类的定义[修饰符] class 类名{ 类成员定义;}说明:( 1)类修饰符可以省略,也可以使用public、final、abstract,final与abstract不能同时出现。可简记成:[ public] [final | abstract]。(2)类名为自定义的类的名字,须遵循标识符命名规则。通常情况下建议类名首字母 大写。(3)类的成员包括成员变量和成员方法,不论是哪种成员,可以是0个或多个,根据需要来定义。2.1 类与对象(4)成员变量定义 格式如下:[修饰符] 数据类型 变量名 [=值];成员变量修饰符可以省略,也可以是public、private、protected 、final、static。其中public、private、protected三个最多只能出现其中之一,可以与final、sta tic组合起来修饰成员变量。简记成:[public | private | protected] [final] [static] 。2.1 类与对象(5)成员方法定义格式如下:[修饰符] 返回值类型 方法名([形参表]){ 方法体; }成员 方法修饰符可以省略,也可以是public、private、protected、final、abstract 、static,其中p ublic、private、protected三个最多只能出现其中之一;abstract与final两者最多只能出现其一,它们可与 static组合起来修饰方法。成员方法修饰符可简记成:[public | private | protected] [final | abstract] [static]。2.1 类与对象【例 5?1】定义一个学生类成员变量成员方法2.1 类与对象2. 对 象的创建类定义好后,就可以通过该类来实例化一个对象。格式:类名 对象名 = new 类名();例创建一个学生类对象:Student stu = new Student();上述代码首先声明了一个对象变量,然后为其分配存储空间。这两步通常合并在一起写,也可分开写 成如下形式:Student stu; stu = new Student(); 与数组类似,类也是一种引用数据类 型,因此上述代码中的stu也是一个引用类型变量,stu本身存放在栈内存中,而stu指向的真正的对象则是存储在堆内存中。2.1 类 与对象3. 对象的使用对象创建完毕,就可以使用该对象。通过成员运算符“.”来访问对象的成员变量或调用成员方法。格式:对象名.成员变 量名对象名.成员方法名([实参表])2.1 类与对象【例 5?2】对象的使用示例(类与测试类在不同文件中)。2.1 类与对象【 例 5?2】对象的使用示例(类与测试类在同一文件中)。2.1 类与对象【例 5?2】对象的使用示例(直接在类中添加一个main( )方法测试类的使用)。2.1 类与对象4. 构造方法构造方法(也叫构造器)是类的一个特殊方法,在实例化对象时由系统自动调用,如果 没有显示定义该方法,系统会调用缺省构造方法。该方法通常用于初始化对象,如为成员变量设置初始值或进行其他必要的初始化工作。构造方法定 义格式:[修饰符] 方法名 ([形参表]){ 方法体;}2.1 类与对象说明:(1)构造方法的方法名必须与类名相同。(2)方法名 前面没有返回值类型的声明。(3)方法体中不能使用return 语句返回值。(4)构造方法的修饰符通常采用public或省略。(5) 一个类中如果没有显式地定义构造方法,系统会自动提供一个默认的无参构造方法。(6)一旦为类定义了构造方法,系统将不再提供默认的无参构 造方法。2.1 类与对象【例 5?3】构造方法应用示例2.1 类与对象构造方法重载构造方法与成员方法一样,都支持方法重载。在一 个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。2.1 类与对象【例 5?4】构造方法的重载2.1 类与对象5. this关键字Java中提供了一个关键字this来指代当前对象,用于在方法中访问对象的成员。this关键字的常见用法 有2种。一是通过this调用构造方法,二是通过this调用成员变量。用法1:通过this调用构造方法。此种方式主要用于实现代码的复 用。当类的一个构造方法中的一段代码与另一个构造方法中的代码完全相同时,就没必要再重复编写,可通过关键字this来直接调用该构造方法 ,其使用格式:this([实参表])2.1 类与对象用法2:通过this调用成员变量。此种方式主要用于解决成员变量名与局部变量名 相冲突问题。成员变量是定义在类中的变量,局部变量指的是定义在方法中的变量。在一个方法中允许局部变量与成员变量同名,但此时在方法中直 接通过变量名访问到的将是局部变量而非成员变量。这时就可通过在变量名前加this关键字来指明访问成员变量。此种应用场景也多出现在构造 方法中。构造方法通常用于为成员变量赋值,其形参名通常都采用与成员变量相同的名字,以减少变量命名。2.1 类与对象【例 5?5】t his关键字使用示例(1)使用this调用构造方法的语句必须是该方法的第一条执行语句。(2)只能在构造方法中使用this关键字调用 该类的其他构造方法,不能在成员方法中使用。2.1 类与对象6. static关键字Java中的static关键字可以用来修饰成员 变量或成员方法。用static修饰的成员变量为类变量(也有的称为静态变量),没有用static修饰的成员变量为实例变量;用stat ic修饰的成员方法为类方法(或称为静态方法),没有用static修饰的成员方法为实例方法。类变量和类方法是属于类本身的成员变量和成 员方法,由该类的所有实例对象共享。无论通过何种方法修改了类变量,该类的所有对象都会受到影响。2.1 类与对象实例变量和实例方法是 属于每个具体实例对象的成员变量和成员方法,不同实例对象之间,实例成员相互独立。任何对象改变了自身的成员变量或调用其成员方法时,其他 对象不受影响。类变量和类方法既可以通过对象名访问或调用,也可以在不实例化对象的情况下直接通过类名进行访问或调用。实例变量和实例方法 只能通过对象名来访问或调用。实例方法中既可以访问实例变量,也可以访问类变量。类方法中则只能访问类变量,而不能访问实例变量。2.1 类与对象【例 5?6】static关键字使用示例。2.2 类的组织项目开发中,一个项目可能会包含若干个类,为了方便对类进行组织 和管理,Java中引入了包机制,它提供了相应的访问控制权限和命名管理机制。包实际上就是一个目录,一个包对应着一个目录。包名就是目录 名。目录可以有多级,即一个目录下面还可以有若干子目录,同样包也可以有多级,一个包下面还可以有子包。目录与子目录之间通常用“\”分隔 ,形如“cn\jnvc”;而包与子包之间则以“.”分隔,形如“cn.jnvc”。2.2 类的组织1. 包的创建包的创建通过pac kage语句实现,格式:package 包名说明:(1)包名须满足标识符命名规则,通常情况下包名全部采用小写字母。(2)在不考虑注 释和空行的情况下,package语句应位于源文件中的第一行。(3)一个源文件中只能出现一次package语句。2.2 类的组织2 . 包的导入同一包中的类可以直接通过类名使用,不同包中的类不能直接通过类名使用。当一个包中的类要使用另一个包中的类时,通常有2种方 法:一是使用完整类名引用包中的类,即在类名前面加上完整的包名,形如“cn.jnvc.Student”,二是使用import语句导入 包中的类。当使用了import 把其他包中的类导入进来后,就可直接通过类名来使用该类。2.2 类的组织import语句使用格式: import 包名.类名说明:(1)import 语句通常出现在package语句之后、类定义之前。(2)import语句可根据需 要出现多次。(3)可使用“import 包名.”来导入包中所有的类。2.2 类的组织3. Java中常用包在JDK中,不同功能 的类都放在不同的包中,其中Java的核心类主要放在java包及其子包下,Java扩展的大部分类都放在javax包及其子包下。下面列 举了Java中常用的一些包。(1)java.lang:java语言的核心类,如String、Math、System等,使用这个包下 的类无须导入,系统会自动导入该包下所有的类。(2)java.util:java的一些工具类和集合类,如Arrrays、List、S et等。(3)java.net:网络编程相关的类和接口。(4)java.io: 输入输出编程相关的类和接口。(5)java.tex t:格式化相关的类。(6)java.sql:JDBC编程的相关类和接口。2.3 访问权限在Java中,针对类、成员方法和成员变量 提供了4种不同级别的访问控制权限,访问级别由小到大分别是private、default、protected和public。(1)p rivate(私有的):如果类的成员被private访问控制符来修饰,则这个成员只能被其定义所在的类访问,其他类无法直接访问。(2 )default(默认):如果一个类或者类的成员不使用任何访问控制符修饰,则称它为默认访问控制级别,这个类或者类的成员只能被本包中 的其他类访问。(3)protected(受保护的):如果一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下 的其他类访问,也能被不同包下该类的子类访问。(4)public(公共的):这是一个最宽松的访问控制级别,如果一个类或者类的成员被p ublic访问控制符修饰,那么这个类或者类的成员能被所有的类访问,不管访问类与被访问类是否在同一个包中。2.3 访问权限访问控制 级别:2.4 封装封装是面向对象的三大特性之一。类由成员变量和成员方法构成,这些成员封装在一个单个实体中,即类的封装。“强内聚, 弱耦合”,要求一个类的内部成员联系尽量紧密一些,而一个类与其他类之间联系尽量松散一些,以增强程序的健壮性、稳定性。要实现这种“强内 聚,弱耦合”,就是尽可能地把类的成员声明为私有的,只把一些少量、必要的方法声明为公有的提供给外部使用。通常情况下不允许外界直接访问 对象的成员变量,因此一个封装良好的类中成员变量都应声明为私有的,然后为这些私有成员变量提供相应的getXX()和setXX()方法 ,这些方法应用public修饰,这样外界就可通过这些公共方法来获取或设置私有成员变量值。2.4 封装【例 5?7】类的封装示例2 .5 继承继承实际上是面向对象程序设计中两个类之间的一种关系。当一个类A能够获取另一个类B中所有非私有成员作为自己的部分或全部成 员时,就称这两个类之间有继承关系。继承是为代码复用和设计复用而设计的,是面向对象程序设计的重要特性之一。这种利用现有类派生出新类的 过程就称为继承。新类既拥有原有类的特性,又增加了自身新的特性。设计一个新类时,如果可以继承一个已有的设计良好的类然后进行二次开发, 无疑会大幅度减少开发工作量。在继承关系中,已有的、设计好的类称为父类或基类,新设计的类称为子类或派生类。继承分为单继承和多继承,单 继承是指任何一个子类只能有一个父类,而多继承是指一个子类可以有若干个父类。Java只支持单继承,不支持多继承。2.5 继承1. 继承定义格式继承的实现是在定义子类时在子类名后面加上关键字extends,extends后面跟上要继承的父类名。具体使用格式:[修 饰符] class 子类名 extends 父类名{ 类成员定义;}说明:(1)父类须是一个已经定义好的类。(2)子类只能继承父类 中的非私有成员。2.5 继承【例 5?8】继承使用示例2.5 继承2. 重写父类方法子类对继承自父类的方法如果不能完全满足自己 的需求,也可以根据需要进行修改,即子类对父类的方法重新改写,简称方法重写。2.5 继承【例 5?9】方法重写使用示例子类重写的方 法需要和父类被重写的方法具有相同的方法名、参数及返回值类型,而且不能使用比父类中被重写的方法更严格的访问权限。2.5 继承3. super关键字在例 5- 9中子类Student重写父类方法info()时,只是在原有父类方法的基础上又添加了新代码,显然没必要 再把父类中已有的代码重复书写,这时就可利用关键字super来调用父类方法,从而实现代码的复用。在继承时,构造方法也可以被重写,同样 如果子类中要用到父类中构造方法,也可以通过super来调用。使用格式:super.成员方法([实参表]); //sup er调用父类成员方法super([实参表]); //super调用父类构造方法2.5 继承【 例 5?10】super关键字使用示例。通过super调用父类构造方法的代码必须要位于子类构造方法的第一行。2.5 继承2.5 继承super访问父类成员变量super关键字除了可以调用父类方法外,还可以通过它访问被隐藏的父类成员变量。在继承中,子类可以定 义和父类中相同的成员变量名,此时父类同名成员变量会被隐藏,即在子类中访问该成员变量时访问到的是子类中的成员变量,而不是父类中的成员 变量,如果想访问父类中的成员变量,就可通过super来访问。格式:super.成员变量名2.5 继承【例 5?11】利用supe r访问父类成员变量2.5 继承4. Object类在Java中提供了一个Object类,它是所有类的父类,即每个类都直接或间接继 承自该类。Object类通常被称之为超类、基类或根类。当定义一个类时,如果没有使用extends关键字为这个类显示地指定父类,那么 该类会默认继承Object类。Object类本身定义了一些方法,其中最常用的一个是toString()方法,该方法作用返回对象的字 符串表示,这个字符串信息包括类名和对象的哈希值,形如“Student@1b6d3586”。实际开发中,可能不需要这样的对象信息,而 是希望能输出一些特定的信息,这时就可通过重写toString()方法来实现这种需求。2.5 继承【例 5?12】toString ()方法使用示例在输出对象名时系统会自动调用该对象的toString()方法。2.5 继承5. final关键字Java中的fi nal关键字可用于修饰类、变量和方法。被final修饰的类称为最终类,该类将不能被继承。当定义的某个类不想被继承时,就可以在定义类 时用final修饰。通常可将一些有固定作用、用来完成某种标准功能的类定义成final类,这样可避免该类被外界修改,从而可增强程序的 健壮性和稳定性。例如Java中常用的System类就是一个最终类。被final修饰的方法称为最终方法,该方法将不能被重写。如果父类 中定义的某个方法不想被子类重新改写,则可以用final修饰。说明:最终类中的方法无须再用final修饰,因为最终类本身不能被继承, 不会有子类,因此里面的方法也就不会被重写。被final修饰的变量(成员变量或局部变量)是常量,其值不允许被改变。用final修饰成 员变量时,要求在声明变量的同时必须给变量赋值,而用final修饰局部变量时,可以在声明变量的同时赋值,也可以先声明变量,再赋值(只 允许一次赋值)。2.5 继承6. 抽象类在继承中,通过方法重写可实现父类同一方法在不同子类中有不同的实现方式。有时父类本身提供的 这一方法的具体实现在各个子类中可能并不需要,这时父类就无须再给出该方法的具体实现,可将该方法定义成抽象方法。所谓抽象方法就是只有方 法声明而没有方法具体实现的方法。通过抽象方法可为各子类规定一个统一的标准,而具体实现可由各子类自行决定。当一个类中包含有抽象方法时 ,该类也必须定义成一个抽象类。2.5 继承抽象方法和抽象类定义格式:[修饰符] abstract class 类名{ [修饰符] abstract 返回值类型 方法名([形参表]); //定义抽象方法 ... //其他成员定义}说明:(1)包含抽象方法的类必须被定义成抽象类。(2)抽象类中可以不包含任何抽象方法。(3)抽象类 不可以被实例化。(4)抽象类的子类须为父类中的所有抽象方法提供实现才可以被实例化,否则它们也是抽象类。2.5 继承【例 5?13 】抽象方法和抽象类使用示例2.5 继承7. 接口如果一个抽象类的所有方法都是抽象的,可以将这个类定义成接口。接口是一种特殊的抽象 类。在接口中,除了可以有用abstract修饰的抽象方法之外,还可以有用default修饰的默认方法和用static修饰的静态方法 (类方法)。默认方法和静态方法都要有方法体。2.5 继承接口定义格式:[修饰符] interface 接口名 [extends 父接口1, 父接口2, ...]{ [public] [static] [final] 常量类型 常量名 = 常量值; [publ ic] [abstract] 方法返回值类型 方法名([形参表]); [public] default 方法返回值类型 方法名([ 形参表]){ //默认方法的方法体 } [public] static 方法返回值类型 方法名([形参表]){ //静态方法的方法体 }}说明:(1)接口修饰符可以是public或省略(省略时采用默认访问控制权限)。(2)定义接口时 ,可以使用extends同时继承多个父接口。(3)接口内部可定义多个常量和抽象方法。(4)在接口内定义常量时,可以省略“publi c static final”修饰符,系统会默认为常量添加。(5)在接口内定义抽象方法时,可以省略“public abstract ”,系统会默认进行添加。(6)定义默认方法和静态方法时,可以省略“public”,系统会自动添加。2.5 继承接口中可以包含三类 方法:抽象方法、默认方法和静态方法。静态方法可以通过“接口名.方法名”的形式直接调用,而抽象方法和默认方法需通过接口实现类的实例对 象来调用。接口实现类就是实现了该接口的一个类,通过关键字implements实现接口。具体使用格式:[修饰符] class 类名 [extends 父类名] [implements 接口1, 接口2, ...]{... }2.5 继承说明:(1)一个类可以在 继承父类的同时实现多个接口。(2)当又有继承又要实现接口时,需先继承后实现接口。即extends须位于implements之前。( 3)实现接口的类如果没有实现接口中所有的抽象方法,那么该类须定义成抽象类。(4)接口中抽象方法为public,因此实现类在实现方法 时,须显式地使用public修饰符,否则会出现缩小方法访问控制权限的错误。2.5 继承【例 5?14】接口使用示例2.5 继承 一个接口可以继承自另一个接口,即接口与接口之间也可以有继承关系。接口的继承与类继承一样都使用extends关键字实现。所不同的是类 继承只能是单继承,而接口可以是多继承,即一个接口可以继承自多个接口。2.5 继承【例 5?15】接口的继承使用示例2.5 继承 【例 5?16】在继承类的同时实现接口抽象类与接口区别:通常抽象类用于对事物的抽象,而接口用于对行为的抽象。2.6 多态多态是面 向对象编程的第三大特性。多态是指同一个方法的多种不同表现行为,即同一个方法可以有不同的实现方式。Java中的多态主要体现在方法重载 和方法重写上。通过方法重载和方法重写实现了一个方法可以实现不同的功能,做到一名多用,从而简化名称空间,方便编程,这是多态的主要作用 。方法重载指的是同一个类中可以存在多个同名方法,要求每个方法的参数类型或参数个数至少有一个不同。在调用重载的方法时,系统会自动根据 传递的参数类型或参数个数决定调用哪个方法。方法重写指的子类重新改写父类中的同名方法。在调用重写的方法时,除了可以用各子类对象去调用 重写方法之外,还可以统一用父类对象名调用,此时会涉及对象类型的转换。对象类型转换分为两种:向上转型和向下转型。2.6 多态1. 向上转型向上转型指的是可以把一个子类对象当作父类对象来引用。即在所有使用父类对象的地方,都可以用一个子类对象来代替该父类对象。将子 类对象当做父类使用时不需要任何显式声明,系统会自动完成类型之间的转换。但需要注意的是,此时无法通过父类变量去调用子类特有的方法。2 .6 多态【例 5?17】向上转型应用示例2.6 多态2. 向下转型向下转型需要显式声明,格式与强制类型转换相同。在使用向下转 型时要注意,必须将父类转换为本质子类才可以,否则会出现错误。2.6 多态【例 5?18】向下转型应用示例2.7 内部类在Jav a中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。根据内部类的位置、修饰符和定义方式的不同,内部类 可分为成员内部类、局部内部类、静态内部类和匿名内部类4种。2.7 内部类1. 成员内部类在一个类中,除了可以定义成员变量和成员方 法外,还可以定义类,这样的类称为成员内部类。在成员内部类中,可以访问外部类的所有成员,包括成员变量和成员方法,在外部类中,同样可以 访问内部类的成员变量和方法。2.7 内部类【例 5?19】成员内部类使用示例外部类名.内部类名 变量名 = 外部类对象名.new 内部类名(); 2.7 内部类2. 局部内部类局部内部类也叫做方法内部类,是在某个成员方法中定义的,其有效范围只限于成 员方法内部。在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,但局部内部类中的变量和方法只能在创建该局部内部类的方法中 进行访问,即只有在包含局部内部类的方法中才可以访问内部类的成员。2.7 内部类【例 5?20】局部内部类使用示例。2.7 内部 类3. 静态内部类静态内部类是使用static关键字修饰的成员内部类,是一种特殊的成员内部类。与普通成员内部类相比,在形式上,静态 内部类只是在内部类前增加了修饰符static,但在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时 ,可以不用实例化内部类对象直接通过内部类访问静态内部类成员。创建静态内部类对象的语法格式:外部类名.静态内部类名 变量名 = ne w 外部类名.静态内部类名();2.7 内部类【例 5?21】静态内部类使用示例。2.7 内部类4. 匿名内部类匿名内部类是一 种没有名字的局部内部类。通常用于方法参数需要一个接口实现类的情况下。在调用包含有接口类型参数的方法时,实际需要的是一个接口实现类对 象。2.7 内部类【例 5?22】接口类型参数示例为了简化代码,在调用包含有接口类型参数的方法时,无须先去定义一个接口的实现类, 然后再创建该接口的实现类对象作为方法参数传入,而是直接通过匿名内部类的形式来实现2.7 内部类【例 5?23】利用匿名内部类实现 接口类型参数匿名内部类格式:new 接口名|抽象类名(){ //方法实现代码 }2.7 内部类对于方法参数是抽象类的情况 ,也可以采用匿名内部类来实现,以达到简化代码的目的。抽象类作为方法参数与接口类型作为方法参数类似,实际需要的都不是自身,对抽象类来 说需要的是一个继承了该抽象类的子类对象,对接口而言就是一个实现了该接口的接口类对象。匿名内部类本质上是一个继承了该类或者实现了该接 口的子类匿名对象。2.7 内部类【例 5?24】利用匿名内部类实现抽象类类型参数。2.8 Lambda表达式对于接口类型参数, 采用匿名内部类可简化代码,对于那些只包含一个抽象方法的匿名内部类,还可以采用一种更简洁的表示方式,即Lambda表达式。2.8 Lambda表达式1. Lambda表达式简介一个Lambda表达式由三部分组成,分别为形参表、“->”和方法体,语法格式如下:( [形参表]) -> {方法体}说明:(1)形参表为逗号分隔的多个形参,每个形参既可以采用“类型 参数”的形式声明,也可以省略类型, 直接给出参数,系统会自动根据表达式主体进行校对和匹配。当只有一个参数时,括号也可以省略。没有参数或者有多个参数时,括号不能省略。( 2)方法体:用于实现抽象方法的方法体,也称作Lambda表达式主体,可以是一条简单语句,也可以是一个语句块,如果只有一条简单语句, 大括号{}可以省略。方法体中可以有返回值,当只有一条return语句时,return关键字可以省略,直接写要返回的表达式即可。2. 8 Lambda表达式【例 5?25】Lambda表达式使用示例2.8 Lambda表达式2. 函数式接口虽然Lambda表达 式写法简洁,却无法完全取代匿名内部类,它只适用于有且仅有一个抽象方法的接口。因为Lambda表达式是基于函数式接口实现的。所谓函数 式接口是指有且仅有一个抽象方法的接口。2.8 Lambda表达式【例 5?26】函数式接口应用示例2.8 Lambda表达式3 . 方法引用当Lambda表达式的主体只有一条语句时,在特定情况下,程序不仅可以省略包含主体的大括号,还可以通过英文双冒号“::” 的语法格式来引用方法,从而进一步简化Lambda表达式的书写。Lambda表达式支持的方法引用类型如下表所示。2.8 Lambd a表达式(1)类名引用静态方法类名引用静态方法就是通过类名对静态方法的引用。类可以是Java自带的类,也可以是自定义的普通类。例5 -27:2.8 Lambda表达式(2)对象名引用方法对象名引用方法指的是通过实例对象的名称来对其方法进行的引用。对于非静态方法 ,需要通过实例化对象去调用的情况。例5-28:2.8 Lambda表达式(3)构造器引用构造器引用指的是对类自身的构造器(构造方 法)的引用。例5-29:2.8 Lambda表达式(4)类名引用普通方法类名引用普通方法指的是通过一个普通类的类名来引用其普通成 员方法。例5-30: 任务实施3.1 类的设计与实现1. 模型类Student的设计与实现每个学生的基本信息有学号、姓名、语文成 绩、数学成绩和英语成绩等字段,设计5个成员变量用于存放学号、姓名、语文成绩、数学成绩和英语成绩,然后为每个成员变量提供相应的set 和get方法。3.1 类的设计与实现3.1 类的设计与实现3.1 类的设计与实现2. 控制器类的设计与实现在控制器类Student List中需要实现系统业务逻辑,即记录的添加、删除、修改、获取等操作。要操作的记录有若干,目前暂用数组来存放,数组长度是固定的,而 要操作的记录数量是随时变化的,可在初始化时开辟一个相对较大的数组,然后设置一个变量用于记录当前数组中实际保存的记录数。3.1 类的 设计与实现3.1 类的设计与实现3.1 类的设计与实现3.1 类的设计与实现3. 视图类的设计与实现视图类StudentView负 责与用户交互,首先展示系统功能菜单供用户选择,当用户输入相应的命令后调用相应的方法完成学生数据的添加、删除、修改和显示功能。在视图 类中需要与用户交互,接收用户的键盘输入,所以首先导入所需要的Scanner类,然后实例化一个控制器类。3.2 功能菜单显示在视图类 StudentView类添加一个显示功能菜单的方法printMenu(),以提示用户可以进行的操作。3.3 学生信息添加在Stud entView类定义一个用于添加学生信息的方法add()。在该方法中,用户根据提示输入学生的学号、姓名、语文成绩、数学成绩和英语成绩。将输入的学生信息封装到模型类Student中,然后调用控制器StudentList的添加方法,将其添加到数组中。在添加学生信息时,为避免插入重复数据(在此仅以学号作为判断依据),可在添加前先判断一下用户输入的学号是否已经存在,只有不存在时才添加,如已经存在给出相应的提示信息。在修改、删除学生信息时也会用到判断学号是否存在,在删除、修改时还需要根据学号找到其所在的下标,因此可将判断学号是否存在及根据学号找其所在下标抽象成一个单独的方法find()。3.3 学生信息添加find()方法:3.3 学生信息添加add()方法:3.4 学生信息删除在StudentView类中添加一个用于删除学生信息的delete()方法,该方法根据用户输入的学号从学生列表中将相应的记录删除。同样用户输入的学号可能存在,也可能不存在,在删除前先要判断,如果学号不存在给出相应的提示信息,如果存在就调用StudentList类的删除方法将其从数组中删除。3.4 学生信息删除3.5 学生信息修改在StudentView类中添加一个用于修改学生信息的modify()方法,该方法根据用户输入的学号进行相应记录的修改。首先判断用户输入的学号是否存在,如存在,则可输入相应的内容进行信息的修改,如不存在,给出相应的提示信息。3.5 学生信息修改3.6 学生信息显示在StudentView类中添加一个用于显示学生信息的show()方法。3.7 菜单功能处理在StudentView类中添加一个菜单功能处理方法process(),用于根据用户的输入来调用相应的方法。3.8 主方法在StudentView类中添加主方法main(),实例化一个StudentView对象,调用其process()方法。3.9 系统测试学生信息添加和显示的测试结果:3.9 系统测试学生信息修改功能的测试结果:3.9 系统测试学生信息的删除功能测试结果:J 程 序 设 计谢 谢 |
|