再上半天班就清明放假啦,最近收获还是颇大的,每天除了工作,剩下的时间过得还算充实——复习C#、跑步、学习英语。今天开始复习C#面向对象。
- 面向对象语言:C#、C++、Java
- 面向过程语言:C
- 面向对象是面向过程里程碑式的升级。
一、成员变量和局部变量
- 类中的变量为成员变量或者实例变量(不包括静态变量,即类变量),成员变量可以不初始化,默认情况下,int变量为0,string变量为null。
- 方法中的变量为局部变量,该值必须初始化。
二、构造函数:给对象进行初始化
- 格式:函数名等于类名、没有返回值
- 构造函数和一般函数的异同:a.构造函数必须没有返回值,名字必须与类名相同;一般函数可以有返回值,函数名不可以与类名相同。b.构造函数在创建对象时会直接调用,给对象进行初始化,只能调用一次;一般函数在需要使用这个函数时才会被调用,可以被调用多次。c.构造函数可以调用一般函,反之不可。d.都可以有重载。e.都可以用return关键字。
- 构造函数不能被继承 :创建子类对象时会调用父类的空构造函数,因为子类会继承父类的内容,要先初始化父类后才能使用父类里面的内容。
三、匿名对象:当对象里的成员仅需调用一次时可以使用匿名对象。
new Car().name="";
new Car().color=Color.blue;//两次匿名,两次对象
四、this关键字
- this代表其所在函数所属对象的引用;换言之,this代表本类对象的引用。
- this可以用来区分局部变量和成员变量的重名。
- 可以使用this进行构造函数之间的调用,this()代表引用无参构造函数。
public DrawLine()
{
print("无参构造");
}
public DrawLine(int i):this()
{
print(i + "含参构造函数");
}
五、static
- static是一个修饰符,修饰成员(变量、方法、属性、构造函数)。
- static修饰的成员被所有对象共享。
- static修饰的成员优先于对象存在(随着类的加载而存在)。
- static修饰的成员只有一种调用方式:类名.静态成员。
- static修饰的是共享数据,而对象中的为特有数据;共享数据只占一份内存。
a.生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而释放
静态变量随着类的加载而存在,随着类的消失而消失。生命周期更长。
b.调用方式不同
成员变量只能被对象调用
静态变量只能被类名调用
c.别名不同
成员变量又叫实例变量
静态变量又叫类变量
d.数据的存储位置不同
成员变量存储在堆内存中
静态变量存储在数据共享区
七、什么时候使用静态?
- 静态变量。如果有数据需要共享,就把数据修饰成static。
- 静态函数。看这个方法中是否需要访问非静态的数据,如果需要访问,那么方法一定不是静态的; 如果不需要则可以修饰成静态。
- 修饰成静态的方法可以直接被类名调用不需要创建对象,十分方便。
八、static的局限性
- 静态的只能访问静态的,而非静态的都可以访问。
- 静态方法中不能使用this,base。
- VS中主函数是静态的。
九、继承:为多态提供了前提
- 继承的好处:提高代码的复用性;让类与类之间产生了关系。
- C#不支持多重继承,但支持多层继承;
- 千万不要为了提高代码的复用性而去使用继承;
- 子父类中可以存在相同名称的变量与方法,此时父类中的也会被继承,只是会隐藏。 一般情况下,子类中的变量或方法用new修饰。 对于相同名称的方法,我们一般用virtual修饰父类方法、override修饰子类方法,也就是重写、覆盖。
- overload和override的区别?
overload(重载)出现在同一个类中,并且是同名函数,参数不同
override(重写)是出现在子父类当中,并且是同名函数,参数也一样(声明一样)
十、base关键字:代表父类对象
class A
{
public int num = 3;
public virtual void Show()
{
System.Console.WriteLine("ShowA");
}
}
class B : A
{
public new int num = 4;
public override void Show()
{
base.Show();//调用父类原有功能
System.Console.WriteLine(base.num); //3
}
}
子类中构造函数默认都会访问父类中无参构造函数,因为每一个构造函数都有一个默认的关键字base。
public class DrawLine : Object
{
public DrawLine():base()
{
}
}
十一、sealed
- sealed表示密封,不被继承,可修饰类(一般为子类)和方法、属性。
- sealed修饰的方法不可以被覆盖,当sealed修饰方法、属性的时候,必须要与override关键字一起用(合着只能修饰子类的方法、属性了)。