1. 类的实例和对象含义相同。
2. 对象之间的包含关系:一个类包含另外一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员进行其他处理。
3. 对象之间的集合关系:一个类用作另一个类的多个实例的容器。这类似于对象数组,但集合有其他功能,包括索引、排序和重新设置大小。
4. 值类型:在内存的一个地方存储它们自己和它们的内容
5. 引用类型:存储指向内存中其他某个位置(称为堆)的引用,而在另一个位置存储内容
6. 值类型和引用类型的一个主要区别是:值类型总是包含一个值,而引用类型可以是null,表示它们不包含值。但是可以使用可空类型(这是泛型的一种形式)创建一个值类型,使值类型在这个方面的行为方式类似于引用类型(即可为null)。
7. 只有string和object简单类型是引用类型,但是数组也是隐式的引用类型。
8. 类的修饰符
9. 接口和抽象类的相似之处:
它们都包含可以由派生类继承的成员。接口和抽象类都不能直接抽象化,但可以声明这些类型的变量。如果这样做,就可以使用多态性把继承这两种类型的对象指定给它们的变量。接着通过这些变量来使用这些类型的成员,但不能直接访问派生类对象的其他成员。
10. 接口和抽象类的区别:
派生类只能继承一个基类,即只能继承一个抽象类(但可以用一个继承链包含多个抽象类)。相反,类可以使用多个接口。但这不会产生太大的区别--这两种情况取得的效果是类似的。只是采用接口的方式略有不同。
抽象类可以拥有抽象成员(没有代码体,且必须在派生类中实现,否则派生类本身必须也是抽象的)和非抽象成员(它们拥有代码体,也可以是虚拟的,这样就可以在派生类中重写)。另一方面,接口成员必须都在使用接口的类上实现--它们没有代码体。另外,按照定义,接口成员是公共的(因为它们倾向于在外使用),但抽象类的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。此外,接口不能包含字段、构造函数、析构函数、静态成员或常量。