Java dubbio metodi e parametri

Robert T.

Utente Attivo
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

Moderatore
Staff Forum
12,170
3,415
Hardware Utente
CPU
Ryzen 7 2700x
Dissipatore
Stock
Scheda Madre
Aourus Gigabyte X-470
Hard Disk
Samsung Evo 850 250gb,2tb toshiba, 500gb western digital, 160gb segate
RAM
16 gb G.Skill Tridentz 3200 mhz RGB
Scheda Video
Sapphire RX 580 8gb ddr5
Monitor
Samsung Smart TV Full HD 50 Pollici/ Hp ES 24 IPS
Alimentatore
XFX 80 plus 750 watt
Case
Aerecool xpredator x3
Sistema Operativo
Windows 10 Pro 64
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.
 

BAT00cent

Utente Attivo
1,000
428
Hardware Utente
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
@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 ;)
 

BAT00cent

Utente Attivo
1,000
428
Hardware Utente
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
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
Hardware Utente
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
Hard Disk
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
Scheda Video
GTX 1070ti MSI
Scheda Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Internet
Fastweb 200/30
Sistema Operativo
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