Podstawy przeciążania metod
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 28 z 87.
Polimorfizm oznacza „wiele form”. W Javie pozwala obiektom zachowywać się różnie w zależności od kontekstu. Jedną z form polimorfizmu jest przeciążanie metod, nazywane także polimorfizmem czasu kompilacji, ponieważ Java określa, którą metodę wywołać podczas kompilacji.
Przeciążanie metod pozwala definiować wiele metod o tej samej nazwie, ale różnych parametrach. Kompilator rozróżnia je na podstawie liczby, typu lub kolejności parametrów:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}Gdy wywołujesz add(5, 3), Java używa pierwszej metody. Wywołanie add(5, 3, 2) uruchamia drugą, a add(5.0, 3.0) wywołuje trzecią. Kompilator wybiera właściwą wersję na podstawie podanych argumentów.
Pamiętaj, że zmiana wyłącznie typu zwracanego nie jest prawidłowym przeciążaniem. Lista parametrów musi się różnić:
// To NIE jest poprawne przeciążenie — kod się nie skompiluje
public int getValue() { return 1; }
public double getValue() { return 1.0; } // Błąd!Właściwie widziałeś już przeciążanie metod w przypadku przeciążania konstruktorów. Przeciążanie metod podlega tym samym zasadom i zapewnia elastyczność, pozwalając jednej nazwie metody obsługiwać różne sytuacje wejściowe.
Wyzwanie
ŁatwyZbudujmy formater wiadomości, który demonstruje przeciążanie metod, oferując wiele sposobów formatowania wiadomości. Utworzysz klasę narzędziową z kilkoma przeciążonymi metodami format, które obsługują różne scenariusze wejściowe.
Podzielisz kod na dwa pliki:
MessageFormatter.java: Utwórz klasę, która umożliwia elastyczne formatowanie wiadomości za pomocą przeciążonych metod. Twój formater powinien zawierać:- Metodę
format(String message), która zwraca wiadomość ujętą w nawiasy kwadratowe:[message] - Metodę
format(String message, int repeatCount), która zwraca wiadomość powtórzoną określoną liczbę razy i rozdzieloną spacjami - Metodę
format(String message, String prefix), która zwraca wiadomość z dołączonym prefiksem:prefix: message - Metodę
format(String message, String prefix, String suffix), która zwraca:prefix: message (suffix)
- Metodę
Main.java: Zademonstruj działanie wszystkich czterech przeciążonych metod. Otrzymasz cztery dane wejściowe: wiadomość (String), liczbę powtórzeń (int), prefiks (String) i sufiks (String). Utwórz obiekt MessageFormatter i wywołaj każdą wersję metodyformat, wypisując każdy wynik w osobnym wierszu:- Po pierwsze, sformatuj samą wiadomość
- Po drugie, sformatuj wiadomość i liczbę powtórzeń
- Po trzecie, sformatuj wiadomość i prefiks
- Po czwarte, sformatuj wiadomość, prefiks i sufiks
Otrzymasz cztery dane wejściowe: tekst wiadomości, liczbę jej powtórzeń, ciąg znaków prefiksu i ciąg znaków sufiksu.
Na przykład, jeśli wiadomość to "Hello", liczba powtórzeń wynosi 3, prefiks to "INFO", a sufiks to "done", wynik powinien pokazywać cztery różne sformatowane wersje tej samej wiadomości, z których każda wykorzystuje inną przeciążoną metodę!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj dane wejściowe
String message = scanner.nextLine();
int repeatCount = Integer.parseInt(scanner.nextLine());
String prefix = scanner.nextLine();
String suffix = scanner.nextLine();
// TODO: Utwórz obiekt MessageFormatter
// TODO: Wywołaj format, przekazując tylko message, i wypisz wynik
// TODO: Wywołaj format, przekazując message i repeatCount, i wypisz wynik
// TODO: Wywołaj format, przekazując message i prefix, i wypisz wynik
// TODO: Wywołaj format, przekazując message, prefix i suffix, i wypisz wynik
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online