考点3 类的继承与封装《算法与程序设计-C#》河北省(对口招生)计算机类 知识点讲解

2026-07-31
| 9页
| 57人阅读
| 0人下载

内容正文:

河北省(计算机类)对口招生《算法与程序设计-C#》 复习讲义 模块 7 面向对象设计 考点三 类的继承与封装 【考纲要求】 1.了解封装的作用与实现; 2.了解继承的概念、语法和实现。 【知识网络】 【知识和技能要点】 一、类的封装 1.封装的概念 封装是面向对象核心特性,指将类的数据(字段)和操作数据的行为(方法、属性)打包封装在类中,遵循隐藏内部细节、暴露公共接口的核心思想。通过访问修饰符控制成员访问权限,杜绝外部随意篡改数据,保障数据完整性、提升代码可维护性。 2.封装实现语法 通过访问修饰符修饰类及类的成员,实现权限管控,固定语法结构: 访问修饰符 class 类名 {  访问修饰符 类成员(字段/属性/方法); } 3.五大访问修饰符 访问修饰符决定类、类成员的访问范围与可见性,C#共5种,权限范围由大到小排序:public > protected internal > internal > protected > private (1)public 公共的:无访问限制,可在任意类、任意程序集中访问。 (2)private 私有的:权限最小,仅能在当前定义类的内部访问,类外部、子类均无法直接访问。 (3)protected 受保护的:可在当前类内部、子类中访问,非子类的外部类无法访问。 (4)internal 内部的:仅限当前程序集(同一个项目)内所有类访问,跨程序集无法访问。 (5)protected internal 受保护内部的:组合权限,取并集。可在当前类、子类、当前程序集所有类中访问,仅程序集外部的非子类无法访问。 二、类的继承 1. 继承概念 继承是实现代码复用的核心机制,指在已有类的基础上创建新类。已有类称为基类/父类,新建类称为派生类/子类,子类可复用父类合法成员,无需重复编写代码。 2.继承的作用 (1) 简化程序开发与后期维护; (2)实现代码复用,减少冗余代码,节省开发时间; (3)规范类的层级关系,提升代码可读性。 3.继承实现语法 通过冒号 : 实现继承。 语法: // 定义父类 class 父类 { } // 定义子类,继承父类 class 子类 : 父类 { } 核心说明:子类无法继承父类的构造函数、析构函数、私有成员。 4.继承中构造函数与析构函数调用顺序 (1)构造函数调用规则:先父类、后子类。创建子类对象时,优先执行父类构造函数,再执行子类构造函数,且从最顶层基类开始依次执行。 ① 父类有无参构造:子类自动隐式调用父类无参构造; ② 父类仅有带参构造、无无参构造:子类必须通过base()显式调用父类带参构造,否则编译报错。 (2)析构函数调用规则:与构造函数完全相反,先子类、后父类,由近及远依次执行。 三、base关键字 base关键字专属子类使用,静态方法中禁止使用,用于访问父类的字段、属性、方法、构造函数,解决父子类成员同名冲突。 1. 访问父类字段/属性 场景:父子类成员同名,子类默认优先访问自身成员,通过base.成员名强制访问父类成员。 语法:base.字段名/属性名 2. 调用父类方法 场景:子类重写父类方法后,可通过base调用父类原方法逻辑。 语法:base.方法名() 3. 调用父类构造函数 场景:父类无无参构造时,子类构造函数必须通过base显式调用父类带参构造。 语法:子类构造函数(参数) : base(父类所需参数) {} 四、多态核心概念 多态是继承基础上的进阶特性,意为“多种形态”。指不同子类继承同一个父类后,对父类的同一方法实现不同的业务逻辑,通过父类引用指向子类对象,运行时自动匹配子类实现,实现一个接口、多种实现。 1.多态的两种类型 (1)编译时多态(静态多态) 编译阶段确定调用的方法,主要通过方法重载、运算符重载实现。 (2) 运行时多态(动态多态) 程序运行阶段动态匹配方法实现,依托继承、虚方法重写、抽象类、接口实现,是多态的核心考查形式。 2.多态的两种核心实现方式 (1) new关键字隐藏父类方法(编译时多态) 子类定义与父类方法名、参数列表、返回值完全一致的方法,用new修饰,隐藏父类同名方法,实现静态多态。 核心规则: ① 父类引用指向子类对象,调用父类方法; ② 子类引用指向子类对象,调用子类new隐藏的方法。 (2)virtual+override虚方法重写(运行时多态,重中之重) 通过父类虚方法、子类重写,实现运行时动态匹配,是对口高考多态核心考点。 语法格式: // 父类定义虚方法 public virtual 返回值 方法名() { 父类逻辑 } // 子类重写虚方法 public override 返回值 方法名() { 子类专属逻辑 } 【练习题】 1、 填空题 1.多态通过______方法或抽象方法实现,使同一方法在不同子类中有不同行为。 2.子类构造函数中,通过______关键字显式调用父类有参构造函数。 3.子类实例化时,默认先调用父类的______构造函数。 4.继承中析构函数执行顺序是先________后________。 5.多态分为编译时静态多态和________动态多态。 6.C#中类的继承是______继承,即一个子类只能继承一个父类;但一个类可以同时实现多个______,从而获得多重继承的效果。 7.编译时多态通过______实现,在编译阶段根据参数的______确定调用的方法。 8.父类无无参构造时,子类必须通过________显式调用父类带参构造。 9.当子类使用new关键字隐藏父类同名方法时,若通过父类引用调用该方法,执行的是______的方法;若通过子类引用调用,执行的是______的方法,这种机制属于______多态。 10.抽象类可以包含______方法和______方法,其中抽象方法没有方法体,必须在子类中重写;非抽象方法可以有完整实现,子类可以选择性重写。 二、选择题 1.下列关于封装的描述,错误的是( )。 A. 封装通过访问修饰符控制成员的可见性 B. 封装将数据与操作数据的方法绑定在一起 C. 封装意味着所有字段都必须声明为private D. 封装的目的是保护数据安全,降低耦合 2.在C#中,若子类未显式调用base(),但父类没有无参构造函数,则( )。 A. 编译器会自动生成父类无参构造 B. 子类编译报错 C. 子类默认调用父类第一个有参构造 D. 子类无法实例化,但编译通过 3.下列关于多态的描述,错误的是( )。 A. 多态通过虚方法或抽象方法实现 B. 多态允许父类引用指向子类对象 C. 多态在编译时确定调用的具体方法 D. 多态提升了代码的扩展性 4.在C#中,若父类构造函数抛出异常,则( )。 A. 子类构造函数继续执行 B. 子类对象创建失败,抛出异常 C. 子类对象创建成功,但父类字段未初始化 D. 编译器报错 5.下列成员中,子类无法从父类继承的是( ) A. public字段 B. protected方法 C. private私有成员 D. public属性 6.创建子类对象时,构造函数的执行顺序是( ) A. 先子类、后父类 B. 先父类、后子类 C. 仅执行子类 D. 随机执行 7.子类使用new关键字隐藏父类同名方法,下列说法正确的是() A. 完全重写父类方法,实现动态多态 B. 父类引用指向子类对象调用父类方法 C. 子类引用指向子类对象调用父类方法 D. 会覆盖父类原有方法 8.关于虚方法virtual说法正确的是() A. 子类必须重写虚方法 B. 虚方法可直接定义在静态类中 C. 为子类重写提供入口,可选择性重写 D. 虚方法无法拥有方法体 9.子类override重写虚方法的作用是() A. 隐藏父类方法,实现静态多态 B. 覆盖父类虚方法,实现运行时动态多态 C. 仅修改方法名称 D. 强制调用父类方法 10.关于静态多态与动态多态区别说法错误的是( ) A. 静态多态编译期绑定 B. 动态多态运行期绑定 C. new隐藏属于动态多态 D. virtual+override属于动态多态 三、判断题 1.子类实例化时,父类构造函数一定在子类构造函数之前执行。( ) 2.子类可以继承父类的私有成员,但不能直接访问。( ) 3.C#中类的默认访问级别为internal,类成员默认访问级别为private,二者均无需显式声明。( ) 4.子类可以继承父类的protected成员,且该成员在同程序集其他非子类中也可访问。( ) 5.父类的构造函数、析构函数可被子类继承,但需要手动调用才能执行。( ) 6.base关键字可以在静态方法、普通方法、构造函数中任意使用。( ) 7.父类普通方法被子类new隐藏后,向上转型调用该方法,会执行子类隐藏后的方法。( ) 8.方法重载、new方法隐藏均属于编译时静态多态。( ) 9.父类存在无参构造时,子类会隐式自动调用该无参构造。( ) 10.子类重写方法可以修改父类虚方法的返回值类型。( ) 四、程序读程题 1.下列程序的运行结果为________ class Father { public void Test() { Console.WriteLine("父类普通方法"); } } class Son : Father { public new void Test() { Console.WriteLine("子类隐藏方法"); } } class Program { static void Main() { Father f = new Son(); f.Test(); } } 2.下列程序的运行结果为________ using System; class Animal { public virtual void Run() { Console.WriteLine("动物奔跑"); } } class Rabbit : Animal { public override void Run() { Console.WriteLine("兔子蹦跳"); } } class WhiteRabbit : Rabbit { public override void Run() { base.Run(); // 调用 Rabbit 的 Run() Console.WriteLine("白兔快跑"); } } class Program { static void Main() { Animal a = new WhiteRabbit(); a.Run(); } } 【答案】 一、填空题 1.虚 2.base 3. 无参 4. 子类、父类 5.运行时 6. 单 、 接口 7.方法重载;类型和数量 8.base() 9.父类;子类;编译时 10.抽象、非抽象 二、选择题 1.C 2.B 3.C 4.B 5.C 6.B 7.B 8.C 9.B 10.C 三、判断题 1. √ 2.√ 3.√ 4.× 5.× 6.× 7.× 8.√ 9.√ 10.× 四、程序读程题 1.父类普通方法 2. 兔子蹦跳 白兔快跑 原创精品资源学科网独家享有版权,侵权必究 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

考点3  类的继承与封装《算法与程序设计-C#》河北省(对口招生)计算机类 知识点讲解
1
考点3  类的继承与封装《算法与程序设计-C#》河北省(对口招生)计算机类 知识点讲解
2
考点3  类的继承与封装《算法与程序设计-C#》河北省(对口招生)计算机类 知识点讲解
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。