C#基础 继承和实例化
有代码如下,问输出的是多少:
class Program
{
static void Main(string[] args)
{
B b = new B();
Console.ReadKey();
}
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A
{
int x = ;
int y;
public B()
{
y = -;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
}
结果:x=1;y=0;
刚开始有点不理解,觉得输出是x=1;y=-1;然后反编译看了下IL代码,然而。。还是没看出来,IL代码如下:
.class private auto ansi beforefieldinit Program
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: nop
L_0007: ret
} .method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack
.locals init (
[] class ConsoleApplication1.Program/B b)
L_0000: nop
L_0001: newobj instance void ConsoleApplication1.Program/B::.ctor()
L_0006: stloc.0
L_0007: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
L_000c: pop
L_000d: ret
} .class auto ansi nested private beforefieldinit A
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: nop
L_0007: nop
L_0008: ldarg.0
L_0009: callvirt instance void ConsoleApplication1.Program/A::PrintFields()
L_000e: nop
L_000f: ret
} .method public hidebysig newslot virtual instance void PrintFields() cil managed
{
.maxstack
L_0000: nop
L_0001: ret
} } .class auto ansi nested private beforefieldinit B
extends ConsoleApplication1.Program/A
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack
L_0000: ldarg.0
L_0001: ldc.i4.1
L_0002: stfld int32 ConsoleApplication1.Program/B::x
L_0007: ldarg.0
L_0008: call instance void ConsoleApplication1.Program/A::.ctor()
L_000d: nop
L_000e: nop
L_000f: ldarg.0
L_0010: ldc.i4.m1
L_0011: stfld int32 ConsoleApplication1.Program/B::y
L_0016: ret
} .method public hidebysig virtual instance void PrintFields() cil managed
{
.maxstack
L_0000: nop
L_0001: ldstr "x={0},y={1}"
L_0006: ldarg.0
L_0007: ldfld int32 ConsoleApplication1.Program/B::x
L_000c: box int32
L_0011: ldarg.0
L_0012: ldfld int32 ConsoleApplication1.Program/B::y
L_0017: box int32
L_001c: call void [mscorlib]System.Console::WriteLine(string, object, object)
L_0021: nop
L_0022: ret
} .field private int32 x .field private int32 y }
}
IL代码
最后打断点,找到了原因

原因分析:
B b = new B();
执行顺序:
1、int x = 1;int y;给x赋值1,给y赋值默认为0(int类型)
2、public B(),然后关键点来了
3、public A(),执行A里面的PrintFields();但是A里面的这个方法是个虚方法,会调用B里面重写的方法
4、public override void PrintFields()这个是B里面的然后Console.WriteLine("x={0},y={1}", x, y);结果当然就是x=1;y=0;
5、然后才回到了B的public B(),接着给y赋值y = -1;这个时候y才变了,如果这个时候打印y的值才是-1,这个时候B的实例化就完成了
关键点:实例化类的时候,会先执行继承的父类的构造函数,如果父类构造函数含有虚方法又会回调子类的重写方法,之后才回到初始类的构造函数
C#基础 继承和实例化的更多相关文章
- python基础——继承和多态
python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...
- python基础——继承实现的原理
python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...
- python基础——继承与派生、组合
python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...
- api的使用机制:继承、实例化、实现(继承)配置、实例(参数化)配置、机制管理模块
api的使用机制:继承.实例化.实现(继承)配置.实例(参数化)配置.机制管理模块 facade模式.管理模块
- 《Java基础——继承》
Java基础--继承 一.类的继承: 规则: 1.一个子类只能有一个父类,但一个父类可以有多个子类,每个子类都可以作为父类使用. 2.若一个类没有声明父类,则默认其父类为Object. 3.父 ...
- JAVA基础-子类继承父类实例化对象过程
之前在项目中碰到这样一个问题: 类B继承了类A,B在实例化的时候,A的构造方法中调用了B的某个方法,并且B的方法中对B的成员属性进行了初始化,然后最后得到的B对象的成员属性为空. 代码场景如下: 这里 ...
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,在pyth ...
- 03Java基础——继承
1.继承 例如一个员工类,包括开发员工和经理. package cn.jxufe.java.chapter2.demo12; public class Employee { String name; ...
- Java 基础 - 继承
子类继承父类的private字段么? Oracle的Java Documentation对Inheritance的定义: 很直白,定义里面就告诉你了这不叫继承.继承的意思是你可以对其进行直接的调用和修 ...
随机推荐
- Django中指定生成表名的方法
在模型类中定义元类: class Meta: de_table = 'tableName' #指定表名
- 逆向工程生成的Mapper.xml以及*Example.java详解
逆向工程生成的接口中的方法详解 在我上一篇的博客中讲解了如何使用Mybayis逆向工程针对单表自动生成mapper.java.mapper.xml.实体类,今天我们先针对mapper.java接口中的 ...
- leetcode-162-寻找峰值
题目描述: 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一 ...
- 【Java并发编程】:并发新特性—塞队列和阻塞栈
阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.Delay ...
- C# base和this ---转载 小昊
new关键字引起了大家的不少关注,尤其感谢 Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在.所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关 ...
- Javac语法糖之内部类
在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来 ...
- Redis持久化配置-AOF
redis的持久化有rdb和aof两种. rdb是记录一段时间内的操作,一般的配置是一段时间内操作超过多少次就持久化.aof可以实现每次操作都持久化. 这里我们使用aof. 配置方式,打开redis的 ...
- tomcat启动(五)Catalina分析-service.init
上篇写到StandardService.init() 这个方法做什么呢?一起来看看. 这个类也是实现了Lifecycle 如图.这个图中i表示Interface接口.如Lifecycle,Contai ...
- linux-统计文本中符合条件的内容
1, 单个条件匹配, cat results.log | grep 'status=402' 2, 多个条件匹配 1), 2个条件都要满足 cat results.log | grep "s ...
- [笔记] Fiddler 抓包工具的使用
目录 Filler 的特点 Fidder工具的下载安装 Fidder 证书安装 Fiddler工作原理 Fidder 常见的命令和按钮 Fiddler 各种疑难杂症 Fillder 的特点 Fidde ...