子类对象初始化时,首先调用父类的构造函数
时间: 2023-09-29 16:08:04 浏览: 143
是的,当创建子类的对象时,首先会调用其父类的构造函数来完成父类的初始化,然后再调用子类自己的构造函数来完成子类的初始化。
在C#中,如果没有显式地定义子类的构造函数,则系统会默认生成一个无参的构造函数。在这种情况下,子类的构造函数会自动调用其父类的无参构造函数来完成父类的初始化。例如:
```csharp
class Animal {
public Animal() {
Console.WriteLine("Animal constructor");
}
}
class Dog : Animal {
public Dog() {
Console.WriteLine("Dog constructor");
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog();
}
}
```
上述代码中,我们定义了一个Animal类和一个Dog类,其中Dog类继承自Animal类。在Program类的Main方法中,我们创建了一个Dog对象。由于Dog类没有显式定义构造函数,因此系统会默认生成一个无参的构造函数,该构造函数会自动调用父类Animal的无参构造函数来完成父类的初始化。因此,当创建Dog对象时,首先会输出"Animal constructor",然后输出"Dog constructor"。
如果子类需要显式地调用父类的构造函数来完成父类的初始化,可以使用base关键字来实现。例如:
```csharp
class Animal {
public Animal(string name) {
Console.WriteLine("Animal constructor: " + name);
}
}
class Dog : Animal {
public Dog(string name) : base(name) {
Console.WriteLine("Dog constructor: " + name);
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog("Tom");
}
}
```
上述代码中,我们定义了一个Animal类和一个Dog类,其中Animal类的构造函数需要一个字符串参数,用于输出信息。在Dog类的构造函数中,我们使用base关键字调用父类Animal的构造函数,传入字符串参数"name",来完成父类的初始化。因此,当创建Dog对象时,首先会输出"Animal constructor: Tom",然后输出"Dog constructor: Tom"。
阅读全文