Clase interna en Java / Hasta ahora, hemos sabido que los miembros de la clase son variables, métodos, constructores y bloques inicializadores.
Pero también es posible tener una clase o una interfaz como un miembro de una clase.
Una clase declarada dentro de otra clase se conoce como clases anidadas en java. El ámbito de una clase anidada está vinculado por el ámbito de su clase envolvente (clase externa).
Por lo tanto, si la clase B se define dentro de la clase A, entonces la clase B no puede existir independientemente sin la clase A. Aquí, la clase A es la clase externa o envolvente y la clase B es la clase anidada.
Una clase anidada en java tiene acceso a los miembros ( incluidos los miembros privados) de su clase adjunta. Pero, la clase que encierra no tiene acceso a los miembros de la clase anidada.
La clase que es miembro de otra clase puede ser estática o no estática. En otras palabras, hay dos tipos de clases anidadas en java: estáticas y no estáticas.
La clase miembro que se declara con un modificador estático se conoce como clase anidada estática en java.
La clase miembro que no es estática se conoce como clase interna o clase anidada no estática. Es el tipo más importante de clase anidada.
En este tutorial, aprenderemos solo clase interna en Java. Más adelante, discutiremos la clase anidada estática en el tutorial adicional.
Clase interna en Java
Una clase interna en java es una clase que se declara dentro de otra clase sin modificador estático. También se conoce comúnmente como una clase anidada no estática en Java. Puede acceder a todos los miembros (variables y métodos) de su clase externa.
Una clase interna no puede tener ningún tipo de miembros estáticos. Los miembros de la clase interna de java pueden ser:
- Variables de instancia
- Métodos de instancia
- Constructores
- Bloque inicializador
- Clase interna
Sintaxis de la clase 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 clase que contiene la clase interna se llama clase envolvente o clase externa. La clase envolvente es una clase de nivel superior, mientras que la clase interna es miembro de la clase externa.
La relación entre la clase externa y la clase interna representa la relación Has-A. Una relación Has-A establece la relación entre dos clases. También se conoce como composición o agregación en Java.
Cuando una clase interna es una clase que encierra a otra clase interna, se denomina anidación de clases internas. No hay límite para la anidación de clases internas.
¿En qué versión se introdujo la clase interna en Java?
La clase interna se introdujo en la versión Java 1.1 sin ningún cambio en la JVM utilizada para manejar los archivos de clase. Está completamente implementado con la ayuda del compilador Java.
El compilador Java genera un archivo de clase dot separado para cada clase interna llamada Outer Inner Inner.clase y para una clase externa llamada Outer.clase. Por ejemplo, una clase interna A se compila en una clase Test llamada Test Test A.class.
Si algún nombre de archivo de clase de punto contiene el símbolo » $ » en su centro, muestra un archivo de clase interno. El formato de los archivos de clase para las clases internas es el mismo que el de los archivos de clase para las clases externas.
Por lo tanto, JVM trata los archivos de clase para las clases internas y las clases externas de la misma manera.
Características de la clase interna
Hay varias características importantes de una clase interna que son las siguientes:
1. Una clase interna puede tener el mismo nombre que la clase externa.
2. El alcance de la clase interna está limitado por el alcance de su clase externa.
3. Sin que exista un objeto o instancia de clase externa, no habrá posibilidad de que exista un objeto de clase interna.
4. Una clase interna puede acceder directamente a todas las variables y métodos de la clase externa, incluida la privada.
5. Dado que la clase interna es un miembro regular de la clase externa al igual que las variables y métodos declarados en la clase.
Por eso, podemos aplicar todos los modificadores de acceso java, como público, predeterminado, protegido y privado, a la clase interna similar a los demás miembros de una clase. Pero la clase externa o normal no puede ser privada o protegida.
6. Si el nombre de la variable de la clase interna es el mismo que el nombre de la variable de la clase externa, podemos acceder a la variable de la clase externa de esta manera. Nombre de capa externa.este.variableName; aquí representa el objeto de clase exterior actual.
7. La clase interna de Java está oculta de otra clase en su clase envolvente. Por lo tanto, proporciona un mecanismo de seguridad en el programa de aplicación y disminuye la legibilidad (comprensión) del programa.
8. Un objeto de clase interna a menudo se crea en su clase externa y no se puede crear a partir de otras clases.
9. Tanto los objetos de clase externa como los de clase interna se crean en ubicaciones de memoria separadas.
Sintaxis para crear un objeto de clase interna en Java
Una instancia de una clase interna comparte una relación con una instancia de una clase externa. Esta relación es tal que no podemos crear una instancia de la clase interna sin tener una instancia de la clase exterior.
Por lo tanto, para crear un objeto de clase interna, primero debe crear un objeto de clase externa para vincularlo a la clase interna. Podemos crear varios objetos de una clase interna para la misma instancia de una clase exterior.
La sintaxis para crear un objeto para la clase interna es la siguiente:
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();
Entendamos cómo una instancia de una clase interna comparte una relación con una instancia de una clase externa con ejemplos en tiempo real.
Ejemplo en tiempo real de clase interna
1. Supongamos que hay una universidad. La Universidad contiene varios departamentos como electrónica, informática, eléctrica, mecánica, etc.
Supongamos que mañana, el gobierno decidió cerrar esta universidad debido a su actividad ilegal en la universidad. Si la universidad está cerrada, todos los departamentos de esta universidad se cerrarán automáticamente.
Por eso podemos decir que los departamentos están vinculados a su universidad. es decir, sus funcionalidades están vinculadas con su universidad. Por lo tanto, sin un objeto universitario existente, no hay posibilidad de que existan objetos de departamento.
Ya que el departamento siempre forma parte de la clase universitaria. Por lo tanto, debemos declarar la clase del departamento dentro de la clase de la universidad.
class University { // University is outer class. . . . . . . . class Department { // Department is inner class. . . . . . . . . }}
Por lo tanto, sin un tipo de objeto existente, si no hay posibilidad de que exista otro tipo de objeto, debemos implementar la clase interna.
2. Supongamos que hay un coche. Dentro de un automóvil, hay varios componentes individuales importantes que se requieren. El componente más importante del automóvil es el motor.
El motor debe ser requerido para hacer un automóvil. Pero sin un objeto de automóvil existente, tampoco hay posibilidad de que exista un objeto de motor.
Ya que un motor siempre es una parte importante de un automóvil. Por lo tanto, el motor de clase debe declararse dentro del automóvil de clase.
class Car { . . . . . . . . . class Engine { . . . . . . . . . . }}
Los dos ejemplos anteriores en tiempo real se explican para obtener las ideas básicas de clase interna. Ahora tomaremos el siguiente ejemplo basado en la API de Java.
3. Como sabemos, en Java hay un concepto de mapa en la API de colecciones. Un mapa no es más que un grupo de pares clave-valor. Cada par clave-valor se llama una entrada. Ahora, sin un objeto de mapa existente, ¿hay alguna posibilidad de que exista un objeto de entrada?
La respuesta es no porque sin un objeto de mapa existente, el objeto de entrada no puede existir también. Es por eso que la entrada de interfaz se define dentro de la interfaz del mapa.
Interface Map { // Map is an outer interface. . . . . . . . . . Interface Entry { // Entry is an inner interface. . . . . . . . . . . } }
Ahora habría entendido del ejemplo en tiempo real anterior que cuando debería usar una clase interna en programación Java.
Uso de la clase interna en Java
Hay los siguientes usos importantes de la clase interna en Java.
1. La clase interna es una característica valiosa porque nos permite agrupar clases e interfaces en un solo lugar que lógicamente pertenece al conjunto.
2. Ayuda a controlar la visibilidad de uno dentro del otro para que pueda ser más legible y fácil de mantener.
3. El mejor uso de la clase interna de java es cuando su funcionalidad está vinculada a su clase externa. Es decir, sin un objeto de clase exterior existente, no hay posibilidad de que exista un objeto de clase interior. Comprenda los ejemplos en tiempo real.
4. . La clase interna de Java es útil para proporcionar seguridad para el código importante. Por ejemplo, si declaramos clase interna como privada, no está disponible para otras clases. Esto significa que un objeto a clase interna no se puede crear en ninguna otra clase.
Entendámoslo con ayuda del programa de ejemplo en tiempo real.
Supongamos que creamos una clase BankAcct. Para obtener algunos detalles de la cuenta bancaria, definimos las variables de instancia «saldo» y «tasa» de interés en la clase.
El método calInterest () calcula el importe de los intereses y mostrará el importe del saldo. Mira el siguiente código fuente.
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); }}
Ya que observa que no hay seguridad para este código porque no se utilizan modificadores de acceso antes de la clase BankAcct.
Dado que está bajo modificadores de acceso predeterminados, cualquier programador puede crear fácilmente un objeto de esta clase y acceder a los miembros de la clase desde fuera de otras clases. Por lo tanto, no hay seguridad para la clase BankAcct.
Por ejemplo, cualquier programador puede crear otra clase. Creará una instancia de clase BankAcct y puede cambiar la tasa de interés de esta manera:
class Myclass { public static void main(String args ){ BankAcct ba = new BankAcct(); ba.calInterest(11.5); } }
Por lo tanto, el método calInterest() es muy sensible. Debe estar protegido de terceros porque las cuentas de saldo pueden ser actualizadas desde el exterior por cualquier otra persona. Solo una persona autorizada debe poder actualizar las cuentas de saldo.
Para proporcionar seguridad al método calInterest () y a la tasa de interés, si colocamos el código del método calInterest () dentro de una clase interna y lo hacemos privado, nadie puede acceder a ellos desde una clase externa. Mira el código.
class BankAcct { . . . . . . . . private class Interest { private double rate; void calInterest() { double interest = bal * rate/100; bal += interest; System.out.println("Balance = " +bal); } }}
Ahora la pregunta es ¿cómo acceder a la clase interna?
Para acceder a la clase interna, crearemos un método contact () dentro de la clase externa. Método inside contact (), crearemos un objeto de clase interna y podremos acceder a los miembros del mismo.
Una persona del banco de autenticación puede interactuar con la clase interna llamando al método contact (). Cuando se llame al método contact (), se verificará con contraseña y luego podrá usar la clase interna y acceder a ella.
Por lo tanto, una clase interna puede proporcionar un mecanismo de seguridad para código importante en Java.
Tipos de clases internas en Java
Basado en declaraciones y comportamientos, hay básicamente cuatro tipos de clases internas en Java. Son los siguientes:
- Clase Interna Normal o Regular
- Método Clase Interna Local
- Clase Interna Anónima
- Clase Interna Anidada estática
En este tutorial, entenderemos cada una en breve.
1. Clase interna normal o regular: Una clase creada dentro de otra clase y fuera del método sin modificador estático se denomina clase interna normal o regular.
2. Método clase interna local: Una clase declarada dentro de un método de la clase externa se denomina método clase interna local.
3. Clase interna anónima: Una clase declarada sin ningún nombre se llama clase interna anónima.
4. Clase interna anidada estática: Una clase declarada con modificador estático dentro de una clase se denomina clase interna anidada estática. También se conoce como una clase anidada de nivel superior. Solo puede acceder a los miembros estáticos de la clase externa.
Nota: Las clases internas regulares, método local y anónimas son clases anidadas no estáticas.
Ventajas de la clase interna
Básicamente hay cinco ventajas de la clase interna en java. Son los siguientes:
1. La clase interna proporciona una forma de agrupar las clases y las interfaces en un lugar que lógicamente pertenece al conjunto.
2. Puede acceder directamente a todas las variables y métodos de la clase externa, incluida private.
3. Se utiliza para desarrollar código más legible y mantenible.
4. Necesita menos código para escribir.
5. Aumenta la encapsulación.
Diferencia entre la clase anidada y la clase interna en Java
La clase anidada es una clase que se define dentro de otra clase. Hay dos tipos de clases anidadas: estática y no estática. La clase anidada no estática es la clase interna.
Espero que este tutorial haya cubierto todas las características importantes de inner class en java con programas de ejemplo en tiempo real. Espero que hayas entendido la idea básica de usar clase interna en Java.
Gracias por leer!!!Siguiente ⇒ Clase interna de miembro en Java
Prev Anterior Siguiente ⇒