第二章 面向对象程序设计.docx
- 文档编号:27666202
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:18
- 大小:21.22KB
第二章 面向对象程序设计.docx
《第二章 面向对象程序设计.docx》由会员分享,可在线阅读,更多相关《第二章 面向对象程序设计.docx(18页珍藏版)》请在冰豆网上搜索。
第二章面向对象程序设计
第二章面向对象程序设计(I)
1、教案目的:
(1)了解面向对象的基本思想;
(2)掌握类、对象的基本概念;
(3)了解面向对象的基本特征;
(4)掌握类的定义、对象的访问方法及访问控制;
(5)掌握类的构造函数和析构函数、类的属性、类的静态成员。
2、教案重难点:
(1)掌握类的定义、对象的访问方法及访问控制;
(2)掌握类的构造函数和析构函数、类的属性、类的静态成员;
3、教案方法:
讲授及练习相结合,结合多媒体广播软件演示
4、教案工具:
计算机,网络,多媒体广播软件
5、教案学时:
2学时
6、教案过程:
6.1引入(约5分钟)
复习旧课,引入新课
面向对象是软件开发中的一种新思想,这种思想的引入,使我们的程序设计更加符后现实。
面向对象编程主要思想是将数据以及处理这些数据的相应方法封装到类中,使用类创建的实例称为对象。
类类型支持继承,派生的类可以对基类进行扩展和特殊化。
面向对象的重要目标就是创建可以让不同开发者反复调用的模块,这些模块的设计易于修改、更新和扩展,通过共享和可重用的特性减少了开发和维护的成本。
C#.NET是一种面向对象的程序设计语言,它支持面向对象程序设计的许多新特性。
整个C#的类模型是建立在.NET对象的基础上的,对象模型是基础框架的一部分,而不再是编程语言的一部分,它解决了编程技巧带来的问题。
6.2教案内容
2.1面向对象的基本思想(约15分钟)
1.对象的基本概念
2.类
3.面向对象的基本特征
(1)封装性
(2)继承性(inheritance)
(3)多态性
2.2类与对象(约65分钟)
2.2.1类的定义(约10分钟)
2.2.2对象的访问方法及访问控制(约15分钟)
(1)对象的访问方法
(2)成员的访问控制
2.2.3类的构造函数和析构函数(约15分钟)
(1)构造函数
(2)析构函数
2.2.4类的属性(约10分钟)
2.2.5类的静态成员(约15分钟)
6.3小结:
(约5分钟)
(1)面向对象的基本思想;
(2)类、对象的基本概念;
(3)面向对象的基本特征;
(4)类的定义
(5)对象的访问方法及访问控制;
(6)掌握类的构造函数和析构函数、类的属性、类的静态成员。
6.4作业:
(1)调试教材上的实例
(2)阅读课件
(3)完成书后的习题
(一)和
(二):
1-2
7、后记:
8、讲义:
第二章面向对象程序设计
面向对象是软件开发中的一种新思想,这种思想的引入,使我们的程序设计更加符后现实。
面向对象编程主要思想是将数据以及处理这些数据的相应方法封装到类中,使用类创建的实例称为对象。
类类型支持继承,派生的类可以对基类进行扩展和特殊化。
面向对象的重要目标就是创建可以让不同开发者反复调用的模块,这些模块的设计易于修改、更新和扩展,通过共享和可重用的特性减少了开发和维护的成本。
C#.NET是一种面向对象的程序设计语言,它支持面向对象程序设计的许多新特性。
整个C#的类模型是建立在.NET对象的基础上的,对象模型是基础框架的一部分,而不再是编程语言的一部分,它解决了编程技巧带来的问题。
2.1面向对象的基本思想
面向对象是一种新兴的程序设计方法(一种新的程序设计规范)。
基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计;从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。
1.对象的基本概念
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。
一个对象由一组属性和对这组属性进行操作的一组服务组成。
2.类
把众多的事物归纳、划分成一些类是人类在认识客观世界时经常采用的思维方法。
分类的原则是抽象。
类是具有相同属性和服务的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。
3.面向对象的基本特征
(1)封装性
封装是一种信息隐蔽技术,用户只能看到对象封装界面上的信息,对象内部对用户是隐藏的。
封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需用设计者提供的消息来访问该对象。
(2)继承性(inheritance)
为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总是希望能够利用前人或自己以前的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模块。
今天,任何面向对象的程序设计语言都必须提供两个重要的特性:
继承性(inheritance)和多态性(polymorphism)。
(3)多态性
所谓多态即一个名字可具有多种语义。
在大多数面向对象的语言中,如果类P是子类S的父类,则子类S的对象s可以用在父类P的对象p使用的地方,这就意味着一个公共的消息集可以送到类P和类S对象上。
当同样的消息可以被送到一个父类的对象和其子类的对象上时,这被称作多态性(polymophism)。
2.2类与对象
类和对象是面向对象的程序设计语言的核心和本质。
类实际上定义了一种崭新的数据类型。
定义了类之后,就可以使用这种新的数据类型创建对象。
类是对象的模板,对象是类的实例。
使用类的好处在于,它有利于程序的模块化设计和开发,可以隐藏内部的实现细节,并能增强程序代码的重用性。
2.2.1类的定义
(1)类的定义格式如下:
class类名
{
成员变量。
成员方法。
}[。
]
例如:
classA
{
intx。
//成员变量
intf()//成员方法
{
returnx。
}
}
类的成员:
成员变量(字段)和成员方法(函数)
成员方法(函数):
一般的成员方法、构造函数、析构函数
类中还可以包含一种特殊的成员,称为属性,它既可看作是成员变量,也可看作是成员方法。
(2)声明对象和创建对象的语法格式分别如下:
类名对象名。
//声明对象
对象名=new类名()。
//创建对象
也可以在声明的同时创建对象:
类名对象名=new类名()。
利用类A来创建对象a:
Aa。
a=newA()。
上述代码等价于:
Aa=newA()。
2.2.2对象的访问方法及访问控制
(1)对象的访问方法
对象被声明并创建以后就可以访问对象中提供的成员了,访问对象成员的方法是通过使用”.”运算符来实现的。
访问格式如下:
对象名.对象成员。
例如:
classB
{
publicintx。
publicintf()
{
returnx+100。
}
}
利用类B来声明并创建对象b:
Bb=newB()。
访问b中的成员:
b.x=100。
inty=b.f()。
Console.WriteLine("y={0}",y)。
结果输出:
y=200
2.2.2对象的访问方法及访问控制
(2)成员的访问控制
类的成员分类
常量:
表示与该类相关联的常量值。
字段:
该类的变量。
类型:
用于表示一些类型,它们是该类的局部类型。
方法:
用于实现可由该类执行的计算和操作。
属性:
用于定义一些命名特性,通过它来读取和写入相关的特性。
事件:
用于定义可由该类生成的通知。
索引器:
使该类的实例可按与数组相同的(语法)方式进行索引。
运算符:
用于定义表达式运算符,通过它对该类的实例进行运算。
实例构造函数:
用于规定在初始化该类的实例时需要做些什么。
析构函数:
用于规定在永久地放弃该类的一个实例之前需要做些什么。
静态构造函数:
用于规定在初始化该类自身时需要做些什么。
访问控制是通过在类成员前冠以修饰符来实现:
访问控制修饰符
修饰符
说明
new
仅允许在嵌套类定义时使用,以表明类中隐藏了由基类中继承而来的、与基类中同名的成员
public
用这种修饰符修饰的成员称为公有成员。
公有成员允许该类和其他类中的所有成员访问。
protected
用这种修饰符修饰的成员称为保护成员。
保护成员可以被该类和其派生类中的成员访问,而其他类中的成员则不允许访问。
internal
只有其所在类才能访问
private
用这种修饰符修饰的成员称为私有成员。
私有成员只能被该类中的其他成员访问,其他类(包括派生类)中的成员是不允许直接访问的。
C#中private是默认的修饰符。
abstract
抽象类,不允许建立类的实例
sealed
密封类,不允许被继承
protectedinternal
用该修饰符修饰的成员只能被程序集内的类的成员及这些类的派生类中的成员所访问。
成员访问控制的例子:
//首先定义类A,然后定义类B,它继承类A
classA//类A
{privateintx。
//私有成员
protectedinty。
//保护成员
publicintz。
//公有成员
voidf()
{x=1。
//正确,允许访问本类中的私有成员
y=2。
//正确,允许访问本类中的保护成员
z=3。
//正确,允许访问本类中的公有成员
}
}
classB:
A//类B,它继承类A
{voidg()
{
base.x=100。
//错误,不允许访问基类中的私有成员
base.y=200。
//正确,允许访问基类中的保护成员
base.z=300。
//正确,允许访问基类中的公有成员
}
}
//在Main函数中实例化类A,并调用相关成员
staticvoidMain(string[]args)
{
Aa=newA()。
a.x=1000。
//错误,不允许访问其他类对象中的私有成员
a.y=2000。
//错误,不允许访问其他类对象中的保护成员
a.z=3000。
//正确,允许访问其他类对象中的公有成员
}
【例1】在一个控制台应用程序中编写一个学生类student,该类包含学号(no)、姓名(name)和成绩(grade)等成员变量,并提供对这些变量成员进行赋值和读取这些成员变量的成员方法。
classstudent
{
//成员变量
intno。
stringname。
doublegrade。
//成员方法
publicintgetNo(){returnno。
}
publicstringgetName(){returnname。
}
publicdoublegetGrade(){returngrade。
}
publicvoidsetNo(intno){this.no=no。
}
publicvoidsetName(stringname){this.name=name。
}
publicvoidsetGrade(doublegrade){this.grade=grade。
}
}
private是默认的修饰符,故这些成员变量实际上是私有成员。
staticvoidMain(string[]args)
{
studentst=newstudent()。
st.setNo(100)。
st.setName("王智高")。
st.setGrade(92.5)。
Console.WriteLine("学号姓名成绩")。
Console.WriteLine("{0}{1}{2}",
st.getNo(),st.getName(),st.getGrade())。
Console.ReadLine()。
}
2.2.3类的构造函数和析构函数
构造函数是在运用类来创建对象时首先被自动执行的方法成员,而且仅被执行一次,它通常用于对成员变量进行初始化。
析构函数则是在对象被撤销(从内存中消除)时被执行,显然也仅仅执行一次,通常用于做对象被销毁前的“扫尾”工作。
(1)构造函数
构造函数的定义格式如下:
public类名([参数列表])
{
语句序列
}
说明:
构造函数的名称必须与类名同名,构造函数不允许有返回类型,要使用public修饰符修饰,否则在非派生类中不能调用它来创建对象。
构造函数可以带参数,也可以不带参数,要根据实际情况来决定。
构造函数可以重载,即可以定义多个构造函数,它们函数名都与类名相同,不同的是各自的参数个数和参数类型不一样。
在定义类时,如果没有显式定义构造函数,则实例化对象时会自动调用默认的构造函数。
如果一旦定义了构造函数,则默认构造函数不会被调用。
默认构造函数的作用是将对象成员的初始值设置为默认的值,如数值类型变量初始化为0,字符串型变量被初始化为null(空值),字符类型变量被初始化为空格等。
构造函数不能被其他成员显式调用,而是在创建对象时由系统自动调用。
【例2】使用默认构造函数的例子。
下面定义了类B1,其中并没有显式定义构造函数:
classB1
{
intx。
strings。
charc。
publicvoidoutmembers()
{
Console.WriteLine("x={0},s=x{1}x,c=x{2}x",x,s,c)。
}
}
方法outmembers用于输出各变量的初始值
B1b1=newB1()。
//调用默认构造函数创建对象b1
b1.outmembers()。
【例3】定义多个构造函数(重载),并分别调用它们创建对象。
classB2
{
intx。
strings。
charc。
publicvoidoutmembers()
{
Console.WriteLine("x={0},s={1},c={2}",x,s,c)。
}
publicB2(){}//第1个构造函数
publicB2(intx){this.x=x。
}//第2个构造函数
publicB2(intx,strings){this.x=x。
this.s=s。
}//第3个构造函数
publicB2(intx,strings,charc){this.x=x。
this.s=s。
this.c=c。
}//第4个构造函数
}
B2b21=newB2()。
//调用第1个构造函数
b21.outmembers()。
B2b22=newB2(100)。
//调用第2个构造函数
b22.outmembers()。
B2b23=newB2(100,"中国人")。
//调用第3个构造函数
b23.outmembers()。
B2b24=newB2(100,"中国人",'男')。
//调用第4个构造函数
b23.outmembers()。
(2)析构函数
析构函数的定义格式如下:
~类名()
{
语句序列
}
说明:
析构函数名是在类名前加上符号“~”而得到。
析构函数没有参数、返回类型和修饰符。
一个类中至多有一个析构函数,如果没有定义析构函数,则系统会在撤销对象时自动调用默认析构函数。
析构函数也不能显式被调用,而是在撤销对象时由系统自动调用。
为类B2定义如下的析构函数:
~B2()
{
Console.WriteLine("正在执行析构函数...")。
}
这样,在执行例3中的代码时,在程序运行界面消失的前一刻会看到析构函数的执行结果:
2.2.4类的属性
属性是一种特殊的类成员,它既可以被视为一种成员变量,也可以看作是一种成员方法。
属性定义的语法格式如下:
数据类型属性名
{
get
{
return表达式1。
}
set
{
表达式2。
//表达式2一般包含特殊变量value
}
}
例如,在类A中添加一个名为attx的属性:
classA
{
privateintx。
//私有成员变量
publicintattx//定义属性(可读、可写)
{
get//可读
{
returnx。
}
set//可写
{
x=value。
//value是一种特殊的变量,用于接收对属性赋的值
}
}
}
通过属性attx对私有成员变量x进行读写操作:
Aa=newA()。
A.attx=100。
//写属性
Console.WriteLine("x={0}",a.attx)。
//读属性
例如,在类A中添加一个名为attx的属性:
classA
{
privateintx。
//私有成员变量
publicintattx//定义属性
{
get//可读
{
returnx。
}
set//可写
{
x=value。
//value是一种特殊的变量,用于接收对属性赋的值
}
}
}
2.2.5类的静态成员
非静态方法可以访问类中包括静态方法在内的所有成员,而静态方法只能访问类中的静态成员。
类的成员还可以分为静态成员和非静态成员。
使用了static修饰符的方法为静态成员,反之则是实例成员。
静态成员隶属于类,只有一个版本,所有对象都共享这个版本;非静态成员隶属于对象,不同的对象(同一个类实例化)有不同的非静态成员,因此有多个版本。
从内存管理的角度看,静态成员是在一个共享的内存空间中定义,所有对象都可以访问这个空间中的同一个静态成员;而非静态成员在对象被创建时形成自己的存储空间(这个空间是对象所拥有空间的一部分),这样不同的对象将形成不同的非静态成员(虽然它们的类型都一样)。
从访问的方式看,静态成员不需要(也不能)实例化,只要定义类了以后就可以通过类名来访问它;而非静态成员则需要在创建对象以后通过对象名来访问。
声明静态成员是由修饰符static来完成,例如:
privatestaticinty。
//静态成员变量
publicstaticvoidf(intx){}//静态成员方法
【例4】静态成员与非静态成员的区别。
classStaticCl
{
privatestringobjName。
privateintx。
//非静态成员变量
privatestaticintstx。
//静态成员变量
publicvoidsetx(intx)//非静态成员方法
{
this.x=x。
}
publicstaticvoidsetstx(inty)//静态成员方法
{
stx=y。
//在静态成员方法中不能使用关键字this
}
publicvoidshow()//非静态成员方法
{
Console.WriteLine("对象{0}:
x={1},stx={2}",this.objName,x,stx)。
}
publicStaticCl(stringobjName){this.objName=objName。
x=0。
stx=0。
}
}
staticvoidMain(string[]args)
{
StaticClc1=newStaticCl("c1")。
StaticClc2=newStaticCl("c2")。
c1.setx
(1)。
StaticCl.setstx
(2)。
//不能写成c1.setstx
(2)。
c2.setx(3)。
StaticCl.setstx(4)。
//不能写成c2.setstx(4)。
c1.show()。
c2.show()。
Console.ReadLine()。
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二章 面向对象程序设计 第二 面向 对象 程序设计