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ń:

 

  1. Sytuacja początkowa. Sterta i stos są puste. Nie utworzono dotychczas żadnego obiektu ani zmiennej.

     

  2. 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.

     

  3. 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.

     

  4. 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.

     

  5. 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.

     

  6. 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ę.

     

  7. 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.