Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
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


Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
The Social Reckoning: il seguito di The ...
iPhone 16 si trova ora su Amazon a soli ...
Amazon fa a pezzi i prezzi dei monitor g...
Componenti hardware e periferiche PC a p...
Pianeta in crisi: 7 su 9 limiti vitali g...
Galaxy S25 FE con taglio di prezzo di 10...
4 robot aspirapolvere e 3 scope elettric...
Nuovissimi Xiaomi 15T e 15T Pro con tagl...
Le agenzie federali americane potranno u...
Smartphone pieghevoli sempre più ...
LG svela le Easy TV, una nuova gamma di ...
L'equipaggio della missione Shenzhou-20 ...
Possibili detriti spaziali del razzo cin...
Amazon distrugge i prezzi: TV OLED LG, i...
Trump studia dazi fino al 100% per sping...
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: 23:44.


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