Memoria

Stack
  • Si rappresentano i frame di attivazione (chiamate ai metodi) e le variabili locali
Heap
  • Si rappresenta l’allocazione degli oggetti
Metaspace
  • Si rappresenta l’allocazione dei campi statici

Esempio tornello

  1. Quando una classe viene caricata la java virtual machine vede se ci sono campi statici

    • nell’esempio c’è il campo statico passaggi
      • passaggi = 0 perchĂ© è il valore di default
  2. Viene eseguito il metodo main() (dichiarato come public static void)

    • viene creato anche lo String[] args, che punta un vettore di stringhe vuoto
  3. Quando viene eseguito un metodo viene creato un’area di memoria per la chiamata del metodo

  4. passaggi passa a 1 perché viene incrementato dal metodo passa()

  5. Quando chiamo il costruttore tonello() l’oggetto viene allocato nella heap

  6. Quando viene eseguito il ciclo for che ha un contatore, viene creata una variabile locale temporanea

Metodi statici

  • I metodi statici sono metodi di classe
  • Non hanno accesso ai campi di istanza
  • Hanno accesso ai campi di classe

Lettura dell’input da console

  • Si effettua la classe java.util.Scanner
  • Costruita passando al costruttore lo stream di input (Sysyem.it di tipo java.io.InputStream)
public class ChatBotNonCosiInterattivo
{
	public stati void main (Strin[] args)
	{
		//crea uno scanner per ottenere l'input da conosle
		java.util.Scanner input = new java.util.Scanner (System.in);
 
		Sysyem.out.println("Come ti chiami?");
 
		//legge i caratteri digitati finche' non viene inserito
		//il carattere di nuova riga (l'utente preme invio)
		String nome = input.nestLine();
		
		System.out.println ("Ciao "+ come + "!");
	}
}

Package

  • Le classi vengono inserite in collezioni dette package
  • Ogni package racchiude classi con funzionalitĂ  correlate
  • Quando si utilizza una classe è necessario specificarne il package (come per Scanner, che appartiene al package java.util)
  • Le classi che abbiamo usato finora (ex. System, String) appartengono al package speciale java.lang
    • Questo package non deve essere specificato

Package standard

  • La API (Application Programming Interface) di Java sono organizzate in numerosi package

Dichiarazione import

  • Per evitare di specificare il package di una classe ogni volta che viene usata, è sufficiente importare la classe
import java.util.Scanner
 
public class ChatBotNonCoiInterattivo
{
	public static void main (String[] args)
	{
		Scanner input = new Scanner (System.in);
 
		System.out.println("Come ti chiami=");
 
		String nome = input.nextLine();
 
		System.out.println ("Ciao "+ nome+ "!");
	}
}

Creazione nuovi package

  • I package sono rappresentati fisicamente da cartelle (String.class si trova sotto java/lang/)
  • Una classe può essere inserita in un determinato package semplicemente
    • specificandolo all’inizio del file (parola chiave package)
    • posizionando il file nella corretta sottocartella

L’istruzione if

Sintassi
if (<espressione booleana>) <singola istruzione>

Oppure

if (<espressione booleana>)
{
	<istruzioni>
}

Ex.

if (x < 0) x = -x;
 
if (x < y)
{
	int t = x;
	x = y;
	y = t;
}

Operatore di selezione

  • In java esiste un operatore di selezione (operatore condizionale) nella forma di espressione condizione ? valoreCasoVero : valoreCasoFalso

Ex.

int abs = x < 0 ? -x : x;
 
int max = x < 0 ? x : y;
 
String testaCroce = Math.random() < 0.5 ? "Testa" : "Croce";

Alternative multiple: l’istuzione switch

  • Per confrontare il valore di un’espressione intera o convertibile a intero, si può usare l’istruzione switch:
Switch (<espressione booleana>)
{
	case <valore1>: <istruzioni>; break;
	case <valore2>: <istruzioni>; break;
 
	case <valoren>: <istruzioni>; break;
}

Switch compatti

switch (k % 7)
{
	case 0: 
}

La parola chiave var (java >= 10)

  • A partire da java 10, è possibile evitare di dichiarare il tipo di una variabile locale
var k = 10; //equivale a int k = 10;
var s = "ciao"; //equivale a String s= "ciao;"
var p = new Pippo(); //equivale a Pippo p = new Pippo()
  • Il tipo della variabile è sempre prefissato e non può cambiare
  • E’ possibile utilizzare var solo per le variabili lcoali
    • Non per i campi, nĂ© per i parametri di metodi

Istruzione while

  • Simile all’if
while (<espressione booleana>)
{
	<istruzione>
}
  • La differenza è che le istruzioni nel corpo sono eseguite finchĂ© l’espressione booleana è vera
  • L’espressione booleana viene controllata all’inizio di ogni esecuzione del corpo
  • Appena l’espressione booleana è falsa (eventualmente anche subito), il ciclo termina
public class PotenzaDi2
{
	public static void main (String [] args)
	{
		//le potenze di 2 fino a 2^N
		final int N = Integer.parseInt(args[0]);
 
		int val = 1;
		int i = 0;
 
		while (i <= N)
		{
			System.out.println(i+" "+ val);
			val *= 2;
			i++;
		}
	}
}