Qual è la differenza tra l'overloading di un metodo e l'override in Java?


Risposte:


41

Per sovraccaricare un metodo con un nuovo metodo, il nuovo metodo dovrebbe avere una firma diversa. Vale a dire due metodi sovraccaricati hanno lo stesso nome, ma parametri diversi. Ecco un esempio di due metodi sovraccarichi:

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

Sulla base dei tipi di parametro, verrà chiamato il metodo corrispondente. Si noti che la modifica del tipo restituito non è sufficiente (sebbene sia possibile farlo in aggiunta).

Quando un metodo viene sovrascritto, il nuovo metodo ha la stessa firma e in alcuni casi sostituisce il metodo sostituito. Ecco un esempio di un metodo ignorato:

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

La scelta viene effettuata in base al tipo di oggetto. Per esempio,

A someA = new B();
someA.someMethod();

chiamerà il someMethoddi B. Puoi (e dovresti) aggiungere l'annotazione @Override:

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

Ora, se modifichi accidentalmente i parametri in B, il compilatore ti informerà che non stai sovrascrivendo someMethod () ma sovraccaricandolo.


@scarfridge, grazie per la modifica. Non ho programmato con Java per anni e ho dimenticato molto)))
superM

1
Grazie per aver menzionato le annotazioni @Override e il fatto che avere solo tipi di ritorno diversi non causa la sostituzione di un metodo, ma invece il sovraccarico.
Daniel Dinnyes,

13

Sovraccarico, i metodi hanno lo stesso nome ma parametri diversi.

Sostituendo, l'implementazione fornita nella classe base viene sostituita con quella nella sottoclasse.


1
per favore non modificare / espandere questo. La brevità è importante.
NimChimpsky

7

I concetti che chiedi sono trattati nei tutorial Java.

La spiegazione per l'override è fornita come segue:

Un metodo di istanza in una sottoclasse con la stessa firma (nome, più il numero e il tipo dei suoi parametri) e il tipo restituito come metodo di istanza nella superclasse sostituisce il metodo della superclasse.

La capacità di una sottoclasse di sovrascrivere un metodo consente a una classe di ereditare da una superclasse il cui comportamento è "abbastanza vicino" e quindi modificare il comportamento secondo necessità. Il metodo di sostituzione ha lo stesso nome, numero e tipo di parametri e tipo di ritorno del metodo che sostituisce. Un metodo di sostituzione può anche restituire un sottotipo del tipo restituito dal metodo di sostituzione. Questo si chiama tipo di ritorno covariante .

Quando si esegue l'override di un metodo, è possibile che si desideri utilizzare l' @Overrideannotazione che indica al compilatore che si intende sostituire un metodo nella superclasse. Se, per qualche motivo, il compilatore rileva che il metodo non esiste in una delle superclasse, genererà un errore. Per ulteriori informazioni su @Override, vedere Annotazioni ...

Il sovraccarico è spiegato nel tutorial come segue:

Il linguaggio di programmazione Java supporta metodi di sovraccarico e Java può distinguere tra metodi con firme di metodi diversi. Ciò significa che i metodi all'interno di una classe possono avere lo stesso nome se hanno elenchi di parametri diversi (ci sono alcune qualifiche a questo che verranno discusse nella lezione intitolata "Interfacce ed eredità".

Supponiamo di avere una classe che può usare la calligrafia per disegnare vari tipi di dati (stringhe, numeri interi e così via) e che contenga un metodo per disegnare ogni tipo di dati. È ingombrante utilizzare un nuovo nome per ogni metodo, ad esempio drawString, drawInteger, drawFloate così via. Nel linguaggio di programmazione Java, è possibile utilizzare lo stesso nome per tutti i metodi di disegno ma passare un diverso elenco di argomenti a ciascun metodo. Pertanto, la classe di disegno di dati potrebbe dichiarare quattro metodi denominati draw, ognuno dei quali ha un elenco di parametri diverso ...

I metodi sovraccarichi si differenziano per il numero e il tipo di argomenti passati nel metodo ...

Non è possibile dichiarare più di un metodo con lo stesso nome e lo stesso numero e tipo di argomenti, poiché il compilatore non può distinguerli.

Il compilatore non considera il tipo restituito durante la differenziazione dei metodi, quindi non è possibile dichiarare due metodi con la stessa firma anche se hanno un tipo restituito diverso.


Nota: i metodi sovraccaricati devono essere usati con parsimonia, in quanto possono rendere il codice molto meno leggibile.


Sopra la spiegazione del sovraccarico menziona le qualifiche discusse nella lezione intitolata "Interfacce ed eredità" :

In una sottoclasse, è possibile sovraccaricare i metodi ereditati dalla superclasse. Tali metodi sovraccaricati non nascondono né sovrascrivono i metodi della superclasse: sono nuovi metodi, unici per la sottoclasse.


2

Il sovraccarico di un metodo è generalmente definito come "fornire più metodi disponibili con lo stesso nome, differendo per il numero e il tipo di ingressi e uscite". Il concetto è di solito che si desidera essere in grado di eseguire la stessa operazione di base dati diversi set di input: è possibile, ad esempio, "aggiungere" due valori qualsiasi di tipo numerico, tuttavia è di solito importante sapere quale sia il tipo esatto di il valore è in modo che tu possa trarre vantaggio o pianificare comportamenti specifici di quel tipo. Pertanto, definiresti un metodo per ogni combinazione di tipi numerici (e o raccolte) che desideri supportare. Tutti questi metodi hanno lo stesso nome, ma "firme" diverse; in fase di compilazione,

Sovrascrivere un metodo è generalmente definito come "fornire un'implementazione diversa in una classe derivata di un metodo con una firma particolare definita nella classe base". Esistono molti motivi per ignorare un metodo; praticamente tutti hanno in comune il fatto che la classe derivata ha una conoscenza aggiuntiva di ciò che deve essere fatto, che non può essere conosciuto dalla classe base. Esistono due tipi di sostituzione nella maggior parte delle lingue OO; l'override può sostituire il metodo della classe di base oppure può estendersiil metodo della classe base. La differenza è che una classe derivata che sta estendendo un'implementazione della classe base chiamerà la versione sovrascritta del metodo della classe base ad un certo punto durante l'esecuzione del metodo override. Ciò consente alle classi di override di "riutilizzare" le aree comuni dell'operazione contenute nella classe di base.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.