In questo capitolo verranno spiegati i metodi, ovvero i mattoncini di una struttura software.

Java

Linguaggio Java
Linguaggio Java

categoria · sviluppo · modifica
Come posso contribuire?

→ Vai su Wikiversity

Java:  Guida alla programmazioneJava/Introduzione - Specifica di linguaggio - Libreria standardJava/Comunicazione seriale

Tipi di datoJava/Tipi di datoEspressioniJava/OperatoriVariabiliJava/Variabili localiIstruzioniJava/IstruzioniStrutture di controlloJava/Strutture di controlloPackageJava/Package
Classi e oggettiJava/Classi e oggettiOggettiJava/OggettiMetodiJava/MetodiMetodi (cont.)Java/Metodi/2ArrayJava/Array
Modificatori di accessoJava/Modificatori di accessoEreditarietàJava/Ereditarietà
Gestione delle eccezioniJava/Gestione delle eccezioniGenericsJava/Generics
Thread e parallelismoJava/MultithreadingInterblocco ricontrollatoJava/Interblocco ricontrollato
Alcune differenze con il CJava/Concetti fondamentaliLessicoJava/LessicoGrammaticaJava/Grammatica

Un metodo è un blocco di istruzioni che una classe o un oggetto rendono disponibili ad altre classi e/o oggetti, affinché possa essere eseguito su richiesta.

public class Prova {
    
    public static void main(String[] args) {
        scrivi();
    }
    
    void scrivi() {
        System.out.println("prova");
    }
    
}

In questo esempio, la JVM invoca il metodo main(), e questo metodo invoca il metodo scrivi(), il quale scrive una determinata stringa sulla console.

L'intestazione di un metodo è definita da

  • eventuali modificatori
  • tipo di ritorno
  • nome del metodo
  • lista di argomenti
  • eventuale clausola throws

I metodi sono utili perché permettono di definire dei "pacchetti" di istruzioni che vengono eseguiti da un certo oggetto su richiesta:

public class Cane {
    
    public void abbaia() { System.out.println("Bau bau"); }
    public void dormi() { System.out.println("zzz"); }
    
}

public class Prova {
    public static void main(String[] args) {
        final Cane c = new Cane();
        c.dormi();
        c.abbaia();
        c.dormi();
        // ... ecc.
    }
}

I metodi offrono numerosi vantaggi:

  • servono a fare una stessa serie di operazioni in più punti del programma senza riscriverle, quindi snelliscono il programma;
  • sono utili per suddividere un programma complesso in piccole parti, migliorandone la gestione e la leggibilità.

Come definire un metodo

modifica
  Per approfondire, vedi Modificatori di accesso.

La sintassi per la implementazione (scrittura di codice) di un metodo è la seguente:

modificatori tipo nomedelmetodo (parametri eventuali){
corpo del metodo;
}

I parametri possono esserci oppure no.

I metodi possono restituire un valore particolare al chiamante oppure no. Quando si vuole restituire un valore il chiamante diverrà tale valore. La restituzione di un valore si ha con l'enunciato "return" ed il tipo del valore restituito indicato prima del nome del metodo. Se non si vuole restituire un valore o un dato particolare allora non occorre return e prima del nome del metodo c'è bisogno dell'enunciato "void". Quindi, prima del nome del metodo, ci deve essere o il "void" o il tipo del valore (con all'interno del corpo la clausola "return").

Il metodo main()

modifica

In Java, così come negli altri linguaggi di programmazione, l'esecuzione del programma comincia sempre da un punto convenzionalmente stabilito. In Java, si tratta del metodo main().

Esso è un normale metodo Java, esattamente al pari degli altri. La differenza rispetto agli altri è che, da qualche parte, è stato deciso per convenzione che un programma Java comincia quando la macchina virtuale invoca un metodo che si chiama main, se soddisfa determinati requisiti: deve essere obbligatoriamente definito come public e static (ma si noti che la classe a cui appartiene non deve necessariamente essere public). Esso deve accettare un solo argomento, di tipo String[], e avere void come tipo di ritorno:

public static void main(String[] args) {}

L'array args contiene le opzioni che vengono passate al programma Java da riga di comando:

java nomepackage.nomeclasse opzione1 opzione2 ...

Notare che la macchina virtuale distingue tra le opzioni passate alla macchina virtuale e quelle passate al programma; in altre parole, in questo esempio,

java -cp . -jar NomeProgramma.jar opzione1 opzione2 ...

solo le opzioni finali finiscono nell'array di stringhe.

Analogia con il C

modifica

La convenzione adottata dal Java è in analogia con il linguaggio C++, nel quale la funzione di partenza è tipicamente definita come

int main(int argc, char** argv) {}

La somiglianza si nota maggiormente se si scrive questo nella forma equivalente

int main(int argc, char* argv[]) {}

In particolare:

  • in C, il main() non appartiene ad alcuna classe e, quindi, non può essere invocato su un oggetto. In Java, la cosa più vicina ad una funzione è un metodo statico (che non può essere invocato su un oggetto specifico).
  • se in C un char* rappresenta una stringa, un char*[] è un array di stringhe; in Java gli array portano sempre con sé l'indicazione della loro lunghezza, per cui il valore argc può essere ottenuto semplicemente scrivendo args.length;
  • il valore int di ritorno corrisponde al valore passato al metodo System.exit() (0 nel caso in cui il programma termini con la semplice terminazione di tutti i thread non-daemon).

Precondizioni e postcondizioni: cosa sono e a cosa servono

modifica