La programmazione orientata agli oggetti, o OOP, è un paradigma di programmazione che implementa il concetto di oggetti nel programma. Mira a fornire una soluzione più semplice ai problemi del mondo reale implementando entità del mondo reale come ereditarietà, astrazione, polimorfismo, ecc. nella programmazione. Il concetto di OOP è ampiamente utilizzato in molti linguaggi popolari come Java, Python, C++, ecc.

Gli OOP sono anche uno degli argomenti più importanti per la programmazione delle interviste. Questo articolo ne contiene alcuni domande principali dell'intervista sul concetto di OOP.
Domande per l'intervista OOP
1. Cos'è la programmazione orientata agli oggetti (OOP)?
O oggetto O orientato P programmazione (noto anche come OOP) è un paradigma di programmazione in cui il software completo funziona come un insieme di oggetti che comunicano tra loro. Un oggetto è una raccolta di dati e i metodi che operano su tali dati.
2. Perché gli OOP?
Il vantaggio principale dell'OOP è un codice meglio gestibile che copre quanto segue:
- La comprensione complessiva del software aumenta man mano che aumenta la distanza tra la lingua parlata dagli sviluppatori e quella parlata dagli utenti.
- L'orientamento agli oggetti facilita la manutenzione mediante l'uso dell'incapsulamento. È possibile modificare facilmente la rappresentazione sottostante mantenendo gli stessi metodi.
- Il paradigma OOP è utile principalmente per software relativamente grandi.
3. Cos'è una classe?
UN classe è un elemento costitutivo dei programmi orientati agli oggetti. È un tipo di dati definito dall'utente che contiene i membri dati e le funzioni membro che operano sui membri dati. È come un progetto o un modello di oggetti con proprietà e metodi comuni.
4. Cos'è un oggetto?
UN oggetto è un'istanza di una classe. I membri dati e i metodi di una classe non possono essere utilizzati direttamente. Dobbiamo creare un oggetto (o un'istanza) della classe per usarli. In termini semplici, sono le entità del mondo reale che hanno uno stato e un comportamento.
C++ #include using namespace std; // defining class class Student { public: string name; }; int main() { // creating object Student student1; // assigning member some value student1.name = 'Rahul'; cout << 'student1.name: ' << student1.name; return 0; }> Giava // class definition class Student { String name; } class GfG { public static void main(String args[]) { // creating an object Student student1 = new Student(); // assigning member some value student1.name = 'Rahul'; System.out.println('student1.name: ' + student1.name); } }> Pitone # class definition class Student: name = '' # creating object student1 = Student() student1.name = 'Rahul'; print('student1.name: ' + student1.name);> C# using System; // defining class public class Student { public string name; } public class GFG { static public void Main() { // creating object Student student1 = new Student(); student1.name = 'Rahul'; Console.WriteLine('student1.name: ' + student1.name); } }> Produzione
student1.name: Rahul>
5. Quali sono le caratteristiche principali degli OOP?
Le caratteristiche principali degli OOP, noti anche come 4 pilastri o principi di base degli OOP, sono le seguenti:
stringa su json java
- Incapsulamento
- Astrazione dei dati
- Polimorfismo
- Eredità

Caratteristiche principali degli OOP
6. Cos'è l'incapsulamento?
L'incapsulamento è l'associazione di dati e metodi che li manipolano in una singola unità in modo tale che i dati sensibili siano nascosti agli utenti
Viene implementato come i processi menzionati di seguito:
- Dati nascosti: Una funzionalità del linguaggio per limitare l'accesso ai membri di un oggetto. Ad esempio, membri privati e protetti in C++.
- Raggruppamento di dati e metodi insieme: I dati e i metodi che operano su tali dati vengono raggruppati insieme. Ad esempio, i membri dati e i metodi membro che operano su di essi sono racchiusi in una singola unità nota come classe.

7. Cos'è l'astrazione?
L'astrazione è simile all'incapsulamento dei dati ed è molto importante nell'OOP. Significa mostrare solo le informazioni necessarie e nascondere all'utente le altre informazioni irrilevanti. L'astrazione viene implementata utilizzando classi e interfacce.

