RISOLTO [JAVA] Passaggio per riferimento e valore

Stato
Discussione chiusa ad ulteriori risposte.

Urubin

Nuovo Utente
Ciao a tutti! Oramai è da un ora che sto cercando di capire come mai questo oggetto (Integer)
che ho passato alla mia funzione non cambia valore anche nel main.

Ringrazio in anticipo tutti per il supporto!

Codice:
    //FUNZIONE CHE CONTA GLI SPAZI PRESENTI IN OGNI STRINGA DELLE 2 SEQUENZE
    public static int contaspazi(String[] array, Integer contaparole)
    {
        int conta=0;
        
        for(int i=0; i<3; i++)
        {   
            if(array[i].charAt(0) >= 'a' && array[i].charAt(0) <= 'z')
                    contaparole++;
        
                for(int j=0; j<array[i].length()-1; j++)   
                {
                    if(array[i].charAt(j) == ' ')
                    {
                        conta++;
                        if(array[i].charAt(j+1) >= 'a' && array[i].charAt(j+1) <= 'z')
                            contaparole++;   

                    }
                }
        }
        return conta;
    }   
    

public static void main(String[] args)
    {
        Integer contaparole = 0;
        String[] a= new String[3];
        String[] a1=new String[3];
        Scanner input = new Scanner(System.in);
    
        //INPUT SEQUENZE
        for(int i=0; i<3; i++)
        {
            System.out.println("inserire la stringa del primo array: ");
            a[i]=input.nextLine();
        }
        
        for(int i=0; i<3; i++)
        {
            System.out.println("inserire la stringa del secondo array: ");
            a1[i]=input.nextLine();
        }

        System.out.println("Gli spazi presenti nelle tre stringhe della PRIMA SEQUENZA sono: " + contaspazi(a, contaparole));
        System.out.println("MAIN: " + contaparole);
        System.out.println("Gli spazi presenti nelle tre stringhe della PRIMA SEQUENZA sono: " + contaspazi(a1, contaparole));
        System.out.println("MAIN: " + contaparole);
    }
 

DispatchCode

Utente Attivo
603
362
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Il valore non cambia in quanto Integer è immutabile. Le operazioni che fai creano un nuovo oggetto.
 

BAT00cent

Utente Attivo
1,006
440
Hardware Utente
...e comunque il metodo statico che hai scritto non è invocato nel main: anche se non fosse immutabile senza la chiamata al metodo come diavolo fa a cambiare?
devi mettere un'istruzione simile a
Integer contaparole = new Integer( contaspazi(BLA...BLA) )
 

Urubin

Nuovo Utente
Il metodo contaspazi lo ho invocato direttamente nel System.out

Volevo solo sapere se appunto ci fosse un altro modo per passare il contaparole al main oltre che al solito return.
So che potrei fare una classe ma risulterebbe troppo lungo. È davvero l’unico modo creare una classe?
 

Andretti60

Utente Èlite
3,714
2,497
Hardware Utente
Il metodo contaspazi lo ho invocato direttamente nel System.out

Volevo solo sapere se appunto ci fosse un altro modo per passare il contaparole al main oltre che al solito return.
So che potrei fare una classe ma risulterebbe troppo lungo. È davvero l’unico modo creare una classe?
Java forza SEMPRE il passaggio dei parametri per valore, MAI per riferimento (ossia scordati i puntatori). Ci sono trucchi per farlo, ma costa MOLTO di meno dichiarare una classe. Credimi, ti salva un sacco di tempo (e di mal di testa). Dimentica le funzioni e il metodo procedurale. Nel tuo caso la classe e' semplicissima, ha due variabile private per memorizzare i conteggi, un metodo per passargli i parametri (metodo che memorizza i valori nei campi interni) e due metodi che espongono tali campi.

Java e' fatto apposta per essere un linguaggio OOP, praticamente per essere usato bene tutto deve essere dichiarato come Classe.
 
  • Mi piace
Reactions: Urubin e BAT00cent

BAT00cent

Utente Attivo
1,006
440
Hardware Utente
Il metodo contaspazi lo ho invocato direttamente nel System.out
Non è la stessa cosa, invocato in quel modo provoca una stampa non un'assegnazione di valore;
Java non è C/C++: come ti ha fatto notare @Andretti60 , il passaggio dei parametri avviene solo per copia, anche se bisogna starci attenti perché se si passa un oggetto, il relativo riferimento non può cambiare, ma il "corpo" dell'oggetto si, eccetto nel caso di oggetti immutabili.
 
  • Mi piace
Reactions: Urubin
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando