版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第4章章 面向对象程序设计面向对象程序设计本章主要内容本章主要内容n类与对象类与对象n字段、属性和方法字段、属性和方法n类的继承与多态类的继承与多态n委托与事件委托与事件*n接口接口n结构与枚举结构与枚举nC#2.0/4.0新特性新特性4.1 面向对象概念面向对象概念n1、对象、对象nObject是由数据和允许的操作组成的封装体,是现实世界中的某是由数据和允许的操作组成的封装体,是现实世界中的某个实体在计算机逻辑中的映射和体现。个实体在计算机逻辑中的映射和体现。n数据数据-属性属性 操作操作-方法方法n2、类和对象、类和对象nClass是一组具有相同数据结构和相同操作的对象的集合是一组具有相
2、同数据结构和相同操作的对象的集合n类是对象的模板,对象是类的实例化类是对象的模板,对象是类的实例化nStudent s1=new Student(); /Student类实例化了类实例化了s1实例实例4.1 面向对象概念面向对象概念n3、面向对象的基本特征、面向对象的基本特征n(1)封装封装n利用抽象数据类型,将数据和基于数据的操作封装在一起。利用抽象数据类型,将数据和基于数据的操作封装在一起。抽象数据类型用抽象数据类型用Class来表示。来表示。n(2)继承继承n当一个类拥有另一个类的所有数据和操作时,就称这两个当一个类拥有另一个类的所有数据和操作时,就称这两个类之间有继承关系。类之间有继承
3、关系。n继承是父类(基类)和子类(派生类)之间共享数据和方继承是父类(基类)和子类(派生类)之间共享数据和方法的机制。法的机制。nC#通过接口来实现多重继承通过接口来实现多重继承n(3)多态多态n多态是指一个程序中同名的不同方法共存。多态是指一个程序中同名的不同方法共存。4.2 类和对象类和对象n类的声明:类的声明:n类的修饰符(表类的修饰符(表4-1) class :基类基类 /类成员类成员(表表4-2)表表4-1 类修饰符类修饰符修饰符描 述new新建类,表示由基类中继承而来、与基类中同名的成员public公有类,表示外界可以不受限制地访问private私有类,表示只有在定义它的类才能访问
4、该类。缺省为privateinternal内部类,表示仅有本程序能够访问该类。protected保护类,表示可以访问该类或从该类派生的类型。abstract抽象类,说明该类是一个不完整类,只有声明而没有具体的实现。一般只能用来做其他类的基类sealed密封类,说明该类不能作为其他类的基类,不能再派生新的类类的示例类的示例public class Student : Person /类头类头 /一对大括号之间是类体一对大括号之间是类体 private string id; /类成员类成员 private float score; public Student(string s, float d)
5、 /类的构造函数类的构造函数 id = s; score = d; public void ShowStudentMsg() /类的方法类的方法 Console.WriteLine(ID:0 Score:1, id, score); 类成员功 能 描 述类成员功 能 描 述常量代表与该类相关的常数值字段即该类的变量,又称域方法实现由该类执行的计算和操作运算符定义类的实例能使用的运算符索引器允许编程人员在访问数组时,通过索引器访问类的多个实例构造函数在类被实例化时首先执行的函数,主要是完成对象初始化操作属性用于定义一些命名特性,通过它来读取和写入相关的特性析构函数在对象被销毁之前最后执行的函数,
6、主要是完成对象结束时的收尾工作事件由类产生的通知,用于说明发生了什么事情静态构造函数用于规定在初始化该类自身时需要做些什么表表4-2 类的成员类的成员表表4-3 类成员的可访问性类成员的可访问性访问修饰符可访问性描述public允许类的使用者从外部进行访问。这是限制最少的一种访问方式,它的优点是使用灵活,缺点是外界有可能会破坏对象成员值的合理性private不允许外界访问,也不允许派生类访问。缺省的类成员访问修饰符为tected不允许外界访问,但允许这个类的派生类访问。internal允许同一个命名空间中的类访问。readonly该成员的值只能读,不能写。也就是说,除了赋
7、予初始值外,在程序的任何一个部分将无法更改这个成员的值。class Person /定义人类定义人类 public string name; /公有成员名字公有成员名字 int age; /私有成员年龄私有成员年龄 protected string sex; /保护成员性别保护成员性别 public void ShowPersonMsg() /方法体方法体 Public static void A() /方法体方法体 class Student:Person /定义学生类定义学生类 Int score; /私有成员成绩私有成员成绩 public void ShowStudentMsg() Sh
8、owPersonMsg(); /正确,允许使用父类的方法正确,允许使用父类的方法 name = William; /正确,允许访问父类的共有成员正确,允许访问父类的共有成员 sex = man; /正确,允许访问父类的保护成员正确,允许访问父类的保护成员 class Teacher public string department; /公有成员系公有成员系 private float salary; /私有成员工资私有成员工资 public void ShowTeacherMsg() department = 计算机计算机; /正确,允许访问自身成员正确,允许访问自身成员 salary = 6
9、741.9f; /正确,允许访问自身成员正确,允许访问自身成员 Person.A(); /正确,访问公共的静态成员正确,访问公共的静态成员 Person p1 = new Person(); = 张三张三; /正确,允许访问正确,允许访问p1的公有成员的公有成员 p1.ShowPersonMsg(); /p1.age = 21; /错误,不允许访问错误,不允许访问p1的私有成员的私有成员 Console.WriteLine(0,1,2, ,department ,salary ); 4.2.2 类成员类成员n3、静态成员与实例成员、静态成员与实例成员n静态成员:使
10、用修饰符静态成员:使用修饰符static定义的字段、方法、属定义的字段、方法、属性、运算符、事件和构造函数等性、运算符、事件和构造函数等n静态成员与实例成员的区别静态成员与实例成员的区别n静态成员属于类所有,为这个类的所有实例所共享,无论这静态成员属于类所有,为这个类的所有实例所共享,无论这个类创建了多少个副本,一个静态成员在内存中只占有一块个类创建了多少个副本,一个静态成员在内存中只占有一块区域。区域。n静态成员的访问格式:类名静态成员的访问格式:类名.静态成员名。静态成员名。 n实例成员属于该类创建的实例,要通过对象名使用实例成员属于该类创建的实例,要通过对象名使用4.2.3 对象创建与访
11、问对象创建与访问n1、对象创建、对象创建n类名类名 对象名对象名=new 构造函数构造函数(参数列表参数列表);n例如:例如:nPerson p1; /声明一个声明一个Person类对象类对象p1,并未创建,并未创建np1new Person();(); /实例化实例化p1,为,为p1分配内存空间分配内存空间nPerson p1new Person();(); /声明对象声明对象p1并实例化并实例化n使用使用new创建对象时,系统会自动调用构造函数,完成初始创建对象时,系统会自动调用构造函数,完成初始化操作化操作4.2.3 对象创建与访问对象创建与访问n2、对象的访问、对象的访问n对象的访问就
12、是访问对象成员,使用对象的访问就是访问对象成员,使用.运算符运算符n例如:例如:nPerson p1new Person()(); = 张三张三; np1.ShowPersonMsg(); 4.2.4 构造函数和析构函数构造函数和析构函数n1、构造函数、构造函数n构造函数的方法名与类名相同构造函数的方法名与类名相同n构造函数通常是构造函数通常是public,构造函数没有返回类型构造函数没有返回类型n构造函数是不能被继承的构造函数是不能被继承的n一个类必须至少有一个构造函数。如果没有声明构造函数,系统一个类必须至少有一个构造函数。如果没有声明构造函数,系统会提供一个默认的构造函
13、数。默认的构造函数将数值类型初始化会提供一个默认的构造函数。默认的构造函数将数值类型初始化为为0,字符类型初始化为,字符类型初始化为null,逻辑类型初始化为,逻辑类型初始化为falsen在创建一个类的新对象时,系统会自动调用该类的构造函数来初在创建一个类的新对象时,系统会自动调用该类的构造函数来初始化新对象。始化新对象。4.2.4 构造函数和析构函数构造函数和析构函数n2 2、析构函数(简单了解)、析构函数(简单了解)n析构函数用于当类实例从内存中删除时,完成资源的析构函数用于当类实例从内存中删除时,完成资源的释放与清理工作。释放与清理工作。n析构函数的名称是在类名前加上一个析构函数的名称是
14、在类名前加上一个“ ”n析构函数没有参数、没有返回类型、没有访问修饰符析构函数没有参数、没有返回类型、没有访问修饰符n不鼓励用析构函数,无用存储单元收集器会自动在后不鼓励用析构函数,无用存储单元收集器会自动在后台完成释放与清理工作台完成释放与清理工作4.3 字段(变量、域)字段(变量、域)n说明:说明:n字段一般置为字段一般置为private,以提高数据的封装程度,以提高数据的封装程度nstatic字段为类所有,通过类名调用字段为类所有,通过类名调用n非静态字段通过对象来访问非静态字段通过对象来访问nreadonly字段,只能在声明时赋值或者通过构造函数字段,只能在声明时赋值或者通过构造函数c
15、lass Student readonly string name=“Jack”; /声明声明只读字段只读字段,并赋值,并赋值 private float score; static int age; /静态字段静态字段 protected string id ; 4.4 属性属性n1、属性定义格式:、属性定义格式:nget方法完成对数据值的读取,方法完成对数据值的读取,return用于返回读取的值用于返回读取的值nset方法完成对数据值的设置修改,方法完成对数据值的设置修改,value是一个关键字是一个关键字n2、属性的访问:、属性的访问:n若属性是静态成员,通过若属性是静态成员,通过”类名
16、类名. .属性名属性名“访问访问n若属性是非静态成员,通过若属性是非静态成员,通过”对象名对象名. .属性名属性名“访问访问Private 类型类型 字段名字段名public 类型类型 属性名属性名 get return 字段名字段名; set 字段名字段名 = value; 4.4 属性属性n属性与字段的比较属性与字段的比较n属性可以实现只读或只写,而字段不可属性可以实现只读或只写,而字段不可n属性的属性的set方法可以进行有效性检查,而字段不能方法可以进行有效性检查,而字段不能n属性的属性的get方法不仅可以返回字段的值,还可以返方法不仅可以返回字段的值,还可以返回处理结果回处理结果n对外
17、公布事物的状态信息,使用属性对外公布事物的状态信息,使用属性n例如例如,一个表示月份的字段,其值的范围应在,一个表示月份的字段,其值的范围应在112之间,但是我们无法阻止用户输入非法的数值,解决之间,但是我们无法阻止用户输入非法的数值,解决这个问题的办法就是使用属性。这个问题的办法就是使用属性。4.5 方法方法n1、概念、概念n方法表示类的动态行为,即类所具有的功能和操作方法表示类的动态行为,即类所具有的功能和操作n2、方法的声明、方法的声明方法修饰符方法修饰符 返回值类型返回值类型 方法名方法名(形参形参1,形参,形参2.) /方法体;方法体;方法修饰符有很多,若省略则默认为是方法修饰符有很
18、多,若省略则默认为是private。最常用的修饰符是最常用的修饰符是public、private、static方法如果有返回值,使用方法如果有返回值,使用return语句语句有参方法与无参方法调用时的不同有参方法与无参方法调用时的不同4.5 方法方法n3、方法的调用、方法的调用n在方法声明的类中调用方法在方法声明的类中调用方法n方法名方法名(实际参数列表实际参数列表);n在方法声明的类外部调用方法在方法声明的类外部调用方法n对象名对象名.方法名方法名(实参列表实参列表);n4、参数类型、参数类型n值参数值参数不含任何修饰符不含任何修饰符n引用参数引用参数以以ref修饰符声明修饰符声明n输出参数
19、输出参数以以out修饰符声明修饰符声明n数组型参数数组型参数以以params修饰符声明修饰符声明4.5 方法方法-参数类型参数类型n1.值参数值参数不含任何修饰符不含任何修饰符n参数传递时,把实参的值复制给形参,形参的值发参数传递时,把实参的值复制给形参,形参的值发生改变不会影响实参的值,从而保证了实参数据的生改变不会影响实参的值,从而保证了实参数据的安全安全n2.引用型引用型以以ref修饰符声明修饰符声明n形参和实参前均使用关键字形参和实参前均使用关键字 refn参数传递时,把实参的地址传递给形参,其特点是参数传递时,把实参的地址传递给形参,其特点是形参的值发生改变时,同时改变实参的值。形参
20、的值发生改变时,同时改变实参的值。n实例实例4-4 引用型参数应用。引用型参数应用。2个数据交换个数据交换4.5 方法方法-参数类型参数类型n3.输出参数输出参数以以out修饰符声明修饰符声明n形参和实参前均使用关键字形参和实参前均使用关键字outnout隐含隐含return(通过变量返回),故方法的返回类(通过变量返回),故方法的返回类型为型为voidn输出型参数也是将内存地址传递给方法输出型参数也是将内存地址传递给方法n与引用型参数的区别是调用方法前无需对变量进行初与引用型参数的区别是调用方法前无需对变量进行初始化始化n输出型参数用于传递方法返回的数据输出型参数用于传递方法返回的数据n实例
21、实例4-5 计算计算x+y,x-y4.5 方法方法-参数类型参数类型n4.数组参数数组参数以以params修饰符声明修饰符声明n参数数组必须放在整个参数列表的最后,同时参参数数组必须放在整个参数列表的最后,同时参数数组不允许是多维数组。数数组不允许是多维数组。n实例实例4-6 求数组元素的最大值、最小值和所有求数组元素的最大值、最小值和所有元素和元素和4.5.3 静态方法和实例方法静态方法和实例方法n静态方法使用静态方法使用static修饰符,属于类所有修饰符,属于类所有n静态方法只能访问类中的静态成员静态方法只能访问类中的静态成员class Class1 public static int
22、sum1(int x, int y) return x + y; public int sum1(int x, int y) return x + y; int a=10,b=12;int s2 = Class1.sum1(a, b);Class1 c = new Class1();int s1 = c.sum2(a, b);4.5.4 方法重载方法重载n1.方法重载概念方法重载概念n类中类中2个以上的方法(包括继承而来的方法)名称个以上的方法(包括继承而来的方法)名称相同,但签名不同,这种情况称为方法的重载相同,但签名不同,这种情况称为方法的重载n2 .方法签名概念方法签名概念n是指调用方法
23、所需要的方法名称、参数个数、参数是指调用方法所需要的方法名称、参数个数、参数类型和修饰符类型和修饰符n3.说明说明n如果派生类与基类的方法同名,则编译时给出一个如果派生类与基类的方法同名,则编译时给出一个警告,要求在同名的派生类方法前加上关键字警告,要求在同名的派生类方法前加上关键字new4.5.4 方法重载方法重载实例实例4-8class MyClass public int Add(int x, int y) return x + y; public double Add(double x, double y) return x + y; public string Add(string
24、x, string y) return x + y; MyClass c = new MyClass(); Console.WriteLine(c.Add(12, 45); Console.WriteLine(c.Add(12.3, 89.5); Console.WriteLine(c.Add(My name is , annoy);4.5.4方法的重载方法的重载-实例(实例(2)class MyClass public int Add(int x, int y) return x + y; class SubClass:MyClass /public int Add(int x, int y
25、) return x + y; public double Add(double x, double y) return x + y; 4.5.6 this关键字关键字n在普通方法中,在普通方法中,this表示调用这个方法的对象表示调用这个方法的对象n在构造函数中,在构造函数中,this表示新创建的对象表示新创建的对象nThis的几种用法:的几种用法:n1.使用使用this解决局部变量与域同名的问题解决局部变量与域同名的问题n2.在构造函数中用在构造函数中用this调用另一构造函数调用另一构造函数n3. this可以指代类本身的实例可以指代类本身的实例使用使用this解决局部变量与域同名的问题
26、解决局部变量与域同名的问题class Employee private string name,sex; int age; public Employee (string name,int age) /this. name表示域变量,表示域变量,name表示的是参数变量表示的是参数变量 =name; this.age =age; 在构造函数中用在构造函数中用this调用另一构造函数调用另一构造函数class Employee private string name,sex; int age; public Employee (string name,int age) thi
27、 =name; this.age =age; /调用另一构造函数初始化调用另一构造函数初始化name和和age public Employee (string name,int age,string sex) :this(name,age) this.sex=sex; 规范原则是,只在必要时才使用规范原则是,只在必要时才使用this;该实例中参数、字段宜采用不同命名规范替代该实例中参数、字段宜采用不同命名规范替代thisthis可以指代类本身的实例可以指代类本身的实例class Employee public string Name get; set; public string
28、Salary get; set; public void Save() DataStorage.Store(this); class DataStorage public static void Store(Employee employee) /.方法体方法体 4.6 继承继承n继承是面向对象编程中一个重要的特性,也是实现代继承是面向对象编程中一个重要的特性,也是实现代码复用的重要手段。码复用的重要手段。 n被继承的类被称为基类或父类,继承其他类的类叫做被继承的类被称为基类或父类,继承其他类的类叫做派生类(派生类(Subclass)或子类。)或子类。n单继承单继承 n继承是可以传递的继承是可
29、以传递的n子类自动地从父类那里继承所有成员,与成员的访问子类自动地从父类那里继承所有成员,与成员的访问方式无关。访问方式只能决定派生类能否访问它们,方式无关。访问方式只能决定派生类能否访问它们,即可见性即可见性class Student : Person /4.6.2 派生类派生类n1.派生类定义格式派生类定义格式nPublic class 派生类名称:基类名称派生类名称:基类名称类体类体n2.说明说明n访问修饰符可以是访问修饰符可以是publicpublic、privateprivate、protectedprotected。通。通常使用常使用publicpublic以保证类的开放性。以保证
30、类的开放性。n父类只能有一个(单继承),如果要多重继承,则应父类只能有一个(单继承),如果要多重继承,则应使用接口使用接口n继承可以传递,即继承可以传递,即c c从从b b继承,继承,b b从从a a继承,则继承,则c c继承了继承了b b和和a a的所有成员(字段、属性、方法、索引等)的所有成员(字段、属性、方法、索引等)n子类除继承父类的成员外,还可以添加新成员,隐藏子类除继承父类的成员外,还可以添加新成员,隐藏或修改父类的成员。常见的是或修改父类的成员。常见的是方法的继承、添加、重方法的继承、添加、重载、隐藏、重写(覆盖)载、隐藏、重写(覆盖)4.6.2 派生类派生类n子类可以定义与父类
31、同名的方法,有以下三种可能子类可以定义与父类同名的方法,有以下三种可能的情况:的情况:n方法的重载方法的重载:定义与父类同名、但签名不同的方法:定义与父类同名、但签名不同的方法n方法的隐藏方法的隐藏:定义与父类同名且签名也相同的方法。:定义与父类同名且签名也相同的方法。子类方法名前应加子类方法名前应加new关键字关键字n方法的重写方法的重写:定义与父类同名且签名也相同的方法。:定义与父类同名且签名也相同的方法。父类方法名前使用父类方法名前使用virtual或或abstract修饰;子类同修饰;子类同名方法名前用名方法名前用override修饰修饰4.7.1方法的重载和隐藏方法的重载和隐藏 cl
32、ass MyClass public int Add(int x, int y) return x + y; class SubClass:MyClass public new int Add(int x, int y) return x + y; public double Add(double x, double y) return x + y; 4.7.2 方法的重写方法的重写(虚方法虚方法)class A /基类中定义虚方法基类中定义虚方法 public virtual void VirtualMethod() Console.WriteLine(基类方法基类方法); class B:
33、A /派生类中重写虚方法派生类中重写虚方法 public override void VirtualMethod() Console.WriteLine(派生类方法派生类方法); 4.7.2 方法的重写方法的重写(抽象方法抽象方法)abstract class Vehicle /抽象汽车类抽象汽车类 public abstract void Whistle (); /抽象方法必须包含在抽象类中抽象方法必须包含在抽象类中class Car:Vehicle /轿车类轿车类 public override void Whistle () /重写基类的抽象方法重写基类的抽象方法 Console.Wri
34、teLine(The car is speaking:Di-di!);/抽象方法实现抽象方法实现 4.7.3 抽象类与抽象方法抽象类与抽象方法n抽象类和抽象方法均使用抽象类和抽象方法均使用abstract修饰符修饰符n抽象类只能作为其他类的基类,不能被实例化抽象类只能作为其他类的基类,不能被实例化n抽象方法一定属于抽象类抽象方法一定属于抽象类,抽象类不一定非要包含抽,抽象类不一定非要包含抽象方法象方法n抽象方法不提供具体实现代码,只写方法名及方法的抽象方法不提供具体实现代码,只写方法名及方法的签名,无需写签名,无需写。n抽象类的派生类必须重写基类中的抽象方法抽象类的派生类必须重写基类中的抽象方法nabstract与与sealed不能同时使用不能同时使用4.7.4 密封类和密封方法密封类和密封方法n密封类和密封方法均使用密封类和密封方法均使用sealed修饰符修饰符n密封类是不允许继承的类,密封类是不允许继承的类,String类是一个密封类类是一个密封类n密封方法是不允许在派生类中对该方法重写。密封方法是不允许在派生类中对该方法重写。n密封方法一定是重写父类的虚方法或抽象方法密封方法一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上饶市广丰县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 白银市白银区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 果洛藏族自治州甘德县2025-2026学年第二学期五年级语文第四单元测试卷(部编版含答案)
- 厦门市湖里区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 伊春市翠峦区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 保定市高碑店市2025-2026学年第二学期四年级语文期中考试卷(部编版含答案)
- 公司接待方案
- 深度解析(2026)《CBT 4428-2015船用辅锅炉控制设备技术条件》
- 深度解析(2026)《CBT 4015-2005 J类法兰青铜 1.6MPa截止阀》
- 深度解析(2026)《AQT 1121-2023煤矿安全现状评价实施细则》宣贯培训长文
- 财税销售技巧培训课件
- GB/T 46894-2025车辆集成电路电磁兼容试验通用规范
- 《安全工程专业实验》课件全套 第1-8章 实验室安全-安全检测实验
- 社会组织业务培训课件
- 江西省港口集团招聘笔试题库2026
- 给水工程可行性研究报告
- 装饰装修施工安全培训课件
- 《生物医学新技术临床研究和临床转化应用管理条例》测试练习竞赛考试题库(附答案)
- 2026年细胞免疫学实验计划
- 铁路货车课件
- 审计法讲解课件
评论
0/150
提交评论