Java dubbio metodi e parametri

Robert T.

Utente Attivo
134
11
E' un mio dubbio.

Dato questo codice:

Codice:
    public int somma(){       
        int a = 0;
        int b = 0;
        
        return (a+b);
    }
    
    public int somma(int a, int b){
        return (a+b);
    }

Nel primo non ho dato parametri, anzi li ho assegnati nel corpo.

Nel secondo ho dato parametri.

Il mio dubbio è, se devo prendere una variabile esterna la metto come parametro ma se la devo creare, la creo nel parametro o nel corpo. Un'altra cosa che ho notato e che se non la metto nel parametro ma anzi la metto nel corpo la devo per forza inizializzare. La domanda dunque si riassume in, quando metterla nel corpo e quando nel parametro, grazie mille.
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,278
11,431
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
E' un mio dubbio.

Dato questo codice:

Codice:
    public int somma(){       
        int a = 0;
        int b = 0;
        
        return (a+b);
    }
    
    public int somma(int a, int b){
        return (a+b);
    }

Nel primo non ho dato parametri, anzi li ho assegnati nel corpo.

Nel secondo ho dato parametri.

Il mio dubbio è, se devo prendere una variabile esterna la metto come parametro ma se la devo creare, la creo nel parametro o nel corpo. Un'altra cosa che ho notato e che se non la metto nel parametro ma anzi la metto nel corpo la devo per forza inizializzare. La domanda dunque si riassume in, quando metterla nel corpo e quando nel parametro, grazie mille.


nel primo metodo
particamente fai la somma di due variabili fisse.
nel secondo le passi come parametro.
quindi nel momento in cui tu fai un input da tastiera ad esempio potresti prendere due variabili diverse
ti scrivo in pseudo codice
Codice:
 public int somma(){       
        int a = 0;
        int b = 0;
        
        return (a+b);
}

primo metodo restuisce una somma di due variabili fisse

public int somma(int a, int b){
        return (a+b);
    }

in un ipotetico main potresti avere

int a = 1;
int b = 3;

e richiamare il metodo somma

int result = somma(a,b);

che ti restituisce la tua somma

spero di essere stato chiaro
 
M

Mursey

Ospite
Nel primo caso hai creato due variabili interne e ritorni la loro somma, nel secondo invece ritorni la somma dei parametri passati alla funzione.

Si usano parametri nella funzione se la funzione ha bisogno di dati esterni, se puo' fare tutto da sola non servono.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,450
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
faccio notare che la funzione dovrebbe essere dichiarata come public static, altrimenti risulterebbe essere legata ad una classe (così com'è ora va richiamata con nomeOggetto.somma() );
per quanto riguarda l'inizializzazione delle variabili la questione è molto semplice e fa parte della specifica del linguaggio Java:
le variabili interne ai metodi devono essere obbligatoriamente inizializzate a qualche valore o al momento della dichiarazione o subito dopo;
le "variabili esterne" in realtà sono attributi di classe e, in caso di assenza di inizializzazione da parte del programmatore, Java le inizializza automaticamente a
0 per gli interi
0.0 per i numeri in virgola mobile
\0 per i caratteri
false per i booleani
null per gli oggetti
 

Robert T.

Utente Attivo
134
11
@Mursey @BAT00cent
Vero, chiamando public static la posso invocare in questo modo: nomeClasse.Metodo().

E riguardo all'utilizzo di una variabile esterna?

Quando va messo nel parametro e quando nel motodo? Considerando che è già inizializzata sarà presa come riferimento?.
Es. :Tipo quando vogliamo assegnare un numero fisso di array, no?.

Codice:
int numero = Integer.parseInt(scan.nextLine());
String nomeArray[] = new String[numero];
 
Ultima modifica:
M

Mursey

Ospite
Se usi una variabile esterna la usi e basta, mettendo un parametro avresti definito un'altra variabile interna copia dell'esterna.

- - - Updated - - -

Mi correggo...
Se Java tratta i parametri come byRef si, potrebbe usarla come riferimento e non come copie interne.

Perdonami ma io parlavo in termini generali, lascio la parola agli esperti di Java ;)
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,450
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
In Java i parametri vengono passati sempre per valore (ossia per copia, non si può passare per riferimento);
bisogna ovviamente stare attenti quando si passano degli oggetti, in tal caso viene passata la copia del riferimento all'oggetto (ma NON l'intero oggetto): ma attraverso di essa l'oggetto vero e proprio può essere modificato.

