Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


120 Domande e Risposte Programmazione (C e Java) - Compilatori - Prof. Anisetti, Prove d'esame di Programmazione C

Raccolta specifica con 120 domande frequenti e risposte precise per l'esame di Programmazione del Prof. Anisetti (A.A. 2023/2024). Nota: il file copre sia il linguaggio C che Java ed è catalogato sotto "Programmazione Java" solo per vincoli del database della piattaforma. Il materiale rispecchia il programma del corso ed è focalizzato sui seguenti nuclei tematici: - Compilatori: differenze AST/Parse Tree, grammatiche formali, ambiguità, BNF, chiusura di Kleene, automi a stati finiti (MAS), Macchina di Turing (MdT), architettura Von Neumann. - Gestione Memoria: Stack, Heap, record di attivazione e passaggio dei parametri in C e Java. - Paradigmi: programmazione strutturata (Bohm-Jacopini) e analisi dei paradigmi (imperativo, dichiarativo, logico, funzionale). - OOP: Principi SOLID, classi, interfacce e polimorfismo. Il testo rimane un'ottima base di studio per gli anni successivi, sebbene negli appelli più recenti possa saltuariamente comparire qualche domanda inedita.

Tipologia: Prove d'esame

2023/2024

In vendita dal 08/06/2026

fram4-
fram4- 🇮🇹

13 documenti

1 / 15

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
1. Cosa è un AST?
Abstract Syntax Tree: Strumento per la rappresentazione grafica astratta della sintassi ed
evidenzia i componenti più significativi di un linguaggio e li mostra sottoforma di un albero.
2. Cosa è un Parse Tree?
È un albero ordinato che rappresenta graficamente la struttura sintattica di una stringa
rispetto ad una grammatica formale. (differenza con AST: elementi riflettono più
concretamente la sintassi del linguaggio in input).
3. Cosa è una grammatica?
Una grammatica è un insieme di regole sintattiche e semantiche che si applicano ad un
alfabeto per definire un linguaggio per il quale costituisce un sistema generativo. La
grammatica di un linguaggio impone una struttura gerarchica (parse tree) ai programmi
definiti da quel linguaggio. Le foglie della gerarchia sono i token e i nodi contengono i
simboli non terminali. Ogni nodo è una regola che definisce un simbolo non terminale come
una sequenza di altri non terminali o terminali.
Una grammatica è una quadrupla G = (N,Σ,R,S).
N = N insieme dei simboli non terminali.
Σ = alfabeto del linguaggio costituito da simboli terminali.
R = insieme finito delle regole di produzione.
S = simbolo non terminale speciale
4. Grammatica ambigua?
Una grammatica G si dice ambigua se esiste una stringa che ammette due o più alberi
sintattici distinti.
5. Cosa è una BNF
Formato di Backus e Naur è un formalismo costituito da un metalinguaggio per la
descrizione delle grammatiche.
6. Grammatica contestuale e non contestuale
La grammatica non contestuale è indipendente dalla notazione con la quale si esprime.
La grammatica contestuale è una grammatica dipendente dalla notazione con la quale si
esprime.
7. Cosa sono le carte sintattiche?
Le carte sintattiche sono dei diagrammi che esprimono le regole di una grammatica in
forma grafica.
8. Cosa è la chiusura di Kleene?
Dato un alfabeto Σ, la chiusura di Kleene (Σ*) è l’insieme di tutte le possibili stringhe su Σ.
9. Cosa è la chiusura L+?
È la chiusura di Kleene senza la parola vuota.
10. Cosa è un linguaggio formale?
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Anteprima parziale del testo

