对象与类型
1、类与结构:(区别)
相同:都是创建对象的模板,每个对象都包含数据,并提供处理和访问数据的方法;都用new来声明实例。
不同:类是存储在堆(heap)上的引用类型,结构是存储在堆栈(Stack)上的值类型;两者在访问方式也不同;结构不支持继承;结构的无参数默认构造函数不允许替换;使用结构可以指定字段如何在内存中布局。
2、类成员
访问级别:
public----成员可由任何代码访问;
private----只能由类中的代码访问(默认用这个)
internal----只能由定义它的项目(程序集)内部代码访问
protected----只能由类或派生类中的代码访问
数据成员:包含了类的数据----字段、常量和事件;静态成员与整个类相关,实例成员与每个实例相关。
方法重载:声明同名但参数个数或类型不同的方法。重载方法不能仅在返回类型上有区别,也不能仅根据参数声明为ref还是out来区分。
构造函数:如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数。若想保留默认的无参构造函数就需要手动实现。
静态构造函数:此函数只执行一次,且通常是在第一次调用类的成员之前执行。
C#的有一个特殊语法:构造函数初始化器,从其它构造函数中调用构造函数 public Car(string model):this(model,4){}
readonly:表示这个字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。用来声明运行时常量。
Const:创建常量,用来声明编译时常量
继承
1、继承的类型
实现继承:表示一个类型派生于一个基类型,拥有该类型的所有成员字段和函数。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码
C#不支持多重实现继承,但允许类型派生于多个接口
2、实现继承
把基类函数显示声明为virtual,该函数就可以在任何派生类中重写。C#要求在派生类中函数重写另一个函数时,要使用override关键词显示声明。
属性也可以声明为virtual,规则跟方法一致,但是成员字段和静态函数都不能声明为virtual。
要在派生类中隐藏基类的签名相同方法,需要用new关键词声明我们要隐藏的方法。如public new int MyClass(){}
调用函数的基类版本:base.<MethodName>(),在JAVA中用super代替base
抽象(abstract)类不能实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写。抽象函数是虚拟的,但不需要声明为virtual
密封类与密封方法声明为sealed,对类来说表示不能继承,对方法来说表示不能重写。Sealed对应于JAVA中的final