继承
- 继承就是面向对象中类与类之间的一种关系
- 继承按着实现方式的不同一般分为两类,实现继承(直接继承其他的类),接口继承(继承只接口)CLr支持实现单继承和接口多继承
- 子类中实现父类虚方法的方式叫做方法的动态绑定
生命对象Bird bird=new Bird();这个过程发生了什么
- Bird bird这个是创建一个Bird的引用
- New Bird()创建一个Bird的对象,并且初始化这个对象,分配内存空间,然后把这个对象引用赋给bird变量,建立bird和Bird的关系
- 对象初始化的时候,会先找到他的父类,为其父类分配内存空间,而父类还会去找更上层的父类分配内存空间,一直类推到system.object为止
- 对象的初始化就是完成所有父类和自身的内存创建,并且字段的顺序是由上到下,父类在前面,
- 子类不光继承了父类的共有成员,也继承了父类的私有成员只是在子类中不能访问父类的共有成员
- 继承可以传递
把父类引用指向子类
/// <summary>
/// 抽¨¦象¨®类¤¨¤
/// </summary>
public abstract class Animal
{
public Animal()
{
var str = "222";
}
public abstract void ShowType();
public void Eat()
{
HttpResponse response = HttpContext.Current.Response;
response.Write("Animal always eat.");
}
}
public class Bird : Animal
{
public Bird()
{
type = "222";
}
private string type = "Bird";
public override void ShowType()
{
HttpResponse response = HttpContext.Current.Response;
response.Write("type is " + type);
}
public string color { get; set; }
}
public class ChicKen : Bird
{
public ChicKen()
{
type = "111";
}
HttpResponse response = HttpContext.Current.Response;
private string type = "ChicKen";
public override void ShowType()
{
response.Write("type is " + type);
}
public void ShowColor()
{
response.Write(color);
}
}
Bird bird2=new Chicken();
- 他的bird2.ShowType(),和bird2.type返回值是什么
Bird2.ShowType()这个会调用ChicKen类的方法所有放回的是type is ChicKen
bird2.type的返回值是222
- 这种父类引用指向子类对象的操作遵守如下原则
(1)【关注对象原则】调用的是父类还是子类,取决于对象是父类还是子类,而不是他的类型(new 初始化的作用)
(2)执行就近原则(就是与类型最近的类),对于同名的字段或者方法编译器是按照顺序查找,访问离他最近的
根据这两个原则Bird2.ShowType为什么会返回type is ChicKen,
因为Bird bird2=new Chicken()声明的是一个Chicken()对象,Chicken()对象里面的ShowType
重写了父类的ShowType方法(由于ShowType被重写了,所以Bird里面的ShowType就是Chicken
的ShowType方法),而bird2.type根据(执行就近原则),他会先调用自身的type属性,如果没有在找父类,所以它的返回值是bird
3.值类型是密封的所以只能实现接口不能继承类