Clases Internas en Java

POO

Las clases anidadas se dividen en dos categorías: la clase anidada estática y la clase interna: una clase interna es una clase anidada no estática. Sobre esto aprenderemos en este artículo.

Lectura Recomendada
Clases Anidadas

1. Clases internas

Una clase interna tiene acceso a todas las variables y métodos de su clase externa y puede referirse a ellos directamente de la misma manera que lo hacen otros miembros no estáticos de la clase externa.

Sintaxis:

clase ClaseExterior
{ 
... 
    clase ClaseInterna
    { 
        ... 
    }
Una instancia de ClaseInterna puede existir solo dentro de una instancia de ClaseExterior y tiene acceso directo a los métodos y campos de su instancia adjunta.

Para crear una instancia de una clase interna, primero debe crear una instancia de la clase externa. Luego, crea el objeto interno dentro del objeto externo con esta sintaxis:

 ClaseExterna objetoExterno=new ClaseExterna();
 ClaseExterna.ClaseInterna objetoInterno= objetoExterno.new ClaseInterna();

Ejemplo: (Comparando el ejemplo con las Clases anidadas estáticas)

// Programa Java para demostrar el acceso a una clase interna

//Clase externa
class ClaseExterna
{
    //Miembro estático
    static int externo_x=10;

    //Miembro de instancia
    int externo_y=20;

    //Miembro privado
    private int externo_privado=30;

    class ClaseInterna{
        void mostrar(){
            //Puede acceder al miembro estático de la clase externa
            System.out.println("externo_x: "+externo_x);

            //Puede acceder a un miembro no estático de la clase externa
            System.out.println("externo_y: "+externo_y);
            
            //Puede acceder a mostrar un miembro privado de la clase externa
            System.out.println("externo_privado: "+externo_privado);

        }
    }
}

 class ClaseInternaDemo{
    public static void main(String[] args) {
        //Accediendo a la clase interna
        ClaseExterna objetoExterno=new ClaseExterna();
        ClaseExterna.ClaseInterna objetoInterno= objetoExterno.new ClaseInterna();
        objetoInterno.mostrar();
    }
}

Salida:

externo_x: 10
externo_y: 20
externo_privado: 30

Hay dos tipos especiales de clases internas:

2. Ejemplo de clases internas en Java

A veces, una clase interna se utiliza para proporcionar un conjunto de servicios que solo utiliza su clase adjunta. Aquí hay un ejemplo que usa una clase interna para calcular varios valores para su clase adjunta:

Ejemplo:

// Programa Java para demostrar las clases internas

    //Clase externa
    class ClaseExterna {
    int nums[];

    ClaseExterna(int n[]){
        nums=n;
    }

    void analizar(){
        Interna inOb=new Interna();
        System.out.println("Minimo: "+inOb.min());
        System.out.println("Máximo: "+inOb.max());
        System.out.println("Promedio: "+inOb.promedio());
    }

    //Esta es una clase interna
    class Interna{
        int min(){
            int m=nums[0];

            for (int i=1;i<nums.length;i++)
                if(nums[i]<m) m= nums[i];
        return m;
        }

        int max(){
            int m=nums[0];
            for (int i=1; i<nums.length;i++)
                if (nums[i]>m) m=nums[i];
        return m;
        }

        int promedio(){
            int a=0;
            for (int i=0; i<nums.length;i++)
                a+=nums[i];
         return a/nums.length;
        }
    }
}

class ClaseAndidadaDemo {
    public static void main(String[] args) {

        int x[]={3,2,1,5,6,7,8,9};
        ClaseExterna extob= new ClaseExterna(x);
        extob.analizar();

    }
}

Salida:

Minimo: 1
Máximo: 9
Promedio: 5

En este ejemplo, la clase Interna calcula varios valores de los nums de la matriz, que es miembro de ClaseExterna. Como se explicó, una clase interna tiene acceso a los miembros de su clase envolvente, por lo que es perfectamente aceptable que Interna acceda directamente a la matriz nums. Por supuesto, lo opuesto no es verdad. Por ejemplo, no sería posible que analizar() invoque el método min() directamente, sin crear un objeto interno.

3. Diferencia entre clases estáticas e internas (anidadas no estáticas)

  • Las clases anidadas estáticas no tienen acceso directo a otros miembros (variables y métodos no estáticos) de la clase adjunta porque, como es estática, debe acceder a los miembros no estáticos de su clase adjunta a través de un objeto. Es decir, no puede hacer referencia directamente a los miembros no estáticos de su clase adjunta. Debido a esta restricción, las clases anidadas estáticas rara vez se utilizan.
  • Las clases anidadas no estáticas (clases internas) tienen acceso a todos los miembros (variables y métodos estáticos y no estáticos, incluido el privado/private) de su clase externa y pueden referirse a ellos directamente de la misma manera que otros miembros no estáticos del exterior de la clase.
Clases Anidadas
  • Clases Internas

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.