English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java Controllo dei flussi

Java Array

Java Orientamento agli oggetti (I)

Java Orientamento agli oggetti (II)

Java Orientamento agli oggetti (III)

Java 异常处理

Java List

Java Queue (coda)

Java Map collection

Java Set collection

Java Input/Output (I/O)

Java Reader/Writer

Altri argomenti Java

Java 多态

In questo tutorial, impareremo il polimorfismo attraverso esempi, i diversi tipi di polimorfismo e come realizzarli in Java.

Il polimorfismo è un concetto importante dell'orientamento agli oggetti. Questo significa che non c'è solo una forma. Ciò significa che il comportamento di un'entità (metodo, operatore o oggetto) può variare in diverse situazioni. Ad esempio,

L'operatore + in Java viene utilizzato per eseguire due funzioni specifiche. Quando viene utilizzato con numeri (interi e numeri a virgola mobile), viene eseguita l'operazione di somma.

int a = 5;
int b = 6;
int sum = a + b; // sum = 11

Quando utilizziamo l'operatore + con le stringhe, esegue la concatenazione delle stringhe. Ad esempio,

String firstName = "abc \";
String lastName = "xyz";
name = firstName + lastName; // name = abc xyz

Tipi di polimorfismo

In Java, il polimorfismo può essere diviso in due tipi:

  • Polimorfismo a tempo di esecuzione

  • Polimorfismo a compile-time

Polimorfismo a tempo di esecuzione

In Java, la polimorfismo a tempo di esecuzione può essere realizzato tramite ricorsione di metodo.

Supponiamo che venga creato lo stesso metodo nel padre e nel figlio della classe. In questo caso, il metodo da chiamare dipende dall'oggetto utilizzato per chiamare il metodo. Ad esempio,

Esempio 1: ricorsione di metodo

abstract class Animal {
   public abstract void makeSound();
}
class Dog extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Bark bark..");
   }
}
class Cat extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Meow meow..")}
   }
}
class Main {
   public static void main(String[] args) {
     Dog d1 = new Dog();
      d1.makeSound();
      Cat c1 = new Cat();
      c1.makeSound();
   }
}

Output:

Bark bark…
Meow-meow...

Per comprendere il funzionamento della sovraccarica dei metodi, visitareSovraccarica dei metodi in Java.

Nell'esempio sopra, il metodo makeSound() ha implementazioni diverse in due classi diverse. Quando eseguiamo il programma

  • L'espressione d1.makeSound() chiamerà il metodo della classe Dog. Questo perché d1 è un oggetto della classe Dog.

  • L'espressione c1.makeSound() chiamerà il metodo della classe Cat. Questo perché c1 è un oggetto della classe Cat.

Determinare il metodo da chiamare durante l'esecuzione del programma. Pertanto, la sovraccarica dei metodi è un polimorfismo a runtime.

Polimorfismo a compile-time

La polimorfismo a compile-time può essere realizzato attraverso la sovraccarica dei metodi e l'overloading degli operatori in Java.

Sovraccarico dei metodi

In una classe Java, se i parametri sono diversi, è possibile creare metodi con lo stesso nome. Ad esempio,

void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }

Questo in Java si chiama sovraccarica dei metodi.

Facciamo un esempio di sovraccarica dei metodi.

Esempio 3: Sovraccarica dei metodi

class Demo {
 public void displayPattern(){
   for(int i = 0; i < 10; i++) {
     System.out.print("*");
   }
 }
 public void displayPattern(char symbol) {
   for(int i = 0; i < 10; i++) {
     System.out.print(symbol);
   }
 }
}
class Main {
 public static void main(String[] args) {
   Demo d1 = new Demo();
   d1.displayPattern();
   System.out.println("\n");
   d1.displayPattern('#');
 }
}

Output:

**********
##########

Nel programma sopra, il metodo displayPattern() è stato sovraccaricato.

  •  Se chiamiamo il metodo senza passare alcun parametro, verrà creata la figura del carattere *.

  •  Se chiamiamo il metodo passando un carattere come parametro, verrà creata la figura del carattere #.

