Przekazanie argumentu typu obiektowego
Przekazanie argumentu obiektowego:
01 class TestClass {
02 public int x;
03 }
04
05 class ObjectTypeArgumentTestClass {
06 static void modifyArg( TestClass arg ) {
07 arg.x++;
08 System.out.println( "arg.x in ObjectTypeArgument: " + arg.x ); // arg.x in ObjectTypeArgumentClass: 2
09 }
10 }
11
12 public class ObjectTypeArgumentTestProgram {
13 public static void main( String[] args ) {
14 TestClass object = new TestClass();
15 object.x = 1; // object.x == 1
16 ObjectTypeArgument.modifyArg( object );
17 System.out.println( "object.x in Program: " + object.x ); // object.x in Program: 2
18 }
19 }
Jako argument dla metody ObjectTypeArgumentTest.modifyArg( TestClass arg ) został przekazany wskaźnik / referencja na obiekt klasy TestClass. W efekcie zmodyfikowanie obiektu wskazywanego przez ten argument spowodowało zmianę obiektu na stercie. Dlatego w metodzie main po odczytaniu wartości atrybutów obiektu klasy TestClass widzimy zmienione wartości.
Sekwencja zdarzeń:
- Sytuacja początkowa. Sterta i stos są puste. Nie utworzono dotychczas żadnego
obiektu ani zmiennej.

- Wiersz 14. W klasie SimpleTypeArgumentTestProgram w metodzie
main, używając instrukcji new TestClass(), konstruujemy nowy
obiekt klasy TestClass. W chwili utworzenia obiektu wszystkie jego
atrybuty są domyślnie inicjowane przy użyciu wartości 0 (ZERO). W tym momencie
na stercie (ang. heap) umieszczana jest struktura klasy TestClass.

- Wiersz 14. W klasie SimpleTypeArgumentTestProgram w metodzie
main deklarujemy zmienną object typu/klasy TestClass i
inicjujemy ją przy użyciu referencji (adresu) do obiektu klasy TestClass
utworzonego w kroku 2 na stercie. W tym momencie na stosie (ang. stack)
umieszczony zostaje "element" zawierający ten adres referencji do obiektu klasy
TestClass na stercie - odpowiadający zmiennej object.

- Wiersz 15. Następuje zainicjowanie atrybutu x w klasie
SimpleTypeArgumentClass przy użyciu wartości 1. Zmianę tę
widać w strukturze klasy SimpleTypeArgumentClass zapisanej na stercie pod
adresem wskazywanym przez zmienną object, która jest referencją do tego
obiektu.

- Wiersz 16. Wywołanie metody statycznej
SimpleTypeArgumentClass.modifyArg( TestClass arg ). Na stosie
tworzona jest kopia zmiennej object - pojawia się element zawierający
adres referencji do obiektu klasy TestClass umieszczonego na
stercie.

- Wiersz 07. Sterowanie programu przechodzi do metody modifyArg( int arg
) w klasie SimpleTypeArgumentClass. W metodzie
SimpleTypeArgumentClass.modifyArg( TestClass arg ) zwiększamy wartość
atrybutu x obiektu arg klasy TestClass. W strukturze
obiektu umieszczonego na stercie widać tę zmianę.

- Wiersz 17. Sterowanie programu wraca do metody main w klasie
SimpleTypeArgumentTestProgram. Na stosie znika utworzona uprzednio
kopia zmiennej object - czyli wartość parametru arg metody
modifyArg(). Wyświetlamy wartość atrybutu x obiektu klasy
TestClass reprezentowanego przez lokalną zmienną object.
Wartość oczywiście uległa zmianie, ponieważ w metodzie
SimpleTypeArgumentClass.modifyArg( TestClass arg ) zmodyfikowany
został ten sam obiekt - zapisany na stercie.
