Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
La prima tappa italiana della Road to CES porta a Milano i vertici della Consumer Technology Association, con una nuova griglia di lettura dei trend tecnologici e una posizione netta su dazi e regolamentazione dell'IA
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
OPPO ha appena lanciato sul mercato la nuova serie Find X10, che ha come smartphone premium il Find X10 Pro Max, uno smartphone completo, che fa del comparto fotografico il suo vero punto di forza. Ma sono tante le novità, tra cui l'AI che adesso diventa agentica. Ma andiamo a vedere nel dettaglio questo nuovo smartphone.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-06-2008, 11:26   #1
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
[Java] difficolta' nel polimorfismo

Ciao a tutti ! ho dei problemi con il polimorfismo. In pratica piu' o meno ho capito cos'e' e come funziona..solo che quando vado a fare degli esercizi sbaglio sempre l'output

questo è il codice di un'esercizio che nn mi riesce :

Codice:
class EsSuper{	
	String prima, seconda;
	public EsSuper(String p,String S){
	  prima=p;
	  seconda=s;
        }
	public String toString() {
	 return prima + " ";
	}
}

public class Esempio extends EsSuper{
	public Esempio(String P,String S) {
	   super (p,s);
	}
	
	public String toString() {
	 return prima + ":" + seconda + " ";
	}
	
	public static void main (String args[]) {
	  EsSuper a = new EsSuper ("A", "a");
	  EsSuper b = new Esempio ("B", "b");

	  System.out.print(a.toString());
          System.out.print(b.toString());
	}
}
sapete dirmi l'output .. io mi trovo con "B B b". Oltre a dirmi l'output sapete guidarmi al ragionamento dell'uotput stesso e quindi alla logica che devo seguire ? grazie mille
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 12:36   #2
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Intanto attento alle maiuscole/minuscole, per il resto è semplicissimo,
per a viene chiamato il metodo di EsSuper, per b quello di Esempio
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 12:46   #3
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
si ma scusa..senti come ragiono io .. allora

a è riferimento all'oggetto creato EsSuper. Inizializza primo e secondo ai valori di default. Dopo c'e' la chiamata al costruttore che a primo mette il valore p cioe' A e a secondo mette il valore s cioe' a.
b è riferimento all'oggetto creato Esempio. Cosa succede: viene chiamato il costruttore di Esempio e dp il costruttore c'e' un super. Il super richiama il costruttore della classe EsSuper e in quest'utlima a prima mette B e a seconda b.
Infine c'e' il system.out.print che stampa a.toString che quindi a primo è B. E poi c'e' la chiamata a b.toString che è B b.

Invece l'output è A B b .. dove sbaglio ?
__________________

Ultima modifica di Tony Hak : 02-06-2008 alle 12:51.
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 13:55   #4
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
nessuno ? help !
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 14:19   #5
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da Tony Hak Guarda i messaggi
si ma scusa..senti come ragiono io .. allora

a è riferimento all'oggetto creato EsSuper. Inizializza primo e secondo ai valori di default. Dopo c'e' la chiamata al costruttore che a primo mette il valore p cioe' A e a secondo mette il valore s cioe' a.
b è riferimento all'oggetto creato Esempio. Cosa succede: viene chiamato il costruttore di Esempio e dp il costruttore c'e' un super. Il super richiama il costruttore della classe EsSuper e in quest'utlima a prima mette B e a seconda b.
Infine c'e' il system.out.print che stampa a.toString che quindi a primo è B. E poi c'e' la chiamata a b.toString che è B b.

Invece l'output è A B b .. dove sbaglio ?
L' output corretto è A B b... Credo che tu debba approfondire meglio il polimorfismo in quanto si nota una profonda confusione.

Chiariamo alcuni punti.

-Parli di inizializzazione di default ma nel caso del tuo codice non si ha mai una inizializzazione di default(in caso di oggetti e quindi Stringhe a null) poichè lo fai sempre esplicitamente.

-La confusione maggiore che hai è sull' utilizzo di super: super setta le 2 stringhe (nel tuo caso essendo a visibilità di package potresti settarle anche a mano,mantenendo un costruttore di default) del tuo oggetto b ma non ha alcuna influenza su a.Questo dovrebbe chiarirti anche la differenza tra classe e istanza di una classe.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 15:11   #6
vincenzo83
Senior Member
 
L'Avatar di vincenzo83
 
Iscritto dal: Jun 2001
Messaggi: 458
Io continuo sempre a consigliare questo: http://www.hwupgrade.it/forum/showpo...&postcount=421
letto dall'inizio, aiuta tantissimo.
__________________
VIDEOLEZIONI di Matematica, Informatica, Fisica I & II e MOLTO altro, GRATIS !!!
Dooove ? leggete: www.hwupgrade.it/forum/showthread.php?t=1703702

