RISOLTO esercizio in java sulle classi

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
Messaggi
262
Reazioni
3
Punteggio
35
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:
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
 
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:
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.
 
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 + "");
    }
 
 

}
 
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
 
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.
 
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.
Pubblicità
Pubblicità
Indietro
Top