Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    4

    [Java] copiare istanza di una classe

    Ciao a tutti!

    Sono alle prime armi con Java, e sto cercando di scrivere un codice per copiare un'istanza di una classe.

    Il mio metodo:

    codice:
    public miaClasse copia() {
    
    miaClasse test = new miaClasse();
    test.varA = varA; //varA è una variabile di miaClasse, array di tipo int[][];
    return test;
    
    }
    Quando però poi scrivo:

    codice:
    miaClasse testA = new miaClasse();
    testA.varA[0][1] = 1;
    miaClasse testB = testA.copia();
    testB.varA[0][1] = 15;
    System.out.println(testA.varA[0][1]);
    Il risultato è comunque 15...

    Suggerimenti?

    Grazie in anticipo!

  2. #2
    Pultroppo in JAVA "tutto è un puntatore". Questo vuol dire che assegnando un valore ad un oggetto quello che viene effettivamente assegnato è un puntatore alla locazione di memoria dove questo oggetto risiede quindi non viene assegnato il "valore" di un oggetto (ovviamente questo non vale per i tipi primitivi).
    Per effettuare un copia di un oggetto quindi non puoi semplicemente assegnargli il valore di un'altro oggetto ma ti devi fare carico di istanziare un nuovo oggetto e assegnarli il valore delle sue proprietà (ovviamente se le proprietà dell'oggetto sono a loro volta oggetti allora dovrai effettuare la stessa operazione anche su di esse).
    Ci sono diverse tecniche per "facilitare la copia di un oggetto", partendo dall'interfaccia Cloneable ai Copy Constructor di cui ti faccio un esempio:
    codice:
    public class MiaClasse
    {
    	private int value;
    	
    	//DEFAULT CONSTRUCTOR
    	public MiaClasse()
    	{
    	}
    	//CUSTOM CONSTRUCTOR
    	public MiaClasse(int aValue)
    	{
    		value = aValue;
    	}
    	//COPY CONSTRUCTOR
    	public MiaClasse(MiaClasse other)
    	{
    		value = other.getValue();
    	}
    	public void setValue(int value)
    	{
    		this.value = value;
    	}
    	public int getValue()
    	{
    		return value;
    	}
    	public static void main(String[]args)
    	{
    		MiaClasse uno = new MiaClasse(1);
    		MiaClasse due = new MiaClasse(uno);
    		due.setValue(15);
    		System.out.println("VALORE OGGETTO 1 "+uno.getValue());
    		System.out.println("VALORE OGGETTO 2 "+due.getValue());
    	}
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    4
    Ciao, grazie per la risposta! Scusami però non capisco questa parte:
    codice:
    //COPY CONSTRUCTOR
    	public MiaClasse(MiaClasse other)
    	{
    		value = other.getValue();
    	}
    Cosa sarebbe "other"?

  4. #4
    Bè se non capisci quel codice ti consiglio di riprendere in mano il libro....
    Cmq other è l'oggetto che vuoi copiare:
    codice:
    MiaClasse uno = new MiaClasse(1);
    //COPIO IL VALORE DELLA CLASSE 1 (e questo lo faccio grazie al copy constructor)
    //infatti come vedi passo un istanza di MiaClasse
    MiaClasse due = new MiaClasse(uno);

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    4
    Ok, capito il codice, e provato a implementarlo costruendo un costruttore che prenda come argomento un'altra istanza della classe e utilizzando l'istanza passata come argomento per assegnare il valore alla variabile.

    Non funziona

    Non capisco la differenza fra assegnare un valore a una variabile all'interno del costruttore oppure all'interno di un metodo copy:

    codice:
    MiaClasse a = new MiaClasse();
    Mia Classe b = new MiaClasse(a);
    Oppure

    codice:
    MiaClasse a = new MiaClasse();
    MiaClasse b = a.copy();

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Tiro ad indovinare... l'array A è statico.
    (hai postato tutto tranne la definizione della classe, quindi devo tirare ad indovinare)


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    4
    Originariamente inviato da LeleFT
    Tiro ad indovinare... l'array A è statico.
    (hai postato tutto tranne la definizione della classe, quindi devo tirare ad indovinare)


    Ciao.
    Scusami, sto studiando Java in inglese... Cosa intendi per definizione della classe?

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Originariamente inviato da DarioGe
    Scusami, sto studiando Java in inglese... Cosa intendi per definizione della classe?
    E che c'entra l'inglese?
    Comunque, la "definizione" della classe è il codice sorgente della classe...

    Definizione è ciò che definisce. La definizione di una classe è ciò che definisce la classe, ovvero il suo codice sorgente.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Mha.....
    Con definizione di classe si intende il codice che "definisce" la classe, in soldoni dove hai scritto public Class MiaClasse

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.