面向过程
面向对象
对象:一切皆为对象。一个人、一本书、一支笔……都是一个对象。
类(class)是既包括数据又包括作用于数据的一组操作的封装体。就是对有共同点的某类对象抽象出的模型。
对象→(抽象)→类
类→(实例)→对象
类一般包含:变量(成员变量)、函数(成员函数、成员方法)
类的特性:封装性、继承性、多态性和抽象性。
封装性:
1、不同类的变量属于各自的对象
2、不同对象的成员变量只属于各自的对象
3、对象中的变量需要通过各自的函数操作,比较安全
继承性:
子类可以从父类继承父类的成员变量和成员方法。
多态性:
某类不同对象在执行的时候,表现出来的形态多样性,这种现象成为多态性。
1、声明类
类声明
{
成员变量的声明;
成员方法的声明及实现;
}
[修饰符(例:public)] class 类<泛型> [:父类][:接口列表]
2、声明成员变量和成员方法
[修饰符] 返回值类型 方法([参数列表])
{
语句序列;
[return [返回值]];
}
3、成员方法重载
声明对象
类 对象
创建实例
对象= new 类的构造方法([参数列表])
引用对象的成员变量和调用对象方法
对象.成员变量
对象.成员方法([参数列表])
构造函数:特殊的成员函数。如果不写构造函数,系统会自动生成一个默认的构造函数。
1、写法特殊
无返回值,函数名只能与类名相同。
2、执行特殊
类在实例化的时候自动执行。构造函数是最早执行的成员函数。构造函数是用来生成对象的函数。
主要作用:对象实例化生成时,做初始化工作。
public class MyDate
{
public MyDate(int y, int m, int d) //声明构造方法
{ //构造方法与类同名,构造方法返回该类的一个实例
year = y;
month = m;
day = d;
}
}
MyDate d = new MyDate(2009,7,18);
public MyDate()
重载:函数名相同,参数不同(个数,类型)的函数就形成了重载。
重载只与函数名、形参有关,与返回值无关。
this
指对象本身。
访问本类的成员变量和成员方法
this.成员变量
this.成员方法([参数列表])
this调用当前对象的其他构造函数。public Bird(string name,string color):this(name)
is
对象 is 类;
如果成立,返回TRUE;否则返回FALSE。
partial 写在class左边,拆分类,可以继续用partial对该类进行拓展。
类中的方法:
构造方法
属性方法:取值赋值
行为方法:运算
类中成员的访问权限
属性方法
右键变量→重构→封装字段→选中“全部”……确定
public int R
{
get{return R;}
set{R = value;} //value就是等号右边的值。{}中可以用if语句
}
1、属性是用来为成员变量赋值和取值的。它有替代属性方法的作用。
2、属性定义的时候,属性名后没有小括号。
3、属性都是public
4、属性中只能包括两部分:get,set。代码只能写在这两部分的{}中。
5、如果属性中只有set或get,则为只写属性或只读属性;两部分都有,则为可读写属性。
静态
静态成员包括:静态变量、静态属性、静态方法。
静态成员属于类,不属于实例。
静态变量在内存中只保存一份,而实例变量则是每个对象都保存一份。
例:将一个学校看成一个类,那么校医属于静态成员,班主任属于实例成员。静态成员(如:校医)的改变对于实例都有影响,而实例成员(如:班主任)的改变对于其他实例成员没有影响。
public class MyDate
{
private int year,month,day; //实例成员变量
private static int thisYear; //静态成员变量
static //静态成员变量初始化
{
thisYear=2009;
}
public static int getThisYear() //静态成员方法
{
return thisYear; //访问静态成员变量
}
}
在C#中:
在当前类的{}之外,静态成员,只能用类名来调用,不能用实例名来调用。而实例成员只能用实例对象来调用。
在当前类的{}之内,静态方法中之恩个直接调用静态成员。实例方法可以调用非静态和静态成员。
浅拷贝、深拷贝
浅拷贝:只拷贝栈空间中的地址
深拷贝:拷贝堆空间中的数据
继承
1、public,protected修改的成员可以被继承到子类去。private修饰的成员,无法被子类继承。
2、单继承:一个父类可以派生多个子类,每个子类只能有一个父类。
3、实例化子类的时候,会先执行父类的构造函数,再执行子类的构造函数。
4、base关键字,用来调用父类的相关成员。base.xxx()调用父类的成员方法;base(…)调用父类的构造函数。
5、如果父类中有且只有一个带参的构造函数,则其子类必须要有带相应参数的构造函数,并且通过base()把参数传给父类。