面向对象

面向对象
类的定义:
1、类的访问修饰符只有两种:public internal,
默认是internal,表示只能在当前项目下使用
public 表示公共的,在任何地方都能访问到
[访问修饰符] class 类名 // 类名首字母要大写
{
类中成员
类中成员主要包括:字段(一般为私有),属性(共有的),方法,索引器
}

构造方法:
用来初始化类中成员,赋初值
[public] 类名() //构造方法名必须与类名相同,并且不能有返回值
{
//构造方法体
}
声明一个类时,系统自动定义了一个无参构造方法
当手动添加一个带参数的构造方法后,会自动把无参构造方法给覆盖掉

eg:
public class Person //实例类,即该类在使用时必须创建类的实例才能使用类中成员
{
private string name;//私有字段

public string Name //公共属性,属性是用来保护类中的私有字段,属性是对字段的一种封装
{
get
{
return name;
}
set
{
name=value;
}
}

public int Age //自动属性
{
get;
set;
}

public void SayHi()
{
Console.WriteLine("你好!");
}
}

class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.Name="张三";
Console.WirteLine(p.Name);
p.SayHi();
Console.ReadKey();
}
}

面向对象三大特性:
1、封装
主要体现在:
1、把代码封装成类
2、把字段封装成属性
3、把功能封装成方法
4、把多个类封装成类库
5、把多个参数封装成对象
2、继承:
子类继承父类
语法:
public class A
{

}
public class B:A
{

}

子类继承父类,父类中所有的非私有成员都被继承下来

继承的特性:
1、单根性:一个类只能有一个亲爹
2、传递性:子类继承父类,父类继承爷爷类,则孙子类可以使用爷爷类的非私有成员
注意:
任何一个类都直接或间接的继承自Object类,即Object类是所有类的祖宗
当一个类没有声明继承自某个类时,则该类默认继承自Object类,显示声明继承自某个类后会把Object给覆盖掉

继承过程中构造方法执行顺序问题:
1、子类继承父类,则创建子类对象时,默认去调用父类无参的构造方法,如果需要调用其它构造方法,则使用base关键字来声明

3、多态
1>虚方法:
父类中声明一个方法,使用virtual关键字修饰,然后等待子类重写,重写时使用override关键字修饰,方法名及参数都不能发生改变,父类中的虚方法子类也可以不重写。

重写与重载的区别?
重写(override)改变的是方法体,方法名即参数不发生改变
重载(overload)改变的是参数的个数及参数的数据类型

2>抽象方法
抽象类
抽象类不能被实例化,抽象类可以包含实例成员,抽象成员,使用abstract关键字修饰

抽象方法只包含方法声明部分,不能有任何方法实现(即方法体)
子类继承自抽象类时,必须实现抽象类中的所有成员,如果子类只重写了部分成员,则需要把子类也标记为抽象类

3>接口
使用interface关键字修饰
接口中只能包含方法声明,不能包含实例成员,且接口成员不能有访问修饰符(接口成员默认的访问修饰符都是public),同样的,接口也不能被实例化,通过反编译工具,可以看到接口就是一个抽象类
eg:
void SayHi();

接口允许多实现(继承),即一个类可以有多个"干爹"
接口就是赋予一个类某种能力的。

接口、抽象类、虚方法使用时优先考虑使用接口,其次是抽象类,最后才是虚方法。
首先观察几个对象是否有公共属性,即是否能提取出父类,如果不属于同一类型,则此时只能使用接口来实现(例如鸟、飞机、超人,都会飞,但不属于同一类)。
当可以提取父类,而又不能创建父类对象时,优先考虑使用抽象类,而非虚方法,例如(动物类,猫猫、狗狗都会叫,动物怎么叫?),当需要使用父类对象时,才考虑使用虚方法来实现。

静态类、静态成员
静态类不能被实例化、不能被继承,通过Reflector可以看到静态类在编译之后是一个abstract+sealed类。
静态类中可以包含静态成员,静态方法,静态字段等,不能包含实例成员(没有意义,因为实例成员需要通过类的对象来调用,而静态类不能被实例化)。
静态成员是全局共享的,直到整个应用程序退出时才会释放静态成员所有占用的存储空间
静态类一般是工具类。


里氏替换原则:
要求父类对象中存储的是必须是子类对象(这个是里氏替换的基础)
转换之前是什么样的子类,转换时必须用什么样的子类来接收

is和as的区别:
Class Person
{

}
Class Student:Person
{

}
Class Program
{
static void Main(string[] args)
{
Person p = new Student();
if(p is Student) //判断的时候尝试转换了一次
{
Student stu = (Student)P; //然后此时又转换了一次
}
//效率最高
Student stu = p as Student; //不判断,直接尝试去转换。转换成功,则把转换之后的数据返回,否则返回null
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值