Scarica 120 Domande e Risposte Programmazione (C e Java) - Compilatori - Prof. Anisetti e più Prove d'esame in PDF di Programmazione C solo su Docsity!

  1. Cosa è un AST?
    • Abstract Syntax Tree: Strumento per la rappresentazione grafica astratta della sintassi ed evidenzia i componenti più significativi di un linguaggio e li mostra sottoforma di un albero.
  2. Cosa è un Parse Tree?
    • È un albero ordinato che rappresenta graficamente la struttura sintattica di una stringa rispetto ad una grammatica formale. (differenza con AST: elementi riflettono più concretamente la sintassi del linguaggio in input).
  3. Cosa è una grammatica?
    • Una grammatica è un insieme di regole sintattiche e semantiche che si applicano ad un alfabeto per definire un linguaggio per il quale costituisce un sistema generativo. La grammatica di un linguaggio impone una struttura gerarchica (parse tree) ai programmi definiti da quel linguaggio. Le foglie della gerarchia sono i token e i nodi contengono i simboli non terminali. Ogni nodo è una regola che definisce un simbolo non terminale come una sequenza di altri non terminali o terminali. Una grammatica è una quadrupla G = (N,Σ,R,S). N = N insieme dei simboli non terminali. Σ = alfabeto del linguaggio costituito da simboli terminali. R = insieme finito delle regole di produzione. S = simbolo non terminale speciale
  4. Grammatica ambigua?
    • Una grammatica G si dice ambigua se esiste una stringa che ammette due o più alberi sintattici distinti.
  5. Cosa è una BNF
    • Formato di Backus e Naur è un formalismo costituito da un metalinguaggio per la descrizione delle grammatiche.
  6. Grammatica contestuale e non contestuale
    • La grammatica non contestuale è indipendente dalla notazione con la quale si esprime.
    • La grammatica contestuale è una grammatica dipendente dalla notazione con la quale si esprime.
  7. Cosa sono le carte sintattiche?
    • Le carte sintattiche sono dei diagrammi che esprimono le regole di una grammatica in forma grafica.
  8. Cosa è la chiusura di Kleene?
    • Dato un alfabeto Σ, la chiusura di Kleene (Σ*) è l’insieme di tutte le possibili stringhe su Σ.
  9. Cosa è la chiusura L+?
    • È la chiusura di Kleene senza la parola vuota.
  10. Cosa è un linguaggio formale?
  • Un linguaggio formale è un insieme di parole su un alfabeto che derivano dall’applicazione di una grammatica.
  1. Cosa è un linguaggio che si definisce codice?
  • Un linguaggio L si definisce codice quando ogni parola in L+ è univocamente decifrabile come prodotto di parole di L. C = {1,10} è un codice C′= {bab,aba,ab} non è un codice
  1. Cosa è un linguaggio regolare?
  • Un linguaggio regolare è un linguaggio le cui stringhe sono implicate da un’espressione regolare; quindi, un linguaggio è detto regolare se è prodotto da un’espressione regolare.
  1. Cosa è un’espressione regolare?
  • Un’espressione regolare è una sequenza di simboli che identifica un insieme di stringhe.
  1. Cosa indica il livello “pragmatico” di un linguaggio?
  • Cosa comporta l’esecuzione di una certa operazione.
  1. Cosa è una macchina a stati?
  • Un automa a stati finiti è un modello matematico di un sistema con ingressi e uscite discreti.
  • MAS deterministica: per qualsiasi input esisterà una ed una sola transizione.
  • MAS non deterministica: a fronte dello stesso stato e dello stesso ingresso può avere più transizioni di stato.
  1. Cosa è e come una funziona una macchina di Turing?
  • Una MdT è una macchina a stati finiti con un dispositivo di controllo, un nastro e una testina. Sul nastro agisce la testina, che può muoversi in entrambe le direzioni e può leggere e scrivere in ogni cella del nastro simboli di alfabeti predefiniti.
  • La tabella delle transizioni di stato è composta da una quintupla di elementi [s,i,S,I,V]: o s: lo stato della macchina all'istante presente; o i: il simbolo letto all'istante presente; o S(s,i): lo stato della macchina all'istante successivo; o I(s,i): il simbolo scritto dalla macchina all'istante successivo; o V(s,i): il verso del movimento della macchina (destra o sinistra).
  1. Come funziona una macchina di Turing universale?
  • La MdT universale è una particolare MdT in grado di simulare una MdT qualsiasi. Definisce di fatto il primo modello di calcolatore programmabile.
  1. Architettura di Von Neumann?
  • La macchina di Von Neumann rappresenta l’architettura a cui si rifanno la maggior parte dei Calcolatori. Comprende i componenti fondamentali:

un intero qualsiasi. Il modello della RAM è costituito da un nastro di ingresso, un nastro di uscita, un programma rappresentato da una sequenza finita di istruzioni, un contatore LC che indica l’istruzione corrente e una memoria formata da infiniti registri.

  1. Quali sono le fasi della programmazione?
      1. Specifica: Richiesta di chi commissiona il lavoro;
      1. Progettazione: Analisi del problema per concepire in modo astratto l’algoritmo che lo risolve (top down, bottom up, ad oggetti);
      1. Modellazione: Descrizione dell’algoritmo con un linguaggio formale;
      1. Codifica: Scrittura del programma in un particolare linguaggio;
      1. Verifica e correzione: Il programma rispetta le specifiche (test e debug).
  2. Cosa sono i pattern di programmazione (design-patterns)?
    • Il pattern di programmazione (o design-pattern) è una soluzione progettuale generale ad un problema ricorrente (o ad una classe di problemi) nello sviluppo del software. Identifica con un nome una descrizione del problema da trattare, la soluzione e le conseguenze dell’utilizzo.
  3. Cosa sono i costrutti in un linguaggio di programmazione?
    • I costrutti sono strutture sintattiche di controllo che agiscono sul flusso di esecuzione del programma e possono variare a seconda del linguaggio di programmazione. (strutture fondamentali: sequenza, assegnazione, salto incondizionato).
  4. A cosa serve il teorema di Bohm-Jacopini?
    • Il teorema stabilisce che dato un programma P è possibile costruire un programma strutturato S(P) equivalente a P, ovvero che a fronte dello stesso input fornisca il medesimo output. Tutti i programmi esprimibili tramite istruzioni di salto (goto) o diagrammi di flusso (flow-chart) possono essere riscritti utilizzando esclusivamente le tre strutture di controllo fondamentali, eliminando i salti.
  5. Cosa dimostra il teorema di Ashcroft e Manna?
    • È una tecnica costruttiva per portare alla dimostrazione del teorema di Bohm-Jacopini sfruttando i concetti di programma proprio e di scomposizione gerarchica di un programma in sottoprogrammi propri.
  6. Per quale motivo ha preso piede la programmazione strutturata?
    • La programmazione strutturata pone le basi della programmazione modulare e rappresenta l’applicazione naturale dell’approccio top-down al processo di scrittura del codice; questo perché permette una scomposizione gerarchica del problema in blocchi di dimensione gestibile con l’obbiettivo di rendere più facile la lettura dei programmi e la riusabilità del codice.
  7. Che differenza esiste tra programmazione strutturata e non strutturata?
  • I costrutti nella programmazione strutturata sono: Sequenza, Selezione e Iterazione. I costrutti nella programmazione non strutturata sono: Sequenza, Selezione e Salto non condizionato.
  1. Per quale motivo i goto sono da evitare?
  • Il salto (o goto) viola le regole della programmazione strutturata e, in genere, l’uso di questa istruzione è malvisto nella programmazione con linguaggio ad alto livello. Il motivo principale è che rende di difficile lettura il flusso di controllo del programma (spaghetti- code).
  1. Cosa si intende per paradigma di programmazione?
  • È un modello concettuale che definisce la struttura di un programma, definendo dunque il modo in cui il programmatore concepisce e percepisce il programma stesso. Esempi: imperativa, funzionale, orientata agli oggetti, logica, dichiarativa, etc.
  1. Paradigma di programmazione Aspect-Oriented?
  • La programmazione orientata agli aspetti è un paradigma di programmazione basato sulla creazione di entità software, denominate aspetti, che sovrintendono alle interazioni fra oggetti finalizzate ad eseguire un compito comune.
  1. Paradigmi / Costrutti della programmazione imperativa?
  • Nel paradigma di programmazione imperativa la computazione è vista come una sequenza di azioni: il programma infatti è composto da istruzioni, che realizzano trasformazioni di stato, a sua volta determinato dai valori di un insieme di variabili in un certo stadio dell’esecuzione.
  1. Costrutti della programmazione dichiarativa?
  • La programmazione dichiarativa si basa su vincoli e logica per definire l’impostazione e il risultato. I vincoli definiscono le proprietà che sono vere in un dato scenario di programmazione definendo come le variabili si relazionano tra loro.
  1. Cosa si intende per programmazione logica?
  • La programmazione logica è un paradigma di programmazione dichiarativo in cui si descrive la conoscenza che si ha del problema piuttosto che il procedimento che porta alla sua soluzione.
  1. Cosa si intende per programmazione funzionale?
  • È un paradigma di programmazione, nato come modello teorico, in cui un programma è una funzione che viene valutata per ottenere un risultato e il valore di un’espressione dipende solamente dai valori delle sub-espressioni, se ne esistono; non sono previsti gli assegnamenti.
  1. Che proprietà garantisce la programmazione funzionale?
  • L’assenza di effetti collaterali.
  1. Cosa è il side-effect (effetto collaterale)?
  • Il side-effect si produce quando una funzione modifica un valore o stato al di fuori del proprio ambito locale.
  1. Cosa avviene nella memoria durante la chiamata in un sottoprogramma?
    • Quando viene invocato un sottoprogramma, viene salvato nello stack il record di attivazione. Il record di attivazione in cima allo stack è quello della funzione attualmente in esecuzione. Ogni funzione ha il proprio record di attivazione, compreso il main. Nel momento in cui l’esecuzione del sottoprogramma termina, il suo record di attivazione viene rimosso dallo stack.
  2. Cosa si intende per scope di una variabile?
    • L’ambito di visibilità di una variabile. Può essere locale o globale.
  3. Come è possibile modificare lo scope di una variabile?
    • In Java si modifica tramite le keyword di visibilità: PUBLIC, PRIVATE, PROTECTED, DEFAULT.
    • In C lo scope è definito in base alla posizione di codice in cui la variabile/funzione è dichiarata.
  4. Cosa è una variabile?
    • Una variabile è un contenitore a cui viene associato un nome simbolico e un tipo che ne definisce la dimensione allocata in memoria.
  5. Cosa è un tipo di una variabile?
    • Un tipo definisce il tipo di dato che la variabile conterrà, il numero di celle che occupa in memoria e le operazioni che possono essere fatte.
  6. Cosa è la tipizzazione?
    • Il tipo di regole che un linguaggio impone circa la tipizzazione dei dati e al loro uso in relazione al tipo. (esistono i fortemente tipizzati che hanno controlli esaustivi e i debolmente tipizzati che violano qualche cosa del fortemente tipizzato)
  7. Prototipo in C?
    • Tipo di ritorno + signature (tipo e nome parametro);
    • Indica la dichiarazione di una funzione in C;
  8. Modalità passaggio parametri?
    • Passaggio per valore: Viene passata una copia del valore della variabile utilizzata al momento della chiamata;
    • Passaggio per riferimento o indirizzo: Viene passato un riferimento alla variabile del chiamante, che quindi non viene duplicata nel sottoprogramma e le eventuali modifiche interne sul formale agiscono sull’attuale.
    • Passaggio per result: copiare formali in attuali all’uscita dalla funzione.
    • Passaggio per value-result: copia il valore in chiamata e lo copia ancora in uscita dalla funzione.
    • Passaggio per nome: Passo il nome simbolico dei parametri permettendo sia accesso che modifica.
  1. Parametri formali ed attuali?
    • I parametri formali sono i parametri dichiarati nel momento della dichiarazione di una funzione, i parametri attuali sono i parametri con i quali si istanzia il processo.
  2. È possibile fare in modo di avere un numero di parametri variabile in ingresso? Se sì come?
    • In genere, i sottoprogrammi ricevono un numero ben definito di parametri in ingresso; in alcune situazioni, però, può essere utile poter passare alle funzioni un numero variabile di argomenti. Molti linguaggi (come ad esempio Java, JavaScript e Python) forniscono quindi la possibilità di passare un numero variabile di parametri in ingresso ad una funzione che lo prevede, per poi essere utilizzati in modi diversi a seconda del linguaggio
  3. Cosa è la ricorsione?
    • È una funzione che nella sua definizione, direttamente o indirettamente, richiama sé stessa.
  4. Differenza tra ricorsione ed iterazione? È vero che qualunque algoritmo ricorsivo si può trasformare in iterativo?
    • L’iterazione permette di eseguire ripetutamente un blocco di codice, fintato che restino valide determinate condizioni e l’esecuzione è tutta nello stesso processo; la ricorsione si ottiene quando una funzione richiama sé stessa fino ad arrivare alla condizione di terminazione. La ricorsione permette di risolvere problemi complessi in poche righe di codice ma ha lo svantaggio di gravare molto sulle prestazioni poiché richiede un grande quantitativo di memoria.
    • Ogni algoritmo ricorsivo può essere trasformato in iterativo.
  5. Descrivere come avviene la chiamata ad una funzione ricorsiva indicando cosa avviene in memoria?
  6. Che legame esiste tra induzione matematica e ricorsione?
    • Entrambe sono legate a un caso base e al passo induttivo. Inoltre, la ricorsione è strettamente collegata al principio di induzione matematica, in quanto può essere vista quasi come la sua applicazione pratica.
  7. Tipi di costrutti iterativi:
    • Pre e post condizionato.
  8. Cosa è un compilatore e che compiti ha?
  • Per definire un puntatore a puntatore bisogna dichiarare una variabile di tipo puntatore a puntatore al tipo della variabile che stiamo puntando. L’ambito più frequente è quando si ha a che fare con gli array di stringhe. *Tipo * puntatore.
  1. Cosa è un puntatore?
  • Un puntatore è una variabile che contiene l’indirizzo di memoria di un’altra variabile da esso puntata.
  1. Cosa si intende per aritmetica dei puntatori?
  • L’aritmetica dei puntatori descrive operazioni aritmetiche sui puntatori e fra puntatori e interi.
  1. Cosa è un tipo di dato astratto?
  • Il tipo di dato astratto (ADT) è un modello comprendente un tipo e un insieme associato di operazioni che ne caratterizzano il comportamento. o Tipo: semplice o strutturato, nome che identifica il dato e definisce le operazioni. o Le operazioni: unico metodo di accesso all’ADT e costituiscono la sua interfaccia.
  • Porta vantaggi nella programmazione orientata agli oggetti come l’incapsulamento, località del cambiamento e flessibilità (è possibile avere diverse implementazioni di uno stesso ADT).
  1. Cosa è una classe?
  • Una classe rappresenta una descrizione in modo “astratto” di una categoria di oggetti, individuati da comportamenti e caratteristiche simili. I comportamenti sono chiamati metodi mentre le caratteristiche vengono definite proprietà.
  1. Diagramma delle classi?
  • È una rappresentazione grafica delle relazioni tra classi, che sono rappresentate come linee alle cui estremità specifichiamo il ruolo e la cardinalità.
  1. Diagramma delle sequenze?
  • È una rappresentazione grafica delle chiamate ai metodi e attributi, quindi delle interazioni tra oggetti, che rappresenta anche la sequenza temporale.
  1. Diagramma delle istanze?
  • È una rappresentazione grafica degli oggetti.
  1. Cosa è l’astrazione modulare?
  • L’astrazione modulare è un concetto particolarmente usato nella programmazione orientata agli oggetti che permette di risolvere problemi complessi, limitando il numero di problemi da trattare parallelamente, scomponendo ogni problema in problemi più piccoli.
  • I moduli sono collezioni di dichiarazioni che includono variabili e procedure. Agiscono come black box con cui il resto del programma interagisce attraverso le loro interfacce.
  • Ruolo : definisce ciò che le procedure fanno all’interno del modulo.
  • Interfaccia : le procedure di interfaccia determinano il comportamento del modulo per il resto del programma.
  • Implementazione : nasconde nelle parti private del modulo le decisioni che non sono di interesse per il resto del programma.
  1. Quali sono le caratteristiche del paradigma di programmazione orientato agli oggetti?
  • Incapsulamento: Proprietà che limita l’accesso diretto agli elementi dell’oggetto e/o descrive come l’oggetto interagisce con altri oggetti.
  • Ereditarietà: Proprietà che permette di definire delle classi a partire da classi già definite.
  • Polimorfismo: proprietà che permette a un oggetto di mostrare più implementazioni per una singola funzionalità.
  1. Per quale motivo ha preso piede la programmazione ad oggetti?
  • È un paradigma più vicino al modo di pensare umano. Le relazioni ed interazioni tra gli oggetti viene reso più chiaro ed intuitivo, permettendo una maggiore facilità di gestione e manutenzione di progetti di grandi dimensioni.
  1. Come si crea un oggetto a partire da una classe?
  • L’oggetto deve essere istanziato con l’istruzione new. MyClass mynewclass = new MyClass();
  1. Nella programmazione ad oggetti quale è il compito del costruttore?
  • Il costruttore è un metodo associato alla classe, che viene invocato nel momento in cui viene creata un’istanza della classe e che ha il compito di inizializzare le costanti e gli attributi dell’oggetto istanziato.
  1. Quanti costruttori può avere una classe?
  • Può averne 0 se si usa il default, o più di uno a patto che abbiano signature diverse; quindi, devono variare i parametri formali presi in input.
  1. Nella programmazione ad oggetti quale è il compito del distruttore? (garbage-collector)
  • Il distruttore è un metodo che viene invocato automaticamente quando l’esecuzione esce dallo scope dell’oggetto per liberare le risorse utilizzate.
  • In Java il distruttore è un processo in background che libera la memoria distruggendo gli oggetti non più raggiungibili, cioè quelli a cui non fa più riferimento nessuna parte del programma.
  1. Cosa si intende per encapsulation?
  • È una proprietà, tipicamente della programmazione ad oggetti, che limita l’accesso diretto agli elementi dell’oggetto e/o descrive come l’oggetto interagisce con altri oggetti.
  1. Cosa si intende per sottoclasse e superclasse nella programmazione ad oggetti?
  • La superclasse è una classe genitore che astrae il concetto comune condiviso nelle sue diverse sottoclassi.

