Entender los diferentes tipos de clases en Java es fundamental para el desarrollo de programas eficientes y bien estructurados. A lo largo de esta guía exploraremos las clases anidadas, estáticas y internas, así como su implicación en la gestión de memoria y ventajas en programación orientada a objetos.
¿Qué son las clases estáticas anidadas?
Las clases estáticas anidadas son un tipo particular de clase dentro de otra clase. No requieren que se cree una instancia de la clase exterior para acceder a ellas. Se accede a estas clases directamente a través del nombre de la clase exterior.
Ventajas de las clases estáticas anidadas
Accesibilidad: Permiten acceder a métodos y variables estáticos sin instanciar la clase exterior.
Eficiencia: Siendo estáticas, pueden mejorar la gestión de memoria, ya que no es necesario crear múltiples objetos.
¿Cómo funcionan las clases internas?
Las clases internas, también conocidas como clases anidadas no estáticas, se declaran dentro de otra clase pero no son estáticas. A diferencia de las clases estáticas, necesitan que se instancie la clase exterior para poder acceder a ellas.
Características principales:
Instanciación: Requiere la creación de un objeto de la clase exterior antes de poder instanciarla.
Encapsulación: Permite agrupar la lógica dentro de la clase exterior impulsando una fuerte cohesión.
classExterior{classInterior{voidmostrar(){System.out.println("Método de la clase interna.");}}}// Usando la claseExterior exterior =newExterior();Exterior.Interior interior = exterior.newInterior();interior.mostrar();
¿Qué son las clases locales a un método?
Estas son clases declaradas dentro de un método específico y solo pueden ser utilizadas dentro del contexto de este método. Ofrecen un alto nivel de encapsulamiento, pero su uso práctico suele ser menos común.
Diferencias clave con otras clases:
Scope restringido: Solamente están disponibles dentro del método donde se definen.
Alcance de contextual: Permiten encapsular la lógica específica del método, brindando más control pero con un costo potencial en eficiencia.
classInclou{voidmetodo(){classLocal{voidimprimir(){System.out.println("Clase dentro de un método.");}}Local local =newLocal(); local.imprimir();}}// Usando el métodoInclou inclou =newInclou();inclou.metodo();
¿Por qué elegir las clases estáticas anidadas?
El enfoque en la eficiencia de memoria es primordial en lenguajes como Java. Las clases estáticas anidadas minimizan el número de objetos requeridos, mejorando el uso de memoria sin sacrificar funcionalidad. Este atributo las convierte en una opción preferida para proyectos con gestión de memoria crítica.
Resumen de elección:
Optimización de memoria: Al crear menos objetos, se gestiona mejor el uso de memoria.
Facilidad de acceso: Menor complejidad al no requerir instancias de la clase externa.
Consistencia: Aumenta al seguir reglas y prácticas de Java sobre la encapsulación y organización de código.
A través del estudio de estas clases, te preparamos para enfrentarte a diversos escenarios en el desarrollo con Java, permitiéndote tomar decisiones informadas respecto a estructura y eficiencia. ¡Sigue explorando y adquiriendo nuevas habilidades en el mundo de la programación orientada a objetos!
Resumen: Usen solamente las Clases Estáticas Anidadas, fin.
Jajaja vale
ty xD
Esperemos que no venga en el examen... XD
esto es un mogollon la verdad no es comun hacer estas loqueras
jajajajaja
la verdad es que al ver estas clases me empezo a doler la cabeza un poco, pero me lo tomare con calma.
Esperate a ver metodos que llaman a otro metodo y debes contar cuantas veces regresa algo o se estan haciendo una operacion
Seguro alguna vez te topaste con la recursividad, el verla por primera vez si te da la misma sensacion que describiste hace 2 anios
Lo bueno es que entendi las static :v
jajajaja
Huy esto se puso mas intenso que una novela de televisa
Las clases locales a un método son muy comunes cuando estas creando una interfaz de usuario con Java y quieres personalizar algún objeto gráfico, yo las he usado bastante de esta forma
Si especialmente para los eventos de botón o cosas así, aunque es mejor hacer una clase controladora que reciba esos eventos en cuanto a lógica es más sencillo que hacerlas locales :)
Mis apuntes de la Clase:
Clases Internas y Locales a un método
Clases Internas
También llamadas Clases anidadas no estáticas. Al no ser una Clase estática, es necesario instanciarla. Ejemplo:
// Declaración de la Clase InternapublicclassOuter{publicclassInner{}}
Para declarar este tipo de Clases hay que instanciar 2 objetos, lo que consume más espacio en memoria, por lo tanto, hay que tener cuidado al usar este tipo de Clases, de hecho este tipo de Clases no son muy comunes.
Clases Locales a un Método
Este tipo de Clases tienen un scope definido para el método al que pertenecen, en el ejemplo de abajo ese método sería el primer void run().
Si se quiere tener acceso al método run de la Clase Local, hay que crear una instancia de dicha Clase.
Declarar una Clase Local a un método
publicclassEnclosing{voidrun(){classLocal{voidrun(){...}}Local local =newLocal(); local.run();}}
Este tipo de Clases también consumen más espacio en memoria. Lo recomendable en estos casos es usar Clases estáticas anidadas para hacer un mejor uso de la memoria.
Gracias por la explicación uwu
Take a look to the link below to learn more about inner classes
Si con la clase anteriro y esta, estás con la cabeza un poco quemada, no te preocupes, no sos el único. No pares!
Resumen: Si vamos a utilizar una, que sean las clases estáticas anidadas.
Entiendo que sean recomendables usar clases Static pero, en que momento usar las otra? porque por algo están imagino....
Interesante y loco!
Les comparto mis apuntes de esta clase. espero les sea de ayuda.
Las clases internas son aquellas que se definen dentro de otra clase. Existen dos tipos de clases internas en Java: clases internas estáticas y clases internas no estáticas. Las clases internas estáticas no tienen acceso a los atributos de la clase externa, mientras que las clases internas no estáticas sí.
Las clases locales son aquellas que se definen dentro de un método. No pueden ser accedidas desde fuera del método en el que se definen y suelen utilizarse para crear objetos temporalmente en un método. A diferencia de las clases internas, las clases locales no pueden acceder a los atributos de la clase externa, a menos que se les pase una referencia a la clase externa como un parámetro.
Usted si le sabe!!!
🔮 Si utilizamos clases anidadas lo recomendable es usar clases estáticas, esto permite optimizar la memoria.
Muy loco, pero espero ver esto en la practica realmente, al verlo en la teoría no le encuentro mucho sentido xD
Esto en la actualidad no lo vas a ver, se usaba cuando se realizaban proyectos de escritorio y tenias que amarrar algún botón o algo por el estilo, pero esto es una mala práctica, aunque no está de más saber que existe en el lenguaje.
Saludos
Le acabo de preguntar a un amigo que es Senior Java, lleva años trabajando con Java en proyectos grandes para diferentes empresas en mi país, y me dice que jamás en la vida ha usado ese tipo de clases anidadas.
Pero bueno, es valido saber que existen estas formas, capaz encontremos algún caso de uso en un futuro donde podamos aplicar.
Pero esas no son todas, faltan las clases anónimas. No?
Cree que esas las enseñan en el curso de Programación funcional en Java. Creo que Anahí dijo eso en la Clase anterior
//como podemos ver el método run() contiene una declaración de
una clase, y contiene las instrucciones para instanciar la clase
y ejecutar un método del objeto instannciado.
En el main, cuando se crea un objeto de clase externa Enclosing,
se puede ejecutar el método que contiene a la clase; cuando se
ejecuta el método contenido por la clase externa, resulta que se
instancia una clase que es local al método. Luego se pueden dar
las instrucciones para que se ejecuten métodos del objeto instanciado.
CLASES LOCALES A UN MÉTODO.
El alcance (scope) es local al método.
public class Enclosing {
voidrun(){classLocal{voidrun(){}}Local local =newLocal(); local.run();}
}
public class Main {
public static void main (String[] args) {
Enclosing enclosing = new Enclosing();
enclosing.run();
}
}
Yo lo entendí así:
*Clases internas estáticas: Se usan cuando no es necesario definir un objeto de la clase externa para acceder a esta clase interna.
*Clases internas no estáticas no locales a un método: Se usan cuando es necesario definir un objeto de la clase externa para poder acceder a esta clase interna.
*Clases internas no estáticas locales a un método: Se usan cuando es necesario definir un objeto de la clase externa para acceder a esta clase interna, y además, estas clases internas tienen la propiedad de definirse dentro de un método y a su vez crear un objeto una vez se ejecuta este método. Esto último me da a entender que este tipo de clases internas se usan cuando la ejecución de cierto método implica, necesariamente, la creación de un objeto.