Przeciążanie
Wprowadzenie
Przeciążanie jest jednym z podstawowych mechanizmów Javy i programowania obiektowego ogółem. Pozwala on na tworzenie wielu metod, charakteryzujących się taką samą nazwą, ale różniących się ilością lub typem przyjmowanych argumentów. Tyczy się to również konstruktorów, dzięki czemu możemy udostępnić wiele sposobów na tworzenie obiektów.
Przeciążanie metod
Załóżmy, że istnieje klasa Calculator, w której chcemy zdefiniować metody umożliwiające wykonywanie dodawania. Dodawanie będzie mogło być jednak wykonywane, albo na dwóch, albo na trzech liczbach, dodatkowo na liczbach całkowitych, albo zmiennoprzecinkowych. Dzięki przeciążaniu wszystkie cztery wersje metod będą mogły nosić wspólną nazwę add (dodaj).
public class Calculator {
public int add(int a, int b) {
return a+b;
}
public int add(int a, int b, int c) {
return add(a, b) + c;
}
public double add(double a, double b) {
return a+b;
}
public double add(double a, double b, double c) {
return add(a, b) + c;
}
}
Możemy teraz skorzystać z naszych metod:
public class CalcApp {
public static void main(String[] args) {
Calculator calc = new Calculator();
int add1 = calc.add(2, 5); // int + int
double add2 = calc.add(2.5, 4.5); // double, double
int add3 = calc.add(1, 2, 3); // int int int
double add4 = calc.add(1.5, 2.5, 3.5); // double double double
System.out.println(add1);
System.out.println(add2);
System.out.println(add3);
System.out.println(add4);
double add5 = calc.add(5, 2.5);
System.out.println(add5);
}
}
W zależności od przekazanych argumentów wywołana zostaje odpowiednia wersja metody. Java stara się dopasować najbardziej zawężony typ, czyli pomimo iż iż metoda przyjmująca dwa double równie dobrze może przyjąć dwa inty, to wywołana zostaje prawidłowa metoda. Przekazują inta i doubla, na incie zostanie wykonana promocja typu.
Przeciążanie konstruktorów
Zasady przeciążania dotyczą również konstruktorów, które są niczym innym jak specjalną odmianą metod przeznaczoną do tworzenia obiektów.
public class Product {
private String name;
private double price;
//settery, gettery
public Product(String name) {
this.name = name;
}
public Product(String name, double price) {
this(name);
this.price = price;
}
}
Definiując dwa konstruktory w klasie Product możemy utworzyć obiekty zarówno przekazując tylko nazwę (name), albo nazwę i cenę. Będzie to przydatne, gdy np. czasami znamy wszystkie niezbędne wartości, a w innym przypadku nie lub gdy część parametrów jest opcjonalna.
public class Shop {
public static void main(String[] args) {
Product p1 = new Product("mleko"); //cena nieznana
Product p2 = new Product("telewizor", 2599); //znamy i nazwę i cenę
}
}
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.