Newsgroup: it.comp.java
Titolo: [LUNGO, NOIOSO, CON CODICE] dubbi

salve a tutti.
sto cercando di capire come funziona java e ho un paio di dubbi.
dunque, ho queste classi qua:
class Padre {
	public void pubblico() {
		System.out.println("Padre.pubblico(): " +
		                   "metodo public di Padre");
		privato(", richiamato da Padre.pubblico()");
	}
	protected void protetto() {
		System.out.println("Padre.protetto(): " +
		                   "metodo protected di Padre");
	}
	private void privato(String arg) {
		System.out.println("Padre.privato(): " +
		                   "metodo private di Padre" + arg);
	}
}
class Figlio extends Padre {
	public void protetto() {
		System.out.println("Figlio.protetto(): " +
		                   "metodo protected di Padre, " +
		                   "public in Figlio");
	}
	public void privato(String arg) {
		System.out.println("Figlio.privato(): " +
		                   "metodo private di Padre, " +
		                   "public in Figlio" + arg);
	}
}
public class Ered {
	public static void main(String args[]) {
		Padre oPF = new Figlio();
		oPF.pubblico();
		oPF.protetto();
		((Figlio) oPF).privato("");
		System.exit(0);
	}
}
quello che ottengo eseguendo "Ered" e':
Padre.pubblico(): metodo public di Padre                       [OK]
Padre.privato(): metodo private di Padre,
                 richiamato da Padre.pubblico()                [OK]
Figlio.protetto(): metodo protected di Padre, public in Figlio [??]
Figlio.privato(): metodo private di Padre, public in Figlio    [??]
primo dubbio: l'oggetto "oPF" e' utilizzato come se fosse un "Padre"
(anche se il codice da eseguire e' preso da "Figlio"): perche'
posso richiamare il metodo "protetto()"?
secondo dubbio: perche' posso definire un metodo "privato()" nella
classe "Figlio", che ha la stessa signature del corrispondente
metodo di "Padre"? ecco la mia non convincente risposta: "privato()"
in "Padre" e' private, quindi e' come se nella classe "Figlio" tale
metodo non esistesse, ma... se quando richiamo il metodo "pubblico()"
(che non ho ridefinito) eredito il codice di "Padre", non dovrei
ereditare anche un metodo con signature "privato(String)", che esiste
nella classe "Figlio", anche se (diciamo cosi') non so dove sia e non
posso modificare? oppure 'eredito' significa 'ho un
riferimento ai metodi (e campi) della classe "Padre"', che, cmq, non
'importo' nella classe "Figlio"?
grazie per chi avra' la pazienza di leggere tutto il post... e
rispondere!

 metodo di "Padre"?
Perche' stai ridefinendo uno dei metodi assegnandogli una diversa
visibilita'. Che problema c'e'? I due metodo sono sempre li',
solo che per richiamare quello del "babbo" dal figlio dovrai usare
super().nomedelmetodo().
Io ti consiglierei di leggere le specifiche del linguaggio, lo so
che sono noiose pero'...
Davide

 visibilita'. Che problema c'e'? I due metodo sono sempre li',
il problema e' che sapevo che nella signature dei metodi non rientra
la visibilita' (public, protected, ecc), ma solo il nome e la lista dei
tipi degli args. quello che non mi e' chiaro e' come faccia java a
richiamare il metodo private definito nel padre, anziche' prendere
quello che ridefinisco in "Figlio" con la stessa sig, ma public.
[cmq, questo comportamento e' (ovviamente) coerente con quanto permette
di fare il modificatore private, solo non riesco a capire come faccia!]
ps: per il protected credevo che fosse visibile SOLO alle classi
figlie e non anche a quelle dello stesso package... grazie per la
dritta