Polimorfismo in Java: concetti, tipi, caratteristiche ed esempi

Pubblicato: 2022-04-18

Javascript è uno dei linguaggi di programmazione orientati agli oggetti più popolari e ampiamente utilizzati, insieme a C#, PHP, Python, C++, ecc. Consente agli utenti di esporre e affrontare concetti della vita reale attraverso la programmazione poiché tutto è rappresentato come un oggetto. Le caratteristiche di Java come linguaggio di programmazione offrono diverse strade per semplificare lo sviluppo del software rendendo i codici più dinamici e facilitando la manutenzione.

In questo articolo esploreremo Java come linguaggio di programmazione orientato agli oggetti e comprenderemo i concetti di ereditarietà, astrazione, polimorfismo e incapsulamento dei dati. Esamineremo anche i tipi di polimorfismo in Java, i loro vantaggi e svantaggi.

Sommario

Panoramica della programmazione orientata agli oggetti

I linguaggi di programmazione orientata agli oggetti (OOP) si riferiscono a quei linguaggi per computer che utilizzano il concetto di "oggetti" in tempo reale nella codifica. Mira a implementare entità mondane come eredità, polimorfismo, loop, astrazione di dati, ecc., Attraverso la programmazione.

Ci sono alcuni concetti di base della programmazione orientata agli oggetti con cui i programmatori devono familiarizzare. Questi termini concettuali sono necessari per conoscere le caratteristiche speciali e uniche dell'OOP come l'incapsulamento, il polimorfismo, ecc.

1. Classe

Una "classe" rappresenta un insieme di proprietà e metodi che si applicano a tutti gli "oggetti" specificati all'interno della classe. Gli oggetti possono essere di diversi tipi come intero, array o stringa, ecc. Una classe è come un prototipo definito dall'utente, utilizzando il quale è possibile creare diversi 'oggetti'.

2. Oggetto

Un oggetto è l'unità fondamentale dei linguaggi OOP, che rappresenta dati reali nella vita reale. Gli oggetti hanno le proprietà delle classi in cui sono invocati.

3. Metodo

Un metodo è un insieme di istruzioni che coinvolgono diverse funzioni che vengono messe insieme per eseguire un'attività specifica. Restituisce l'output dopo aver completato le istruzioni definite dall'utente. Può anche eseguire attività che non forniscono output. I metodi consentono ai programmatori di riutilizzare i codici senza ridigitarli. Java richiede che tutti i metodi appartengano a una classe, a differenza dei linguaggi come C++, C o Python.

Concetti OOP

Esistono quattro principi fondamentali della programmazione orientata agli oggetti: Java mostra tutte queste proprietà:

1. Astrazione

Data Abstraction è una proprietà dei linguaggi OOP che mostra i dettagli necessari mantenendo gli altri dettagli irrilevanti dell'oggetto dalla visibilità all'utente, come il codice di implementazione. Solo i dettagli essenziali e rilevanti vengono visualizzati da questa funzionalità, che aiuta gli sviluppatori ad apportare rapidamente le modifiche appropriate alle funzionalità di una classe.

2. Incapsulamento

L'incapsulamento dei dati si riferisce al wrapping dei dati all'interno delle unità. Questa proprietà dei linguaggi OOP protegge i dati incapsulati da altre funzioni e metodi. Unisce il codice e i metodi specificati per eseguire operazioni in unità singolari, impedendo così che vengano manipolati o accessibili da metodi esterni. Questo è anche noto come Nascondere i dati.

3. Eredità

L'ereditarietà è un'altra importante caratteristica dei linguaggi OOP che consente a una classe di ereditare proprietà da altre classi. Funziona sul concetto di riutilizzabilità dei codici, riducendo così la necessità di riscrivere ripetutamente le caratteristiche delle classi. La classe che eredita da un'altra classe è nota come sottoclasse e la classe ereditata è nota come superclasse.

4. Polimorfismo

Il polimorfismo consente a un oggetto di assumere molte forme ed eseguire compiti simili o esibire comportamenti simili con metodi diversi.

