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
-
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
- nell’esempio c’è il campo statico
-
Viene eseguito il metodo
main()
(dichiarato come publicstatic void
)- viene creato anche lo
String[] args
, che punta un vettore di stringhe vuoto
- viene creato anche lo
-
Quando viene eseguito un metodo viene creato un’area di memoria per la chiamata del metodo
-
passaggi
passa a 1 perché viene incrementato dal metodopassa()
-
Quando chiamo il costruttore
tonello()
l’oggetto viene allocato nella heap -
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 specialejava.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++;
}
}
}