Java Flashcards
Cos’è uno stream in Java 8?
Uno Stream in Java è un’interfaccia introdotta con Java 8 che consente di operare su sequenze di dati in modo funzionale e dichiarativo. Gli Stream permettono di elaborare collezioni di dati (come liste, insiemi o array) in modo efficiente, eseguendo operazioni come il filtraggio, la mappatura, l’ordinamento, e l’aggregazione di dati, senza dover scrivere loop espliciti o manipolare manualmente le strutture dati.
Costituito da:
Collection (Lista)
List<Double> valori = Arrays.asList(1.3,2.4,4.4);</Double>
Sorgente (.stream())
* valori.stream();
operazioni intermedie
* map
* filter
* sorted
operazioni terminali
* collect (esegue ed assegna)
* forEach (esegue e basta)
descrivi le lambda
Le lambda Expression ci consentono di dare corpo alle funzioni anonime scrivendo così codice più leggibile
Sono un modo conciso e potente di rappresentare funzioni anonime che possono essere usate come argomenti di metodi o assegnate a variabili. Le lambda expression permettono di scrivere codice più leggibile e flessibile, soprattutto quando si lavora con interfacce funzionali, ovvero interfacce con un unico metodo astratto.
Descrivi le classi astratte
Sono classi con parola chiave abstract: Le classi astratte possono contenere metodi completamente implementati, oltre a metodi astratti (con parola chiave abstract e senza implementazione). Un metodo astratto è dichiarato senza un corpo e deve essere implementato nelle sottoclassi concrete.
2. Possono contenere campi e variabili di istanza: Le classi astratte possono avere campi e variabili di istanza, che possono essere ereditati e utilizzati dalle sottoclassi.
3. Consentono ereditarietà singola: Una classe Java può estendere solo una classe astratta. Quindi, una classe astratta può essere utilizzata come una classe base per una sola sottoclasse.
4. Utilizzate per fornire una base comune: Le classi astratte vengono spesso utilizzate per fornire una base comune e condividere il codice tra diverse sottoclassi.
descrivi le interfacce
- Sono completamente astratte: Le interfacce in Java contengono solo metodi astratti, cioè metodi senza implementazione. Forniscono solo la “firma” dei metodi e le classi che implementano l’interfaccia devono fornire l’implementazione effettiva.
- Non possono contenere campi o variabili di istanza: Le interfacce possono dichiarare solo costanti (campi statici final) e metodi astratti.
- Da java 8 possono contenere metodi default facoltativamente le sottoclassi possono sovrascrivere i metodi di default.
- una sottoclasse può non sovrascrivere tutti i metodi astratti soltanto se essa stessa diventa astratta.
- Consentono ereditarietà multipla: Una classe Java può implementare più di un’interfaccia, consentendo così di ottenere l’ereditarietà multipla tramite interfacce.
- Utilizzate per definire comportamenti: Le interfacce vengono spesso utilizzate per definire comportamenti comuni che possono essere condivisi da diverse classi senza dover ereditare da una singola classe astratta.
- Un metodo può implemetare infinite interfacce
Quando una classe implementa un’interfaccia contenente un metodo di default, ha tre opzioni:
Sovrascrittura del Metodo di Default: La classe può scegliere di sovrascrivere il metodo di default con un'implementazione personalizzata. In questo caso, il metodo di default nella classe implementante avrà la precedenza su quello nella interfaccia. Ereditare il Metodo di Default: La classe può scegliere di ereditare direttamente il metodo di default senza fornire una sua implementazione. In questo caso, il metodo di default nella interfaccia sarà utilizzato dalla classe. Ridichiarare il Metodo: La classe può dichiarare un metodo con lo stesso nome del metodo di default dell'interfaccia, ma con una firma diversa (ad esempio, un metodo statico o un metodo non statico). Questo non costituirà una sovrascrittura e la classe non erediterà il metodo di default dell'interfaccia.
Quali sono le parole chiave per modificare il comportamento delle classi , metodi e variabili
abstract, static e final
descrivi abstract
In Java, la parola chiave abstract è usata per dichiarare classi e metodi che non possono essere istanziati direttamente e devono essere implementati o estesi da altre classi
Caratteristiche di una Classe Astratta:
Non può essere istanziata: Non è possibile creare un’istanza diretta di una classe astratta.
Può contenere metodi astratti: Metodi che non hanno un corpo e devono essere implementati dalle sottoclassi.
Può contenere metodi concreti: Metodi con un corpo che possono essere ereditati dalle sottoclassi.
Può contenere variabili di istanza e costruttori.
Inoltre la sottoclasse è obbligata a sovrascrivere i metodi astratti.
Un metodo astratto è un metodo dichiarato senza implementazione (senza corpo) all’interno di una classe astratta. Le sottoclassi concrete sono obbligate a fornire l’implementazione per questi metodi.
Caratteristiche di un Metodo Astratto:
Non ha un corpo: Il metodo è dichiarato senza un corpo ({}).
Deve essere implementato: Le sottoclassi concrete che estendono la classe astratta devono fornire l’implementazione di questo metodo.
Descrivi Static
- static: La parola chiave static viene utilizzata per dichiarare membri (variabili o metodi) di una classe come membri di classe anziché membri di istanza. Ciò significa che i membri statici appartengono alla classe stessa e non a specifiche istanze della classe. Possono essere accessibili direttamente attraverso il nome della classe, senza dover creare un’istanza della classe. Il concetto di static è molto particolare in quanto una variabile static è legata alla classe di appartenenza e prescinde dal concetto di oggetto
Esempio di variabile statica e metodo statico:
class Contatore {
static int count = 0; // Variabile statica (di classe)
static void increment() { // Metodo statico (di classe) count++; } }
descrivi final
- final: La parola chiave final viene utilizzata per definire una costante, impedire l’ereditarietà di una classe o prevenire l’override di un metodo o la modifica di una variabile. Una variabile dichiarata con final non può essere modificata una volta assegnato un valore. Un metodo dichiarato con final non può essere sovrascritto nelle sottoclassi. Una classe dichiarata con final non può essere estesa.
Possibile avere una classe static?
Sì, in Java puoi avere una classe statica. Una classe statica è una classe interna dichiarata come static all’interno di un’altra classe. Una classe statica è associata alla classe esterna, e non alle istanze della classe esterna.
Le classi statiche possono essere utili quando hai una classe interna che non ha bisogno di accesso alle variabili di istanza della classe esterna e non vuoi creare un’istanza della classe esterna per utilizzare la classe interna.
Ecco un esempio di una classe statica:
java
public class ClasseEsterna {
// Variabile di istanza della classe esterna
private int variabileEsterna;
// Costruttore della classe esterna public ClasseEsterna(int variabileEsterna) { this.variabileEsterna = variabileEsterna; } // Classe statica interna static class ClasseStatica { // Metodo statico della classe statica static void metodoStatico() { System.out.println("Questo è un metodo statico della classe statica interna."); } } } Puoi utilizzare la classe statica interna direttamente attraverso il nome della classe esterna, senza dover creare un'istanza della classe esterna: java public class Main { public static void main(String[] args) { ClasseEsterna.ClasseStatica.metodoStatico(); } } Nell'esempio sopra, abbiamo una classe ClasseEsterna con una classe interna ClasseStatica, dichiarata come static. La classe interna ha un metodo statico metodoStatico() che possiamo richiamare direttamente usando il nome della classe esterna, come ClasseEsterna.ClasseStatica.metodoStatico(). Le classi statiche sono utili quando vuoi raggruppare logicamente classi correlate ma che non hanno una dipendenza dai dati dell'istanza della classe esterna.
In java se provo a fare l’ override o l’ oreload dei metodi statici và in errore?
- Overload dei metodi statici: In Java, è possibile fare l’overload dei metodi statici. L’overload si verifica quando una classe ha più metodi con lo stesso nome ma con firme differenti (parametri diversi). Questi metodi possono essere metodi statici o di istanza. L’overload dei metodi statici è permesso e non causerà errori di compilazione.
-
Override dei metodi statici: In Java, non è possibile fare l’override dei metodi statici. Quando si definisce un metodo statico in una classe, questo metodo appartiene alla classe stessa e non alle istanze della classe. Pur compilando non si sovrascrivono Poiché l’override coinvolge l’ereditarietà e il polimorfismo, che si applicano alle istanze delle classi, non è possibile sovrascrivere metodi statici. Tentare di farlo non causerà un errore di compilazione, ma il metodo definito nella classe figlia sarà considerato un metodo separato e non avrà alcun legame con il metodo statico nella classe genitore.
In breve, puoi fare l’overload di metodi statici perché non coinvolge il polimorfismo, ma non puoi fare l’override di metodi statici in Java.
In sintesi, l’overload dei metodi statici è possibile poiché riguarda solo la firma del metodo e non coinvolge il polimorfismo. L’override non è possibile perché l’implementazione dei metodi statici è associata alla classe stessa e non alle istanze, e quindi non esiste il contesto di ereditarietà necessario per il polimorfismo dell’override.
Possiamo avere classi Final?
Possiamo avere una classe final la quale non si può estendere ma la possiamo instanziare.
Il modificatore final impedisce l’ereditarietà, ma non influisce sulla capacità di creare oggetti della classe. Questa funzionalità è utile per creare classi che non dovrebbero essere estese per motivi di sicurezza, progettazione o integrità dei dati.
quali sono i Modificatori di accesso?
- public: Un componente dichiarato con il modificatore public è accessibile da qualsiasi classe, sia all’interno dello stesso pacchetto che da pacchetti esterni.
- protected: Un componente dichiarato con il modificatore protected è accessibile dalla stessa classe, dalle sottoclassi e dalle altre classi nello stesso pacchetto.
- private: Un componente dichiarato con il modificatore private è accessibile solo dalla stessa classe. Non è accessibile dalle sottoclassi o da altre classi nello stesso pacchetto.
- Nessun modificatore (package-private/default): Se un componente non ha un modificatore di accesso specificato, si dice che ha un accesso “package-private” o “default”. Un componente con accesso package-private è accessibile solo dalle classi nello stesso pacchetto.
cosa è Operatore di riferimento al metodo?
In Java, l’operatore :: è noto come “operatore di riferimento al metodo” o “operatore di riferimento ai costruttori”. Esso consente di fare riferimento a un metodo o a un costruttore esistente senza chiamarlo direttamente, ma piuttosto utilizzandolo come riferimento.
a cosa servono le api stream di Java 8
Una Stream è una sequenza di elementi che supporta varie operazioni per la manipolazione dei dati. Può essere applicata a liste, set e mappe, oltre a altre fonti di dati, come array o input/output di file.
Si costruisce un collezione di dati che può essere una List o un array es:
* List<Double> valori = Arrays.asList(1.3,2.4,4.4);
Ottenuta la collection si trasforma in stream come sorgente con .stream()
* valori.stream();
adesso abbiamo le operazioni intermedie che possono essere tantissimi tra i più comuni
* .map (trasforma i dati)
* .filter (Li filtra)
* .sorted (li ordina)
Per terminare abbiamo le operazioni terminali le quali eseguono le operazioni intermedie e le assegnano ad una nuova lista le operazioni terminali sono:
* collect (esegue ed assegna)
* forEach (esegue e basta)</Double>
Il polimorfismo
Capacità di un oggetto di apparire in più forme
Esempio: Se abbiamo una classe Animale e una classe Cane che estende Animale, possiamo trattare un oggetto di tipo Cane come un oggetto di tipo Animale. Ad esempio:
Animale animale = new Cane();
Possiamo assegnare ad un oggetto Animale un oggetto di tipo cane.
Altro esempio è quello dell overload
descrivi l’ incapsulamento
E’ una tecnica che ci consente di incapsulare (proteggere) metodi e attributi di un oggetto.E di esporre solo quello che necessario.
Possiamo farlo attraverso i modificatori di accesso public private e protected fornendo dei metodi specifici per utilizzare i dati (es: bean get e set)
cosa è una classe?
Rappresenta un modello per la la creazione di oggetti.