Twitter: @grzegg
Kategoria: java, Tagi: - - .

Java [19] – Metody

Pisane dotychczas programy mieściły się w jednej metodzie main(). Czas zacząć pisać programy składające się z wielu metod.

Ta strona jest częścią materiałów do kursu “Programowanie w Javie z elementami bioinformatyki dla poczatkujących”. Pozostałe materiały znajdziesz tutaj

Czym są metody?

Metoda to wydzielona część klasy, mająca za zadanie wykonanie określonych operacji. Program musi posiadać przynajmniej jedna metodę: main. Inne metody tworzy się w celu wydzielenia fragmentów kodu, które wykonują jakieś konkretne operacje.

Dzielenie kodu na wiele metod niesie liczne korzyści, takie jak:

  • podzielenie klasy na pewne logiczne części zwiększa przejrzystość i czytelność kodu
  • pozwala znacznie ograniczyć powtarzanie takich samych (lub bardzo podobnych) fragmentów kodu
  • umożliwia łatwy dostęp do poszczególnych funkcjonalności obiektów (będzie na ten temat mowa w dalszej części kursu)

Ogólnie dobrze jest trzymać się zasady, że jeśli możemy wydzielić w programie fragmenty odpowiadające poszczególnym zadaniom to należy to zrobić separując je w oddzielnych metodach.

Jak napisałem powyżej, metody są częściami klas co ma swoje konsekwencje w sposobie ich użycia. W wielu przypadkach najpierw tworzymy na podstawie tych klas obiekty a później wywołujemy metody posługując się utworzonymi obiektami. Tak robiliśmy na przykład używając klasy Scanner:


// Tworzenie obiektu klasy Scanner.
Scanner skaner = new Scanner(System.in);

// Wywołanie na obiekcie metody nextDouble
double liczba = skaner.nextDouble();

Innym sposobem jest używanie metod statycznych. W takim przypadku, nie ma potrzeby tworzenia obiektu, metody są wywoływane bezpośrednio z klasy. Tak było na przykład, gdy wykorzystywaliśmy metody z klasy Math:


// Bezpośrednie wywołanie metody statycznej
double liczba = Math.round(2.49);

A także, gdy używaliśmy polecenia System.out.println() do wypisania tekstu na ekranie.

Tworzenie i używanie metod

W ogólnej postaci tworzenie metod wygląda tak:

modyfikatory zwracanaWartość nazwaMetody (argumenty) {
// Zawartość metody
}

Pierwsza linia, zwana jest nagłówkiem metody. Zajmijmy się teraz poszczególnymi elementami nagłówka:

  • modyfikatory – służą do określenia cech metody takich jak to czy metoda jest statyczna oraz jaka jest jej dostępność (omówimy to bliżej w przyszłości)
  • zwracanaWartość – określa jakiego typu wartość jest zwracana przez metodę. Metody mogą zwracać wartości typów podstawowych (int, double, char, etc.), tablice i inne obiekty, albo nie zwracać nic. W tym ostatnim wypadku zamiast typu zwracanej wartości umieszczamy słowo void. Zasadniczo metody mogą zwracać co najwyżej jedną wartość, ale da się to obejść używając obiektów.
  • nazwaMetody – jak sama nazwa wskazuje to nazwa tworzonej przez nas metody ;-). Zasady nazywania metod są podobne do tych, które opisałem dla zmiennych.
  • argumenty (parametry) – określają jakiego typu wartości są przekazywane do metody i pod jaką nazwą (zmiennej, tablicy etc) będą używane w ciele metody. Można metodzie przekazać dowolną liczbę argumentów ale to co zostaje przekazane musi się zgadzać zarówno pod względem liczby jak i ich typów z tym co zadeklarowano w nagłówku.

Podstawowe sposoby tworzenia i używania metod pokażę na przykładach:

W powyższym programie, poza obowiązkową metodą main stworzyłem a następnie użyłem cztery metody. Za chwilę omówmy je po kolei. Najpierw jednak parę uwag ogólnych:

  • We wszystkich powyższych metodach użyłem modyfikatora static. Oznacza to, że są to metody statyczne a zatem możemy ich używać bezpośrednio, bez tworzenia obiektu klasy Metody.
  • Stworzone przeze mnie metody znajdują się na zewnątrz metody main. Wszystkie metody są na tym samym poziomie zagnieżdżenia, wewnątrz klasy.
  • Metoda main znalazła się na końcu klasy. To nie jest konieczność, ale dla przejrzystości kodu lepiej jeśli metoda main znajduje się na końcu lub na początku klasy.
  • Metody, które zwracają wartość mają zadeklarowany typ zwracanej wartości w nagłówku oraz w ciele metody komendę return. Co więcej, jeśli w nagłówku zadeklarowaliśmy, że metoda ma zwracać wartość określonego typu to w ciele metody musi znaleźć się komenda return i musi ona poprzedzać wartość o zadeklarowanym w nagłówku typie.
    Komenda ta powinna być ostatnią wykonywaną komendą w metodzie, ponieważ na niej metoda kończy działanie. Komenda return może też znaleźć się dodatkowo w innych miejscach metody, ale pamiętaj że w momencie jej wywołania kończy się działanie całej metody. Takie rozwiązanie stosuje się zazwyczaj w połączeniu z konstrukcjami warunkowymi (np. if...else).

