两种重写方法的内存机制
在编程语言如C#中,`new`和`override`关键字用于处理类的继承和方法重写,这两种机制涉及到内存管理和多态性。本文将详细解释这两种重写方法的内存机制,并通过实例来阐述它们的区别。 让我们回顾一下继承实例化的流程。当创建一个子类对象时,如`Student`实例,内存会执行以下操作: 1. **实例化父类成员**:在子类对象的内存空间中,会为父类的所有公有成员分配空间。在这个例子中,`Person`类有`name`字符串变量,`age`整型变量初始化为10,以及两个非虚方法`printC()`和`printD()`,还有一个虚方法`printA()`。 2. **实例化子类成员**:接着,为子类特有的成员分配空间。在`Student`类中,除了继承的成员外,还有`num`整型变量,以及对`printA()`的重写和`printD()`的`new`重写。 3. **基类引用**:子类对象内部包含一个指向父类实例的引用,这在C#中称为`base`,在Java中为`super`。这意味着子类对象可以访问并调用父类的成员。 现在,我们来看看`new`和`override`重写的关键区别: **1. `new`重写**: - 当子类使用`new`关键字重写父类方法时,它并不改变父类原有的方法,而是创建一个新的同名方法。在`Student`类中,`new`重写了`printD()`,这意味着`Student`对象有一个属于自己的`printD()`方法。 - 当使用子类引用`stu`调用`printD()`时,会执行子类的实现。但若将子类对象转换为父类引用`person pe = (person)stu`,调用`pe.printD()`则会执行父类中的`printD()`方法,因为子类的`new`重写并不影响父类引用的可见性。 **2. `override`重写**: - `override`关键字允许子类覆盖父类的虚方法。在`Student`类中,`printA()`被`override`重写,这意味着它会替换父类的实现。 - 不论是使用子类引用`stu`还是父类引用`pe`调用`printA()`,都会执行子类中的`printA()`实现,因为`override`重写真正地覆盖了父类的方法。无论通过哪种引用调用,多态性保证了始终调用子类的覆盖版本。 总结起来,`new`关键字主要用于隐藏父类的方法,而不是覆盖。它在子类对象中创建了一个新的同名方法,但不会影响父类引用的行为。而`override`关键字则真正实现了方法的覆盖,不论通过何种引用调用,都会执行子类的覆盖版本,体现了多态性。理解这两种重写方式对于理解和优化面向对象程序设计至关重要。





























- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 生产流水线小车的PLC控制设计.doc
- 智慧交通产品总体解决方案-交通信息资源平台.docx
- 仓库管理系统设计与实现软件工程课程设计.doc
- Packet-Tracer-5.2实验(十四)-网络地址转换NAT配置.doc
- 电子商务企业电子商务的创建与管理.doc
- 健康养生网站分析推广.ppt
- 幻灯片1首页《数据库原理及其应用》精品课程河南科技大学.ppt
- XXX云计算平台建设总体技术实施方案.doc
- 基于云计算辅助教学的艺术类高职公共英语教学改革与发展研究.docx
- plc电梯毕业-设计.doc
- 翻转课程在计算机基础应用课程中的应用研究.docx
- EPP模式的数据采集卡设计方案.doc
- 液晶显示屏LCD显示接口方案设计书-课程方案设计书.doc
- 项目安全生产文明施工管理网络.doc
- 人事管理系统的研究设计数据库课程研究设计.doc
- 信息系统项目管理师九大知识领域过程输入输出.doc


