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?

codice:
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