Rozdział 7 - Metody - Argumenty metod

Jak już widzieliśmy, metody mogą przyjmować zero, jeden lub więcej argumentów.

Argumenty metody:

  • mają określony typ (prymitywny, jak na przykład int, bądź złożony, jak String),
  • mają nazwę (zgodną z zasadami nazewnictwa obiektów w Javie),
  • są rozdzielone przecinkami,
  • nie muszą być tego samego typu,
  • nie mogą mieć określonych wartości domyślnych – jeżeli metoda ma przyjąć trzy argumenty, to tyle ich musimy podać podczas wywoływania takiej metody,
  • podczas wywoływania muszą być podane w takiej samej kolejności, w jakiej zostały zdefiniowane w metodzie.

Spójrzmy na poniższy przykład:

Nazwa pliku: PrzykladArgumentowMetod.java
import java.util.Scanner;

public class PrzykladArgumentowMetod {
  public static void main(String[] args) {
    System.out.println("Ile gwiazdek wypisac?");

    int liczbaGwiazdek = getInt(); // (1)

    wypiszWielokrotnosc("*", liczbaGwiazdek); // (2)
    // wypiszWielokrotnosc(liczbaGwiazdek, "*"); // (3)
  }
  
  public static int getInt() { // (4)
    return new Scanner(System.in).nextInt();
  }
  
  public static void wypiszWielokrotnosc(String tekst, int ileRazy) { // (5)
    for (int i = 0; i < ileRazy; i++) {
      System.out.print(tekst);
    }
  }
}
  • Metoda getInt nie przyjmuje żadnych argumentów (4) – pomimo tego, wywołując ją musimy użyć pustych nawiasów (1).
  • Metoda wypiszWielokrotnosc przyjmuje dwa argumenty (5) – jeden typu złożonego String, a drugi typu podstawowego int.
  • Wywołując (2) metodę wypiszWielokrotnosc, musimy podać oba argumenty tej metody.
  • Gdybyśmy spróbowali wywołać metodę wypiszWielokrotnosc podając argumenty w złej kolejności (3), powyższy kod źródłowy by się nie skompilował.

Modyfikacja argumentów metod

O poniższym zagadnieniu opowiemy sobie bardzo dokładnie w kolejnym rozdziale, gdy zaczniemy uczyć się czym są klasy w języku Java.

W Javie istnieją dwa rodzaje typów – prymitywne oraz referencyjne (zwane typami złożonymi). W rozdziale trzecim poznaliśmy wszystkie osiem typów prymitywnych, którymi są:

  • boolean
  • byte
  • short
  • int
  • long
  • float
  • double
  • char

Typy prymitywne są elementami budującymi, z których składają się typy złożone, definiowane przez programistów.

Typy referencyjne – to typy złożone, zdefiniowane w bibliotekach standardowych języka Java, oraz tworzone przez programistów. Do typów referencyjnych zaliczamy także tablice. Przykładem typu złożonego jest String. Biblioteka standardowa Java udostępnia tysiące tego rodzaju typów.

Oba te rodzaje typów mają kilka bardzo istotnych różnic, o których opowiemy sobie w rozdziale siódmym. Na razie skupimy się na jednej z nich – przekazywaniu i modyfikowaniu ich w metodach.

Spójrzmy na poniższy przykład – co zostanie wypisane na ekranie?

Nazwa pliku: ZmianaArgumentowWMetodzie.java
public class ZmianaArgumentowWMetodzie {
  public static void main(String[] args) {
    int x = 5; // (1)
    int[] tablicaWartosci = { 1, 2, 3 }; // (2)
    
    doKwadratu(x); // (3)
    wszystkieDoKwadratu(tablicaWartosci); // (4)

    System.out.println("X wynosi " + x); // (5)

    for (int i = 0; i < tablicaWartosci.length; i++) { // (6)
      System.out.println("Element tablicy o indeksie " + i +
          " wynosi " + tablicaWartosci[i]); // (7)
    }
  }

  public static void doKwadratu(int liczba) {
    liczba = liczba * liczba; // (8)
  }

  public static void wszystkieDoKwadratu(int[] tablicaLiczb) {
    for (int i = 0; i < tablicaLiczb.length; i++) { // (9)
      tablicaLiczb[i] = tablicaLiczb[i] * tablicaLiczb[i]; // (10)
    }
  }
}

Niespodziewanie, na ekranie zobaczymy następujące wartości:

X wynosi 5
Element tablicy o indeksie 0 wynosi 1 Element tablicy o indeksie 1 wynosi 4 Element tablicy o indeksie 2 wynosi 9

Przeanalizujmy powyższy program:

  • Na początku metody main tworzymy po jednej zmiennej typu prymitywnego (1) i referencyjnego (2) (tablicę liczb typu int).
  • Następnie, wywołujemy metody doKwadratu (3) i wszystkieDoKwadratu (4), przekazując jako argumenty utworzone wcześniej zmienne.
  • W obu metodach modyfikujemy przesłane do tych metod argumenty (8) (9, 10).
  • Po powrocie z obu metod wypisujemy na ekran wartości obu zmiennych (5) (6, 7).

Dlaczego zmienna x zachowała po wywołaniu metody doKwadratu swoją pierwotną wartość 5, natomiast elementy tablicy tablicaWartosci po powrocie z metody wszystkieDoKwadratu mają wartości podniesione do kwadratu?

Powodem są różne rodzaje typów tych zmiennych – zmiany argumentów prymitywnych typów (jak int) nie zmieniają oryginalnej zmiennej, podczas gdy argumenty typów referencyjnych operują bezpośrednio na przesłanym obiekcie – w tym przypadku, na tablicy. Dlatego zmienna x zachowała swoją pierwotną wartość, a zmiany wykonane na tablicy, którą podaliśmy jako argument metody wszystkieDoKwadratu, "przetrwały" po zakończeniu tej metody.

Jest to bardzo ważna różnica i zawsze trzeba mieć świadomość, że modyfikacja argumentów typów referencyjnych pociąga za sobą zmiany w oryginalnym obiekcie. W rozdziale o klasach poznamy powód takiego zachowania zmiennych typów referencyjnych.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Nie musisz podawać swojego imienia, e-mailu, ani strony www, aby opublikować komentarz. Komentarze muszą zostać zatwierdzone, aby były widoczne na stronie.