Concetti introduttivi Flashcards
Identificatore
è il nome di una variabile (di un metodo o di una classe). Dovrebbe iniziare con una lettera minuscola (mentre il nome di una classe con una maiuscola). Non può iniziare con un numero. Non può contenere simboli ( tranne $ e _ ). è case sensitive.
oggetto
è un entità di un programma, manipolabile tramite metodi.Una volta definita una classe x, essa può essere utilizzata per istanziare (ossia allocare spazio in memoria) un oggetto di tipo x.
Un oggetto appartiene a diverse classi (ad es. un oggetto system.out è un oggetto della classe PrintStream).
Metodo
è una sequenza di istruzioni che accede ai dati di un oggetto.
es.:
public static void main(String[] args) {
}
public = specificatore di accesso
(String[] args) = parametri
{} = corpo
Classe
Una classe è un tipo di dato astratto rappresentante un elemento costituito secondo
determinate caratteristiche (attributi) e operazioni (metodi) eseguibili su di esso.
Interfaccia
Le interfacce sono un meccanismo di completa astrazione in grado di descrivere il comportamento di altre classi.
- Non hanno metodo costruttore e non può essere costruito un oggetto di tipo interfaccia.
- una classe può implemetare un num illimitato di interfacce
- tutte le sottoclassi che lo impementano devono fare la riscrittura dei metodi dell’interfaccia
- tutti i metodi e gli attributi sono astratti e statici
- la classe che lo utilizza deve usare la keyword implements
- i metodi sono pubblici astratti (ossia senza una vera implemtezione)
- si possono efinire metodi di default che non hanno bisogno di essere riscritti dalle sottoclassi
es.
public interface Measurable{
double getMeasure();
}
public class Rectangle implements Measurable{
@Override
public double getMeasure(){
// ridefinizione del metodo
}
Vantaggi delle interfacce
MOTIVAZIONI
Il linguaggio Java usa l’ereditarietà singola.
Questo vuol dire che una classe ha sempre una sola superclasse da cui eredita variabili, proprietà e metodi.
L’ereditarietà singola è più semplice da gestire ma comporta dei limiti.
Per superare questi limiti, in Java sono state introdotte le interfacce.
Le interfacce generano errori se le sottoclassi che le implementano non ridefiniscono i metodi, generando quindi una garanzia che le sottoclassi definiscano quei particolari metodi, e uno standard dato che i metodi hanno firma uguale definita dall’interfaccia.
con java 8 sono stati introdotti i metodi default per evitare la riscrittura di codice per sottoclassi che implementavano lo stesso metodo con lo stesso identico corpo.
Final
La keyword Final indica, se assegnata a..
- una classe, che non può avere sottoclassi
- un metodo, che non può essere sovrascritto da altre classi
- un attributo, che non può essere modificato successivamente (rappresenta ossia una costante)
Static
La keyword Static indica, se assegnata a..
- un metodo, che può essere usato senza istanziare un oggetto di quella classe
- un attributo, che sarà condiviso tra le istanze della classe
Principi Solid
S - Single responsibility principle (principio di responsabilità singola)
ogni classe dovrebbe avere una singola responsabilità, e rappresentare un singolo aspetto del sistema. Esempio: se esiste una classe Database in grado di creare una connessione, leggere e modificare i dati del database, ogni compito deve essere affidato ad un’istanza
separata (ConnectionHandler, DataReader, DataWriter)
O - Open/close principle ( principio di estensione/chiusura)
ogni entità del codice dovrebbe essere facile da estendere, senza essere modificata. questo favorisce il ruso del codice e la stabilità del sistema.
Esempio: una classe non dovrebbe possedere attributi troppo specifici, poiché impedirebbe la possibilità di estenderne il funzionamento.
L - Links substitution principle (principio di separazione di links)
gli oggetti di una classe dovrebbero essere sostituibile senza alterare la correttezza dlecodice. una classe derivata deve rispettare il contartto (interfaccia, comportamento, pre e postcondizioni) della classe base. questo comportamento favorisce l’interoperabilità e l’estendibilità delle classi
Esempio: se una classe implementa un’istanza della classe Animale, sostituirla con la classe Cane non deve comportare modifiche al programma.
I - Interface segregation principle (principio di separazione delle interfacce)
le classi non dovrebbero essere dipendenti da interfacce che non utilizzzano. le interfacce dovrebbero essere corte, mimali, specifiche e le classi dovrebbero implementare tante interfacce quanti sono i ruoli che svolgono.
Esempio: un’interfaccia Measurable risulta troppo generica, poiché ogni oggetto è potenzialmente misurabile in qualche modo
D - Dipendency inversion principle (principio di inversione di dipendenze)
le classi di alto livello non dovrebbero dipendere da classi di basso livello. entrambi dovrebbero dipendere da interfacce o classi astratte per minimizzare dipendenza tra classi.
Esempio: se esiste una classe Animale e varie sue sottoclassi (Cane, Gatto, …),
il codice implementante un’istanza di tali classi deve essere scritto basandosi sulla classe Animale e non sulle sue sottoclassi
Eccezioni
Esistono due categorie di eccezioni:
- controllate
Il compilatore verifica che l’eccezione non venga ignorata.
le eccezioni controllate sono dovute a circostanze esterne che il programmatore non puo evitare.
la maggior parte delle gestioni controllate vengono dalla gestione di I/O.
tutte le sottoclassi IOException sono eccezioni controllate
- non controllate
le eccezioni non controllate sono RuntimeException o Error
le sottoclassi di RuntimeException sono non controllate: NullpointerException
esempio di errore: OutOfMemoryError
rappresentano errori del programmatore
Esempio di cattura eccezione
class CiaoMondo {
public static void main(String[] args)
{
System.out.print (“Ciao mondo, sono il primo programma in Java “);
String Nome; String Cognome; try { Nome = args[0]; } catch (ArrayIndexOutOfBoundsException e) { Nome="Non hai inserito il tuo Nome"; } try { Cognome=args[1]; } catch (ArrayIndexOutOfBoundsException e) { Cognome="Non hai inserito il tuo Cognome"; } System.out.println ("di "+Nome+" "+Cognome); } }
Classe Scanner
la classe Scanner è utile per la lettura di dati da file o altri flussi di dati in java.
Per leggere da un file bisogna costruir eun oggetto di tipo FileReader e usarlo per costruire un oggetto di tipo Scanner
Metodi e costruttori:
Scanner(File file) - costruisce un oggetto scanner che legge d aun file
Scanner(Stream in) - costruisce un oggetto scanner che legge da un origine di dati ad esempio System.in
hasNext() - restituisce True se il flusso di dati non è terminato
Next() - restituisce la prossima stringa nel flusso di input
nextInt() - restituisce il prossimo intero nel flusso di input
nextDouble() - restituisce il prossimo double nel flusso di input
close() - chiude lo scanner e rilascia le risorse associate
Esempio classe scanner
import java.util.File;
import java.util.Scanner;
public class ScannerExample{
public static void main(String[] args){
String filePath = “path/file.txt”
File file = new File(filePath); Scanner scanner = new Scanner(file); while (scanner.hasNext()){ int num = scanner.nextInt(); System.out.println("Il num è: "+num); } scanner.close(); }
Classe PrintWriter
è una classe con la quale si può scrivere su un file o su un flusso dati.
i metodi e costruttori sono:
printReader(File source)
- printReader(Stream out)
- print(String)
- println(String)
- print(int)
- println(int)
close() - chiude
Classe PrintWriter
è una classe con la quale si può scrivere su un file o su un flusso dati.
i metodi e costruttori sono:
printWriter(File source) - scrive sul file
printWriter(Stream out) - scrive sul flusso dati
print(String) - scrivesul flusso di output una stringa
println(String) - scrive sul flusso di output una stringa seguita da una linea
print(int) - scrive sul flusso di output un intero
println(int) scrive sul flusso di output un intero sgeuito da una linea
close() - chiude il PrintWriter e rilascia le risorse associate