public class Father // 定义 父类
{
public Father() // 父类的构造函数
{
}
public virtual int num // 虚属性 注意没有虚字段
{
get
{
return 0;
}
}
private int pnum = 1;// 私有字段
protected int bhnum = 2;// 受保护的字段
public void ShowNum()
{
Console.WriteLine(" 这个是 父类的");
}
public virtual void ShowStr()
{
Console.WriteLine(" 这个是 父类的");
}
}
public class son:Father // 继承 father
{
public son():base() // 构造函数
{
}
private int pnum = 4;// 私有字段
protected int bhnum = 5;// 受保护的字段
public override int num
{
get
{
return 3;
}
}
public void ShowNum()
{
Console.WriteLine(" 这个是 子类的");
}
public override void ShowStr()
{
Console.WriteLine(" 这个是 自类的类的");
}
}
Father fatherson=new son();
当程序执行执行到 father fatheson的时候是创建了一个Father类型的引用,new son()的时候是完成创建了一个son 对象,分配内存空间和初始化操作。然后是把这个new son()的对象引用给fatherson.
在初始化new son()有下面几步:
(1):先执行到son类中 检测到有字段,先初始化所有的字段
(2):执行到的son的构造函数的时候检测到有继承先去执行father 类的构造函数,在father 中检测到有字段,初始化所有的字段(father中的)
(3):执行father 中的构造函数
(4):执行son中的构造函数。
在上述4个步骤中,虽然没有提到方法是什么时候初始化的。所有的方法都会在第一次加载的时候创建一个方法表的
在执行 fatherson.num的时候 ,返回值是3. 因为在实例fatherson 中 对father 中的字段 num 重写了。特别注意: 如果father 中num 没有使用virual ,在son 中的num 使用 new 来隐藏father 中的num的情况,那么fatherson.num=0
特别注意 new 和 override的 不同。虽然都是很基础 ,不过自认为是很重要的基础知识点。
在执行 fatherson.shownum();的时候应该输出的是 “”这个是 父类的“” 假如son 类中的shownum方法加了new 关键字 成功的隐藏了fateher中的方法,输出的结果也是一样的。要想执行的是son 类中的方法,必须得向shostr();方法一样的
在执行 fatherson.showstr();的时候要输出的是 “”“这个是 自类的类的”
针对上述代码: 我也是为了写而写的代码,所以在编译的时候会有 警告的。
天道酬勤。 尘世间一个迷途小码畜