8. Cos'è il polimorfismo?
La parola Polimorfismo significa avere molte forme. È proprietà di alcuni codici comportarsi diversamente a seconda dei contesti. Ad esempio, nel linguaggio C++ possiamo definire più funzioni con lo stesso nome ma funzionamento diverso a seconda del contesto.
Il polimorfismo può essere classificato in due tipi in base al momento in cui viene risolta la chiamata all'oggetto o alla funzione. Sono i seguenti:
- Polimorfismo in fase di compilazione
- Polimorfismo di runtime
A) Polimorfismo in fase di compilazione
Il polimorfismo in fase di compilazione, noto anche come polimorfismo statico o associazione anticipata, è il tipo di polimorfismo in cui l'associazione della chiamata al relativo codice viene eseguita in fase di compilazione. L'overload del metodo o l'overload dell'operatore sono esempi di polimorfismo in fase di compilazione.
B) Polimorfismo di runtime
Conosciuto anche come polimorfismo dinamico o associazione tardiva, il polimorfismo di runtime è il tipo di polimorfismo in cui l'effettiva implementazione della funzione viene determinata durante il runtime o l'esecuzione. L'override del metodo è un esempio di questo metodo.
9. Cos'è l'ereditarietà? Qual è il suo scopo?
L'idea dell'ereditarietà è semplice, una classe deriva da un'altra classe e utilizza i dati e l'implementazione di quell'altra classe. La classe derivata è chiamata figlia o derivata o sottoclasse e la classe da cui deriva la classe figlia è chiamata genitore o base o superclasse.
Lo scopo principale dell'ereditarietà è aumentare la riusabilità del codice. Viene utilizzato anche per ottenere il polimorfismo di runtime.
10. Cosa sono gli specificatori di accesso? Qual è il loro significato negli OOP?
Gli specificatori di accesso sono tipi speciali di parole chiave utilizzate per specificare o controllare l'accessibilità di entità come classi, metodi e così via. Privato , Pubblico , E Protetto sono esempi di specificatori di accesso o modificatori di accesso.
I componenti chiave degli OOP, l'incapsulamento e l'occultamento dei dati, sono in gran parte raggiunti grazie a questi specificatori di accesso.
11. Quali sono i vantaggi e gli svantaggi degli OOP?
Vantaggi degli OOP | Svantaggi degli OOP |
|---|---|
| Gli OOP forniscono una maggiore riusabilità del codice. | Il programmatore dovrebbe essere ben qualificato e dovrebbe avere un'ottima capacità di pensare in termini di oggetti poiché tutto è trattato come un oggetto negli OOP. |
| Il codice è più facile da mantenere e aggiornare. | È necessaria una pianificazione adeguata perché gli OOP sono un po' complicati. |
| Fornisce una migliore sicurezza dei dati limitando l'accesso ai dati ed evitando esposizioni non necessarie. | Il concetto di OOP non è adatto a tutti i tipi di problemi. |
| Veloce da implementare e facile da riprogettare, con conseguente riduzione al minimo della complessità di un programma complessivo. | La durata dei programmi è molto maggiore rispetto all'approccio procedurale. |
12. Quali altri paradigmi di programmazione esistono oltre agli OOP?
Il paradigma di programmazione si riferisce alla tecnica o all'approccio con cui si scrive un programma. I paradigmi di programmazione possono essere classificati nei seguenti tipi:

