RISOLTO [JAVA] Passaggio per riferimento e valore

Stato
Discussione chiusa ad ulteriori risposte.

Urubin

Nuovo Utente
15
5
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

Moderatore
Staff Forum
Utente Èlite
2,221
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
Il valore non cambia in quanto Integer è immutabile. Le operazioni che fai creano un nuovo oggetto.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,887
11,544
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
...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
15
5
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
6,440
5,091
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
Reazioni: Urubin e BAT

BAT

Moderatore
Staff Forum
Utente Èlite
22,887
11,544
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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
Reazioni: Urubin
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