vincenzo83 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 15:17   #7
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Si' mi sa che e' un problema di comprensione del concetto piu' basilare di classe piuttosto che di polimorfismo.
O almeno, da quanto ti aspetti e da come l'hai spiegato, mi sembra che il problema primo sia li'.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 16:27   #8
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
in pratica dove ho sbagliato : pensavo che scrivendo super (5,6) ad esempio si passano anche i nuovi valori al costruttore nella superclasse.. per esempio se il costruttore della superclasse è construct( int x,y) se lo chiamo dalla classe base con super (5,6) , construct diventava construct (5,6) .. invece non è cosi'... una cosa che invece non ho capito è il fatto che nella classe Esempio nel metodo ToString non dovrebbero esserci

Codice:
public String toString() {
	 return p+ ":" + s + " ";
	}
piuttosto che

Codice:
public String toString() {
	 return prima + ":" + seconda + " ";
	}
per far uscire B b ?
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 16:38   #9
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
L'oggetto a e l'oggetto b sono 2 oggetti diversi, ciascuno dei quali ha la propria copia delle stringhe prima e seconda, indipendenti.

C'e' modo di condividere alcune informazioni tra le diverse istanze delle classi, ma prima di tutto occorre capire questo comportamento, che e' il concetto fondamentale di incapsulamento.

Codice:
public static void main (String args[]) {
  EsSuper a = new EsSuper ("A", "a");
  EsSuper b = new EsSuper ("B", "b");
  System.out.print(a.toString());
  System.out.print(b.toString());
}
cerca prima di capire questo, che e' piu' semplice, senza alcuna ereditarieta' (Dove la classe ereditata Esempio potrebbe anche non esistere)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 16:49   #10
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
L'oggetto a e l'oggetto b sono 2 oggetti diversi, ciascuno dei quali ha la propria copia delle stringhe prima e seconda, indipendenti.

C'e' modo di condividere alcune informazioni tra le diverse istanze delle classi, ma prima di tutto occorre capire questo comportamento, che e' il concetto fondamentale di incapsulamento.

Codice:
public static void main (String args[]) {
  EsSuper a = new EsSuper ("A", "a");
  EsSuper b = new EsSuper ("B", "b");
  System.out.print(a.toString());
  System.out.print(b.toString());
}
cerca prima di capire questo, che e' piu' semplice, senza alcuna ereditarieta' (Dove la classe ereditata Esempio potrebbe anche non esistere)
scusa ma in questo esempio vengono creati due oggetti ? .. o sempre lo stesso a cui puntano due riferimenti ?
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 16:55   #11
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da Tony Hak Guarda i messaggi
in pratica dove ho sbagliato : pensavo che scrivendo super (5,6) ad esempio si passano anche i nuovi valori al costruttore nella superclasse.. per esempio se il costruttore della superclasse è construct( int x,y) se lo chiamo dalla classe base con super (5,6) , construct diventava construct (5,6) .. invece non è cosi'... una cosa che invece non ho capito è il fatto che nella classe Esempio nel metodo ToString non dovrebbero esserci

Codice:
public String toString() {
	 return p+ ":" + s + " ";
	}
piuttosto che

Codice:
public String toString() {
	 return prima + ":" + seconda + " ";
	}
per far uscire B b ?
Quanta confusione....

1)Classe Base e SuperClasse sono 2 modi per indicare la stessa cosa...
2)Invocando super invochi si il costruttore della classe Base ma solo per l' istanza interessata. Un esempio pratico: se una ditta licenzia l' impiegato Mario Rossi non licenzia tutti gli altri impiegati dello stesso reparto(secondo il tuo ragionamento invece dovrebbe essere cosi).Ancora, come dicevo, ti è oscura la differenza tra Classe e istanza.
3)Dall' ultima domanda si evince che ti mancano 2 concetti base per la POO: la visibilità delle variabili e l' incapsulamento.
P ed S hanno il loro scope solo all' interno del costruttore ed è li e solo li che puoi utilizzarle. Per come hai implementato la tua classe base è consentito ' accesso a "prima" e " seconda" in quanto entrambe sono prive di descrittore d' accesso e utilizzano quello di default che è settato da java su package ovvero accesso consentito alle sole classi contenuto nello stesso package che se nn diversamente indicato è quello in cartella corrente. Di norma però le variabili si etichettano come private e si accedono attraverso i metodi accessori e settatori.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 17:02   #12
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da Tony Hak Guarda i messaggi
scusa ma in questo esempio vengono creati due oggetti ? .. o sempre lo stesso a cui puntano due riferimenti ?
2 new = 2 oggetti.
La classe e' una, sempre la stessa.
gli oggetti, meglio chiamarli "Istanze della classe EsSuper", sono 2
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 17:08   #13
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da Tony Hak Guarda i messaggi
scusa ma in questo esempio vengono creati due oggetti ? .. o sempre lo stesso a cui puntano due riferimenti ?
2 oggetti ovviamente.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 17:19   #14
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
ok ok ..forse ho capito .. ho disegnato il meccanismo su carta.. un attimo che lo trasferisco in open office writer e ve lo allego ..speriamo bene
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 17:59   #15
Tony Hak
Senior Member
 
