继承的本质,对象的创建

public class bird
{
public string type = "bird";
public virtual void write()
{
Program.print("type is bird");
}
}
public class chicken : bird
{
public string type = "chicken";
public override void write()
{
Program.print("type is chicken");
}
}
static class Program
{
static void Main(string[] args)
{
F1 f1 = new F1();
f1.S();//f1

F1 f2 = new F2();
f2.S();//f1

F1 f3 = new F3();
f3.S();//f1

F3 f4 = new F3();
f4.S();//f2

Console.WriteLine(f1.f); //f1
Console.WriteLine(f2.f); //f1
Console.WriteLine(f3.f); //f1
Console.WriteLine(f4.f); //f2

}
}
class F1
{
public string f = "f1";
public void S()
{
Console.WriteLine("F1");
}
}

class F2 : F1
{
public string f = "f2";
public void S()
{
Console.WriteLine("F2");
}
}
class F3 : F2
{
}


bird mybird=new chicken()

1、调用构造器,对字段初始化,顺序:基类--父类--子类.父类字段在子类字段前面,如果字段同名编译器认为是不同的字段.(这个为执行就近原则准备的,对象访问的是最先编译的那个字段,即父类字段bird);

2、方法存储在一个方法表中,初始化顺序跟字段一样,不同的是,如果有重写(virtual重写),子类方法覆盖父类方法.

3、疑惑:Bird bird2 = new Chicken(); 调用方法的时候到底调用哪一个类的方法?子类?父类?
答:调用子类方法还是父类方法,取决于创建的对象是子类对象还是父类对象,与引用变量的类型无关。引用类型的不同只是决定了不同对象在方法表中的不同访问权限。

根据这三条,所以 mybird.type="bird" ; mybird.write() = "type is chicken".

F3 f=new F3(),初始化字段与方法时,是从基类到子类的,最近原则是指离F3类最近的,f.f="f3",f.S()="F3",若F3中无方法,刚查找类F2中的方法S(),若类F2中还没有方法S(),就继续往上查找.

posted @ 2012-02-22 16:08  pantherbean  阅读(404)  评论(0编辑  收藏  举报