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() e setX()
    • 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

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 proprio
    • compareTo(): 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");
	}
}