RISOLTO esercizio in java sulle classi

Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
262
3
Buongiorno non riesco a capire perchè stampa RicciRicci50Ricci:

Java:
public class Main {

    public static void main(String[] args) {
        Edificio a = new Edificio(3, "Rossi");
        Edificio b = new Casa(21, "Russo");
        Casa c = new Casa(50, "Ricci");
      
        a.print();
        b.print();
        c.print();

    }

}
Java:
public class Casa extends Edificio {

    public Casa(int f, String c) {
        super(f, c);     
      
    }

    public static void print() {
        System.out.print(piani + "" + costruttore + "");
    }
  
}
Java:
public class Edificio {
  
    static String costruttore;
    static int piani;
  
    public Edificio(int f, String c) {
        piani = f;
        costruttore = c;
    }
  
    public static void print() {
        System.out.print(costruttore + "");
    }
  
  

}
Potete aiutarmi a capire perchè?
Grazie :)
 
Ultima modifica da un moderatore:

Moffetta88

Moderatore
Staff Forum
Utente Èlite
20,543
12,932
CPU
i5-4690
Dissipatore
DEEPCOOL CAPTAIN 240EX
Scheda Madre
MSI Z97 U3 PLUS
HDD
KINGSTON SSD KC400 240GB
RAM
24GB BALLISTIX SPORT @2133MHz
GPU
STRIX GTX980 DC2OC
Audio
INTEGRATA
Monitor
AOC G2590VXQ
PSU
BEQUIET! System Power 7 500W
Case
DEEPCOOL MATREXX 55
Periferiche
NESSUNA
Net
EOLO 100
OS
UBUNTU/WINDOWS11
Piccolo trucco scrivi il Main così
Java:
public class Main {

    public static void main(String[] args) {
        Edificio a = new Edificio(3, "Rossi");
        a.print();
        Edificio b = new Casa(21, "Russo");
        b.print();
        Casa c = new Casa(50, "Ricci");
        c.print();

    }

}

E vedi cosa ti stampa ^__^
Vediamo se con questo trucchetto ci arrivi
 
  • Mi piace
Reazioni: sare1234

sare1234

Utente Attivo
262
3
Piccolo trucco scrivi il Main così
Java:
public class Main {

    public static void main(String[] args) {
        Edificio a = new Edificio(3, "Rossi");
        a.print();
        Edificio b = new Casa(21, "Russo");
        b.print();
        Casa c = new Casa(50, "Ricci");
        c.print();

    }

}

E vedi cosa ti stampa ^__^
Vediamo se con questo trucchetto ci arrivi
stampa:RossiRusso50Ricci... ma perchè se invece li metto come prima stampa RicciRicci50Ricci?
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
stampa:RossiRusso50Ricci... ma perchè se invece li metto come prima stampa RicciRicci50Ricci?

Riguardati cosa significa la parola chiave static, e forse anche il polimorfismo.
 
  • Mi piace
Reazioni: Tidus88 e Ibernato

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Non proprio, la chiamata avviene per tipo di dato (e non per riferimento, che crei usando il new), infatti viene richiamata due volte Edificio e poi Casa, che ti stampa anche il valore 50.
 
  • Mi piace
Reazioni: sare1234

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
okay quindi quando scrivo a.print(); viene eseguito il metodo print() ridefinito dalla classe Casa e non quello originale definito nella classe Edificio e quindi mi stampa Riccio
L'esecuzione dei metodi è corretta.
Il problema, come dice @DispatchCode , sono le variabili della classe che sono statiche.
Una variabile statica viene inizializzata a runtime e poi viene condivisa con tutti gli oggetti (quindi non ci sarà una copia per ogni istanza).
Infatti, se tu rsegui i metodi non in sequenza ma subito dopo aver istanziato un oggetto, il risultato è corretto.
Invece, quando istanzi
Java:
Casa c = new Casa(50, "Ricci");
questo comporta la modifica di tutti i valori di tutti gli oggetti che appartengono a questa classe

Definisci la classe Edificio in questo modo e poi prova a chiamare i metodi in sequenza come nel tuo esempio
Java:
public class Edificio {
 
    String costruttore;
    int piani;
 
    public Edificio(int f, String c) {
        piani = f;
        costruttore = c;
    }
 
    public void print() {
        System.out.print(costruttore + "");
    }
 
 

}
 

sare1234

Utente Attivo
262
3
L'esecuzione dei metodi è corretta.
Il problema, come dice @DispatchCode , sono le variabili della classe che sono statiche.
Una variabile statica viene inizializzata a runtime e poi viene condivisa con tutti gli oggetti (quindi non ci sarà una copia per ogni istanza).
Infatti, se tu rsegui i metodi non in sequenza ma subito dopo aver istanziato un oggetto, il risultato è corretto.
Invece, quando istanzi
Java:
Casa c = new Casa(50, "Ricci");
questo comporta la modifica di tutti i valori di tutti gli oggetti che appartengono a questa classe