Polimorfismo in Java

Il polimorfismo consente di eseguire un singolo compito in vari modi. È una proprietà che aiuta a identificare e differenziare tra entità di codice simili, migliorando così l'efficienza dei linguaggi OOP.

In Java, il polimorfismo si manifesta dichiarando gli oggetti come entità separate. In questo modo, la stessa azione può essere eseguita in più modi. Il polimorfismo viene attivato insieme all'ereditarietà, consentendo agli oggetti di svolgere compiti diversi utilizzando le proprietà ereditate di classi diverse. Le differenze nella designazione di metodi o oggetti distinguono due entità.

Impara i corsi di sviluppo software online dalle migliori università del mondo. Guadagna programmi Executive PG, programmi di certificazione avanzati o programmi di master per accelerare la tua carriera.

Caratteristiche del polimorfismo

1. Coercizione

La conversione implicita dei tipi di dati per evitare errori di tipo durante il tempo di compilazione è coercitiva. Non include conversioni esplicite del tipo di dati ma segue solo la gerarchia di conversione consentita da Java. Ad esempio, se un operando è inattivo e l'operatore è un numero intero, il risultante sarà inattivo.

2. Parametri/variabili polimorfici

Un oggetto o una variabile che può contenere valori di vario tipo durante il tempo di esecuzione è noto come variabile o parametro polimorfico. Stabilisce che durante la dichiarazione di una classe, gli stessi nomi di variabili possono contenere tipi di dati diversi e gli stessi nomi di metodi possono contenere parametri e tipi restituiti diversi.

3. Sovraccarico interno dell'operatore

Il sovraccarico dell'operatore utilizza un simbolo dell'operatore come richiesto dall'utente. Java supporta il sovraccarico dell'operatore interno. È anche un esempio di polimorfismo statico.

Tipi di polimorfismo in Java

In Java, il polimorfismo può essere invocato usando:

1. Sovraccarico del metodo

L'overloading del metodo è il processo di creazione di più oggetti o metodi con lo stesso nome e appartenenti alla stessa classe. Funziona all'interno di una classe.

2. Sovrascrittura del metodo

L'override del metodo è il modo in cui una sottoclasse costituisce gli stessi metodi dichiarati nella superclasse. Funziona tra le classi. Se la sottoclasse contiene gli stessi metodi già presenti nella superclasse, la funzione nella sottoclasse viene sovrascritta.

Sottotipo Polimorfismo in Java

Il polimorfismo del sottotipo dipende da Upcasting e Late Binding.

  • L'upcasting è un processo mediante il quale un oggetto o un metodo può promuovere un tipo di dati (float, intero, ecc.) da un sottotipo a un supertipo spostandolo verso l'alto nella gerarchia di ereditarietà.
  • L'associazione tardiva viene utilizzata per chiamare metodi che non sono istanze finali.

Nessun operatore è coinvolto in questo perché il sottotipo stesso è un membro del supertipo. Ad esempio, se una classe è denominata colori, i suoi sottotipi possono essere rosso, blu, arancione, verde, ecc. Il polimorfismo del sottotipo include i sottotipi per mostrare le proprietà del supertipo. Tuttavia, si perde l'accesso alle singole proprietà di ogni sottotipo.

Polimorfismo di runtime in Java

In Java, il polimorfismo di runtime è anche noto come Dynamic Method Dispatch o Dynamic Binding. Si ottiene tramite l'override del metodo, chiamando un metodo sottoposto a override per fornire una risoluzione dinamica in fase di esecuzione. Può essere ottenuto attraverso funzioni e non oggetti.

Ecco un esempio di polimorfismo di runtime in Java:

auto di classe{

void run(){System.out.println("guida");}

}

classe Volkswagen estende Auto{

void run(){System.out.println("Guidare in sicurezza con 90 km");}

public static void main(String args[]){

Auto c = nuova Volkswagen();//upcasting

b.run();

}

}

Uscita :

Guidare in sicurezza con 90 km

Compila il polimorfismo del tempo in Java

