Java程序设计-项目驱动式教程04不同类别学生信息管理_第1页
Java程序设计-项目驱动式教程04不同类别学生信息管理_第2页
Java程序设计-项目驱动式教程04不同类别学生信息管理_第3页
Java程序设计-项目驱动式教程04不同类别学生信息管理_第4页
Java程序设计-项目驱动式教程04不同类别学生信息管理_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

讲师:XXX时间:

月目录CONTENTWS01.项目开发环境搭建02.学生成绩管理03.学生基本信息管理04.不同类别学生信息管理05.学生基本信息查找与计算目录CONTENTWS06.使用集合实现学生信息管理07.学生信息管理系统异常处理08.使用文件实现学生信息存储09.使用JDBC实现学生信息管理10.图书管理系统设计与实现项目

不同类别学生信息管理项目4不同类别学生信息管理任务一面向对象程的三大核心特性任务二

抽象类和接口知识目标掌握封装的实现方法。掌握继承的实现方法,包括

extends

super

关键字的用法,以及方法重写的方法,理解方法重写和方法重载的区别。掌握多态的实现方法。掌握抽象类和抽象方法的用法。了解接口的概念,掌握定义和实现接口的方法,以及接口中默认方法的用法。了解函数式接口的概念,掌握定义和实现函数式接口的方法。能力目标能够正确使用封装、继承和多态,并合理使用抽象类和接口实现继承和多态。能够使用接口的高级特性简化代码,提高程序的可读性。素养目标养成持续学习和不断探索的良好习惯。树立规则意识与标准化思维,增强责任意识。点击跳过情境扫码观看“不同类别学生信息管理”视频,讨论并回答下列问题问题1:学生信息管理系统中学生可以分为哪些类别?问题2:如何使用Java对不同类别学生信息进行统一管理?扫码学习不同类别学生信息管理任务一面向对象编程的三大核心特性封装原则

将必要方法设为公共以供外部调用,其余成员定义为私有,避免直接访问,确保数据安全与逻辑隔离。方法设计

私有成员通过公共的getter与setter方法访问,外部通过标准接口控制数据读写,实现可控性与扩展性。Getter方法和Setter

方法在

Java

中,Getter方法和Setter

方法是用于获取和设置类中私有成员变量的公共方法,是实现封装的重要手段。Getter

方法不接收任何参数,返回值类型与要获取的成员变量类型一致,其命名规则一般是

get

加上成员变量名,且成员变量名首字母大写,如getXxx();Setter

方法接收一个与要设置的成员变量类型相同的参数,返回值类型通常为

void,其命名规则一般是

set

加上成员变量名,且成员变量名首字母大写,如setXxx()。实例:4-1封装【问题分析】

在项目的

src

目录下新建

project4.example4_1

包,在包中定义员工类Employee,包含

name(姓名)、phone(联系方式)和

address(家庭住址)3

个私有成员变量,以及获取和设置这些变量值的

Getter

方法和

Setter

方法;然后定义测试类EmployeeTest,在类中创建

Employee

类对象,通过该对象调用

Setter

方法设置变量的值,调用Getter方法获取变量的值。【运行结果】实例:4-1封装【参考代码】/*Employee.java*/packageproject4.example4_1; //声明包publicclassEmployee{……(详见教材)

自动生成Getter方法和Setter方法

IntelliJIDEA

中可以自动生成所有变量的

Getter

方法和

Setter

方法,具体步骤是,右击添加

Getter

方法和

Setter

方法的区域,在弹出的快捷菜单中选择“生成”选项,在弹出的子菜单中选择“Getter

Setter”选项,打开“选择要生成

Getter

和Setter

的字段”对话框,按住“Ctrl”键的同时选中所有字段,最后单击“确定”按钮。自动生成Getter方法和Setter方法isa关系A类继承B类需满足“A是B”的语义关系,如Dog类继承Animal类,体现对象间的必然从属特征。。继承定义

继承表示两个类之间的从属关系,子类可继承父类成员变量与方法,并支持重新定义或扩展新内容。1.extends关键字在Java中,使用extends关键字实现类的继承。[类修饰符]class子类名extends父类名{//类体}语法格式继承不改变类成员的访问权限,也就是说,如果父类的成员定义为公共的、受保护的或默认的,那么子类继承的成员仍具有相同的访问权限。子类不能继承父类的私有成员和构造方法。

继承不改变类成员的访问权限,也就是说,如果父类的成员定义为公共的、受保护的或默认的,那么子类继承的成员仍具有相同的访问权限。实例:4-2继承【问题分析】

首先定义父类

Animal,包含

category(种类)变量、setCategory()方法和

say()方法,然后定义继承

Animal类的子类Dog,包含food(食物)变量和eat()方法,最后定义

AnimalTest

类,在类中创建

Animal

类对象,调用

Animal

类的方法,创建

Dog类对象,调用Animal类和Dog类的方法。【运行结果】实例:4-2继承【参考代码】/*Animal.java*/packageproject4.example4_2; //声明包publicclassAnimal{……(详见教材)

2.方法重写概述

方法重写也称方法覆盖,是指在子类中重新实现父类的方法,要求子类方法的方法名、返回值类型、形参列表(包括参数的类型、数量和顺序)和父类方法的一样,只是方法体不同,以实现不同于父类方法的功能。条件(1)子类中重写方法的访问权限不能比父类中被重写方法的访问权限小。(2)子类中重写方法不能比父类中被重写方法抛出更多的异常。方法重写和方法重载的区别①

方法重写要求形参列表必须相同,而方法重载要求形参列表必须不同。②

方法重写要求返回值类型必须相同,而方法重载对此不做要求。③

方法重写只能在子类中重写父类的方法,而方法重载可以重载同一个类的所有方法,包括从父类继承的方法。④

方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载对此不做要求。⑤

父类的方法只能在子类中重写一次,而方法可以在同一个类中重载多次。【问题分析】实例:4-3方法重写

首先定义父类Animal,包含

say()方法,然后定义继承

Animal

类的子类

Rabbit

Dog,分别在子类中重写

say()方法,最后定义

AnimalTest

类,在类中创建父类和子类的对象,分别调用say()方法。【运行结果】实例:4-3方法重写【参考代码】/*Animal.java*/packageproject4.example4_3; //声明包publicclassAnimal{……(详见教材)

@Override@Override

注解用于显式声明方法重写。如果使用了@Override,编译器会验证@Override注解下面的方法是否存在父类中,如果不存在则会报错。3.super关键字

(1)使用

super

关键字访问直接父类的非私有成员变量和调用直接父类的非私有成员方法。super.成员变量名; //访问直接父类的成员变量super.成员方法名([实参列表]); //调用直接父类的成员方法语法格式如果子类中定义了与父类同名的成员变量或重写了父类的成员方法,父类的成员变量和成员方法会被隐藏,此时在子类中需要使用

super

关键字访问父类中被隐藏的成员变量和成员方法。(2)使用super关键字调用直接父类的构造方法。super(); //调用直接父类无参数的构造方法super(实参列表); //调用直接父类带参数的构造方法语法格式由于子类不能继承父类的构造方法,因此必须在子类构造方法的第一行使用

super

关键字显式调用父类的构造方法。super

关键字super

关键字只能在构造方法和实例方法中使用,不能在静态方法和静态语句块中使用。

在子类的构造方法中必须调用父类的构造方法,调用方法包括通过

super

关键字显式调用父类的构造方法;不使用

super

关键字,由编译器隐式调用父类的无参数的构造方法。需要注意的是,若父类没有无参数的构造方法,在子类中必须显式调用父类的带参数的构造方法,否则编译会报错。【参考代码】实例:4-4使用super关键字【运行结果】/*Animal.java*/packageproject4.example4_4; //声明包publicclassAnimal{……(详见教材)

多态定义

多态指不同对象调用同一方法时呈现不同形态,分为编译时与运行时多态,分别通过方法重载和继承机制实现。编译时多态编译时多态通过方法重载实现,依据实参列表差异在编译阶段确定调用方法,属于静态类型绑定机制。【运行结果】实例:4-5运行时多态【参考代码】/*Vehicle.java*/packageproject4.example4_5; //声明包publicclassVehicle{……(详见教材)

123实施流程

在项目

src

目录下的

project4

包中新建

task1

包。

task1

包中新建学生管理员类。

task1

包中新建

StudentManage

类。创建学生子类扫码学习4运行

StudentManage

类面向对象编程的三大核心特性封装继承多态任务二抽象类和接口抽象类的定义

抽象类即类的抽象,是对相似类的归纳和总结。抽象类可以包含抽象方法,这些抽象方法只有声明而没有方法体,具体的方法体由继承该抽象类的子类来实现,使得程序功能描述和实现能够分离。一个抽象类可以有多个子类,抽象方法可以在不同子类中有多种方法体,实现不同的功能,这就是面向对象编程的多态实现。定义抽象类和声明抽象方法的语法格式[public]abstractclass类名{ //定义抽象类……[public]abstract返回值类型

方法名();//声明抽象方法,必须加分号}(1)抽象类中可以包含具体方法。(2)抽象类中可以不包含抽象方法,但包含了抽象方法的类必须被定义为抽象类。(3)抽象方法要在子类中实现,所以抽象方法不可以是静态的,也不可以是

final

类型的。抽象类和抽象方法【运行结果】实例:4-6使用抽象类和抽象方法【参考代码】/*Animal.java*/packageproject4.example4_6;abstractclassAnimal{……(详见教材)

接口定义

定义行为规范的抽象类型,用于声明抽象方法,支持多继承以实现多态,允许不同类中存在多种方法体。多态实现通过接口声明的抽象方法,在不同实现类中可定义差异化方法体,形成面向对象编程的多态特性。多继承支持接口允许一个接口继承多个接口,形成层级结构,扩展类可同时实现多个父接口的抽象方法。1.定义接口定义接口需要使用interface关键字声明接口语法格式[public]interface接口名[extends父接口名列表]{ //声明接口//定义常量//声明抽象方法}父接口名列表是要继承的接口名,如果有多个父接口,父接口之间用英文逗号隔开。示例//定义InterfaceA接口publicinterfaceInterfaceA{voidmethodA(); //声明抽象方法}//定义InterfaceB接口publicinterfaceInterfaceB{voidmethodB(); //声明抽象方法}//定义InterfaceC接口,继承两个父接口publicinterfaceInterfaceCextendsInterfaceA,InterfaceB{voidmethodC(); //声明抽象方法}大写字母“I”

在实际应用中,一般在接口名前加上大写字母“I”,如

IShape、IFood

等,方便开发者快速识别接口

由于接口中的常量都默认为

publicstaticfinal

类型,方法都默认为

publicabstract

类型,因此在接口中定义常量和声明抽象方法时可以省略修饰符示例publicinterfaceIMessage{ //定义接口doublePI=3.14; //定义常量voidsay(); //声明抽象方法}2.实现接口

实现接口是指一个类通过

implements

关键字声明要实现的接口,并在类中实现接口中的所有抽象方法语法格式[public]class类名implements接口名1[,接口名2……]{//实现接口中的抽象方法}实现接口的规则

当一个类实现接口时,如果未实现接口中的所有抽象方法,该类必须被声明为抽象类。抽象方法的声明与调用

在实现抽象方法时,方法必须声明为public,且方法名和形参列表需与接口中定义的一致。接口引用变量的定义与使用

换口本身不能实例化,但可以定义接口类型的引用变量,指向实现该接口的类的对象。实现接口抽象方法

实现子接口的类,除了实现子接口中的所有抽象方法,还必须实现父接口中的所有抽象方法。【问题分析】实例:4-7定义两个类实现一个接口

使用相机和手机都能拍照和浏览照片。定义一个接口,在其中声明拍照和浏览照片抽象方法,然后定义一个相机类和一个手机类,分别在类中实现接口中的拍照和浏览照片抽象方法。【运行结果】【参考代码】/*IPhoto.java*/packageproject4.example4_7;publicinterfaceIPhoto{ //声明接口……(详见教材)

【问题分析】

鱼是一种食物,也是一种动物。定义两个接口,一个接口描述鱼是一种食物,另一个接口描述鱼是一种动物,然后定义一个鱼类实现两个接口。实例:4-8

定义一个类实现两个接口【运行结果】【参考代码】/*IFood.java*/packageproject4.example4_8;publicinterfaceIFood{ //定义食物接口……(详见教材)

抽象方法

由于系统要求在实现接口的类中必须实现接口中的所有抽象方法。因此,一旦修改了接口中的抽象方法,就需要修改实现接口的所有类。要在接口中添加新的方法,可以定义一个新接口(子接口)继承原接口,然后在新接口中声明新的抽象方法。如果需要使用新接口,可以在实现原接口的类声明中将原接口名修改为新接口名,然后在类中实现新的抽象方法,此时在类中实现了新接口和原接口中的所有抽象方法。Java8

引入了接口的默认方法(defaultmethod),它允许在接口中定义包含方法体的方法。(1)向后兼容性

在不改变现有代码的情况下为接口添加新方法。默认方法的优势

将公共方法的方法体放在接口中,避免每个实现接口的类都包含相同的代码。(2)减少重复代码

在实现接口的类中根据需要选择是否重写默认方法,使接口更加灵活。(3)简化

API

设计1.定义默认方法定义默认方法使用default关键字声明,并为方法提供方法体。示例publicinterfaceMyInterface{//定义一个默认方法defaultvoiddefaultMethod(){System.out.println("这是接口的默认方法。");}voidabstractMethod(); //声明一个抽象方法}

上述代码中,defaultMethod()是一个默认方法,有方法体;而

abstractMethod()是一个抽象方法,没有方法体。2.使用默认方法在实现接口的类中可以直接使用默认方法,也可以重写默认方法。

代码中,在

MyClass

类中重写了

defaultMethod()方法,因此通过

myClass

调用defaultMethod()方法时输出重写后的内容。publicclassMyClassimplementsMyInterface{//重写默认方法@Override……(详见教材)示例【运行结果】实例:4-9

使用默认方法【参考代码】/*IFly.java*/packageproject4.example4_9;publicinterfaceIFly{ //定义IFly接口……(详见教材)

在实现接口的类中重写默认方法时,可以使用

super

关键字调用指定接口的默认方法。例如,在例

4-9

Duck

类的

move()方法中,可以使用“IFly.super.move();”语句调用

IFly

接口的默认方法,或者使用“ISwim.super.move();”语句调用

ISwim

接口的默认方法。函数式接口定义

函数式接口(functionalinterface)是Java8引入的一项重要特性,它是指仅包含一个抽象方法的接口(可以有多个默认方法或静态方法),可以描述单一功能。核心作用函数式接口主要用于Java的函数式编程,通常使用Lambda表达式和方法引用实现函数式接口。1.定义函数式接口

函数式接口可以通过@FunctionalInterface注解显式声明,这个注解不是强制性的,但可以帮助编译器检查接口是否只包含一个抽象方法,避免意外添加多个抽象方法。示例@FunctionalInterface //使用注解声明函数式接口publicinterfaceICalculator{ //定义函数式接口intcalculate(inta,intb); //声明一个抽象方法}上述代码中,ICalculator是一个函数式接口,它只包含一个抽象方法calculate()。(1)Supplier<T>常用的函数式接口(3)BiFunction<T,U,R>(2)Function<T,R>

抽象方法为

Tget(),不接收参数,返回

T

类型数据,T

可以是Java支持的任意引用类型。抽象方法为Rapply(Tt),接收一个参数t,返回R类型数据,T和R可以是Java支持的任意引用类型。抽象方法为Rapply(Tt,Uu),接收两个参数t和u,返回R类型数据,T、U和R可以是Java支持的任意引用类型。编写程序在编写程序时,有时会遇到算法和运算逻辑一样,但要求在不同的场合操作不同数据类型对象的情况,此时可以使用泛型。泛型的核心是参数化类型,它支持在类、接口和方法的声明中使用类型形参,通过类型形参在创建对象、调用方法时指定参数的数据类型。上述内置的函数式接口都是泛型接口,使用接口时将

T、U

R

设置为需要的引用数据类型,如Supplier<String>。2.使用Lambda表达式实现函数式接口Lambda

表达式是

Java8

引入的另一项重要特性,它极大地简化了函数式接口的实现方式,使代码更加简洁和易读。Lambda

表达式是一种匿名函数,它可以作为参数传递给方法或赋值给函数式接口类型的变量。语法格式([形参列表])->{方法体}其中,形参列表的每个形参以“数据类型

参数”的形式声明,数据类型可以省略,多个形参之间用英文逗号隔开,当只有一个参数时,圆括号可以省略;方法体也称Lambda

表达式的主体,可以是一条语句或多条语句,当只有一条语句时,大括号可以省略。【运行结果】实例:4-10使用Lambda表达式实现函数式接口【参考代码】/*LambdaExample.java*/packageproject4.example4_10;@FunctionalInterface //使用注解声明函数式接口……(详见教材)

3.使用方法引用实现函数式接口

方法引用(methodreferences)也是

Java8

引入的一项重要特性,它可以直接引用已有方法,是Lambda表达式的一种简洁形式,同样也是函数式接口的一种实现方式。特定对象实例方法引用特定类任意对象实例方法引用构造方法引用静态方法引用(1)静态方法引用,通过类名引用类的静态方法,语法格式为“类名::静态方法名”。实例:4-11使用

Lambda

表达式和静态方法引用实

现函数式接口,求两个整数的较大值。【问题分析】

使用

java.util.function

包中的内置函数式接口

BiFunction,无须显式定义函数式接口,引用Math类的静态方法max()返回两个数值中的较大值。【运行结果】【参考代码】/*StaticMethod.java*/packageproject4.example4_11;importjava.util.function.BiFunction;//导入BiFunction接口publicclassStaticMethod{……(详见教材)

【结果说明】

结合例

4-11

的代码和运行结果可以看出,使用

Lambda

表达式和静态方法引用可以实现相同的功能,但使用静态方法引用的代码更加简洁。

(2)特定对象实例方法引用,通过对象名

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论