Tornando all'esempio dell'utente, per questa funzione non c'è nessun bisogno di variabili interne: si sommano i parametri passati, per cui la dichiarazione deve essere
Codice:
public static int somma(int a, int b) {
   return (a+b);
}
l'altro modo è inutile;
le variabili interne si usano per eseguire un algoritmo, i parametri sono i dati da manipolare nella funzione (metodo) che scrivi.
Nell'esempio dell'array si può scrivere un metodo che, leggendo un certo numero n inserito dall'utente (n in questo caso è un parametro interno al metodo) restituisce un array (in tal caso fuori dal metodo bisogna definire una variabile di tipo array a cui verrà assegnato il risultato del metodo).

@Robert T.
sei nuovo alla programmazione vero?
 
Ultima modifica:

Robert T.

Utente Attivo
134
11
In Java i parametri vengono passati sempre per copia (non si può passare per riferimento);
bisogna ovviamente stare attenti quando si passano degli oggetti, in tal caso viene passata la copia del riferimento all'oggetto (ma NON l'intero oggetto): ma attraverso di essa l'oggetto vero e proprio può essere modificato.

Tornando all'esempio dell'utente, per questa funzione non c'è nessun bisogno di variabili interne: si sommano i parametri passati, per cui la dichiarazione deve essere
Codice:
public static int somma(int a, int b) {
   return (a+b);
}
l'altro modo è inutile;
le variabili interne si usano per eseguire un algoritmo, i parametri sono i dati da manipolare nella funzione (metodo) che scrivi.
@Robert T.
sei nuovo alla programmazione vero?

Si abbastanza, mi sto concentrando sulle basi, in modo da evitare di scrivere codice a caso senza capire il perchè. Riguardo al parametri per "value" e per "reference" lo sapevo, è la caratteristica di java.

Le cose scritte qua le sapevo volevo solo togliermi dei dubbi, creando un discorso quello che purtroppo il libro non offre.
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
E' un mio dubbio.

Dato questo codice:

Codice:
    public int somma(){       
        int a = 0;
        int b = 0;
        
        return (a+b);
    }
    
    public int somma(int a, int b){
        return (a+b);
    }

Nel primo non ho dato parametri, anzi li ho assegnati nel corpo.

Nel secondo ho dato parametri.

Il mio dubbio è, se devo prendere una variabile esterna la metto come parametro ma se la devo creare, la creo nel parametro o nel corpo. Un'altra cosa che ho notato e che se non la metto nel parametro ma anzi la metto nel corpo la devo per forza inizializzare. La domanda dunque si riassume in, quando metterla nel corpo e quando nel parametro, grazie mille.

Sono un poco in ritardo ma fa niente, essendo che ci lavoro con Java cercherò di darti una risposta estenuante.

Essendo che sei inesperto, (lo posso notare da come formuli le domande) ti posso riformulare la tua prima domanda in modo corretto e darti risposta:

Qual'è la differenza tra parametri formali e variabili locali?

Le variabili locali dette anche di stack, automatiche o temporanee a te la scelta del nome, vengono dichiarate all'interno di un metodo, esse smetteranno di esistere quando sarà terminato il metodo ed esisteranno esclusivamente nel metodo è prassi inizializzare una variabile locare, altrimenti il compilatore potrebbe restituirti un errore.

I parametri formali: sono quelle variabili dichiarate nei parametri o argomenti. Esse saranno inizializzate al momento della chiamate del metodo, in caso non si voglia dichiarare un metodo con numero di parametri di un certo tipo non definiti, si farà ricorso ai Varargs.

La differenza: Un parametro si può considerare variabile locale del metodo, data la sua visibilità e ciclo di vita, la differenza tuttavia sussiste nella posizione e dichiarazione. dunque a meno che tu non debba inizializzare le variabili al momento della chiamata le poni come variabili locali, in caso le debba inizializzare alla chiamata le poni come parametri formali.

La seconda domanda invece sarebbe da formulare cosi:

Quando e perchè si usa una variabile d'istanza in un parametro?

Il tutto continua con la risposta di BAT00cent

Il che ci portà ad un altra domanda:

Quando usare un parametro formale e quando usare una variabile d'istanza?

Questo lo si vede in base all'applicazione e alla revisione del codice. Ti posso dire che usare troppo variabili d'istanza in parametri porta problemi e crea il classico spaghetti code. Bisogna seguire la filosofia OOP, cosa che si assimila con l'esperienza e il tempo.
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!