Se stai per affrontare un colloquio di lavoro in ambito Java, in questo articolo ho raccolto quelle che reputo le possibili domande che potresti ricevere. Le domande riguardano principalmente la parte core di Java, quindi tutti i fondamenti di base per arrivare ad un livello leggermente più avanzato. Solitamente queste domande vengono fatte in sede di colloquio per capire se la persona è a conoscenza innanzitutto delle basi.
Non perdiamo altro tempo in chiacchiere e partiamo subito con le domande che potresti ricevere durante un colloquio di lavoro su java (e relative risposte).
Domande e risposte colloquio di lavoro su JAVA
Che cos’è Java?
Java è uno dei linguaggi di programmazione più popolari in uso. Si tratta di un linguaggio Object Oriented, di alto livello, progettato per essere il più possibile indipendente dalla piattaforma hardware di esecuzione (tramite compilazione in bytecode prima e interpretazione poi da parte di una JVM) .
Che cosa vuol dire linguaggio di programmazione Object Oriented?
La programmazione orientata agli oggetti (in inglese object-oriented programming, in acronimo OOP), a volte chiamata semplicemente programmazione ad oggetti, è un paradigma di programmazione che permette di definire oggetti software in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi.
Java è indipendente dalla piattaforma hardware di esecuzione: come è possibile ciò?
Il linguaggio Java è stato progettato in modo tale da non dipendere dalla piattaforma hardware di esecuzione. Ciò è possibile grazie al compilatore Java che compila il codice e lo converte in bytecode eseguibile su diversi sistemi a prescindere dalla piattaforma. L’unico requisito per eseguire (o meglio interpretare) il bytecode è quello di aver installato sulla macchina l’ambiente di runtime JRE.
Che cos’è un IDE?
Un IDE (dall’inglese Integrated Development Environment) è un ambiente di sviluppo integrato, un software progettato per la realizzazione di applicazioni che aggrega strumenti di sviluppo comuni in un’unica interfaccia utente grafica. Solitamente in un IDE è presente un potente editor di testo che facilita la scrittura del codice, strumenti per effettuare una build in locale, strumenti di debugging del codice.
Quali sono i principali IDE Java?
I principali IDE che si utilizzano attualmente per programmare in Java sono Eclipse, NetBeans, IntelliJ IDEA e Android Studio. Questa è sicuramente una delle domande che puoi ricevere ad un colloquio di lavoro su java. Per questo motivo puoi approfondire tramite questo articolo.
Che cos’è una classe?
Nel linguaggio Java una classe è un insieme composto da attributi e metodi. Una classe serve a definire un prototipo di oggetto da cui vengono creati tutti gli oggetti. Contiene attributi e metodi comuni a tutti gli oggetti istanziati a partire da essa, ma non specifica il loro valore.
L’immagine in basso raffigura una classe Person che ha una serie di attributi: name, age, gender, occupation ed una serie di metodi: walk(), eat(), sleep(), work().
A cosa servono le classi?
Le classi sono il fondamento della programmazione orientata agli oggetti (OOP). Grazie ad una classe è possibile creare degli oggetti che ereditano automaticamente gli attributi e i metodi della classe stessa.
Che differenza c’è tra attributi e metodi di una classe?
Attributi: sono le variabili della classe e ne definiscono le proprietà. Ad esempio, l’attributo “anno” è una variabile a cui è possibile assegnare un valore (es. anno=2020).
Metodi: sono le funzioni della classe e ne definiscono il comportamento. Ad esempio, il metodo “somma” calcola l’addizione tra due numeri passati come argomento.
Che cos’è un oggetto?
Un oggetto in Java è una istanza della classe che, come detto in precedenza, è il prototipo di oggetto con stato e comportamento definiti a priori. Gli stati degli oggetti sono veicolati dagli attributi (o variabili) di istanza, mentre i metodi ne stabiliscono il comportamento. L’oggetto viene solitamente creato con la keyword “new”. Ad esempio Persona persona1 = new Persona(); dove persona1 è l’oggetto istanziato a partire dalla classe Persona.
Che differenza c’è tra classi e oggetti?
La differenza tra una classe e un oggetto è la stessa che c’è tra un insieme e un elemento dell’insieme. La classe è un insieme che contiene gli oggetti (elementi). Tutti gli oggetti hanno in comune le proprietà dell’insieme.
Nell’immagine in basso è rappresentata la classe automobile e 3 oggetti che hanno in comune tutti gli attributi della classe automobile ma che valorizzano in maniera distinta.
Cosa sono i modificatori di accesso?
In Java i modificatori di accesso possono impedire l’accesso (modifica/uso) delle componenti e l’invocazione dei metodi. Si tratta sostanzialmente di parole chiave usate per definire l’ambito di accesso del metodo, della classe o di una variabile.
I modificatori di accesso possono essere applicati a: classi, componenti e metodi e sono:
- public: accessibile da qualsiasi classe o metodo
protetto, ovvero accessibile solo dalla classe dello stesso pack - protected: accessibile solo dalla classe dello stesso package, o dalla sottoclasse di questa classe, o all’interno della classe stessa
- default: ovvero accessibile solo all’interno dello stesso package. Viene assegnato automaticamente dal compilatore solo quando nella scrittura del sorgente si omettono gli altri modificatori.
- private: ovvero accessibile solo all’interno della classe
Che cos’è un Singleton?
Il singleton è un design pattern di tipo creazionale. La sua funzione è quella di garantire, all’interno di un ambiente software, un’unica istanza di una determinata classe. Questo significa che una volta creata l’istanza, sarà utilizzata sempre la stessa all’interno del codice.
L’implementazione di un singleton si fa rendendo il costruttore della classe privato (con il modificatore di accesso private) e delegare la creazione dell’istanza ad un metodo di tipo statico.
Qui di seguito un esempio di implementazione:
Che cos’è l’incapsulamento (encapsulation)?
L’incapsulamento è uno dei concetti fondamentali della programmazione orientata agli oggetti. Esso stabilisce che gli attributi privati di un oggetto siano accessibili solo ai metodi dello stesso oggetto. Si tratta di un meccanismo di sicurezza poiché impedisce l’accesso diretto alla componente dell’oggetto e ne permette la modifica/uso solo attraverso i metodi. Qui di seguito un esempio in cui la variabile “x” è privata e può essere modificata o usata solo attraverso i metodi get e set.
Che cos’è l’ereditarietà (inheritance)?
L’ereditarietà è uno dei concetti fondamentali della programmazione orientata agli oggetti. Ereditarietà in Java significa che una classe può estendersi a un’altra classe, consentendo di riutilizzare il codice da una classe all’altra. La classe esistente viene chiamata superclasse mentre quella derivata è chiamata sottoclasse.
La sottoclasse eredita da una classe base (superclasse) lo stato e il comportamento, questo significa che la sottoclasse possiede tutti i campi e metodi della superclasse. Nella sottoclasse si possono aggiungere
o modificare campi e metodi per specializzare la superclasse.
Nell’immagine in basso le classi B, C e D sono sottoclassi di A.
In Java la relazione di derivazione viene resa con la keyword “extends” che deve essere usata nella dichiarazione della classe. Ad esempio, se ho una classe A e voglio definire una classe B che estende A, dovrò fare come segue:
Che cos’è il polimorfismo (polymorphism)?
Il polimorfismo è uno dei concetti fondamentali della programmazione orientata agli oggetti. Il polimorfismo di per sé è la capacità di un oggetto di assumere molte forme. In Java, questo indica la possibilità di eseguire la stessa azione in molti modi diversi, ovvero consente di definire un’interfaccia e avere più implementazioni. Questo vuol dire che con Java è possibile definire comportamenti diversi a secondo del contesto in cui ci si trova in risposta ai medesimi input esterni.
Esistono 2 tipi di polimorfismo:
- polimorfismo dei metodi: vengono sfruttati i meccanismi di overriding e overloading dei metodi per definire elaborazioni differenti in sottoclassi differenti (vedere domande successive su override e overload)
- polimorfismo dei dati: permette ad una classe di assumere tutte le forme dei figli. Ad esempio, se abbiamo una classe “Figlio” che estende una classe “Padre”, possiamo usare i cosiddetti parametri polimorfi in questo modo Padre p = new Figlio(). Il codice subito in basso può chiarire meglio il concetto:
Che cos’è un’interfaccia in Java?
Nel linguaggio Java una interfaccia (interface) è un insieme di nomi di metodi astratti che possono essere implementati su più classi. Un’interfaccia non può contenere costruttori, variabili statiche, variabili di istanza e metodi statici. Ogni classe che implementa l’interfaccia definisce i metodi in modo diverso dalle altre classi che implementano la stessa interfaccia.
Nell’immagine in basso vengono definite 2 interfacce “FirstInterface” e “SecondInterface”. La classe “DemoClass” implementa entrambe le interfacce (separate da virgola) e fa l’override (obbligatorio) dei metodi presenti in entrambe le interfacce.
A cosa servono le interfacce?
Come visto le interfacce servono innanzitutto a garantire che una determinata classe che implementa una determinata interfaccia, possiede tutti i metodi dell’interfaccia.
Inoltre, poiché il linguaggio Java usa l’ereditarietà singola, cioè che una classe ha sempre una sola superclasse da cui eredita variabili, proprietà e metodi. Per superare parzialmente questo limite, in Java si possono usare le interfacce. Bisogna far in modo che una classe implementi più interfacce, ognuna delle quali contenga al suo interno le definizioni dei metodi che si vuole vengano implementati dalla classe stessa.
Che cos’è il method overriding?
L’override del metodo è una caratteristica del linguaggio Java che consente a una sottoclasse di fornire un’implementazione specifica di un metodo già fornito da una delle sue superclassi. Quando una sottoclasse contiene un metodo con stesso nome, stessi parametri e stesso tipo restituito della sua superclasse, allora il metodo della sottoclasse si dice che sovrascrive (override) quello superclasse. L’override del metodo è uno dei modi con cui Java realizza il polimorfismo in fase di runtime.
Che cos’è il method overloading?
L’overload del metodo serve a definire più versioni dello stesso metodo (quindi che avrà sempre lo stesso nome), variando il numero e il tipo dei parametri e/o la visibilità. Il concetto di overloading è correlato al polimorfismo in fase di compilazione.
A cosa serve il costruttore di una classe?
Il costruttore è quel metodo di una classe il cui compito è proprio quello di creare nuove istanze, oltre ad essere il punto del programma in cui un nuovo elemento (quindi una nuova identità) viene creato ed è reso disponibile per l’interazione con il resto del sistema.
Che cos’è una classe astratta?
Una classe astratta in Java è una classe dichiarata con la keyword “abstract” e serve a dichiarare caratteristiche comuni fra classi di una determinata gerarchia. La classe astratta può avere costruttori e metodi statici, metodi astratti e non astratti. Una classe astratta non può in alcun modo essere istanziata, quindi può essere utilizzata esclusivamente come classe base. Quando estendiamo (o deriviamo) da una classe astratta, la classe derivata deve fornire una implementazione per tutti i metodi astratti dichiarati nella classe genitrice; se così non dovesse essere, anche la sotto-classe deve essere dichiarata come abstract.
Che cos’è una metodo astratto?
Un metodo astratto è un metodo solamente definito (firma del metodo) ma senza corpo.
Che differenza c’è tra interfaccia e classe astratta?
Le classi astratte, a differenza delle interfacce, possono avere costruttori, variabili di istanza e metodi non astratti.
Che cosa sono le espressioni Lamba (Java Lambda Expressions)?
Le espressioni lambda sono state aggiunte a partire da Java 8. Un’espressione lambda è un breve blocco di codice che accetta parametri e restituisce un valore. Le espressioni lambda sono simili ai metodi, ma non necessitano di un nome e possono essere implementate direttamente nel corpo di un metodo.
La sintassi di una espressione lambda è molto semplice:
parameter -> expression
Per usare più di un parametro in ingresso l’espressione diventa:
(parameter1, parameter2) -> expression
Quando non ci sono parametri di ingresso l’espressione diventa:
() -> expression
Le espressioni lambda sono limitate. Devono restituire immediatamente un valore e non possono contenere variabili, assegnazioni o istruzioni come if o for. Per eseguire operazioni più complesse, è possibile utilizzare un blocco di codice con parentesi graffe. Se l’espressione lambda deve restituire un valore, il blocco di codice deve avere un’istruzione return.
(parameter1, parameter2) -> { code block }
Conclusioni
In questo articolo ti ho fornito tutte le principali domande, con relativa risposta, che potresti riceve in sede di colloquio di lavoro sul linguaggio Java. Se hai bisogno di maggiori chiarimenti oppure vuoi suggerire qualche altra domanda che non è presente in questo articolo, puoi utilizzare il box commenti subito in basso.