Definisci la classe Edificio in questo modo e poi prova a chiamare i metodi in sequenza come nel tuo esempio
Java:
public class Edificio {
 
    String costruttore;
    int piani;
 
    public Edificio(int f, String c) {
        piani = f;
        costruttore = c;
    }
 
    public void print() {
        System.out.print(costruttore + "");
    }
 
 

}
Facendo cosi mi stampa: RossiRusso50Ricci
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Facendo cosi mi stampa: RossiRusso50Ricci
Lo so, non è la risposta che ti aspetti, ed è scorretta. Ma questo è perchè probabilmente hai copiato il codice di ibernato senza capire quello che ti ha scritto, e quello che dicevo sopra anche io.
Al 99% non hai rimosso la parola chiave static dal metodo print() di Casa.

La parola chiave static in Java è un pò come la peste, molte volte. Va usata solo in certi frangenti perchè ha proprio come scopo quello di non dipendere dall'istanza dell'oggetto che la sta creando. Quindi se da un oggetto modifichi il valore di una variabile static, questo cambia anche quando accedi dall'altra istanza (proprio perchè non dipende dalle istanze).

Questo è quello che ti aspetti:

Java:
class Edificio {
  
    String costruttore;
    int piani;
  
    public Edificio(int f, String c) {
        piani = f;
        costruttore = c;
    }
  
    public  void print() {
        System.out.print(costruttore + "");
    }
}

class Casa extends Edificio {

    public Casa(int f, String c) {
        super(f, c);     
      
    }

    public void print() {
        System.out.print(piani + "" + costruttore + "");
    }
  
}

public class Main {

    public static void main(String[] args) {
        Edificio a = new Edificio(3, "Rossi");
        Edificio b = new Casa(21, "Russo");
        Casa c = new Casa(50, "Ricci");
      
        a.print();
        b.print();
        c.print();
    }
}

Output:
Codice:
Rossi21Russo50Ricci

Questo è il polimorfismo in azione. La chiamata avviene in base al riferimento dell'oggetto, e non in base al tipo. Infatti sia b che c richiamano la versione di print() di Casa e non quella di Edificio, anche se b è di tipo Edificio.

Se ti aiuta, puoi vedere concettualmente una variabile static come una variabile globale. Un metodo static esiste solo se deve essere chiamato al di fuori del contesto di un oggetto, quando non dipende da una sola istanza; ad esempio la classe Math ha metodi statici.
 

sare1234

Utente Attivo
262
3
Lo so, non è la risposta che ti aspetti, ed è scorretta. Ma questo è perchè probabilmente hai copiato il codice di ibernato senza capire quello che ti ha scritto, e quello che dicevo sopra anche io.
Al 99% non hai rimosso la parola chiave static dal metodo print() di Casa.

La parola chiave static in Java è un pò come la peste, molte volte. Va usata solo in certi frangenti perchè ha proprio come scopo quello di non dipendere dall'istanza dell'oggetto che la sta creando. Quindi se da un oggetto modifichi il valore di una variabile static, questo cambia anche quando accedi dall'altra istanza (proprio perchè non dipende dalle istanze).

Questo è quello che ti aspetti:

Java:
class Edificio {
 
    String costruttore;
    int piani;
 
    public Edificio(int f, String c) {
        piani = f;
        costruttore = c;
    }
 
    public  void print() {
        System.out.print(costruttore + "");
    }
}

class Casa extends Edificio {

    public Casa(int f, String c) {
        super(f, c);    
     
    }

    public void print() {
        System.out.print(piani + "" + costruttore + "");
    }
 
}

public class Main {

    public static void main(String[] args) {
        Edificio a = new Edificio(3, "Rossi");
        Edificio b = new Casa(21, "Russo");
        Casa c = new Casa(50, "Ricci");
     
        a.print();
        b.print();
        c.print();
    }
}

Output:
Codice:
Rossi21Russo50Ricci

Questo è il polimorfismo in azione. La chiamata avviene in base al riferimento dell'oggetto, e non in base al tipo. Infatti sia b che c richiamano la versione di print() di Casa e non quella di Edificio, anche se b è di tipo Edificio.

Se ti aiuta, puoi vedere concettualmente una variabile static come una variabile globale. Un metodo static esiste solo se deve essere chiamato al di fuori del contesto di un oggetto, quando non dipende da una sola istanza; ad esempio la classe Math ha metodi statici.
ah grazie mille, ora ho capito :)
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili