教学课件第8章 面象对象程序设计基础.ppt
C#程序设计案例教程程序设计案例教程第第8章章 面向对象程序设计基础面向对象程序设计基础 第第8章章 面向对象程序设计基础面向对象程序设计基础 学习目标学习目标了解面向对象概念。了解面向对象概念。掌握类的定义和使用。掌握类的定义和使用。掌握对象的使用。掌握对象的使用。掌握属性的使用。掌握属性的使用。了解索引器。了解索引器。掌握方法的重载。掌握方法的重载。熟悉构造函数的使用和重载。熟悉构造函数的使用和重载。熟悉析构函数的使用。熟悉析构函数的使用。掌握静态类和静态成员的使用。掌握静态类和静态成员的使用。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.1 面向对象程序设计概述面向对象程序设计概述8.1.1 对象对象对象是面向对象的程序设计中涉及的核心概念。它代对象是面向对象的程序设计中涉及的核心概念。它代表着真实世界中一个实体或概念。例如,汽车、公司表着真实世界中一个实体或概念。例如,汽车、公司等都可以建模成对象。等都可以建模成对象。对象具有状态、行为和身份。例如:现实中我们用唯对象具有状态、行为和身份。例如:现实中我们用唯一的车牌号来标识这台汽车的身份。一的车牌号来标识这台汽车的身份。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.1.2 类类类是对对象进行分类的声明,是人们对客观对象的不类是对对象进行分类的声明,是人们对客观对象的不断认识而抽象出来的概念。断认识而抽象出来的概念。类和对象具有不同的概念。类定义对象的类型,是基类和对象具有不同的概念。类定义对象的类型,是基于对象的抽象,但它不是对象本身。于对象的抽象,但它不是对象本身。在在C#中,根据类的来源可分为系统类和自定义类。系中,根据类的来源可分为系统类和自定义类。系统类是由系统预先定义在统类是由系统预先定义在.NET框架类库中。自定义类框架类库中。自定义类则是由程序员根据系统开发的需要而创建的类。则是由程序员根据系统开发的需要而创建的类。类在本质上是一种数据类型,所以类的用法和基本数类在本质上是一种数据类型,所以类的用法和基本数据类型的用法基本相同。据类型的用法基本相同。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.1.3 消息和方法消息和方法在面向对象的程序设计中,对象不是独立存在的,对在面向对象的程序设计中,对象不是独立存在的,对象之间要进行交互,交互通过消息发生。象之间要进行交互,交互通过消息发生。行为(在面向对象的程序设计中,又称行为(在面向对象的程序设计中,又称“方法方法”),),根据根据Grady Booch的定义:行为是对象根据其状态的的定义:行为是对象根据其状态的更改和消息的传递进行的作用和反作用。更改和消息的传递进行的作用和反作用。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.1.4 类的封装性类的封装性在面向对象的程序设计中,在面向对象的程序设计中,“封装封装”就是隐藏了类的就是隐藏了类的实现细节,程序员在使用类时,只要知道该类公有成实现细节,程序员在使用类时,只要知道该类公有成员的功能并执行相关的操作,而不需要知道该类公有员的功能并执行相关的操作,而不需要知道该类公有成员是如何实现的。成员是如何实现的。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.2 对象对象 【课堂案例课堂案例8-1】在学生成绩管理系统中,需要对学生的基本信息进在学生成绩管理系统中,需要对学生的基本信息进行管理,现要求使用面向对象的方法接收学生信息并显示。一个学生行管理,现要求使用面向对象的方法接收学生信息并显示。一个学生的基本信息包括:学号、姓名、出生年月、性别、入学时间、所在班的基本信息包括:学号、姓名、出生年月、性别、入学时间、所在班级、家庭住址、联系电话、手机以及备注。级、家庭住址、联系电话、手机以及备注。【案例学习目标案例学习目标】掌握类及成员的使用掌握类及成员的使用掌握访问修饰符的使用掌握访问修饰符的使用掌握对象的创建和访问掌握对象的创建和访问【案例知识要点案例知识要点】类的定义、字段、方法的定义、创建对象类的定义、字段、方法的定义、创建对象【案例完成步骤案例完成步骤】(1)定义类)定义类(2)定义类的成员字段)定义类的成员字段(3)定义类的成员方法)定义类的成员方法(4)加载访问修饰符)加载访问修饰符(5)创建对象并访问对象成员)创建对象并访问对象成员(6)实现应用程序)实现应用程序第第8章章 面向对象程序设计基础面向对象程序设计基础 8.2.1 定义类定义类 在在C#中,定义类需要使用关键字中,定义类需要使用关键字Class,类定义的格式如下:,类定义的格式如下: class 类名类名 /类成员类成员 说明:说明:(1)类名必须是合法的)类名必须是合法的C#命名命名(2)“类成员类成员”包括类中所有的数据以及对数据的操作,如字段、包括类中所有的数据以及对数据的操作,如字段、属属 性、方法和构造函数等。性、方法和构造函数等。 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.2.2 定义定义类的成员字段类的成员字段 字段是类的成员之一。定义字段的方法和之前定义变量的方法相同。字段是类的成员之一。定义字段的方法和之前定义变量的方法相同。 例如:例如:String sStuNumber; /定义学号字段定义学号字段 String sStuName; /定义姓名字段定义姓名字段第第8章章 面向对象程序设计基础面向对象程序设计基础 8.2.3 定义定义类的成员方法类的成员方法 方法也是类的成员之一,其实质就是在类中声明函数,为类的对象提方法也是类的成员之一,其实质就是在类中声明函数,为类的对象提供行为。方法遵循先定义后使用的规则,在供行为。方法遵循先定义后使用的规则,在C#中方法必须放在类定中方法必须放在类定义中声明,即方法必须是某一个类的类成员。义中声明,即方法必须是某一个类的类成员。 1、声明方法,格式如下:、声明方法,格式如下: 方法修饰符方法修饰符 返回类型返回类型 方法名方法名 (参数列表参数列表) /方法体方法体 (1)“方法修饰符方法修饰符”包括访问修饰符(如包括访问修饰符(如Public 、private、protected)、静态()、静态(Static)修饰符、虚方法()修饰符、虚方法(Virtual)、抽象)、抽象(abstract)修饰符等。)修饰符等。 (2) “返回类型返回类型”表示一个方法结果的数据类型,可以是任何合法的表示一个方法结果的数据类型,可以是任何合法的C#数据类型。类的方法将执行的结果作为返回值返回给调用者。如数据类型。类的方法将执行的结果作为返回值返回给调用者。如果一个方法不返回任何值,它的返回类型用空类型(果一个方法不返回任何值,它的返回类型用空类型(void)表示。)表示。 (3) “方法名方法名”是一个合法的是一个合法的C#语言标识符,对方法的命名,通常要语言标识符,对方法的命名,通常要求能描述方法的功能。求能描述方法的功能。 第第8章章 面向对象程序设计基础面向对象程序设计基础 (4) “参数列表参数列表”说明一个方法所需要的参数,即传递给方法的数据值。说明一个方法所需要的参数,即传递给方法的数据值。每个参数都有参数类型和参数名。每个参数都有参数类型和参数名。 (5)方法体中的语句定义了该方法所执行的任务。方法体中的语句定义了该方法所执行的任务。 2.调用类的成员方法调用类的成员方法 声明方法后,我们就可以开始调用方法了。对于调用方法,根据调用声明方法后,我们就可以开始调用方法了。对于调用方法,根据调用的环境的环境不同,大致可以分成两种方式:不同,大致可以分成两种方式: (1) 如果在声明方法的类定义中调用该方法,调用方法的格式:如果在声明方法的类定义中调用该方法,调用方法的格式: 方法名(参数列表)方法名(参数列表) (2) 如果在方法声明的类定义外调用该方法,则需通过创建对象的方如果在方法声明的类定义外调用该方法,则需通过创建对象的方式,调用式,调用 方法的格式为:方法的格式为: 对象名对象名.方法名(参数列表)方法名(参数列表) 提示提示:根据:根据课堂案例课堂案例8-1的要求,要实现接收学生的信息并显示,因此需要的要求,要实现接收学生的信息并显示,因此需要定义两个成员方法定义两个成员方法Accept()和和Display()。Accept()用于接收学生的基本信息,用于接收学生的基本信息,Display()用于显示学生的基本信息。用于显示学生的基本信息。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.2.4 加载加载访问修饰符访问修饰符 C#中提供了许多访问控制符,它们确定了是否允许其他代码对类的某个特定中提供了许多访问控制符,它们确定了是否允许其他代码对类的某个特定成员进行访问。通过访问修饰符,成员进行访问。通过访问修饰符, C#能实现面向对象的程序设计中的一个能实现面向对象的程序设计中的一个最重要的特征最重要的特征封装性封装性 。C#中最常用的访问修饰符及其含义见表中最常用的访问修饰符及其含义见表8-1。 表表8-1 访问修饰符访问修饰符声明的可访问性声明的可访问性含含 义义public(公有的公有的)访问不受限制访问不受限制protected(受保护的受保护的)访问仅限于包含类或从包含类派访问仅限于包含类或从包含类派生的类型生的类型Internal(内部的内部的)访问仅限于当前程序集访问仅限于当前程序集Protected internal(受保护内部受保护内部的的)访问仅限于从包含类派生的当前访问仅限于从包含类派生的当前程序集或类型。程序集或类型。private (私有的)(私有的) 访问仅限于包含类型。访问仅限于包含类型。 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.2.5 创建对象并访问对象成员创建对象并访问对象成员1.创建对象创建对象 类的定义完成后,接下来就是创建对象,只有通过对象类的定义完成后,接下来就是创建对象,只有通过对象才能访问类的成员。才能访问类的成员。“创建对象创建对象”也就是常说的也就是常说的“对象实对象实例化例化”,对象实例化是指在定义对象时,使对象具有相应,对象实例化是指在定义对象时,使对象具有相应的存储空间用来存储对象的信息。对象实例化时占用的空的存储空间用来存储对象的信息。对象实例化时占用的空间主要是数据成员需要的内存空间。用关键字间主要是数据成员需要的内存空间。用关键字new创建对创建对象。象。 格式一格式一: ; /先声明对象先声明对象 对象名对象名 = new 类名;类名; /再创建对象再创建对象 格式二格式二: = new ; /边声明边创建边声明边创建 第第8章章 面向对象程序设计基础面向对象程序设计基础 例如,对案例中定义的学生类例如,对案例中定义的学生类Student,现要创建该类的实例对象,现要创建该类的实例对象stuOne。创建的代码格式如下所示:。创建的代码格式如下所示: 格式一格式一 Student stuOne; /先声明对象先声明对象 stuOne = new Student(); /再创建对象再创建对象 格式二格式二 Student stuOne = new Student(); /边声明边创建边声明边创建 第第8章章 面向对象程序设计基础面向对象程序设计基础 2. 访问对象访问对象 创建对象的目的是要通过对象来访问类的成员。访问对象实质上就是创建对象的目的是要通过对象来访问类的成员。访问对象实质上就是访问对象成员,通过对象访问成员的方式是使用成员运算符访问对象成员,通过对象访问成员的方式是使用成员运算符“.”。 例如:例如: stuOne.Display(); /访问成员方法访问成员方法 stuOne.Accept(); /访问对象的方法成员访问对象的方法成员 stuOne. sStuNumber = “001”; /为该对象的学号成员赋值为该对象的学号成员赋值 stuOne. sStuName = “张三张三”; /为该对象的姓名字段成员赋值为该对象的姓名字段成员赋值 8.2.6 实现应用程序实现应用程序 第第8章章 面向对象程序设计基础面向对象程序设计基础 演示应用程序编辑、编译和运行过程第第8章章 面向对象程序设计基础面向对象程序设计基础 课堂实践课堂实践8-1任务一任务一在学生管理系统中,除了需要管理学生信息外,还需要对开设在学生管理系统中,除了需要管理学生信息外,还需要对开设的课程进行管理,请编写程序实现对课程信息的接收与显示。课程的的课程进行管理,请编写程序实现对课程信息的接收与显示。课程的相关信息包括,课程编号、课程名称、学时、考核方式以及任课教师。相关信息包括,课程编号、课程名称、学时、考核方式以及任课教师。 任务二任务二定义一个数学类,该类提供了如下几种功能:定义一个数学类,该类提供了如下几种功能:1、输出、输出1100之之间的整数之和间的整数之和 2、对随机输入的数,求其平方根。、对随机输入的数,求其平方根。 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.3 属性属性 【课堂案例课堂案例8-2】在学生管理系统中,现要求能在在学生管理系统中,现要求能在Student类类的外部实现对该类中的学号(的外部实现对该类中的学号(sStuNumber)、姓名)、姓名(sStuName)字段进行读)字段进行读/写操作,而对于性别写操作,而对于性别(sGender)字段,在类外只允许进行读操作。)字段,在类外只允许进行读操作。【案例学习目标案例学习目标】掌握属性的声明掌握属性的声明 【案例知识要点案例知识要点】声明属性声明属性 【案例完成步骤案例完成步骤】(1)确实对字段的读)确实对字段的读/写方式写方式 (2)声明属性)声明属性 (3)实现应用程序)实现应用程序 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.3.1 声明属性声明属性 在类定义外部,是不允许对私有或受保护字段在类定义外部,是不允许对私有或受保护字段进行访问。但如果在程序实现过程中需要在类外进行访问。但如果在程序实现过程中需要在类外对此类字段进行访问,又该如何实现呢?对此类字段进行访问,又该如何实现呢? 答案是:通过属性可以设置对字段的访问方式,答案是:通过属性可以设置对字段的访问方式,如只读、只写、读如只读、只写、读/写等。写等。第第8章章 面向对象程序设计基础面向对象程序设计基础 声明属性的语法格式如下:声明属性的语法格式如下: 访问修饰符访问修饰符 类型类型 属性名属性名 get return 字段名;字段名; /读字段值读字段值 set字段名字段名 = value; /将值写入字段将值写入字段 通过通过get、set关键字,我们可以将属性声明为可读可写、只读、或只关键字,我们可以将属性声明为可读可写、只读、或只写属性。其中写属性。其中get设置属性为可读,而设置属性为可读,而set设置属性为可写。设置属性为可写。 在属性声明中,在属性声明中,get完成数据值的读取完成数据值的读取,return返回读取的值返回读取的值,set完成对完成对数据值的修改数据值的修改,value是一个关键字是一个关键字,表示要写入数据成员的值。表示要写入数据成员的值。第第8章章 面向对象程序设计基础面向对象程序设计基础 例如:要设置客户例如:要设置客户Customer类中的类中的customerId、customerName字段字段为读写,为读写,address为只读,代码如下:为只读,代码如下:Class Customer private string customerId; private string customerName; private string address; public string CustomerId /对应对应customerId get return customerId; set customerId = value; public string CustomerName /对应对应customerName get return customerName; set customerName = value; public string Address /对应对应address get return address; 第第8章章 面向对象程序设计基础面向对象程序设计基础8.3.2 访问属性:访问属性:对属性进行声明后,就可以访问属性了。访问属性与访问类的公有数据对属性进行声明后,就可以访问属性了。访问属性与访问类的公有数据成员一样,也是通过成员运算符进行访问。访问的格式如下:成员一样,也是通过成员运算符进行访问。访问的格式如下: 对象名对象名.属性属性以上面定义以上面定义Customer类为例说明属性的访问类为例说明属性的访问Customer objCustomer = new Customer();objCustomer.CustomerId = “C000001”; /合法合法objCustomer.CustomerName = “腾飞有限责任公司腾飞有限责任公司”; /合法合法objCustomer.Address = “上海南京路上海南京路22号号”; /非法,因为非法,因为 Address属性是只读属性是只读第第8章章 面向对象程序设计基础面向对象程序设计基础 演示编写程序并运行演示编写程序并运行8.3.3 实现应用程序实现应用程序 第第8章章 面向对象程序设计基础面向对象程序设计基础 课堂实践课堂实践8-2在学生成绩管理系统中,需要在课程类在学生成绩管理系统中,需要在课程类Course的外部的外部实现对类中的所有字段进行读实现对类中的所有字段进行读/写操作。写操作。 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.4 索引器索引器 【课堂案例课堂案例8-3】现有一个元素个数为现有一个元素个数为4的圆类数组的圆类数组CircleArray,其中,数组的元素都是圆类的实例对象。,其中,数组的元素都是圆类的实例对象。现要求给现要求给CircleArray中中4个对象元素的半径成员个对象元素的半径成员radius分别赋以分别赋以1,2,3,4的取值。也就是说用的取值。也就是说用CircleArray数组的数组的4个元素分别描述半径为个元素分别描述半径为1,2,3,4的的4个圆。个圆。【案例学习目标案例学习目标】掌握索引器的定义掌握索引器的定义 【案例知识要点案例知识要点】定义索引器定义索引器 【案例完成步骤案例完成步骤】(1)定义索引器)定义索引器 (2)实现应用程序)实现应用程序 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.4.1 初步认识索引器:初步认识索引器:索引器的声明类似于属性的声明,也由get和set访问器组成。索引器提供了对类的数组元素的直接访问功能。即如果一个类定义了索引器,这个类的实例就可以使用数组访问运算符对数组元素进行访问。索引器的定义与属性有点类似。 访问修饰符 this int index get Return 集合名index; set . 集合名index = value; 第第8章章 面向对象程序设计基础面向对象程序设计基础 说明:(1)集合元素类型表示索引器的返回类型(2)this指当前对象,索引器和属性不同,没有专门的索引器名。对象名就相当于索引器名。(3)集合名index,用于访问各集合元素。(4)index为int类型变量,用于指示集合类型下标,也可以为其他类型,但一般为int型,index变量名是可以任意命名的,只是编程人员通常用index或ind作为下标变量名。(5)set和get访问器及value的功能与属性基本相同 ,此外不再详细介绍。以下代码说明了索引器的定义:Class Circle int index = 0; int radius; /整型数组 public int thisint ind /定义索引器 get return radiusind; set radiusind = value; 8.4.2 实现实现应用程序应用程序 第第8章章 面向对象程序设计基础面向对象程序设计基础 演示应用程序编辑、编译和运行过程第第8章章 面向对象程序设计基础面向对象程序设计基础 课堂实践课堂实践8-3任务一任务一 编写一个类,要示使用索引器存储编写一个类,要示使用索引器存储100个整型变量。个整型变量。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.5 方法重载方法重载【课堂案例课堂案例8-4】在学生成绩管理系统中,需要实现如下功在学生成绩管理系统中,需要实现如下功能:能: (1)显示学生的信息)显示学生的信息 (2)根据年龄显示学生的信息)根据年龄显示学生的信息 (3)根据姓名显示学生的信息)根据姓名显示学生的信息 构造实现这些功能的方法原型构造实现这些功能的方法原型【案例学习目标案例学习目标】掌握方法的重载掌握方法的重载 【案例知识要点案例知识要点】方法重载方法重载【案例完成步骤案例完成步骤】(1)初步认识重载)初步认识重载(2)构造重载方法原型)构造重载方法原型第第8章章 面向对象程序设计基础面向对象程序设计基础 8.5.1 初步认识重载方法初步认识重载方法 重载是面向对象程序设计中的一个重要特征,通过重载可以使得重载是面向对象程序设计中的一个重要特征,通过重载可以使得在同一个类中有多个具有相同功能而参数不同的方法共享同一个方在同一个类中有多个具有相同功能而参数不同的方法共享同一个方法名。在实际调用时,根据方法参数的个数和参数数据类型的不同法名。在实际调用时,根据方法参数的个数和参数数据类型的不同来区分调用的是哪一个方法。这样做的优点在于可以使程序简洁清来区分调用的是哪一个方法。这样做的优点在于可以使程序简洁清晰,同时也是面向对象程序设计多态性的一个表现。晰,同时也是面向对象程序设计多态性的一个表现。 根据对根据对课堂案例课堂案例8-4的分析可知,虽然显示学生信息各有侧重的分析可知,虽然显示学生信息各有侧重点,但三个功能都是要求显示学生的信息,因此可以使用重载来实点,但三个功能都是要求显示学生的信息,因此可以使用重载来实现。现。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.5.2 构造重载方法原型构造重载方法原型 根据重载的定义和要求,对于根据重载的定义和要求,对于课堂案例课堂案例8-4,需要定义的重载方法如需要定义的重载方法如下:下:(1)displayInfo():显示学生的信息。:显示学生的信息。(2)displayInfo(int stuAge):根据年龄显示学生的信息。:根据年龄显示学生的信息。(3)displayInfo(string stuName):根据学生的姓名显示学生的信:根据学生的姓名显示学生的信息。息。 方法重载的规则:在定义重载的时候,可以根据参数列表的个数、类型或顺序来定义重载,例如,displayInfo()、displayInfo(int stuAge)以及displayInfo(string stuName)所带的参数类型不同,但不能根据方法返回值的不同来定义重载。第第8章章 面向对象程序设计基础面向对象程序设计基础 课堂实践课堂实践8-5任务一任务一 阅读下面各组方法,判断哪些是重载?哪些不是?阅读下面各组方法,判断哪些是重载?哪些不是? (1) void display(int); void display(string); (2) void display(int); void display(int ,int ); (3) void display(int ,string); void display(string,int); (4) int display(int); void display(int);任务二任务二在学生成绩管理系统中,现有的成绩类需要实现如下要求:在学生成绩管理系统中,现有的成绩类需要实现如下要求: (1) 显示所有学生的成绩信息。显示所有学生的成绩信息。 (2) 根据指定的学生学号显示该学生成绩信息。根据指定的学生学号显示该学生成绩信息。 确定要编写的方法。确定要编写的方法。 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.6 构造函数构造函数 【课堂案例课堂案例8-5】定义一个圆(定义一个圆(Circle)类,该类要)类,该类要求对圆的半径求对圆的半径(radius)进行初始化。即,当创建该类的对象时,)进行初始化。即,当创建该类的对象时,对象的半径值初始为对象的半径值初始为0.0。【案例学习目标案例学习目标】定义构造函数定义构造函数 【案例知识要点案例知识要点】构造函数构造函数 【案例完成步骤案例完成步骤】(1)定义构造函数)定义构造函数 (2)实现应用程序)实现应用程序 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.6.1 定义构造函数定义构造函数在类中,定义构造函数的一般格式为:在类中,定义构造函数的一般格式为:class 类名类名 public 类名(参数表)类名(参数表) /构造函数名与类名相同构造函数名与类名相同 在在C#中构造函数与类的名称相同,能带参数,但不能返中构造函数与类的名称相同,能带参数,但不能返回任何值,即使是回任何值,即使是void,每个类必须有一个构造函数。,每个类必须有一个构造函数。如果不提供用户定义的构造函数,编译器会自动生成一如果不提供用户定义的构造函数,编译器会自动生成一个默认的构造函数,不过,它实际上并不会做任何事情。个默认的构造函数,不过,它实际上并不会做任何事情。构造函数通常用来初始化新对象的数据成员。构造函数通常用来初始化新对象的数据成员。 第第8章章 面向对象程序设计基础面向对象程序设计基础 通过分析通过分析【课堂案例课堂案例8-5】,我们发现在创建对象时,需要自动对半径进行初始化,使用,我们发现在创建对象时,需要自动对半径进行初始化,使用构造函数可以实现该要求。定义构造函数的代码如下:构造函数可以实现该要求。定义构造函数的代码如下:class Circle private double radius; /圆半径,私有类型圆半径,私有类型 public Circle() /构造函数构造函数 radius = 0.0; /初始化半径值初始化半径值 说明:(1)构造函数通常用public修饰,用protected,private修饰可能导致无法实例化。虽然构造函数通常用public修饰但也不能像调用其他函数那样显式地调用构造函数。(2)若没有构造函数,C#会自动调用默认的构造函数,形式为:()。 8.6.2 实现实现应用程序应用程序 第第8章章 面向对象程序设计基础面向对象程序设计基础 演示应用程序编辑、编译和运行过程第第8章章 面向对象程序设计基础面向对象程序设计基础 课堂实践课堂实践8-5编写程序:一个矩形类具有数据成员长(编写程序:一个矩形类具有数据成员长(length)和)和宽(宽(width),要求使用构造函数将),要求使用构造函数将length和和width设设置为置为10,并使用并使用caculate()方法求解矩形面积。方法求解矩形面积。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.7 重载构造函数重载构造函数 【课堂案例课堂案例8-6】阅读下面的程序,理解构造函数的重载阅读下面的程序,理解构造函数的重载并预测程序的输出结果。并预测程序的输出结果。Class Circle private int radius; public Circle() radius = 0; public Circle(int r) radius = r; public void Print() Console.WriteLine(radius); Class Program static void Main(string args) Circle myCircle = new Circle(); Console.Write(“第一个圆的半径值为:第一个圆的半径值为:”); myCircle.Print(); Circle myCircle2 = new Circle(4); Console.Write(“第二个圆的半径值为第二个圆的半径值为 ”); myCircle2.Print(); 第第8章章 面向对象程序设计基础面向对象程序设计基础 【案例学习目标案例学习目标】掌握重载构造函数掌握重载构造函数【案例知识要点案例知识要点】构造函数构造函数【案例完成步骤案例完成步骤】(1)定义重载的构造函数)定义重载的构造函数(2)预测程序的输出结果)预测程序的输出结果第第8章章 面向对象程序设计基础面向对象程序设计基础 8.7.1 定义重载的构造函数定义重载的构造函数 构造函数也属于类的成员方法,和普通的成员方法一样构造函数也属于类的成员方法,和普通的成员方法一样也可以重载。重载构造函数的目的在于提供多种对象的也可以重载。重载构造函数的目的在于提供多种对象的初始化方式,增强编程的灵活性。构造函数重载的形式初始化方式,增强编程的灵活性。构造函数重载的形式与普通方法的重载格式相同。与普通方法的重载格式相同。 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.7.2 预测程序的输出结果预测程序的输出结果根据重载的构造函数的功能,程序的输出结果为:根据重载的构造函数的功能,程序的输出结果为:第一个圆的半径为:第一个圆的半径为:0第二个圆的半径为:第二个圆的半径为:4第第8章章 面向对象程序设计基础面向对象程序设计基础 课堂实践课堂实践8-6完成下面给出的程序,它能让用户实现以下任务:完成下面给出的程序,它能让用户实现以下任务: 1、初始化时、分、秒、初始化时、分、秒 2、按给定的格式显示时、时:分或时:分:秒、按给定的格式显示时、时:分或时:分:秒Namespace prj8_10 class Time private int hour; private int minute; private int second; class Program static void Main(string args) Time obj = new Time(); obj.display(); obj.setTime(); obj.display(); obj.setTime(5,12); obj.display(); obj.setTime(5,12,13); obj.display(); 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.8 析构函数析构函数【课堂案例课堂案例8-7】阅读下面的程序,识别析构函数并阅读下面的程序,识别析构函数并预测程序的输出结果。预测程序的输出结果。name spaces 8_7 class Circle Circle() /析构函数析构函数 Console.WriteLine(“析构函数被调用析构函数被调用”); public Circle() /构造函数构造函数 Console.WriteLine(“构造函数被调用构造函数被调用”); class Program satatic void Main(string args) Circle obj = new Circle(); 第第8章章 面向对象程序设计基础面向对象程序设计基础 【案例学习目标案例学习目标】了解析构函数的定义与作用了解析构函数的定义与作用【案例知识要点案例知识要点】析构函数析构函数【案例完成步骤案例完成步骤】(1)初步认识析构函数)初步认识析构函数(2)预测程序的输出结果)预测程序的输出结果第第8章章 面向对象程序设计基础面向对象程序设计基础 8.8.1 初步认识析构函数初步认识析构函数 析构函数与构造函数是相对的析构函数与构造函数是相对的,其用途是完成内存清理。其用途是完成内存清理。在类中仅有一个析构函数。程序员对于什么时候调用析在类中仅有一个析构函数。程序员对于什么时候调用析构函数没有控权,构函数没有控权,.NET框架会自动运行析构函数,销毁框架会自动运行析构函数,销毁在内存中的对象。在内存中的对象。 析构函数的名字与类的名字相同析构函数的名字与类的名字相同,但有一个前缀但有一个前缀”.定义格式如下定义格式如下:class 类名类名 public 类名类名() /定义析构函数定义析构函数 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.8.2 预测程序的输出预测程序的输出 结果结果根据析构函数的功能根据析构函数的功能,课堂案例课堂案例8-7的输出结果为:的输出结果为:构造函数被调用构造函数被调用析构函数被调用析构函数被调用第第8章章 面向对象程序设计基础面向对象程序设计基础 课堂实践课堂实践8-7阅读下面的程序阅读下面的程序,识别析构函数并预测程序的输出结果。识别析构函数并预测程序的输出结果。namespace prj8_7 class Circle double radius; const double PI=3.14; public Circle() radius = 0; Console.WriteLine(“构造函数被调用构造函数被调用”); Circle() Console.WriteLine(“析构函数被调用析构函数被调用”); public double calculateArea() return PI*radius*radius; class Program static void main(string args) double area; Circle obj = new Circle(); area = obj.caculateArea(); Console.WriteLine(“圆的面积为:圆的面积为:0”,area); 第第8章章 面向对象程序设计基础面向对象程序设计基础 8.9 静态类静态类静态类静态类 当在类声明中添加当在类声明中添加static修饰符时,该类称为静态类。对修饰符时,该类称为静态类。对于静态类,于静态类,用户不必创建该类的实例对象就可以访问类中的数据和用户不必创建该类的实例对象就可以访问类中的数据和方法成员。方法成员。静态类的定义格式如下:静态类的定义格式如下:static class 类名类名 /类定义类定义第第8章章 面向对象程序设计基础面向对象程序设计基础 以StudentInfo类为例,下面的代码解释了静态类的定义。 static class StudentInfo public static string GetStudentName() /定义静态方法 public static string GetStudentAddress() /定义静态方法 静态类的使用规则:、静态类只能包含静态成员。、静态类不能被实例化。、静态类不能包含实例构造函数,但可声明静态构造函数用以分配初始值或设置某个静态状态。第第8章章 面向对象程序设计基础面向对象程序设计基础 8.10 静态成员静态成员【课堂案例课堂案例8-8】阅读下面的程序,识别静态成员并预测阅读下面的程序,识别静态成员并预测程序的输出结果程序的输出结果。namespace prj8_8 class Item private static int itemQty; private int itemId; private string itemName; private double price; private int qtyOh; public Item(int itemId,string itemName,double Price,int qtyOh) itemQty+; this.itemId = itemId; this.itemName = itemName; this.price = price; this.qtyOh = qtyOh; public static int getItemQty() return itemQty; public void display() Console.Write(