Tutorijali
polimorfizam og-cs java tutorijali

Polymorphism (polimorfizam) u Javi

Polymorphism (polimorfizam) je jedan od ključnih koncepata objektno orijentiranog programiranja (OOP). Odnosi se na sposobnost objekata da imaju više oblika ili da se ponašaju na različite načine na temelju vrste ili broja parametara s kojima rade.

Pomoću OOP-a kreiramo klase, kojima opisujemo entitete iz stvarnog života. U Javi se ti entiteti zovu objekti. Objekti sadržavaju informacije o entitetu kojeg opisuju, kao i akcije koje ti objekti mogu raditi. Primjera radi, jedan objekt može opisivati psa, drugi ribu, a treći pticu.

Svaki ovaj objekt ima određena svojstva kojim se razlikuje od ostalih objekata. Pas trči, riba pliva, a ptica leti. Međutim, ovi objekti imaju i neka zajednička svojstva. Svi spomenuti objekti se kreću i hrane se. Polimorfizam nam omogućava da ta svojstva i informacije dijelimo između njih.

Polimorfizam u primjeru – overridanje metode

U uvodu smo spomenuli kako se ista akcija može izvesti na različite načine. Za primjer ćemo uzeti psa, ribu i pticu koji, rekli smo, imaju neka zajednička svojstva.

public class Animal {

    void move() {
        System.out.println("The animal is moving.");
    }
}

Kreirali smo klasu Animal, koja opisuje što svaka životinja može raditi. Svakoj životinji je zajedničko da se kreće, a to smo pokazali metodom move(). Sada ćemo kreirati klase kojima definiramo psa, ribu i pticu. Pomoću nasljeđivanja (inheritance) proslijedit ćemo metodu move() iz nadklase u sve tri podklase.

public class Dog extends Animal {

}

public class Fish extends Animal {

}

public class Bird extends Animal {

}

Sada sve tri podklase nasljeđuju opisano ponašanje iz nadklase. To ćemo potvrditi ako kreiramo instance ovih klasa u main metodi.

public class Main {
    public static void main(String[] args) {

        Animal animal = new Animal();
        Dog dog = new Dog();
        Fish fish = new Fish();
        Bird bird = new Bird();

        animal.move();
        dog.move();
        fish.move();
        bird.move();
    }
}

Pomoću nasljeđivanja sve podklase pristupile su metodi move() iz nadklase. Tom metodom naslijedili smo akciju koja je zajednička svim životinjama. Nakon pokretanja aplikacije dobit ćemo sljedeći ispis:

The animal is moving. // rezultat ispisa iz nadklase
The animal is moving. // rezultat ispisa iz podklase Dog
The animal is moving. // rezultat ispisa iz podklase Fish
The animal is moving. // rezultat ispisa iz podklase Bird

Sada ćemo pomoću polimorfizma omogućiti da ovi objekti (pas, riba i ptica) rade potpuno istu stvar, ali na različite načine. Ako ovo zvuči zbunjujuće, evo primjera kojim ćemo to razjasniti.

public class Dog extends Animal {

	@Override
    void move() {
        System.out.println("The dog is running.");
    }
}

public class Fish extends Animal {

    @Override
	void move() {
        System.out.println("The fish is swimming.");
    }
}

public class Bird extends Animal {

    @Override
	void move() {
        System.out.println("The bird is flying.");
    }
}

Implementirali smo potpuno istu metodu u sve tri podklase. Međutim, napravili smo dvije dodatne stvari: prvo smo promijenili poruku, koja točnije opisuje kako se kreće svaka pojedina životinja. Pas trči, riba pliva i ptica leti.

Nauči programirati: OG-CS YouTube tutorijali

Drugo, dodali smo anotaciju @Override, kojom prepisujemo odnosno nadjačavamo (‘overrideamo’) metodu move() iz nadklase i mijenjamo ju metodom move() iz podklase. U našem programu i dalje radimo istu stvar, ali na drugačiji način. Pokrenut ćemo aplikaciju i provjeriti rezultat.

The animal is moving. // rezultat ispisa iz nadklase
The dog is running.   // rezultat ispisa iz podklase Dog
The fish is swimming. // rezultat ispisa iz podklase Fish
The bird is flying.   // rezultat ispisa iz podklase Bird

Imajte na umu kako anotacija @Override nije obvezna i vaš će kod raditi čak i ako ju ne dodate u kod. Međutim, riječ je o dobroj praksi kojom drugim developerima dajete do znanja što vaš kod točno radi.

Polimorfizam u primjeru – overloading metode

Overloading metode podrazumijeva da klasa ima više metoda s istim imenom, ali s različitim brojem ili s različitim tipom parametara.

Za primjer ćemo koristiti klasu Dog, u koju smo dodali metodu move(). Ako dva puta napišemo istu metodu, Java će nas upozoriti kako to nije dopušteno. Ali zato metodi move() možemo dodati parametre.

public class Dog extends Animal {

	@Override
    void move() {
        System.out.println("The dog is running.");
    }
	
	void move(int speed) {
		System.out.println("The dog is running " + speed + " km/h.");
    }
}

U main metodi ćemo pozvati obje metode move() iz klase Dog.

public class Main {
    public static void main(String[] args) {

        Dog dog = new Dog();

        dog.move();
        dog.move(18);
    }
}

Pokrenut ćemo aplikaciju i provjeriti rezultat.

The dog is running. // rezultat ispisa metode move()
The dog is running 18 km/h. // rezultat ispisa metode move(int speed)

Ukratko, polimorfizam omogućava različitim podklasama da naslijede iste informacije iz nadklase i implementiraju ih na različite načine.

Autor

Marko Lubar

Ova stranica koristi kolačiće da bi poboljšalo korisničko iskustvo, više o tome možete saznajte na našoj stranici "politika privatnosti"

Politika privatnosti