Classe interna in Java / Finora, abbiamo saputo che i membri della classe sono variabili, metodi, costruttori e blocchi di inizializzazione.
Ma è anche possibile avere una classe o un’interfaccia come membro di una classe.
Una classe dichiarata all’interno di un’altra classe è nota come classi nidificate in java. L’ambito di una classe nidificata è legato dall’ambito della sua classe che racchiude (classe esterna).
Quindi, se la classe B è definita all’interno della classe A, la classe B non può esistere indipendentemente senza la classe A. Qui, la classe A è esterna o che racchiude la classe e la classe B è nidificata.
Una classe nidificata in java ha accesso ai membri (inclusi i membri privati) della sua classe che la racchiude. Ma, la classe che racchiude non ha accesso ai membri della classe nidificata.
La classe che è un membro di un’altra classe può essere statica o non statica. In altre parole, ci sono due tipi di classi nidificate in java: statiche e non statiche.
La classe membro dichiarata con un modificatore statico è nota come classe nidificata statica in java.
La classe membro che non è statica è nota come classe interna o classe nidificata non statica. È il tipo più importante di classe nidificata.
In questo tutorial, impareremo solo classe interna in Java. Più tardi, discuteremo classe nidificata statica nel tutorial ulteriore.
Classe interna in Java
Una classe interna in java è una classe dichiarata all’interno di un’altra classe senza modificatore statico. È anche comunemente noto come una classe nidificata non statica in Java. Può accedere a tutti i membri (variabili e metodi) della sua classe esterna.
Una classe interna non può avere alcun tipo di membri statici. I membri della classe interna java possono essere:
- variabili di Istanza
- metodi di Istanza
- Costruttori
- Inizializzatore di blocco
- classe Interna
Sintassi della classe Interna
access modifier class OuterClassName { . . . . . . . . . . access modifier class InnerClassName { // Members of the inner class. } // Other members of the outer class.}For example:public class Test { // Here, Test is an outer class. . . . . . . // Inner class public class A { // A is inner class as a member of its outer class. . . . . } }
La classe che detiene la classe interna è chiamato allegando o all’esterno della classe. La classe che racchiude è una classe di primo livello mentre la classe interna è membro della classe esterna.
La relazione tra la classe esterna e la classe interna rappresenta una relazione. Una relazione Has-A stabilisce la relazione tra due classi. È anche noto come composizione o aggregazione in Java.
Quando una classe interna è una classe che racchiude per un’altra classe interna, viene chiamata nidificazione di classi interne. Non c’è limite alla nidificazione delle classi interne.
In quale versione Inner class è stata introdotta in Java?
Inner class è stata introdotta nella versione Java 1.1 senza alcuna modifica nella JVM utilizzata per gestire i file di classe. È completamente implementato con l’aiuto del compilatore Java.
Il compilatore Java genera un file di classe dot separato per ogni classe interna denominata Outer Inner Inner.classe e per una classe esterna denominata Outer.classe. Ad esempio, una classe interna A viene compilata in un test di classe denominato Test Test A.class.
Se un nome di file di classe dot contiene il simbolo “”” al centro, mostra un file di classe interno. Il formato dei file di classe per le classi interne ha lo stesso dei file di classe per le classi esterne.
Pertanto, JVM tratta i file di classe per le classi interne e le classi esterne allo stesso modo.
Caratteristiche della classe interna
Ci sono diverse caratteristiche importanti di una classe interna che è la seguente:
1. Una classe interna può avere lo stesso nome della classe esterna.
2. L’ambito della classe interna è limitato dall’ambito della sua classe esterna.
3. Senza l’esistenza di un oggetto o un’istanza di classe esterna, non ci sarà alcuna possibilità di un oggetto di classe interna esistente.
4. Una classe interna può accedere direttamente a tutte le variabili e i metodi della classe esterna, incluso private.
5. Poiché la classe interna è un membro regolare della classe esterna, proprio come le variabili e i metodi dichiarati nella classe.
Ecco perché, possiamo applicare tutti i modificatori di accesso java come pubblico, predefinito, protetto e privato alla classe interna simile agli altri membri di una classe. Ma la classe outer o normal non può essere privata o protetta.
6. Se il nome della variabile della classe interna è lo stesso del nome della variabile della classe esterna, possiamo accedere alla variabile della classe esterna in questo modo. Nome classe esterna.questo.VariableName; qui questo rappresenta l’oggetto corrente della classe esterna.
7. La classe interna Java è nascosta da un’altra classe nella sua classe che la racchiude. Pertanto, fornisce un meccanismo di sicurezza nel programma applicativo e diminuisce la leggibilità (comprensione) del programma.
8. Un oggetto di classe interna viene spesso creato nella sua classe esterna e non può essere creato da altre classi.
9. Sia la classe esterna che gli oggetti della classe interna vengono creati in posizioni di memoria separate.
Sintassi per creare oggetti di classe interna in Java
Un’istanza di una classe interna condivide una relazione con un’istanza di una classe esterna. Questa relazione è tale che non possiamo creare un’istanza della classe interna senza avere un’istanza della classe esterna.
Pertanto, per creare un oggetto di classe interna, è necessario innanzitutto creare un oggetto di classe esterna da legare alla classe interna. Possiamo creare più oggetti di una classe interna per la stessa istanza di una classe esterna.
La sintassi per creare un oggetto per la classe interna è la seguente:
Syntax: OuterClass.InnerClass innerObject = outerObject.new InnerClass();For example:// First create an object of Outer class Test. Test t = new Test();// Second create an object of inner class A. Test.A innerObj = t.new A();
Capiamo come un’istanza di una classe interna condivide una relazione con un’istanza di una classe esterna con esempi in tempo reale.
Esempio in tempo reale della classe interna
1. Supponiamo che ci sia un’università. Università contiene diversi dipartimenti come l’elettronica,informatica, elettrico, meccanico, ecc.
Supponiamo che domani il governo abbia deciso di chiudere questa università a causa della sua attività illegale che si svolge nell’università. Se l’università è chiusa, tutti i dipartimenti di questa università saranno chiusi automaticamente.
Ecco perché possiamo dire che i dipartimenti sono legati alla sua università. cioè le loro funzionalità sono legate all’università. Quindi, senza un oggetto universitario esistente, non c’è possibilità di oggetti di reparto esistenti.
Dal momento che il dipartimento è sempre una parte della classe universitaria. Quindi, dobbiamo dichiarare la classe del dipartimento all’interno della classe universitaria.
class University { // University is outer class. . . . . . . . class Department { // Department is inner class. . . . . . . . . }}
Quindi, senza un tipo di oggetto esistente, se non c’è possibilità di esistere un altro tipo di oggetto, dovremmo implementare la classe interna.
2. Supponiamo che ci sia una macchina. All’interno di un’auto, ci sono diversi componenti individuali importanti che sono richiesti. Il componente più importante dell’auto è il motore.
Il motore deve essere richiesto per fare una macchina. Ma senza un oggetto auto esistente, non c’è anche alcuna possibilità di esistere un oggetto motore.
Poiché un motore è sempre una parte importante di un’auto. Quindi, il motore di classe deve essere dichiarato all’interno della vettura di classe.
class Car { . . . . . . . . . class Engine { . . . . . . . . . . }}
I due esempi precedenti in tempo reale sono spiegati per ottenere le idee di base della classe interna. Ora prenderemo il prossimo esempio basato su Java API.
3. Come sappiamo che in Java esiste un concetto di mappa nell’API delle collezioni. Una mappa non è altro che un gruppo di coppie chiave-valore. Ogni coppia chiave-valore è chiamata una voce. Ora senza un oggetto mappa esistente, C’è qualche possibilità di oggetto entry esistente?
La risposta è no perché senza l’esistenza di un oggetto di una mappa, l’oggetto entry non può esistere. Ecco perché la voce dell’interfaccia è definita all’interno dell’interfaccia della mappa.
Interface Map { // Map is an outer interface. . . . . . . . . . Interface Entry { // Entry is an inner interface. . . . . . . . . . . } }
Ora avresti capito dall’esempio in tempo reale sopra che quando dovrebbe usare una classe interna nella programmazione Java.
Uso della classe interna in Java
Ci sono i seguenti importanti usi della classe interna in Java.
1. La classe interna è una caratteristica preziosa perché ci consente di raggruppare classi e interfacce in un unico luogo che appartiene logicamente insieme.
2. Aiuta a controllare la visibilità di uno all’interno dell’altro in modo che possa essere più leggibile e mantenibile.
3. Il miglior uso della classe interna java è quando la sua funzionalità è legata alla sua classe esterna. Cioè, senza un oggetto di classe esterna esistente, non vi è alcuna possibilità di oggetto di classe interna esistente. Comprendere gli esempi in tempo reale.
4. . Java inner class è utile per fornire sicurezza per il codice importante. Ad esempio, se dichiariamo inner class come private, non è disponibile per altre classi. Ciò significa che un oggetto per la classe interna non può essere creato in altre classi.
Capiamolo con l’aiuto del programma di esempio in tempo reale.
Supponiamo di creare una classe BankAcct. Per ottenere alcuni dettagli del conto bancario, definiamo le variabili di istanza ‘ balance ‘e’ rate ‘ di interesse nella classe.
Il metodo calInterest () calcola l’importo degli interessi e visualizza l’importo del saldo. Guarda il seguente codice sorgente.
class BankAcct { // Balance and Rate of interest. private double bal; private double rate; // Calculating interest and updated balance. void calInterest() { double interest = bal * rate/100; bal += interest; System.out.println("Balance amount = " +bal); }}
Come si osserva che non c’è sicurezza per questo codice a causa di non utilizzare alcun modificatore di accesso prima della classe BankAcct.
Poiché è sotto modificatori di accesso predefiniti, qualsiasi programmatore può facilmente creare un oggetto di questa classe e accedere ai membri della classe dall’esterno di altre classi. Quindi, non c’è sicurezza per la classe BankAcct.
Ad esempio, qualsiasi programmatore può creare un’altra classe. Creerà un’istanza della classe BankAcct e può cambiare il tasso di interesse in questo modo:
class Myclass { public static void main(String args ){ BankAcct ba = new BankAcct(); ba.calInterest(11.5); } }
Pertanto, il metodo calInterest() è molto sensibile. Deve essere protetto da estranei perché i conti di equilibrio possono essere aggiornati dall’esterno da qualsiasi altra persona. Solo persona autorizzata dovrebbe essere in grado di aggiornare i conti di equilibrio.
Per fornire sicurezza al metodo calInterest() e al tasso di interesse, se mettiamo il codice del metodo calInterest() all’interno di una classe interna e lo rendiamo privato, nessuno può accedervi dall’esterno della classe. Guarda il codice.
class BankAcct { . . . . . . . . private class Interest { private double rate; void calInterest() { double interest = bal * rate/100; bal += interest; System.out.println("Balance = " +bal); } }}
Ora la domanda è come accedere alla classe interna?
Per accedere alla classe interna, creeremo un metodo contact () all’interno della classe esterna. Metodo Inside contact (), creeremo un oggetto di classe interna e possiamo accedere ai membri di esso.
Una persona della banca di autenticazione può interagire con la classe interna chiamando il metodo contact (). Quando verrà chiamato il metodo contact (), verrà verificato con la password e quindi sarà in grado di utilizzare la classe interna e accedervi.
Pertanto, una classe interna può fornire un meccanismo di sicurezza al codice importante in Java.
Tipi di classe interna in Java
In base alla dichiarazione e ai comportamenti, esistono fondamentalmente quattro tipi di classi interne in Java. Sono i seguenti:
- Classe interna normale o regolare
- Metodo Classe interna locale
- Classe interna anonima
- Classe interna nidificata statica
In questo tutorial, capiremo ciascuno in breve.
1. Classe interna normale o regolare: una classe creata all’interno di un’altra classe e all’esterno del metodo senza modificatore statico viene chiamata classe interna normale o normale.
2. Metodo classe interna locale: una classe dichiarata all’interno di un metodo della classe esterna è chiamata metodo classe interna locale.
3. Classe interna anonima: Una classe dichiarata senza alcun nome è chiamata anonymous inner class.
4. Classe interna nidificata statica: una classe dichiarata con modificatore statico all’interno di una classe è chiamata classe interna nidificata statica. È anche conosciuto come una classe nidificata di livello superiore. Può accedere solo ai membri statici della classe esterna.
Nota: le classi interne regolari, locali e anonime sono classi nidificate non statiche.
Vantaggi della classe interna
Ci sono fondamentalmente cinque vantaggi della classe interna in java. Sono i seguenti:
1. Inner class fornisce un modo per raggruppare le classi e le interfacce in un unico luogo che appartiene logicamente insieme.
2. Può accedere direttamente a tutte le variabili e i metodi della classe esterna incluso private.
3. Viene utilizzato per sviluppare codice più leggibile e manutenibile.
4. Ha bisogno di meno codice da scrivere.
5. Aumenta l’incapsulamento.
Differenza tra classe nidificata e classe interna in Java
La classe nidificata è una classe definita all’interno di un’altra classe. Esistono due tipi di classe nidificata: statica e non statica. La classe nidificata non statica è la classe interna.
Spero che questo tutorial abbia coperto tutte le caratteristiche importanti di inner class in java con programmi di esempio in tempo reale. Spero che tu abbia capito l’idea di base dell’uso della classe interna in Java.
Grazie per la lettura!!!Avanti ⇒ Membro classe interna in Java
Pre Prev Next ⇒