Lekcje modułu (2/2)
Metodi e Przeciążanie
Metody definiują zachowanie obiektu. Możemy postrzegać je jako funkcje zadeklarowane wewnątrz klasy, które operują na polach instancji obiektu lub parametrach wejściowych.
Definiowanie Metody
Metoda w Javie składa się z:
- Modyfikatora dostępu (np.
public,private). - Typu zwracanego (np.
int,Stringlubvoid, jeśli nic nie zwraca). - Nazwy metody pisanej w notacji
camelCase. - Parametrów ujętych w nawiasy okrągłe.
- Ciała metody ujętego w nawiasy klamrowe.
class Person {
String name;
public Person(String name) {
this.name = name;
}
// Metodo con tipo di ritorno String
public String greet() {
return "Ciao, mi chiamo " + name;
}
}
Wywoływanie Metody
Aby wywołać metodę na utworzonym obiekcie, używamy składni z kropką .:
public class Main {
public static void main(String[] args) {
Person p = new Person("Marco");
String message = p.greet(); // Chiamata del metodo
System.out.println(message);
}
}
Przeciążanie Metod (Method Overloading)
W Javie dwie lub więcej metod wewnątrz tej samej klasy może mieć tę samą nazwę, pod warunkiem, że posiadają różną listę parametrów (różnią się liczbą, kolejnością lub typem parametrów). Koncepcja ta znana jest jako Przeciążanie (Overloading).
Kompilator decyduje, którą metodę wywołać, analizując argumenty przekazane podczas wywołania.
class Printer {
// Metodo per stampare un intero
public void printValue(int number) {
System.out.println("Intero: " + number);
}
// Metodo sovraccaricato per stampare una stringa
public void printValue(String text) {
System.out.println("Testo: " + text);
}
}
Przekazywanie Parametrów przez Wartość (Pass-by-Value)
W Javie wszystkie parametry są przekazywane przez wartość (pass-by-value). Oznacza to, że gdy przekazujesz argument do metody, Java tworzy kopię wartości zmiennej i przekazuje ją do metody.
- W przypadku typów prostych (primitiv) oryginalna wartość na zewnątrz metody nigdy się nie zmienia, nawet jeśli zostanie zmodyfikowana wewnątrz metody.
- W przypadku obiektów/referencji kopiowana jest referencja do obiektu. Oznacza to, że choć nie możemy zmienić adresu, na który wskazuje oryginalny obiekt, możemy modyfikować jego stan wewnętrzny (np. pola), a zmiany te będą widoczne na zewnątrz.
Ograniczenia Przeciążania: Typ Zwracany
Ważne jest podkreślenie, że nie jest możliwe przeciążenie metody wyłącznie na podstawie jej typu zwracanego. Na przykład poniższy kod wygeneruje błąd kompilacji:
class Example {
// ERRORE: La firma dei due metodi è considerata identica
public int getNumber() { return 42; }
public double getNumber() { return 42.0; }
}
Kompilator musi rozróżniać metody wyłącznie na podstawie parametrów, aby zdecydować, którą wersję wywołać w czasie kompilacji (przeciążanie jest w pełni rozstrzygane w czasie kompilacji).
Spróbuj sam
Dodaj do klasy Calculator metodę public int add(int a, int b), która zwraca sumę dwóch liczb. W metodzie main wywołaj tę metodę na obiekcie calc i przypisz wynik do zmiennej całkowitej.
Pokaż wskazówkę
Zadeklaruj metodę jako `public int add(int a, int b) { return a + b; }` i wywołaj ją w metodzie main jako `int result = calc.add(5, 10);`.
Rozwiązanie dostępne po 3 próbach
Przeciąż metodę add w klasie Calculator tworząc inną metodę, która przyjmuje dwa parametry typu double i zwraca ich sumę.
Pokaż wskazówkę
Napisz `public double add(double a, double b) { return a + b; }` bezpośrednio pod pierwszą metodą add.
Rozwiązanie dostępne po 3 próbach
Dodaj do klasy Calculator metodę public int multiply(int a, int b), która zwraca iloczyn dwóch liczb. W metodzie main wywołaj tę metodę na obiekcie calc i przypisz wynik do zmiennej całkowitej.
Pokaż wskazówkę
Zadeklaruj metodę jako `public int multiply(int a, int b) { return a * b; }` i wywołaj ją w metodzie main jako `int result = calc.multiply(5, 10);`.
Rozwiązanie dostępne po 3 próbach