Il polimorfismo in fase di compilazione si ottiene mediante il sovraccarico del metodo. È il processo in cui la chiamata per un metodo sovraccarico viene eseguita e risolta durante la fase di compilazione. È anche noto come polimorfismo statico. Java è sufficientemente flessibile da consentire all'utente di utilizzare metodi o oggetti con gli stessi nomi purché le sue dichiarazioni e le proprietà della firma rimangano diverse.

Ecco un esempio di polimorfismo in fase di compilazione in Java:

classe SimpleCalc

{

int add(int x, int y)

{

restituisci x+y;

}

int add(int x, int y, int z)

{

restituisce x+y+z;

}

}

Demo di classe pubblica

{

public static void main(String args[])

{

SimpleCalc obj = new SimpleCalc();

System.out.println(obj.add(20, 30));

System.out.println(obj.add(40, 30, 20));

}

}

Uscita :

50

90

Importanza del polimorfismo

Il polimorfismo consente di scrivere metodi che possono costituire diversi tipi di entità con lo stesso nome. Il polimorfismo è essenziale in Java a causa dei suoi vari vantaggi di utilizzo e dell'ambito che fornisce per rendere dinamico il codice:

  1. Consente il riutilizzo dei codici: gli stessi codici non devono essere scritti più volte.
  2. Consente a una variabile di esibire più comportamenti: avere lo stesso nome ma proprietà diverse può aprire la possibilità di mantenere la coerenza nei codici.
  3. Riduzione dei codici di massa: aiuta nel debug e allo stesso tempo riduce il tempo di compilazione, risparmiando memoria, energia e tempo dell'utente.

Possibili problemi nell'implementazione del polimorfismo

Il polimorfismo può creare confusione da usare e implementare. Riduce la leggibilità dei codici, ponendo quindi minacce di molteplici bug ed errori. Crea anche problemi con l'esecuzione delle funzioni come richiesto.

C'è un problema classico a cui prestare attenzione: il problema della classe base fragile. Si riferisce all'assemblaggio e alla codifica impropri di una classe ereditata che si traduce in metodi che mostrano risultati imprevedibili.

Conclusioni

La natura fragile dell'eredità può portare a codici disfunzionali e non funzionanti nonostante tutti gli altri criteri rimangano soddisfatti. Questo problema di base dell'architettura è considerato il problema della classe base fragile. Scopri di più su come Java esibisce i concetti OOP unendoti al programma Executive PG di upGrad in sviluppo software - specializzazione in sviluppo full stack . Fatti guidare da esperti del settore e costruisci conoscenze pratiche impegnandoti in progetti pratici e collaborativi con i colleghi.

Prenota oggi il tuo posto!

Che cos'è l'associazione statica e dinamica?

Gli oggetti determinati al momento della compilazione sono noti come binding statico. D'altra parte, i tipi di associazione dinamica degli oggetti vengono determinati in fase di esecuzione. Il primo viene utilizzato durante l'override del metodo e il secondo durante l'override del metodo.

Quali sono le due differenze fondamentali tra l'override del metodo e l'override del metodo?

In Java, l'override del metodo non sovrascrive i metodi statici, privati ​​e finali, mentre l'override del metodo sovraccarica i metodi statici, privati ​​e finali in Java. Inoltre, l'override sottopone i metodi all'associazione dinamica e, d'altra parte, i metodi sovraccaricati passano attraverso l'associazione statica.

Quali sono le differenze tra polimorfismo ed ereditarietà in Java?

In Java, ci sono diversi punti di differenza tra polimorfismo ed ereditarietà:

1. L'ereditarietà è una rappresentazione della relazione genitore-figlio nel mondo reale nella codifica. Ma il polimorfismo è un catalizzatore che usa questa relazione per rendere il programma più dinamico.
2. L'ereditarietà consente il riutilizzo dei codici dalla classe figlia ereditando gli stessi dalla classe padre. Il polimorfismo, al contrario, consente alla classe figlia di ridefinire nuovamente il suo comportamento esistente all'interno della classe genitore.