Saltar a contenido

Clases anidadas

Decimos que una clase es anidada si está contenida en otra clase. Hay varios tipos de clases anidadas en Java:

  • Clase anidada interna.
  • Clase anidada estática.
  • Clase local.
  • Clase anónima.

Clase anidada interna.

El anidamiento de una clase tiene por objetivo favorecer el encapsulamiento. Una clase anidada se dice que es interna si se la declara dentro de otra clase pero fuera de cualquier método de la clase contenedora. Puede declararse con cualquiera de los modificadores: private, protected o public.

Una característica fundamental es que una clase interna tiene acceso a todos los atributos de la clase que la contiene, luego para que exista una clase anidada interna es necesario que exista un objeto de la clase contenedora.

import java.util.ArrayList;
public class Coordenadas {
    private class Punto {
        private int x, y;
        public Punto(int x, int y) {
            fijarX(x);
            fijarY(y);
        }
        public void fijarX(int x) {
            this.x = x;
        }
        public void fijarY(int y) {
            this.y = y;
        }
        public int retornarCuadrante() {
            if (x > 0 && y > 0)
                return 1;
            else if (x < 0 && y > 0)
                return 2;
            else if (x < 0 && y < 0)
                return 3;
            else if (x > 0 && y < 0)
                return 4;
            else
                return -1;
        }
    }
    private ArrayList<Punto> puntos;
    public Coordenadas() {
        puntos = new ArrayList<Punto>();
    }
    public void agregarPunto(int x, int y) {
        puntos.add(new Punto(x, y));
    }
    public int cantidadPuntosCuadrante(int cuadrante) {
        int cant = 0;
        for (Punto pun : puntos)
            if (pun.retornarCuadrante() == cuadrante)
                cant++;
        return cant;
    }
}
public class PruebaCoordenadas {
    public static void main(String[] args) {
        Coordenadas coordenadas = new Coordenadas();
        coordenadas.agregarPunto(30, 30);
        coordenadas.agregarPunto(2, 7);
        coordenadas.agregarPunto(-3, 2);
        coordenadas.agregarPunto(-5, -4);
        coordenadas.agregarPunto(-9, -2);
        System.out.println("Cantidad de puntos en el primer cuadrante:" + coordenadas.cantidadPuntosCuadrante(1));
        System.out.println("Cantidad de puntos en el segundo cuadrante:" + coordenadas.cantidadPuntosCuadrante(2));
        System.out.println("Cantidad de puntos en el tercer cuadrante:" + coordenadas.cantidadPuntosCuadrante(3));
        System.out.println("Cantidad de puntos en el cuarto cuadrante:" + coordenadas.cantidadPuntosCuadrante(4));
    }
}

Clase anidada estática.

En Java podemos definir clases internas con el modificador static. Luego la clase interna se comporta como una clase normal de Java con la salvedad que se encuentra dentro de otra.

Para crear un objeto de la clase interna tenemos que utilizar la siguiente sintaxis

public class Externa {
    public static class Interna {
        public void imprimir() {
            System.out.println("Clase interna estática");
        }
    }
    public void imprimir() {
        System.out.println("Clase externa");
    }
}
public class PruebaClaseInterna {
    public static void main(String[] args) {
        Externa.Interna interna = new Externa.Interna();
        interna.imprimir();
    }
}

Clase local.

El lenguaje Java permite declarar una clase local a un método o inclusive a un bloque dentro de un método.

public class Externa {
    public void imprimir() {
        System.out.println("Comienzo del método imprimir de la clase Externa.");
        class Local {
            public void imprimir() {
                System.out.println("Método imprimir de la clase Local.");
            }
        }
        Local local1 = new Local();
        local1.imprimir();
        System.out.println("Fin del método imprimir de la clase Externa.");
    }
    public static void main(String[] args) {
        Externa externa1 = new Externa();
        externa1.imprimir();
    }
}

Clase anónima.

Las clases anónimas en Java son clases anidadas sin un nombre de clase. Normalmente se declaran como una subclase de una clase existente o como la implementación de una interfaz:

public class PruebaClaseAnonima {
    abstract class A {
        public abstract void imprimir();
    }
    interface B {
        void imprimir();
    }
    public void probar() {
        (new A() {
            public void imprimir() {
                System.out.println("Clase");
            }
        }).imprimir();
        (new B() {
            public void imprimir() {
                System.out.println("Interface");
            }
        }).imprimir();
    }

    public static void main(String[] args) {
        PruebaClaseAnonima p = new PruebaClaseAnonima();
        p.probar();
    }
}