Per ulteriori informazioni sulla sovraccarica dei metodi, visitareSovraccarico dei metodi

Sovraccarico dei metodi in Java VS Sovraccarico dei metodi

  • Nel caso del sovraccarico dei metodi, i metodi dovrebbero essere in classi diverse. Tuttavia, nel caso del sovraccarico dei metodi, i metodi dovrebbero essere nella stessa classe.

  •  Il sovraccarico dei metodi viene eseguito in tempo di esecuzione, mentre il sovraccarico dei metodi viene eseguito in tempo di compilazione.

Sovraccarico degli operatori

Alcuni operatori in Java hanno comportamenti diversi per diversi operandi. Ad esempio,

  • L'operatore + viene sovraccaricato per eseguire l'addizione numerica e la concatenazione delle stringhe.

  • &、| e ! vengono sovraccaricati per le operazioni logiche e bitwise.

Vediamo come gli operatori vengono sovraccaricati in Java.

L'operatore + in Java viene utilizzato per eseguire due funzioni specifiche. Quando viene utilizzato con numeri (interi e numeri a virgola mobile), esegue l'operazione di somma. Ad esempio,

int a = 5;
int b = 6;
int sum = a + b; // sum = 11

Quando utilizziamo l'operatore + con le stringhe, esegue la concatenazione delle stringhe. Ad esempio,

String firstName = "abc \";
String lastName = "xyz";
name = firstName + lastName; // name = abc xyz

In linguaggi come C++, possiamo definire operatori per gestire diversi operandi in modo diverso. Tuttavia, Java non supporta il sovraccarico degli operatori definito dall'utente.

Perché il polimorfismo?

Il polimorfismo ci permette di creare codice coerente. Ad esempio,

Supponiamo di dover disegnare un cerchio e un quadrato. Per fare questo, possiamo creare una classe Polygon, da cui derivano due sottoclassi Circle e square. In questo caso, è necessario creare un metodo con lo stesso nome render() nelle due sottoclassi, invece di creare metodi con nomi diversi.

Nel nostro esempio di sovraccarico dei metodi, utilizziamo lo stesso nome del metodo displayPattern() per visualizzare due pattern diversi, per mantenere la coerenza.

Il metodo print() in Java è un esempio di polimorfismo (sovraccarico dei metodi). Lo stesso metodo viene utilizzato per stampare valori di diversi tipi, come char, int, String e così via. Possiamo anche utilizzare lo stesso metodo per stampare più valori in una volta.

Variabile polimorfa

In Java, le variabili di oggetto (variabili di istanza) rappresentano il comportamento delle variabili polimorfe. Questo perché le variabili di oggetto della classe possono riferirsi agli oggetti della sua classe e agli oggetti delle sue sottoclassi. Ad esempio,

class Animal {
   public void displayInfo() {
      System.out.println("Sono un animale.");
   }
}
class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("Io sono un cane.");
   }
}
class Main {
   public static void main(String[] args) {
    
      // Dichiarazione della variabile di oggetto della classe Animal a1
      Animal a1;
    
     //Creazione dell'oggetto della classe Animal
      a1 = new Animal();
      a1.displayInfo();
     //Creazione dell'oggetto della classe Dog
      a1 = new Dog();
      a1.displayInfo();
   }
}

Output:

Io sono un animale.
Io sono un cane.

Nell'esempio sopra, abbiamo creato una variabile di oggetto della classe Animal chiamata a1. In questo caso, a1 è una variabile polimorfa.

Questo è perché

  • Nella frase a1 = new Animal(), l'oggetto a1 fa riferimento all'oggetto della classe Animal.

  • Nella frase a1 = new Dog(), l'oggetto a1 fa riferimento all'oggetto della classe Dog.

Questo è un esempio di conversione ascendente in Java. Per ulteriori informazioni, visitareConversione ascendente e discendente Java.