Teraz przyjrzyjmy się poszczególnym metodom i sposobom ich wywołania.

  • Metoda powiedzCzesc() – nie przyjmuje ani nie zwraca żadnych wartości. Wywołujemy ją zatem bardzo prosto, wypisując jej nazwę, nie umieszczając w parze nawiasów żadnych wartości. Zwracam uwagę, że nawet jeśli metodzie nie przekazujemy argumentów, koniecznie trzeba po nazwie umieścić parę nawiasów ().

  • Metoda powiedzCos(String cos) – przyjmuje łańcuch znaków (String) jako argument, który zostaje przypisany do zmiennej o nazwie cos. Zmienna może być użyta wewnątrz metody, ale nie może być użyta poza nią, ponieważ jest widoczna tylko w obrębie metody w której jest zadeklarowana.

  • Metoda wylosujLiczby() – nie przyjmuje argumentów ale zwraca tablicę liczb double. Za zwracanie wartości w metodzie odpowiada komenda return, która zwraca tablicę liczb double o nazwie tablica. Zauważ, że jest to nazwa zupełnie inna od nazwy tablicy, która przyjmuje wynik zwracany przez metodę (wylosowaneLiczby). Obie tablice „nie widzą się” mogą zatem mieć zupełnie inne albo takie same nazwy, nie ma to znaczenia dla działania programu.

  • Metoda dodajLiczby(int l1, double l2) – przyjmuje dwie liczby (int oraz double) a zwraca liczbę double. Wewnątrz metody wywołujemy inną metodę – jak widać możemy to robić nie tylko z metody main, metody „widzą się” w obrębie klasy. Zauważ też, że po komendzie return nie umieściłem nazwy zmiennej ale wyrażene, które zwraca wartość, która jest następnie zwracana przez metodę.

Ćwiczenie

Napisz program, który:

  • Pobiera od użytkownika określoną liczbę liczb – użytkownik podaje ile to liczb, może też podać nowy zestaw liczb
  • Dla podanych liczb użytkownik może uzyskać (menu):
    • wypisanie wszystkich danych
    • największą liczbę
    • najmniejszą liczbę
    • średnią arytmetyczną
    • sumę liczb
    • wariancję
    • od razu wszystkie powyższe wartości
  • Program działa dopóki użytkownik nie wybierze z menu opcji zakończenia
  • Jeśli użytkownik chce uzyskać jakieś parametry statystyczne a jeszcze nie wprowadził danych to uruchamia się kod odpowiedzialny za wprowadzanie danych

Wskazówki

  • Zastanów się na jakie oddzielne zadania można podzielić program, które z nich będą wykorzystane wielokrotnie
  • Rozdziel fragmenty kodu odpowiedzialne za poszczególne zadania do oddzielnych metod

Rozwiązanie

Na początku należy oddzielić poszczególne zadania, które umieścimy w oddzielnych metodach. Oddziel też obliczenia od wypisywania wyników. Warto też od razu zastanowić się jakie dane będą przyjmować a jakie zwracać poszczególne metody. Oznaczymy je jako „we:” i „wy:”. Ogólnie, wszystkie metody odpowiedzialne za obliczenia powinny przyjmować jako argumenty dane potrzebne do obliczeń a zwracać liczbę, która będzie wynikiem. Metoda odpowiedzialna za pobranie danych od użytkownika, nie powinna pobierać nic a zwracać tablicę liczb double.

Dla przypomnienia, wzór na wariancję wygląda tak:

fig_wariancja

gdzie: s2– wariancja, xi – kolejna liczba, xsr – średnia arytmetyczna z liczb, n – liczba danych

  • wyświetlanie menu we: nic; wy: nic
  • pobranie opcji od użytkownika i uruchomienie odpowiedniej metody – to będzie główna pętla programu, wykonująca się aż do decyzji użytkownika o zakończeniu pracy – we: nic; wy: nic
  • pobranie danych od użytkownika – we: nic; wy: double[]
  • obliczenia:
    • znalezienie największej liczby – we: double[]; wy: double
    • znalezienie najmniejszej liczby – we: double[]; wy: double
    • obliczenie sumy liczb – we: double[]; wy: double
    • obliczenie średniej arytmetycznej – we: double[]; wy: double
    • obliczenie wariancji – we: double[]; wy: double
  • wywołanie odpowiednich metod i wypisanie wszystkich danych i parametrów – we: double[]; wy: nic

Następnie zastanów się, czy w poszczególnych metodach nie można wykorzystać innych metod. W takim wypadku można z wnętrza metody wywołac inną metodę i wykorzystać zwróconą przez nią wartość do dalszych obliczeń (lub wypisania zwracanych wartości).

  • Metoda odpowiedzialna za wydruk wszystkich parametrów, będzie musiała wywołać wszystkie metody odpowiedzialne za wykonanie obliczeń
  • Do obliczenia wariancji potrzebna jest średnia arytmetyczna
  • Do obliczenia średniej arytmetycznej potrzebna jest suma liczb

Kompletny kod może wygladać tak:

Ta strona jest częścią materiałów do kursu “Programowanie w Javie z elementami bioinformatyki dla poczatkujących”. Pozostałe materiały znajdziesz tutaj

1 comment to Java [19] – Metody

  • Karolina

    Czy ja dobrze kombinuję, że stosując powyższy kod na rozwiązanie zadania menu wyświetli się dwa razy: 1 raz przy pierwszym wprowadzaniu danych i drugi, żeby program wiedział, co z tymi wprowadzanymi danymi zrobić? Nie można by pierwsze wprowadzanie danych wyrzucić poza pętlę? Fakt że wtedy nie będzie można od razu programu zakończyć

Leave a Reply