Kurs Java Podstawy - rozszerzony

Przeciążanie

  1. Wprowadzenie
  2. Przeciążanie metod
  3. Przeciążanie konstruktorów

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ę
    }
}

Komentarze