Learn in 10 minutes

Learn in 10 minutes

Impara Java in 10 minuti

Java è un linguaggio di programmazione orientato agli oggetti di alto livello noto per il suo principio “scrivi una volta, esegui ovunque”. Questo tutorial copre le funzionalità di Java 21+, aiutandoti a imparare rapidamente i fondamenti di Java.

1. Scrivere il tuo primo programma Java

I programmi Java sono organizzati in classi. Iniziamo con un programma semplice. Crea un file chiamato HelloWorld.java:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Compila ed esegui il programma:

javac HelloWorld.java
java HelloWorld

L’output sarà:

Hello, World!

Questo semplice programma dimostra la struttura di base di Java. Ogni programma Java deve avere almeno una classe, e il metodo main è il punto di ingresso.

2. Sintassi di base

La sintassi Java è strutturata e segue regole specifiche:

// Questo è un commento a riga singola
/* Questo è un
   commento multi-riga */

public class BasicSyntax {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

Regole di sintassi di base in Java:

  • Sensibilità alle maiuscole: Java è sensibile alle maiuscole. Variable e variable sono diversi.
  • Nomi delle classi: Devono iniziare con una lettera maiuscola e seguire la convenzione CamelCase.
  • Nomi dei metodi: Devono iniziare con una lettera minuscola e seguire la convenzione camelCase.
  • Punti e virgola: Ogni istruzione deve terminare con un punto e virgola ;.
  • Parentesi graffe: I blocchi di codice sono definiti usando parentesi graffe {}.
  • Commenti: I commenti a riga singola usano //, i commenti multi-riga usano /* */.

3. Variabili e tipi di dati

Java è un linguaggio tipizzato staticamente, il che significa che devi dichiarare esplicitamente i tipi di variabili.

Regole di nomenclatura delle variabili:

  • Devono iniziare con una lettera, underscore _, o simbolo del dollaro $.
  • Possono contenere lettere, cifre, underscore e simboli del dollaro.
  • Non possono essere parole chiave Java.
  • Dovrebbero seguire la convenzione camelCase.

Tipi di dati primitivi di Java:

  • byte: intero con segno a 8 bit (-128 a 127)
  • short: intero con segno a 16 bit (-32,768 a 32,767)
  • int: intero con segno a 32 bit (-2^31 a 2^31-1)
  • long: intero con segno a 64 bit (-2^63 a 2^63-1)
  • float: virgola mobile a 32 bit
  • double: virgola mobile a 64 bit
  • boolean: true o false
  • char: carattere Unicode a 16 bit
public class DataTypes {
    public static void main(String[] args) {
        // Tipi interi
        byte age = 25;
        short year = 2024;
        int population = 1000000;
        long distance = 93000000L; // suffisso L per long
        
        // Tipi a virgola mobile
        float temperature = 36.5f; // suffisso f per float
        double pi = 3.14159265359;
        
        // Booleano e carattere
        boolean isActive = true;
        char grade = 'A';
        
        // Stringa (tipo di riferimento)
        String name = "Alice";
        
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

3.1 Operazioni sulle stringhe

Le stringhe in Java sono oggetti, non tipi primitivi:

public class StringExample {
    public static void main(String[] args) {
        String text = "Java Programming";
        
        System.out.println("Length: " + text.length());
        System.out.println("Uppercase: " + text.toUpperCase());
        System.out.println("Lowercase: " + text.toLowerCase());
        System.out.println("Character at index 0: " + text.charAt(0));
        System.out.println("Substring: " + text.substring(0, 4));
        System.out.println("Contains 'Java': " + text.contains("Java"));
        
        // Concatenazione di stringhe
        String greeting = "Hello, " + "World!";
        System.out.println(greeting);
        
        // Formattazione di stringhe
        String formatted = String.format("Pi is approximately %.2f", 3.14159);
        System.out.println(formatted);
    }
}

4. Array e collezioni

4.1 Array

Gli array memorizzano più valori dello stesso tipo:

public class ArrayExample {
    public static void main(String[] args) {
        // Dichiarazione e inizializzazione dell'array
        int[] numbers = {1, 2, 3, 4, 5};
        String[] fruits = new String[3];
        fruits[0] = "apple";
        fruits[1] = "banana";
        fruits[2] = "orange";
        
        // Accesso agli elementi dell'array
        System.out.println("First number: " + numbers[0]);
        System.out.println("Array length: " + numbers.length);
        
        // Iterazione attraverso gli array
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("Number " + i + ": " + numbers[i]);
        }
        
        // Ciclo for migliorato (for-each)
        for (String fruit : fruits) {
            System.out.println("Fruit: " + fruit);
        }
        
        // Array multidimensionali
        int[][] matrix = {{1, 2}, {3, 4}, {5, 6}};
        System.out.println("Matrix element [1][1]: " + matrix[1][1]);
    }
}

4.2 Collezioni

Il Java Collections Framework fornisce strutture dati dinamiche:

import java.util.*;

public class CollectionsExample {
    public static void main(String[] args) {
        // ArrayList (array dinamico)
        ArrayList<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");
        names.remove("Bob");
        System.out.println("Names: " + names);
        
        // HashMap (coppie chiave-valore)
        HashMap<String, Integer> ages = new HashMap<>();
        ages.put("Alice", 25);
        ages.put("Bob", 30);
        ages.put("Charlie", 35);
        System.out.println("Alice's age: " + ages.get("Alice"));
        
        // HashSet (elementi unici)
        HashSet<Integer> uniqueNumbers = new HashSet<>();
        uniqueNumbers.add(1);
        uniqueNumbers.add(2);
        uniqueNumbers.add(2); // Duplicato, non sarà aggiunto
        uniqueNumbers.add(3);
        System.out.println("Unique numbers: " + uniqueNumbers);
        
        // Iterazione attraverso le collezioni
        for (String name : names) {
            System.out.println("Name: " + name);
        }
        
        for (Map.Entry<String, Integer> entry : ages.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

5. Operazioni e operatori

Java fornisce vari operatori per diverse operazioni:

  • Operatori aritmetici: +, -, *, /, % (modulo), ++ (incremento), -- (decremento)
  • Operatori di confronto: ==, !=, >, <, >=, <=
  • Operatori logici: && (e), || (o), ! (non)
  • Operatori bitwise: &, |, ^, ~, <<, >>, >>>
  • Operatori di assegnazione: =, +=, -=, *=, /=, %=
public class OperatorsExample {
    public static void main(String[] args) {
        int a = 10, b = 3;
        
        // Operazioni aritmetiche
        System.out.println("Addition: " + (a + b));
        System.out.println("Subtraction: " + (a - b));
        System.out.println("Multiplication: " + (a * b));
        System.out.println("Division: " + (a / b));
        System.out.println("Modulus: " + (a % b));
        
        // Incremento e decremento
        System.out.println("Pre-increment: " + (++a));
        System.out.println("Post-decrement: " + (b--));
        
        // Operazioni di confronto
        System.out.println("Equal: " + (a == b));
        System.out.println("Not equal: " + (a != b));
        System.out.println("Greater than: " + (a > b));
        
        // Operazioni logiche
        boolean x = true, y = false;
        System.out.println("AND: " + (x && y));
        System.out.println("OR: " + (x || y));
        System.out.println("NOT: " + (!x));
        
        // Operazioni di assegnazione
        int c = 5;
        c += 3; // c = c + 3
        System.out.println("After += 3: " + c);
    }
}

6. Flusso di controllo

6.1 Istruzioni condizionali

public class ConditionalExample {
    public static void main(String[] args) {
        int score = 85;
        
        // istruzione if-else
        if (score >= 90) {
            System.out.println("Grade: A");
        } else if (score >= 80) {
            System.out.println("Grade: B");
        } else if (score >= 70) {
            System.out.println("Grade: C");
        } else {
            System.out.println("Grade: F");
        }
        
        // Operatore ternario
        String result = (score >= 60) ? "Pass" : "Fail";
        System.out.println("Result: " + result);
        
        // istruzione switch
        char grade = 'B';
        switch (grade) {
            case 'A':
                System.out.println("Excellent!");
                break;
            case 'B':
                System.out.println("Good!");
                break;
            case 'C':
                System.out.println("Average");
                break;
            default:
                System.out.println("Invalid grade");
        }
    }
}

6.2 Cicli

public class LoopExample {
    public static void main(String[] args) {
        // ciclo for
        System.out.println("For loop:");
        for (int i = 0; i < 5; i++) {
            System.out.println("Iteration: " + i);
        }
        
        // Ciclo for migliorato (for-each)
        System.out.println("\nFor-each loop:");
        int[] numbers = {1, 2, 3, 4, 5};
        for (int num : numbers) {
            System.out.println("Number: " + num);
        }
        
        // ciclo while
        System.out.println("\nWhile loop:");
        int count = 0;
        while (count < 3) {
            System.out.println("Count: " + count);
            count++;
        }
        
        // ciclo do-while
        System.out.println("\nDo-while loop:");
        int x = 0;
        do {
            System.out.println("X: " + x);
            x++;
        } while (x < 3);
        
        // break e continue
        System.out.println("\nBreak and continue:");
        for (int i = 0; i < 10; i++) {
            if (i == 5) {
                break; // Esce dal ciclo
            }
            if (i % 2 == 0) {
                continue; // Salta i numeri pari
            }
            System.out.println("Odd number: " + i);
        }
    }
}

7. Metodi (funzioni)

I metodi in Java sono funzioni che appartengono alle classi:

public class MethodExample {
    
    // Metodo senza parametri e senza valore di ritorno
    public static void greet() {
        System.out.println("Hello, World!");
    }
    
    // Metodo con parametri e valore di ritorno
    public static int add(int a, int b) {
        return a + b;
    }
    
    // Metodo con parametri multipli
    public static String formatName(String firstName, String lastName) {
        return firstName + " " + lastName;
    }
    
    // Overloading di metodi (stesso nome, parametri diversi)
    public static int multiply(int a, int b) {
        return a * b;
    }
    
    public static double multiply(double a, double b) {
        return a * b;
    }
    
    // Argomenti variabili (varargs)
    public static int sum(int... numbers) {
        int total = 0;
        for (int num : numbers) {
            total += num;
        }
        return total;
    }
    
    public static void main(String[] args) {
        greet();
        
        int result = add(5, 3);
        System.out.println("Addition result: " + result);
        
        String fullName = formatName("John", "Doe");
        System.out.println("Full name: " + fullName);
        
        System.out.println("Multiply integers: " + multiply(4, 5));
        System.out.println("Multiply doubles: " + multiply(2.5, 3.0));
        
        System.out.println("Sum of multiple numbers: " + sum(1, 2, 3, 4, 5));
    }
}

8. Programmazione orientata agli oggetti

8.1 Classi e oggetti

public class Person {
    // Variabili di istanza (campi)
    private String name;
    private int age;
    private String email;
    
    // Costruttore
    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    
    // Costruttore di default
    public Person() {
        this("Unknown", 0, "");
    }
    
    // Metodi getter
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    public String getEmail() {
        return email;
    }
    
    // Metodi setter
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        if (age >= 0) {
            this.age = age;
        }
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    
    // Metodo di istanza
    public void introduce() {
        System.out.println("Hi, I'm " + name + ", " + age + " years old.");
    }
    
    // Metodo con logica
    public boolean isAdult() {
        return age >= 18;
    }
    
    // Metodo toString (sovrascrive il toString di Object)
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + ", email='" + email + "'}";
    }
    
    public static void main(String[] args) {
        // Creazione di oggetti
        Person person1 = new Person("Alice", 25, "[email protected]");
        Person person2 = new Person();
        
        // Utilizzo dei metodi
        person1.introduce();
        System.out.println("Is adult: " + person1.isAdult());
        
        person2.setName("Bob");
        person2.setAge(17);
        person2.setEmail("[email protected]");
        
        System.out.println(person1.toString());
        System.out.println(person2.toString());
    }
}

Questo tutorial Java completo copre i concetti essenziali necessari per iniziare con la programmazione Java. La tipizzazione forte del linguaggio, le funzionalità orientate agli oggetti e l’ampia libreria standard lo rendono potente per costruire applicazioni robuste. Pratica questi esempi e sperimenta con il codice per approfondire la tua comprensione dei concetti di programmazione Java.