1. Paradigma di programmazione imperativa
È un paradigma di programmazione che funziona modificando lo stato del programma attraverso istruzioni di assegnazione. L’obiettivo principale in questo paradigma è come raggiungere l’obiettivo. In questa categoria rientrano i seguenti paradigmi di programmazione:
- Paradigma di programmazione procedurale : Questo paradigma di programmazione si basa sul concetto di chiamata di procedura. Le procedure, note anche come routine o funzioni, sono gli elementi costitutivi di base di un programma in questo paradigma.
- Programmazione orientata agli oggetti o OOP : In questo paradigma, visualizziamo ogni entità come un oggetto e proviamo a strutturare il programma in base allo stato e al comportamento di quell'oggetto.
- Programmazione parallela : Il paradigma di programmazione parallela prevede l'elaborazione delle istruzioni dividendole in più parti più piccole ed eseguendole contemporaneamente.
2. Paradigma di programmazione dichiarativa
La programmazione dichiarativa si concentra su ciò che deve essere eseguito piuttosto che su come dovrebbe essere eseguito. In questo paradigma, esprimiamo la logica di un calcolo senza considerare il suo flusso di controllo. Il paradigma dichiarativo può essere ulteriormente classificato in:
- Paradigma di programmazione logica : Si basa sulla logica formale in cui le dichiarazioni del programma esprimono i fatti e le regole relativi al problema in forma logica.
- Paradigma della Programmazione Funzionale : I programmi vengono creati applicando e componendo funzioni in questo paradigma.
- Paradigma di programmazione di database : Per gestire dati e informazioni organizzati come campi, record e file, vengono utilizzati modelli di programmazione di database.
13. Qual è la differenza tra programmazione strutturata e programmazione orientata agli oggetti?
La programmazione strutturata è una tecnica considerata precursore dell'OOP e solitamente consiste in moduli ben strutturati e separati. È un sottoinsieme della programmazione procedurale. La differenza tra OOP e programmazione strutturata è la seguente:
Programmazione orientata agli oggetti | Programmazione strutturale |
|---|---|
| La programmazione orientata agli oggetti si basa su oggetti aventi uno stato e un comportamento. | La struttura logica di un programma è fornita dalla programmazione strutturale, che divide i programmi nelle funzioni corrispondenti. |
| Segue un approccio dal basso verso l’alto. | Segue un approccio Top-to-Down. |
| Limita il flusso aperto di dati solo alle parti autorizzate fornendo una migliore sicurezza dei dati. | Nessuna restrizione al flusso dei dati. Chiunque può accedere ai dati. |
| Riutilizzabilità del codice migliorata grazie ai concetti di polimorfismo ed ereditarietà. | La riusabilità del codice si ottiene utilizzando funzioni e loop. |
| In questo, i metodi vengono scritti globalmente e le righe di codice vengono elaborate una per una, ovvero eseguite in sequenza. | In questo, il metodo funziona dinamicamente, effettuando chiamate secondo la necessità del codice per un certo tempo. |
| Modificare e aggiornare il codice è più semplice. | La modifica del codice è difficile rispetto agli OOP. |
| Ai dati viene data maggiore importanza negli OOP. | Al codice viene data più importanza. |
14. Quali sono alcuni linguaggi di programmazione orientati agli oggetti comunemente usati?
Il paradigma OOP è uno dei paradigmi di programmazione più popolari. È ampiamente utilizzato in molti linguaggi di programmazione popolari come:
tutorial sul selenio
- C++
- Giava
- Pitone
- Javascript
- C#
- Rubino
15. Quali sono i diversi tipi di polimorfismo?
Il polimorfismo può essere classificato in due tipi in base al momento in cui viene risolta la chiamata all'oggetto o alla funzione. Sono i seguenti:
- Polimorfismo in fase di compilazione
- Polimorfismo di runtime

Tipi di polimorfismo
A) Polimorfismo in fase di compilazione
Il polimorfismo in fase di compilazione, noto anche come polimorfismo statico o associazione anticipata, è il tipo di polimorfismo in cui l'associazione della chiamata al relativo codice viene eseguita in fase di compilazione. Sovraccarico del metodo O sovraccarico dell'operatore sono esempi di polimorfismo in fase di compilazione.
B) Polimorfismo di runtime
Conosciuto anche come polimorfismo dinamico o associazione tardiva, il polimorfismo di runtime è il tipo di polimorfismo in cui l'effettiva implementazione della funzione viene determinata durante il runtime o l'esecuzione. Metodo prioritario è un esempio di questo metodo.
16. Qual è la differenza tra sovraccarico e override?
Una funzionalità di polimorfismo in fase di compilazione chiamata sovraccarico consente a un'entità di avere numerose implementazioni con lo stesso nome. L'overload del metodo e l'overload dell'operatore sono due esempi.
Preponderante è una forma di polimorfismo di runtime in cui viene eseguita un'entità con lo stesso nome ma con un'implementazione diversa. È implementato con l'aiuto di funzioni virtuali.
17. Esistono limitazioni all'ereditarietà?
SÌ, ci sono più sfide quando hai più autorità. Sebbene l'ereditarietà sia una caratteristica OOP molto potente, presenta anche notevoli inconvenienti.
- Poiché deve passare attraverso diverse classi per essere implementata, l'ereditarietà richiede più tempo per essere elaborata.
- Anche la classe base e la classe figlia, entrambe impegnate nell'ereditarietà, sono strettamente correlate tra loro (chiamate strettamente accoppiate). Pertanto, se è necessario apportare modifiche, potrebbe essere necessario apportarle in entrambe le classi contemporaneamente.
- Anche l'implementazione dell'ereditarietà potrebbe essere difficile. Pertanto, se non implementato correttamente, ciò potrebbe causare errori imprevisti o risultati imprecisi.
18. Quali diversi tipi di eredità esistono?
L'ereditarietà può essere classificata in 5 tipi che sono i seguenti:

- Eredità singola: Classe figlia derivata direttamente dalla classe base
- Eredità multipla: Classe figlio derivata da più classi base.
- Eredità multilivello: Classe figlia derivata dalla classe derivata anch'essa da un'altra classe base.
- Eredità gerarchica: Più classi figlie derivate da una singola classe base.
- Eredità ibrida: Eredità costituita da più tipi di eredità di quanto sopra specificato.
Nota: Il tipo di ereditarietà supportata dipende dalla lingua. Ad esempio, Java non supporta l'ereditarietà multipla.
19. Cos'è un'interfaccia?
Un tipo di classe univoco noto come interfaccia contiene metodi ma non le relative definizioni. All'interno di un'interfaccia è consentita solo la dichiarazione del metodo. Non è possibile creare oggetti utilizzando un'interfaccia. È invece necessario mettere in uso quell'interfaccia e specificare le procedure per farlo.
20. In che modo una classe astratta è diversa da un'interfaccia?
Sia le classi astratte che le interfacce sono tipi speciali di classi che includono solo la dichiarazione dei metodi, non la loro implementazione. Tuttavia, una classe astratta è completamente distinta da un'interfaccia. Di seguito sono riportate alcune delle principali differenze tra una classe astratta e un'interfaccia.
Classe astratta | Interfaccia |
|---|---|
| Quando una classe astratta viene ereditata, tuttavia, la sottoclasse non è tenuta a fornire la definizione del metodo astratto finché e a meno che la sottoclasse non lo utilizzi effettivamente. | Quando viene implementata un'interfaccia, la sottoclasse deve specificare tutti i metodi dell'interfaccia e la loro implementazione. |
| Una classe astratta può avere sia metodi astratti che non astratti. | Un'interfaccia può avere solo metodi astratti. |
| Una classe astratta può avere variabili finali, non finali, statiche e non statiche. | L'interfaccia ha solo variabili statiche e finali. |
| La classe astratta non supporta l'ereditarietà multipla. | Un'interfaccia supporta l'ereditarietà multipla. |
21. Quanta memoria occupa una classe?
Le classi non utilizzano la memoria. Servono semplicemente come modello da cui vengono realizzati gli articoli. Ora, gli oggetti inizializzano effettivamente i membri della classe e i metodi quando vengono creati, utilizzando la memoria nel processo.
linux esegui cmd
22. È sempre necessario creare oggetti dalla classe?
NO. Se la classe base include metodi non statici, è necessario costruire un oggetto. Ma non è necessario generare oggetti se la classe include metodi statici. In questo caso, puoi utilizzare il nome della classe per chiamare direttamente questi metodi statici.
23. Qual è la differenza tra una struttura e una classe in C++?
Anche la struttura è un tipo di dati definito dall'utente in C++ simile alla classe con le seguenti differenze:
- La differenza principale tra una struttura e una classe è che in una struttura i membri sono pubblici per impostazione predefinita mentre in una classe i membri sono privati per impostazione predefinita.
- L'altra differenza è che usiamo struttura per dichiarare la struttura e classe per dichiarare una classe in C++.
24. Cos'è Costruttore?
Un costruttore è un blocco di codice che inizializza l'oggetto appena creato. Un costruttore assomiglia a un metodo di istanza ma non è un metodo poiché non ha un tipo restituito. Generalmente è il metodo che ha lo stesso nome della classe ma in alcune lingue potrebbe differire. Per esempio:
In Python viene nominato un costruttore __caldo__.
In C++ e Java, il costruttore ha lo stesso nome del nome della classe.
Esempio:
C++ class base { public: base() { cout << 'This is a constructor'; } }> Giava class base { base() { System.out.printIn('This is a constructor'); } }> Pitone class base: def __init__(self): print('This is a constructor')> 25. Quali sono i vari tipi di costruttori in C++?
La classificazione più comune dei costruttori include:
- Costruttore predefinito
- Costruttore non parametrizzato
- Costruttore parametrizzato
- Copia costruttore
1. Costruttore predefinito
Il costruttore predefinito è un costruttore che non accetta argomenti. Si tratta di un costruttore non parametrizzato che viene definito automaticamente dal compilatore quando non viene fornita alcuna definizione esplicita del costruttore.
Inizializza i membri dati sui loro valori predefiniti.
2. Costruttore non parametrizzato
È un costruttore definito dall'utente che non ha argomenti o parametri.
Esempio:
C++ class base { base() { cout << 'This is a non-parameterized contructor'; } }> Giava class base { base() { System.out.printIn( 'This is a non-parameterized constructor.'); } }> Pitone class base: def __init__(self): print('This is a non-parameterized constructor')> 3. Costruttore parametrizzato
I costruttori che accettano alcuni argomenti sono noti come costruttori con parametri.
Esempio:
class base { public: int base; base(int var) { cout << 'Constructor with argument: ' << var; } };> Giava class base { int base; base(int a) { System.out.println('Constructor with argument: ' + a); } }> Pitone class base: def __init__(self, a): print('Constructor with argument: {}'.format(a))> 4. Copia costruttore
Un costruttore di copie è una funzione membro che inizializza un oggetto utilizzando un altro oggetto della stessa classe.
derivati parziali nel lattice
Esempio:
C++ class base { int a, b; base(base& obj) // copy constructor { a = obj.a; b = obj.b; } }> Giava class base { int a, b; base(base obj) // copy constructor { a = obj.a; b = obj.b; } }>
In Python non abbiamo costruttori di copie incorporati come Java e C++ ma possiamo creare una soluzione alternativa utilizzando metodi diversi.
26. Cos'è un distruttore?
Un distruttore è un metodo che viene chiamato automaticamente quando l'oggetto viene creato nell'ambito o distrutto.
In C++, anche il nome del distruttore è uguale al nome della classe ma con ( ~ ) simbolo della tilde come prefisso.
In Python, il distruttore viene nominato __del__ .
Esempio:
C++ class base { public: ~base() { cout << 'This is a destructor'; } }> Pitone class base: def __del__(self): print('This is destructor')>
In Java, il garbage collector elimina automaticamente gli oggetti inutili, quindi in Java non esiste il concetto di distruttore. Avremmo potuto utilizzare il metodo finalize() come soluzione alternativa per il distruttore Java, ma è anche deprecato a partire da Java 9.
27. Possiamo sovraccaricare il costruttore in una classe?
Sì Possiamo sovraccaricare il costruttore in una classe in Java. L'overload del costruttore viene eseguito quando vogliamo un costruttore con un costruttore diverso con parametri diversi (numero e tipo).
28. Possiamo sovraccaricare il distruttore in una classe?
No. Un distruttore non può essere sovraccaricato in una classe. Può essere presente un solo distruttore in una classe.
29. Cos'è la funzione virtuale?
Una funzione virtuale è una funzione utilizzata per sovrascrivere un metodo della classe genitore nella classe derivata. Viene utilizzato per fornire astrazione in una classe.
In C++, una funzione virtuale viene dichiarata utilizzando la parola chiave virtual,
In Java ogni metodo pubblico, non statico e non finale è una funzione virtuale.
I metodi Python sono sempre virtuali.
Esempio:
C++ class base { virtual void print() { cout << 'This is a virtual function'; } }> Giava class base { void func() { System.out.printIn('This is a virtual function') } }> Pitone class base: def func(self): print('This is a virtual function')> 30. Cos'è la pura funzione virtuale?
Una funzione virtuale pura, nota anche come funzione astratta, è una funzione membro che non contiene alcuna istruzione. Questa funzione è definita nella classe derivata, se necessario.
Esempio:
C++ class base { virtual void pureVirFunc() = 0; }> Giava abstract class base { abstract void prVirFunc(); }>
In Python, otteniamo questo risultato utilizzando @abstractmethod dal modulo ABC (Abstract Base Class).
Domanda bonus
Cos'è una classe astratta?
In termini generali, una classe astratta è una classe destinata ad essere utilizzata per l'ereditarietà. Non è possibile istanziarlo. Una classe astratta può essere composta sia da metodi astratti che non astratti.
In C++, una classe astratta è una classe che contiene almeno una funzione virtuale pura.
In Java, una classe astratta viene dichiarata con an astratto parola chiave.
formattazione stringhe java
Esempio:
C++ class absClass { public: virtual void pvFunc() = 0; }> Giava abstract class absClass { // body }>
In Python, utilizziamo il modulo ABC (Abstract Base Class) per creare una classe astratta.
Deve fare riferimento:
- OOP in C++
- OOP in Java
- OOP in Python
- Classi e oggetti in C++
- Classi e oggetti in Java
- Classi e oggetti in Python
- Introduzione ai paradigmi di programmazione
- Interfaccia in Java
- Classe astratta in Java
- Domande di intervista in C++