Kanske sen, men jag hade tråkigt
När du skapar en klass, t.ex.
så deklareras en pekare som heter "myclass" och är av typen MyClass.
När du sedan skriver
Kod:
myclass = new MyClass();
så kommer ett MyClass objekt skapas på heapen och variabeln myclass kommer peka på den. "myclass" kommer inte vara objektet, utan peka på objektet.
I sin stur betyder detta att när du skickar myclass till en metod:
Kod:
...kod...
myclass = new MyClass();
metod1(myclass);
metod2(myclass);
metod3(myclass);
...osv...
Metod1 (eller andra) kan se ut så här:
public void metod1(MyClass value)
{
MyClass mc = value;
value.val = 2;
}
Då kommer metod1 och övriga metoder som tog emot "myclass" inte få en kopia av objektet, utan en kopia av pekaren. Det betyder att om metod1 ändrar variabeln "val" i "value", så kommer det även ändra myclass.
En annan exempel:
Kod:
//Säg att någon vill fylla en array med MyClass så att arrayen inte blir NULL
//Du kan tänka att MyClass är en "person" som ska läggas i en "kontaktbok", eller nåt
MyClass mc = new MyClass();
MyClass[] mcarray = new MyClass[100];
for(int a = 0; a < 100; a++)
{
mcarray[a] = mc;
}
Okej, nu innehåller arrayen inget NULL så det är dags att lägga till personer i kontaktboken
Kod:
MyClass temp = mcarray[0]; //Ändra första personen i kontaktboken
temp.namn = "Anna Jihad";
temp = mcarray[1]; //Nästa person...
temp.namn = "Stefan Smiley";
..osv till sista...
temp = mcarray[99];
temp.namn = "John Doe";
Oops! Nu kommer mcarray[0] till mcarray[99] alla heta "John Doe" eftersom alla 100 platser i arrayen pekar till en och samma objekt som befinner sig på heapen.
För att få bort nåt från heapen så måste man göra sig av med alla pekare som pekar på objektet. I sista fallet så skulle vi behöva sätta mcarray = NULL; och mc = NULL; och då skulle objektet tas bort från heapen.
Stacken är lite svårare att förklara, men kortfattat så hamnar int, double, string, etc där och när man gör som jag skrev längre upp med "metod1" "metod2" osv men ersätter "MyClass value" med "int value" (eller liknande) så kommer en riktigt kopia av objektet skickar till metoderna och så fort metoden är klar kommer metodens kopia försvinna för evigt såvida man inte skickar vidare den till en annan metod.
Bäst att läsa här:
Heap och stack