Sobes.tech
Middle

Kas ir manto un polimorfisms atsauces datu tipos?

sobes.tech AI

Atbilde no AI

Mantošana — tas ir mehānisms, kas ļauj jaunam klasei (manto, apakšklasei, apakšklasei) mantot esošās klases (vecāka, superklases) laukus un metodes. Tas veicina koda atkārtotu izmantošanu un klases hierarhiju.

Polimorfisms (daudzveidība formās) — tas ir objekta spēja būt vairākām formām. Kontekstā ar atsauces tipiem tas nozīmē, ka superklases mainīgais var atsaukties uz apakšklases objektu. Tas ļauj apstrādāt dažādu apakšklases objektus vienotā veidā caur kopēju interfeisu vai superklasi.

Ir divi galvenie polimorfisma veidi:

  1. Kompilācijas laiks (statiskais polimorfisms): Parasti tiek sasniegts ar metožu pārrakstīšanu (method overloading), kad vienā klasē ir vairākas metodes ar vienādu nosaukumu, bet dažādām signaturām (parametru skaitu un/ vai tipus).
  2. Izpildes laiks (dinamisks polimorfisms): Tiek sasniegts ar metožu pārrakstīšanu (method overriding), kad apakšklase nodrošina savu realizāciju jau definētai metodai superklasē. Izsaucot tādu metodi caur superklases atsauci, tiks izpildīta apakšklases realizācija (ja objekta tips — apakšklase).

Piemērs mantošanai un dinamiskajam polimorfismam:

// Pamatklase
class Animal {
    public void makeSound() {
        System.out.println("Vispārīgs dzīvnieka skaņa");
    }
}

// Apakšklase
class Dog extends Animal {
    @Override // Pārrakstīšana
    public void makeSound() {
        System.out.println("Vau!");
    }
}

// Apakšklase
class Cat extends Animal {
    @Override // Pārrakstīšana
    public void makeSound() {
        System.out.println("Mau!");
    }
}

public class Main {
    public static void main(String[] args) {
        // Statiskā tipa mainīgais — Animal, dinamisks tips — Dog
        Animal myDog = new Dog();
        // Statiskā tipa mainīgais — Animal, dinamisks tips — Cat
        Animal myCat = new Cat();
        // Statiskā tipa mainīgais — Animal, dinamisks tips — Animal
        Animal genericAnimal = new Animal();

        // Polimorfisma demonstrācija
        myDog.makeSound(); // Izsauks Dog metodi
        myCat.makeSound(); // Izsauks Cat metodi
        genericAnimal.makeSound(); // Izsauks Animal metodi
    }
}

Šajā piemērā Dog un Cat manto no Animal. Mainīgie myDog, myCat un genericAnimal ir statiska tipa Animal, bet atsaucas uz dažādu dinamisko tipu objektiem (Dog, Cat, Animal). Izsaucot makeSound() metodi, katrā gadījumā tiek izpildīta atbilstošā metodes realizācija atkarībā no objekta dinamiskā tipa, kas ir izpildes laika polimorfisms.