面试题答案
一键面试定义类并实例化对象示例代码
public class MyClass
{
// 私有字段
private int privateField;
// 公有属性
public int PublicProperty { get; set; }
// 构造函数
public MyClass(int initialValue)
{
privateField = initialValue;
PublicProperty = initialValue;
}
}
在Main
方法中实例化对象:
class Program
{
static void Main()
{
MyClass myObject = new MyClass(10);
}
}
字段初始化
- 默认初始化:在类的实例化过程中,字段首先会被赋予其默认值。例如,数值类型(如
int
)默认初始化为0,引用类型默认初始化为null
。对于上述代码中的privateField
,在构造函数执行前,它会被默认初始化为0。 - 显式初始化:可以在声明字段时进行显式初始化。例如
private int privateField = 5;
,这种初始化会在默认初始化之后,构造函数执行之前发生。
构造函数执行顺序
- 基类构造函数:如果当前类继承自其他类(在C#中所有类都直接或间接继承自
System.Object
),首先会调用基类的构造函数。若基类有多个构造函数,会根据调用的具体构造函数进行执行。 - 字段初始化:在调用基类构造函数之后,类的字段会按照声明顺序进行初始化(包括显式初始化)。
- 当前类构造函数:最后执行当前类的构造函数代码。例如上述代码中,
privateField
和PublicProperty
会在构造函数代码执行前先完成默认初始化和可能存在的显式初始化,然后执行构造函数中的赋值操作。
对象实例化时内存分配
- 栈上分配:当使用
new
关键字创建对象时,首先在栈上为对象的引用分配内存空间。例如MyClass myObject = new MyClass(10);
这里的myObject
引用在栈上分配空间。 - 堆上分配:然后在堆上为对象实例分配内存空间,这块内存空间用于存储对象的所有字段(包括从基类继承的字段)。堆上分配的内存大小取决于对象的字段类型和数量。例如上述
MyClass
对象,会在堆上分配足够存储privateField
和PublicProperty
的空间。 - 内存初始化:堆上分配的内存会被清零,这就完成了字段的默认初始化。然后按照上述字段初始化和构造函数执行顺序,逐步完成对象的初始化。