Инициализация на полета в конструктора – представяне в паметта
Нека разгледаме подробно, какво прави конструкторът след като бъде извикан и в тялото му инициализираме полетата на класа. Знаем, че при извикване, той ще задели памет за всяко поле и тази памет ще бъде инициализирана със стойността по подразбиране.
Ако полетата са от примитивен тип, тогава след подразбиращите се стойности, ще бъдат присвоени новите, които ние подаваме.
В случая, когато полетата са от референтен тип, например нашето поле name, конструкторът ще ги инициализира с null. След това ще създаде обекта от съответния тип, в случая низа "Sharo" и накрая ще се присвои референция към новия обект в съответното поле, при нас – полето name.
Същото ще се получи, ако имаме и други полета, които не са примитивни типове и ги инициализираме в конструктора. Например, нека имаме клас, който описва каишка – Collar:
public class Collar
{
private int size;
public Collar()
{
}
}
|
Нека съответно нашият клас Dog, има поле collar, което е от тип Collar и което инициализираме в конструктора на класа:
public class Dog
{
private string name;
private int age;
private double length;
private Collar collar;
public Dog()
{
this.name = "Sharo";
this.age = 3;
this.length = 0.5;
this.collar = new Collar();
}
public static void Main()
{
Dog myDog = new Dog();
}
}
|
Нека проследим стъпките, през които минава конструкторът, след като бъде извикан в Main() метода. Както знаем, той ще задели памет в хийпа за всички полета, и ще ги инициализира със съответните им подразбиращи се стойности:
След това, конструкторът ще трябва да се погрижи за създаването на обекта за полето name (т.е. ще извика конструктора на класа string, който ще свърши работата по създаването на низа):
След това нашия конструктор ще запази референция към новия низ в полето name:
След това идва ред на създаването на обекта от тип Collar. Нашият конструктор (на класа Dog), извиква конструктора на класа Collar, който заделя памет за новия обект:
След това я инициализира с подразбиращата се стойност за съответния тип:
След това референцията към новосъздадения обект, която конструкторът на класа Collar връща като резултат от изпълнението си, се записва в полето collar:
Накрая, референцията към новия обект от тип Dog се присвоява на локалната променлива myDog в метода Main():
Помним, че локалните променливи винаги се съхраняват в областта от оперативната памет, наречена стек, а обектите – в частта, наречена хийп.
Сподели с приятели: |