面向对象:1.找对象 2.调用输入的方法 3.得到结果
面向对象只是人们为了便于开发和维护而提出的一种观点(代码组织形式)
三大特性:
1.封装性:打包 便于管理。诞生:为了解决大型项目的维护与管理。
2.继承性:拿来主义
什么是继承性:将一个类库作为原始模板,在其上扩展另外的类库
解决代码的的冗余 单根性(C#和Java类语言的特征),传递性
注意的问题:构造方法的执行顺序。
类就是模板
>字段
class MyBase
{
int num1;//4字节 存10
}
class MyClass:MyBase
{
int num1;//4字节 存11
}
MyClass m = new MyClass();
创建步骤:
1.统计从当前类到根类object中所有类的成员字节数,共16字节(填充需8字节)。
2.执行new向操作系统(CLR)申请内存,如果内存不够用抛异常,反之,这段内存标记
为被它使用,并把内存首地址返回,保存,对象创建完毕后,把首地址赋值给变量m。
3.开始从当前构造方法向基类构造方法引用,依次向下调用(object(),MyBase(),MyClass()),
初始化内存中的字段
4.对象创建完毕,返回地址为变量m
里氏转换原则:1.子类可以赋值给父类对象
2.父类对象可以强制转化为对应的子类对象
class MyBase { }
class MyClass1 : MyBase { }
class MyClass2 : MyBase { }
//里氏第一条
MyBase m1 = new MyClass1();
//里氏第二条
MyClass1 m2 = (MyClass1)m1;
//MyClass1 m2 = (MyClass1)m1;
is与as运算符:
//判断是否可以转换
//bool 变量 is 类型
Console.WriteLine(m1 is MyClass1);//t
Console.WriteLine(m1 is MyClass2);//f
Console.WriteLine(m1 is MyBase);//t
Console.WriteLine(m1 is object);//t
MyClass1 m3;
if (m1 is MyClass1)
{
m3 = (MyClass1)m1;
}
else
{
m3 = null;
}
//以上代码等价于
MyClass1 m4 = m1 as MyClass1;//如果m1可以转换为MyClass1则赋值给m4,如果转换不了则赋值null。
3.多态性
对象在调用同一个方法的时候表现出来的多种状态。
>>重写基类方法实现多态:父类统一调用 ,子类具体实现。
>>隐藏基类方法实现多态
>>口诀:new则隐藏,override重写;隐藏看类型(调用的时候对象是什么类型的,方法执行的就
是哪个类型的方法),重写只管新(前面所有的方法不要了)
调用规则:对象.方法(); 对象是什么类型,这个方法就是谁的方法。
在父类方法前加virtual或abstract)
在子类方法前加override
内存
对象类型指针>>方法表:类型信息与指针偏移量与方法的地址等
具体的字段
同步块索引 参考地址http://www.csharpwin.com/csharpspace/12496r2065.shtml