➢ Per inclusione: Subtyping o polimorfismo dinamico stabilisce che un metodo ammesso nell’interfaccia di una classe, può essere applicato a tutti gli oggetti appartenenti a quella classe. È collegato al principio di Liskov. o Ad-hoc : ➢ Overloading: funzione o metodo o stesso operatore possono essere applicati a tipi diversi. È orizzontale. Applicati ai metodi consente di avere un metodo di classe con diverse varianti, in base ai parametri passati come riferimento. ➢ Coercion: Gli argomenti di una funzione o di un operatore vengono trasformati implicitamente nel tipo applicabile in base al contesto scelto. o Overriding: È verticale ed implica ereditarietà. Avviene quando il metodo della classe derivata sovrascrive il metodo della classe base, mantenendo inalterato il numero e il tipo parametri.

  1. Come fa una classe CHILD a ridefinire la classe PARENT?
    • Si tratta di polimorfismo per inclusione, quando chiamo il metodo del figlio con nome uguale a quello del padre, ridefinendo i tipi, per poi eseguire il metodo del figlio.
    • Per overriding, invece, la classe derivata non sarà più in grado di distinguere i due metodi; quindi, il metodo dell’antenato non sarà più disponibile.
  2. Cosa è una wild card e in che contesto si usa?
    • È un tipo parametrico variante e si rappresenta con un ‘?’. Il contesto è quello dei tipo parametrizzati o generics, nell’ambito del problema del type-safe, per garantire la correttezza del tipo a compile time. Un generic è uno strumento che permette la definizione di un tipo parametrizzato, che viene esplicitato in fase di compilazione secondo la necessità.
  3. Cosa si intende per ereditarietà multipla?
