面向对象
对象:特指看得到 摸得着的 具体实体。
类:类是模子,确定对象将会拥有的特征(属性)和行为(方法)。
类是对象的模型,类是抽象的概念,仅仅是模板。类不占内存,对象才占内存。
对象是类的实例化,类是对象的高级抽象。
属性:就是对象的特征。
属性值:就是描述这个特征的值。
方法:就是对象的行为。
类的定义:
[访问修饰符]class 类名
{
成员
…..
}
类中可以包含变量的定义,也可以包含方法的定义。
类中的成员:(默认private,是私有的)字段 属性 方法。
字段:用public private修饰问题
属性:是为了保护与之相对应的字段的。保证对字段的读取和赋值符合要求。属性可分为读写、只读、只写。允许外部访问的变量一定要声明为属性。通过属性可以给私有字段赋值。
访问修饰符:
Private:私有成员,在类的内部才可以访问。
Protected:保护成员,该类内部和继承类中可以访问。
Public:公共成隐患,完全公开,没有访问限制。
Internal:当前程序集内可以访问。
访问修饰符是private,那么这个字段就是私有的,外边不能直接访问。可以通过属性 在外面或者其他地方进行访问。
**属性和public字段的区别是什么?调用set方法为一个属性值,然后用个体方法读取出来的值一定是set进去的值吗?
属性可以对设值、取值的过程进行非法控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值。极端的例子:Public Age{get{return 100;}set{}}。用reflector反编译可以看出,属性内部本质上就是set_***、get_***方法。
类的实例化:
使用关键字new(在随机数、数组中都用了new)
语法:
类 实例名=new 类()
类的成员访问:
实例名.属性 实例名.方法名()
字段、方法、属性都可以叫做类的成员Member,它们都需要定义访问级别。访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中“封装”的目的。
**在donate中类(class)与结构(struct)的异同:
Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。
Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。Int32、Boolean等都属于结构体。
类与成员的修饰符:
类:public internal abstract sealed static
成员(方法):public、private、protected、internal;
protected internal;abstract、virtual、new、override;static
Internal 用于当前程序集;new 隐藏的
类型转换:
使用 is和as。
Type A Is type B 仅判断
Type A as Type B 先判断 再转换
is子类可以隐式的转换成父类:
as转换:as也是转换, 但是 如果转换不了的 不报异常 返回来的是null。
is转换 返回的是bool值 true就是能转换 false就是不能转换;使用is比较保险。
继承:
Public class 子类(派生类):父类(基类)。
在C#中,所有的类都直接或间接的继承了object类。当我们定义一个类的时候,如果没有写:继承一个类,那么这个类就继承了object类。
显示调用父类的构造函数:
实例化子类时调用了父类的构造方法(子类会调用父类默认无参的)。
利用构造方法设置公共属性,也就是说若父类的构造方法有参数,显示调用父类的构造方法,关键字:base。
子类中如果有有参数的构造函数 会默认的调用父类中的无参数的构造函数。若调用有参的,需要使用set---this.调用。这与上面的base调用是不一样的。
多态:
抽象方法与抽象类:
抽象类与抽象方法由abstract修饰。Abstract的使用注意:
抽象方法没有方法体、抽象方法必须在抽象类中(抽象成员只能存在与抽象类中)、抽象类可以有非抽象成员、抽象类的派生类必须实现抽象方法体、抽象类只能做基类,无法实例化(父类是基类,子类继承了这个类,必须把抽象类中的抽象方法重写。
接口:
定义:interface关键字 接口中可以有属性、方法(未实现)。接口的名称通常以“I”开头,如IList。
如果一个类既继承了类,又实现了接口,那么类必须写在前面。一个类只能继承一个父类,但可以实现多个接口。接口就是用来实现的。完全抽象的一种约定。
语法:
[访问修饰符]interface接口名
{
接口成员定义
}
Eg:Interface IFliy
{
Void IFly
}
接口只用于方法、属性、索引和事件的声明。
C#中的类和接口有什么异同?
不同点:
不能直接实例化接口;接口不包含方法的实现;接口可以多继承,类只能单继承;类定义可在不同的源文件之间进行拆分
相同点:
接口、类和结构都可以从多个接口继承;接口类似于抽象基类,继承接口的任何非抽象类型都必须实现接口的所有成员;接口和类都可以包含事件、索引器、方法和属性。
**C#支持多重继承吗?
类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。类是爹,接口是能力,能有多个能力,但不能有多个爹。
建立多态的方式:
A、用父类实现多态
B、用抽象类实现多态
C、用接口实现多态
构造函数
构造函数:是用来创建对象的特殊方法,方法名和类名一样,没有返回值,也不需要void。利用构造函数给里面的字段赋值,构造方法用来创建对象,并且可以在构造函数中对对象进行初始化。构造函数可以有参数,new对象的时候传递函数参数即可。
构造函数可以重载,也就是有多个参数不同的构造函数。
使用构造函数能解决:
1、在赋初值时,重复的书写对象名。
2、假如我们有一个属性,不允许用户随意改动,我们一般把这个属性定义为只读类型的属性。那么这个只读类型的属性就不能再在实例化后对他赋值了,这时我们可以通过构造方法来进行初始化。
结构体和类的区别
类:类当中默认的有一个无参的构造函数。写一个类,如果没有写任何的构造函数,那么这个类有一个默认的无参构造函数。如果自己定义了构造函数,就有了有参的构造函数,不再有默认的那个无参的构造函数了。如果想要使用那个默认的无参的构造函数,还需要自己重新定义。类中写构造函数参数列表中参数个数可以不确定。
结构体:在结构中默认的也有一个无参的构造函数。当在结构中写一个有参的构造函数 默认的无参的构造函数还有 没被干掉。在结构中写构造函数 要把所有的字段都要完全赋值。
堆和栈的区别
栈是编译期间就分配好的内存空间,因此自己的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小。
值类型和引用类型的区别
1、将一个值类型变量赋值给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不赋值对象本身。
2、值类型不可能派生出新的类型:所有的值类型均隐士派生自System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3、值类型不可能包含null值。
4、每种值类型均有一个隐士的默认构造函数来初始化该类型的默认值。
.net中哪些是值类型,哪些是引用类型:
感谢您的浏览,希望对您有所帮助,欢迎在评论区留言!