L'Avatar di Tony Hak
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661



1) creazione nuovo oggetto EsSuper con maniglia a;
2) inizializzazione delle stringhe Prima e Seconda a NULL nel nuovo oggetto creato;
3) Chiamata al costruttore di EsSuper che imposta a prima = "A" e seconda = "a"
4) Creazione nuovo oggetto Esempio com maniglia b;
5) si eriditano prima ( = "A") e seconda (= "a") e il metodo tostring che puo' essere sovraccaricato per l'overloading.
6) Chiamata al costruttore di Esempio che provvede a chiamare la superclasse (Essuper) tramite il super e prima e seconda nella classe Esempio diventano rispettivamente "B" e "b"
7) chiamate ai metodi toString per la stampa di "A" ( in EsSuper), "B:b" in Esempio

scusate se mi so espresso come un libro stracciato ma piu' o meno penso di aver capito
__________________
Tony Hak è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2008, 21:13   #16
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da Tony Hak Guarda i messaggi



1) creazione nuovo oggetto EsSuper con maniglia a;
2) inizializzazione delle stringhe Prima e Seconda a NULL nel nuovo oggetto creato;
3) Chiamata al costruttore di EsSuper che imposta a prima = "A" e seconda = "a"
4) Creazione nuovo oggetto Esempio com maniglia b;
5) si eriditano prima ( = "A") e seconda (= "a") e il metodo tostring che puo' essere sovraccaricato per l'overloading.
6) Chiamata al costruttore di Esempio che provvede a chiamare la superclasse (Essuper) tramite il super e prima e seconda nella classe Esempio diventano rispettivamente "B" e "b"
7) chiamate ai metodi toString per la stampa di "A" ( in EsSuper), "B:b" in Esempio

scusate se mi so espresso come un libro stracciato ma piu' o meno penso di aver capito
Hai capito come funziona il polimorfismo...ma ti manca qualche base..come la differenza tra dichiarazione di un oggetto e la sua inizializzazione. Quando fai la dichiarazione Object O; stai semplicemente riservando un' area di memoria per ospitare quello' oggetto(se sei nello scope globale di classe sarà di default riferito a null, viceversa se lo tenti di utilizzare senza inizializzazione avrai un errore di compilazione...che vantaggiosamente ti preserva da una probabile eccezzione runtime di NullPointer).L' inizializzazione si ha invece facendo o=new Object(); solo ora viene costruito l' oggetto e valorizzate le sue variabili in base a quanto stabilito dal programmatore nel costruttore stesso oppure con i valori di default(in questo caso consentiti perchè sotto scope globale).
Non confondere poi l' overloading di un metodo che indica il fatto che 2 metodi possano riportare lo stesso nome ma con parametri di input differenti per tipo e/o numero(la cosa non vale per il solo tipo di ritorno) esempio:

OK: public String toString()
public String toString(String s)

NOublic String toString()
public int toString()
esiste poi il concetto di covarianza sul tipo restituito ma che consente ad una classe derivata di sostituire il tipo restituito da classe Base a classe Derivata

public Base metodo()
public Derivata metodo()

con l' override di un metodo che consente appunto di cambiarne il corpo(la semantica) di un metodo ereditato lasciando inalterata la firma(o al piu utilizzando la covarianza che accennavo prima).
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato WoW Forever provato: il MMORPG che la community ...
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita TCL P80 Ultra: con un display AMOLED opaco &egra...
NordVPN anticipa il Black Friday: sconti...
HPE Spaceborne Computer-4: calcolo ad al...
500 chilometri in soli 5 minuti: la rica...
CATL e BAIC puntano a un milione di auto...
La Svezia blocca ChatGPT e Claude sui co...
La NASA ha tenuto una conferenza sulle f...
Galaxy S27 Ultra, spunta la batteria in ...
Google Maps porta l'intelligenza artific...
Una foto troppo perfetta può costare car...
Caldo in Europa, oltre 50.000 morti stim...
Il low cost spopola su Amazon: 7 offerte...
HP Envy 6120e a 49,90€ su Amazon: stampa...
Dove finiscono le ore che l’IA fa rispar...
Radiatori a olio in offerta su Amazon: M...
Tlc, l'occupazione crolla al minimo stor...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v