- Si intende la possibilità di una classe di poter ereditare caratteristiche da più classi. In Java non esiste l’ereditarietà multipla ma una classe può implementare più di un’interfaccia.
  1. Cosa si intende per problema del diamante?
- È il problema di ereditarietà multipla e si materializza nell’esempio in cui due classi B e C ereditano dalla classe A e la classe D eredita sia da B che da C, se un metodo D chiama un metodo definito in A, da quale classe viene ereditato? (per risolvere basta o far decidere all’utente o scegliere in automatico).
  1. Cosa si intende per ereditarietà nella programmazione ad oggetti? L’ereditarietà impatta anche i costruttori delle classi? Come?
    • È quella caratteristica che consente ad una classe child di ereditare elementi e caratteristiche dalla classe parent.
    • I costruttori non sono ereditati ed è necessario definirli nella sottoclasse che estende la superclasse, anche se è possibile richiamare il costruttore della superclasse con la keyword super.
  2. UP e DOWN Casting?
  • Sono processi di Type Casting (conversioni da un tipo ad un altro).
  • Upcasting (generalizzazione o Widening), è un casting da child type verso un parent type. Quindi l’upcasting è un casting di tipi individuali verso un tipo comune. L’upcasting in Java è implicito perché il principio di Liskov consente di poter generalizzare.
  • Downcasting (specializzazione o Narrowing) è un casting verso un child type, quindi un casting di un tipo comune verso uno individuale. Il down casting è invece esplicito.
  1. Descrivere cosa è un metodo statico in Java e dire a cosa serve?
  • Un metodo statico in Java è un metodo di classe, ovvero è relativo alla classe e non all’istanza della classe. Questo permette di utilizzare il metodo statico in assenza di un’istanza della classe.
  1. Static associato ad un attributo?
  • Un attributo static è condiviso da tutte le istanze di quella classe ed è di fatto una variabile globale per tutti gli oggetti della classe.
  1. FINAL associato a classi, metodi e attributi?
  • La keyword FINAL su classi e metodi fa sì che la classe non possa essere ereditata e il metodo non possa essere ridefinito tramite ereditarietà e ovveride. FINAL su attributi li rende costanti.
  1. PROTECTED associato ad un metodo?
  • Il metodo è visibile alle classi del package e alle sottoclassi anche di un altro package.
  1. PACKAGE in Java?
  • Un package (JAR java archive) è uno strumento per raggruppare entità in qualche modo legate fra di loro.
  1. Cosa sono e come funzionano i riferimenti agli oggetti in Java?
  • Un riferimento è un puntatore all’indirizzo di memoria dove si trova il valore dell’oggetto. Un oggetto è accessibile fino a quando esiste un riferimento che permette l’accesso. Esempio: Integer i = new Integer(5).
  1. Oggetti dinamici in Java?
  • L’istanza della classe (oggetto) è allocata dinamicamente, nello heap. Le variabili primitive e i riferimenti. Staticamente nello stack.
  1. Differenza tra puntatore (c) e riferimento (oop)
  • Mentre il puntatore consente le operazioni e può essere modificato, il riferimento è immutabile.
  1. Ridefinizione metodo da padre a figlio?
  • Override se viene sovrascritto il metodo mantenendone inalterato il prototipo. Bisogna assicurarsi che il subtype non cambi il contratto del supertype, per non violare il principio di Liskov.
  1. Cosa è Object in Java?