Domanda semplice teorica sui metodi sovrascritti

di il
3 risposte

Domanda semplice teorica sui metodi sovrascritti

Ciao a tutti

Definisco generalmente un metodo m "sovrascritto" quando definisco un altro metodo con lo stesso nome di m che però differisce, ad esempio, per il tipo o il numero di parametri espliciti (quindi la macchina virtuale è in grado di capire a quale metodo l'utente sta realmente facendo riferimento proprio analizzando l'entità dei parametri espliciti).

Facendo qualche esercizio mi sono ritrovato in questa situazione:

-In una classe, che per semplicità chiamerò "S1", ho definito un metodo di esemplare "ciao()";
-In una seconda classe "S2", composta della prima classe (ossia ha come campi di esemplare oggetti di tipo "S1"), ho un metodo di esemplare che da consegna è chiamato "ciao()". (Specifico NON ESSERE UNA SITUAZIONE DI EREDITARIETA').

Posso operare in questa maniera?
public class S2{
    public void ciao(){
        ... 
        oggettoDiTipoS1.ciao();
    }
}
La macchina virtuale JVM capisce che il secondo metodo "ciao()" è il metodo della classe S1 in quanto agisce su un oggettoDiTipoS1 e NON su un oggetto di tipo S2? O traduce il tutto in una ricorsione senza senso?

Spero di essermi spiegato

3 Risposte

  • Re: Domanda semplice teorica sui metodi sovrascritti

    Visto che S1 ed S2 non hanno nessuna relazione, il metodo S1.ciao() non ha nessuna relazione con il metodo S2.ciao().

    Il nome di un metodo non e' semplicemente ciao(), ma e' composto da:

    1) package a cui la classe appartiene
    2) nome della classe
    3) nome del metodo
    4) tipo dei parametri passati al metodo.

    in una qualche forma, mantenuta all'interno della VM

    Nota che non ho indicato il tipo del valore di ritorno.
    Infatti, al momento il compilatore Java (ed anche in C++, non mi ricordo per altri linguaggi, ma immagino seguano le stesse regole), non e' in gradi di distinguere tra due metodi, appartenenti alla stessa classe, con gli stessi parametri in ingresso, ma con diversti tipi di valori in uscita.

    Quindi, in questo caso, anche se i metodi hanno gli stessi nomi, non sei in una situazione di overloading
  • Re: Domanda semplice teorica sui metodi sovrascritti

    Ecco una situazione piu' interessante:
    
    
    class A
    {
        public void m(Object o){
            System.out.print("A.m: ");
            System.out.println(o);
        }
    
        public void c(Object o){
            System.out.print("A.c: ");
            System.out.println(o);
        }
    }
    
    class B extends A
    {
        public void m(String s){
            System.out.print("B.m: ");
            System.out.println(s);
        }
    
        public void c(Object o){
            System.out.print("B.c: ");
            System.out.println(o);
        }
    }
    
    public class Main {
    
        public static void main(String[] args) {
    
            B b = new B();
            Object o = "ciccio";
    
            b.m(o);
            b.m((String)o);
    
            b.c(o);
            b.c((String)o);
        }
    }
    
    Naturalmente la domanda e': perche'?
  • Re: Domanda semplice teorica sui metodi sovrascritti

    migliorabile ha scritto:


    Il nome di un metodo non e' semplicemente ciao(), ma e' composto da:

    1) package a cui la classe appartiene
    2) nome della classe
    3) nome del metodo
    4) tipo dei parametri passati al metodo.
    La mia domanda era focalizzata proprio sul punto 4 da te espresso:

    " tipo dei parametri passati al metodo. "

    Indifferentemente dal fatto che i parametri siano di tipo esplicito o implicito, giusto?
Devi accedere o registrarti per scrivere nel forum
3 risposte