Luty 4, 2019

Java pytanie rekrutacyjne: Przeciążanie i przesłanianie metod

Czym różni się przeciążanie od przysłaniania metod?

Przeciążanie metody polega na stworzeniu wielu metod o tej samej nazwie, lecz przyjmującymi inne parametry. Taki mechanizm pozwala użytkownikowi użycie tej metody, która mu odpowiada – np. ma obiekt danego typu i nie chce go samodzielnie zmieniać.

Takim przykładem może być parametr URL oraz String – zależnie od tego czym dysponujemy możemy podać metodzie inny typ.

package org.blog;

import com.sun.deploy.net.BasicHttpRequest;
import com.sun.deploy.net.HttpRequest;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

public class Main {
    public void makeRequest(HttpRequest httpRequest, URL url) {
        try {
            httpRequest.doGetRequest(url);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void makeRequest(HttpRequest httpRequest, String url) {
        try {
            makeRequest(httpRequest, new URL(url));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    public void makeRequest(HttpRequest httpRequest) {
        makeRequest(httpRequest, "http://google.com");
    }

    public static void main(String[] args) {
        new Main().makeRequest(new BasicHttpRequest());
    }
}

W przysłonięciem metod mamy do czynienia podczas rozszerzania klasy przez klasę – a dokładnie w momencie, gdy chcemy przysłonić implementację klasy rodzica własną.

Omawiany mechanizm można zauważyć na poniższych dwóch klasach: Parent oraz Child.

package org.blog;

public class Parent {
    public String name;

    public Parent(String name) {
        this.name = name;
    }

    public String sayHello() {
        return "Hello, I am " + name;
    }

    public String todoSth() {
        return "I'm " + name;
    }
}

Oraz druga klasa:

package org.blog;

public class Child extends Parent {
    public Child(String name) {
        super(name);
    }

    @Override
    public String sayHello() {
        return "Hello, my name is: " + name;
    }

    @Override
    public String todoSth() {
        return super.todoSth().toUpperCase();
    }
}

Warto wspomnieć, że możemy również odwołać się w klasie dziedziczącej do metody z klasy rodzica poprzez słowo kluczowe super i bez problemu wywołać ową metodę – tak jak to się dzieje w metodzie todoSth.

Adnotacja @Override pełni również ważną funkcję podczas przesłaniania metod – sprawdź ten mechanizm w innym pytaniu rekrutacyjnym.