Modificare le dimensioni di un array
- Un array ha dimensioni prefissate che non possono essere modificate
- Tuttavia è possibile creare un nuovo array con nuove dimensioni a partire da un array preesistente
Con il metodo statico copyOf
della classe java.util.Arrays
import java.util.Arrays;
public class MyArrays
{
public static void main (String[] args)
}
Metodi con un numero di parametri variabile (Java>= 5)
- Si possono dichiarare metodo con un numero variabile di parametri
public class SommaDouble
{
public static double sum (double... valori)
{
double somma = 0.0;
for (int k = 0; k < valori.lenght; k++) somma += valori[k];
return somma;
}
public static double sumFirstN(final in N; double...valori)
{
double somma = 0.0
for (int k = 0; k < valori.lenght; k++) somma += valori[k];
return somma;
}
public static void main (String[] args)
{
system.out.println(sum());
System.out.println(sum(1,2,3,4));
System.out.println(sum(3, 1, 2, 3, 4));
}
}
Array a due dimensioni
- Possiamo specificare un array a 2 dimensioni (o matrice) semplicemente specificando due coppie di parentesi quadre[]
String[][] matrice= new String [RIGHE][COLONNE];
- L’accesso avviene specificando le due dimensioni
System.out.println(matrice[x][y]);
ahahah gay cacaccacacacacacacacaccacaca
Metodi
- Il miglior modo per sviluppare e mantenere un programma grande è costruirlo da pezzi piccoli e semplici
- Principio del divide et impara
Vantaggi dei metodi
- I metodi permettono di modularizzare un programma separandone i compiti in unità autocontenute
- Le istruzioni di un metodo non sono visibili da un altro metodo
- Ma possono essere riutilizzate in molti punti del programma
- Tuttavia, certi metodi non utilizzano lo stato dell’oggetto
- Ma si applicano all’intera classe
Metodi statici
- Definizione: specificando
static
nell’intestazione del metodo
public static String getLinea(int k)
{
String s="";
while (k-->0) s += "*";
return s;
}
- Accesso:
- Dall’interno della classe semplicemente chiamando il metodo
- Dall’esterno,
nomeClasse.NomeMetodo()
Metodi get() e set()
- Tipicamente l’acceso ad alcuni campi è garantito dai metodi
getX()
esetX()
- X è tipicamente il nome del campo
- Garantiscono la consistenza dei dati
- Non si può accedere a un campo pubblico
- Fanno da “filtro” tra i dettagli implementativi e ciò che vede l’utente esterno
- Ad esempio, si potrebbe utilizzare un campo che memorizza i minuti passati dall’ora 00:00
Campi statici
- Definizione: specificando static nell’intestazione
- Accesso (analogamente ai metodi statici)
- Dall’interno della classe
nomeCampo
- Dall’esterno,
NomeClasse.nomeCampo
- Dall’interno della classe
Alcuni campi statici molto noti
Math.PI
(3.14…)Math.E
(2.71…)- Dichiarati nella classe math con modificatori public, final e static
- public: perché accessibili a tutti
- final perché costanti
- static perché non variano secondo lo stato dell’oggetto
Enumerazioni
- Spesso è utile definire dei tipi (detti enumerazioni) i cui valori possono essere scelti tra un insieme predefinito di identificatori univoci
- Ogni identificatore corrisponde a una costante
- Le costanti enumerative sono implicitamente static
- Non è possibile creare un oggetto del tipo enumerato
- Un tipo enumerazione viene dichiarato mediante la sintassi
public enum NomeEnumerazone
{
COSTANTE1, COSTANTE2,..., COSTANTEN
}
Dichiarazioni di una enumerazione
- Come tutte le classi, la dichiarazione di una enumerazione può contenere altre componenti tradizionali
- Costruttori
- Campi
- Metodi
Metodi statici values()
e valueOf()
- Per ogni enumerazione, il compilatore genera il metodo statico
values()
un array delle costatanti enumerative - Viene generato anche un metodo
valueOf()
che restituisce la costante enumerativa associata alla stringa fornita in input- Se il valore non esiste, viene emessa un’eccezione
SameCarta[] valori = SemeCarta.values();
for (int k = 0; k<valori.lenght; k++)
System.out.println(valori[k]);
String v = "PICCHE";
SameCarta picche = SemeCarta.valueOf(v);
System.out.println(picche);
Enumerazioni e switch
- Le enumerazioni possono essere utilizzate all’interno di un costrutto switch
SameCarta = null;
/*...*/
switch(seme)
{
case CUORI: System.out-println("come"); break;
}
Classi wrapper
- Permettono di convertire i valori di un tipo primitivo in un oggetto
- Forniscono metodi di accesso e visualizzazione dei valori
Confrontare oggetti interi
- Confrontare i valori interi primitivi mediante gli operatori di confronto == , != , <, ⇐, >, >=
- Ma:
new Integer(5) new Integer(5)
… Perché? - Avendo un oggetto, dobbiamo utilizzare i metodi per il confronto
equals()
: restituisce true se e solo se l’oggetto in input è un intero di valore uguale al propriocompareTo()
: restituisce 0 se sono uguali, < 0 se il proprio valore è < di quello in ingresso, > 0 altrimenti
Autoboxing e auto-unboxing
- L’autoxing converte automaticamente un tipo primitivo al suo tipo wrapper associato
Integer k = 3;
Integer[] array = {5, 3, 7, 8, 9}
- L’auto-unboxing converte automaticamente da un tipo wrapper all’equivalnete tipo primitivo
int j = k;
int n = array[j];
Relazione di estensione in UML
Ereditarietà
- Un concetto cardine della programmazione orientata agli oggetti
- Una forma di riuso del software in cui una classe è creata
- “assorbendo” i membri di una classe esistente
- aggiungendo nuove caratteristiche o migliorando quelle esistenti
- Programmazione mattone su mattoni
- Aumenta le probabilità che il sistema sia implementato e mantenuto in maniera efficiente
Cosa si eredita?
- Una sottoclasse estende la superclasse
- La sottoclasse eredita i membri della superclasse
- I campi e metodi d’istanza secondo il livello di accesso specificato
- Inoltre la sottoclasse può:
- aggiungere nuovi metodi e campi
- ridefinire i metodi che eredita dalla superclasse
Classi astratte
- Una classe astratta (definita mediante la parola chiave abstract) non può essere istanziata
- Quindi NON possono esistere oggetti per quella classe
public abstract class PersonaggioDisney
{
abstract void faPasticci();
}
- Tipicamente verrà estesa da altre classi, che invece potranno essere istanziate
public class Paperoga extends PersonaggiDisney
{
public void faPasticci()
{
System.out.println("vdhuisvgdsv");
}
}