Entender la Programación orientada a objetos

1

Programación Orientada a Objetos con Java Avanzado

2

Modelado de Objetos: Propiedades y Comportamientos

3

Abstracción y UML: Modelado de Clases en Programación OO

4

Modularidad en Programación Orientada a Objetos

Definir Clases y sus componentes

5

Programación Orientada a Objetos en Java: Creación de Clases y Objetos

6

Métodos Constructores en Java: Creación de Objetos y Uso Eficiente

7

Métodos y variables estáticas en Java: Uso y diferencias.

8

Java: Usando Atributos y Métodos Estáticos Para Identificadores Únicos

9

Variables y Métodos Estáticos en Java

10

Sobrecarga de Métodos y Constructores en Java

11

Gestión de Pacientes en Java: Clase y Atributos Básicos

12

Encapsulamiento de Datos en Java: Modificadores de Acceso

13

Métodos Getters y Setters en Programación Orientada a Objetos

14

Conceptos Básicos de Objetos y Variables en Programación

15

Ubicación de Variables y Objetos en Memoria: Stack vs Heap

16

Clases Internas y Estáticas en Java: Uso y Beneficios

17

Clases Anidadas y Locales en Java: Diferencias y Usos

18

Uso y características de Enum en Java

Reutilizar Código

19

Herencia en Programación: Reutilización y Abstracción de Clases

20

Atributos y Herencia en Clases Médicas con Java

21

Herencia y sobreescritura de métodos en Java

22

Sobreescritura de métodos en Java: Aplicaciones prácticas

23

Herencia y Polimorfismo en Programación Orientada a Objetos

24

Composición de Interfaces en Programación Java

25

Uso de Java Collections: Interfaces Set, List y Map

Aplicar Abstracción

26

Polimorfismo: Herencia y Clases Abstractas en Programación

27

Métodos Abstractos en Programación Orientada a Objetos

28

Clases Anónimas en Java: Uso y Aplicaciones Prácticas

29

Diferencias entre las Interfaces y las Clases Abstractas

30

Interfases en Java 8 y 9: Novedades en Modificadores de Acceso

31

Herencia Múltiple en Interfaces Java 8+

Ensamblando Objetos el proyecto

32

Simulación de Autenticación de Usuarios con Java

33

Creación de Menús Interactivos en Java

34

Formato de Fechas en Aplicaciones Java

35

Programación Orientada a Objetos en Java: Clases y Métodos Avanzados

36

Mapeo de Colecciones en Java: Clave-Valor y Estructuras de Árbol

37

Manejo de Estructuras de Datos en Agendas Médicas

38

Patrones de Diseño en Java: Crear Aplicaciones Modulares

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Java SE Orientado a Objetos

Curso de Java SE Orientado a Objetos

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Clases Anidadas y Locales en Java: Diferencias y Usos

17/38
Recursos

¿Cuáles son los tipos de clases en Java?

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.
class Exterior {
    class Interior {
        void mostrar() {
            System.out.println("Método de la clase interna.");
        }
    }
}
// Usando la clase
Exterior exterior = new Exterior();
Exterior.Interior interior = exterior.new Interior();
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.
class Inclou {
    void metodo() {
        class Local {
            void imprimir() {
                System.out.println("Clase dentro de un método.");
            }
        }
        Local local = new Local();
        local.imprimir();
    }
}
// Usando el método
Inclou inclou = new Inclou();
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!

Aportes 77

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Resumen: Usen solamente las Clases Estáticas Anidadas, fin.

Esperemos que no venga en el examen… XD

la verdad es que al ver estas clases me empezo a doler la cabeza un poco, pero me lo tomare con calma.

Lo bueno es que entendi las static :v

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

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 Interna
      public class Outer {
          public class Inner {
      
          }
      }
      

      Llamar a la Clase:

      public class Main {
          public static void main(String[] args) {
            Outer outer = new Outer();
            Outer.Inner inner = outer.new Inner();
          }
      }
      

      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

      public class Enclosing {
          void run() {
              class Local {
                  void run() {
                      ...
                  }
              }
              Local local = new Local();
              local.run();
          }
      }
      

      Instanciar una Clase Local a un método

      public class Main {
          public static void main(String[] args) {
          	Enclosing enclosing = new Enclosing();
              enclosing.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.

Take a look to the link below to learn more about inner classes

Esp: https://javadesdecero.es/poo/clases-internas/
Eng: https://www.tutorialspoint.com/java/java_innerclasses

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!

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.

Les comparto mis apuntes de esta clase. espero les sea de ayuda.



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.

🔮 Si utilizamos clases anidadas lo recomendable es usar clases estáticas, esto permite optimizar la memoria.

Pero esas no son todas, faltan las clases anónimas. No?

//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 {

void run() {
    
    class Local {
        void run () {
        }   
    }

    Local local = new Local ();
    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.

muy interesante, pero mejor es con ejemplo

En el codigo de un proyecto grande que me toco trabajar si vi este tipo de clases estaticas internas, y hasta ahora entiendo el por que.

La mejor opción es utilizar las clases anidadas estáticas evitando crear varios objetos desperdiciando espacio de la memoria heap.

los ejemplos de código que se usan para explicar son muy poco descriptivos,ya es difícil la teoría de por si como para complicarlo más… siempre empiezan los cursos explicando muy bien y muy claro y llega un punto que el profesor empieza a liarlo todo y uno se frustra y se pierde.

mi practica:

public class clases_local {
private int  a = 10;
    void run1(){

        class corre{
            int b = 20;
            void run2(){
                System.out.println(a+b);
            }
        }

        corre c = new corre();
        c.run2();
    }



}
 //CLASES LOCALES A UN METODO
    clases_local cl = new clases_local();
    cl.run1();

Me imagino que las clases dentro de otra clases instancia varios objetos, hay menos eficiencia en la memoria que usarlas estaticas para ser mas concreto, son dos formas de verlas hasta mas facil se ve tener clases anidadas

Para quienes vienen de JavaScript puede salir mucho más fácil aprender Java, en especial si se sabe TypeScript y por ejemplo se ha trabajado con Nest.js o Angular.

Entonces, solo se deben usar Clases Estáticas Anidadas

solo he visto clases estáticas anidadas.

😃 estáticas anidadas

profe usted me a bolado la cabeza jajajaja regresare aqui mas de una vex créame
Esto deberia ser ilegal
Scope de las clases internas según lo que entendí: El alcance o scope de las clases internas es para una clase exterior. Scope de clases locales a un método: Como su nombre lo indica aplica para el metodo de una clase exterior.
En Java, las **clases internas no estáticas** tienen una **relación especial con las instancias de la clase contenedora**. <u>Cada instancia de la clase interna está asociada a una instancia específica de la clase contenedora</u>. Por lo tanto, **necesitas una instancia de la clase contenedora para crear una instancia de la clase interna**. ![](https://static.platzi.com/media/user_upload/image-5bac0bba-fe22-42a4-9147-d7d76a256466.jpg) ![](https://static.platzi.com/media/user_upload/image-dbdc69f9-3663-4042-b67b-4568071af720.jpg)
Amo tu vos en velocidad 1.75x xD

En mi experiencia, hay casos donde hay particularidades del negocio y varias formas de abordarlo: con objetos, con arrays, con clases anidadas, y vale la pena conocerlo, para tener una opción más para aquellos casos particulares que se presentan rara vez.

Clases Internas:
Se instancian las dos clases.
Dependiendo de las clases internas se crearan los objetos ya que una clase depende la otra (si fuera estática no hay necesidad de instanciar).
No son muy comunes.

Clases locales a un método:
Se desperdicia memoria.
Analisis código:
Dentro de Enclosing está el método run y dentro del método run esta la clase local y dentro de la clase local está el método run.
El método run de la clase local solo se puede usar dentro del run de enclosing

Suena muy complicado el manejo de estas clases :c

Las clases anidadas internas y las clases locales a un método no son tan comunes en el desarrollo de software a nivel de aplicaciones empresariales o grandes sistemas, pero pueden ser útiles en algunos casos específicos.

Las clases anidadas internas pueden ser útiles cuando se quiere encapsular el comportamiento de una clase dentro de otra clase y limitar su accesibilidad solo a la clase exterior. Por ejemplo, en una aplicación gráfica, se puede utilizar una clase interna para representar un control en una ventana y limitar su accesibilidad a la clase que representa la ventana.

Las clases locales a un método son útiles cuando se quiere crear una clase para un propósito específico en un método y no se necesita acceder a ella desde otras partes del código. Por ejemplo, en un algoritmo de ordenamiento, se puede utilizar una clase local para comparar elementos y ordenarlos en el método de ordenamiento.

En general, el uso de clases anidadas internas y clases locales a un método debe ser limitado y solo debe ser utilizado cuando realmente aporten claridad y simplicidad al código y cuando se necesite una limitación de acceso o un alcance específico.

Yo habia visto Java hace un tiempo, pero nunca habia visto esto de clases anidadas.

Hablando de eficiencia.
Tengo entendido que lo que declares dentro de un scope {} se borrará al finalizar el scope de esta manera:
{
int x=1; // se crea x

}// se borra x
Entonces no seria mas eficiente declarar e instanciar una clase dentro de un método para que luego al finalizar el scope esta se auto elimine? (Comportamiento de la memoria Stack).

   /*
   public class Outer{
     public class Inner{
     }
   }

   // para acceder a la clase inner, necesito
   1. Crear un objeto outer
   Outer outer = new Outer()

   2. Acceder ahora si, a inner
   Outer.Inner inner = outer.new Inner();
   */

    /* CLASES LOCALES A UN METODO
    public class Enclosing{
     //metodo
     void run(){
     class local{
      void run (){

       }
      }
      //Acceder metodo local
      Local local = new Local();
      local.run();
     }
    }

    // Acceder al metodo, se hace lo mismo

    //Objeto Enclosing
    Enclosing enclosing = new Enclosing()
    enclosin.run()
    * */

No conocía esta forma de anidar

Resumen de esta clase y la clase anterior:

Las clases pueden tener definidas otras clases en el interior.
Existen 2 tipos de clases, las estáticas y las no estáticas.
Las clases estáticas no necesitan ser instanciadas para utilizarse.

Una clase estática sirve principalmente como una estructura de datos de, por ejemplo, c++ o c#.

Es que eso me suene como a mala práctica. Existen pero no sería tan bueno usarlas. No creen ?

Tratando de entender

quede echo nudo, es mejor utilizar solo clases estaticas anidadas según se requiera

No es muy dificil, simplemente necesitar tener un ejemplar para poder obtener un objeto de la clase anidada

minuto : 5.42 🤣🤣🤣

claro. igual esta bueno por si nos llegamos a topar con un problema en el trabajo a resolver

Lo importante es que hay salud!!..

Nooo mentiras, realmente importante antes de conocer a cabalidad su funcionamiento e implementacion, es saber que existen y saber que las podemos encontrar en el camino y que se podrían presentar casos de uso muy específicos donde se implementen.
Pero importante, ya tenemos el concepto!!!
💻
Great Class 💚💚

jajjja ya entiendo por que a la gente no le gusta Java

No sé qué tan correcto sea esto, pero igual se puede hacer

Outer.Inner inner = new Outer().new Inner();

Y así evitamos tener una instancia de la clase Outer solo para instanciar la clase Inner

Nunca habia visto un for como este:

for (Doctor.AvailableAppointment aA: myDoctor.getAvailableAppointments()){ System.out.println(aA.getDate() + " " + aA.getTime()) }

aA es una suerte de variable tipo AvailableAppointment, que va a recorrer myDoctor.getAvailableAppointments?
Alguien puede explicarlo mejor?

Nunca las use, si tengo un objeto dentro de otro, ambas clases las creo por separado.

Confuso este tema :’( , pero con entender las clases estaticas estamos bien xD

Excelente clase, muy buena explicación de las clases anidadas

¿Qué pasó acá?

En la clases Static, como su nombre lo dice, estaremos trabajando siempre sobre las variables estáticas de la clase, es decir, sin multiples instanciaciones en objetos.

Las clases no estáticas las usamos para instanciar objetos.

En el caso de una clase Outer no estática con una Inner, depende de si necesitamos Inner estática para almacenar datos en una única instancia, o si por lo contrario debemos instanciar objetos en los objetos de la clase externa.

Con esta explicación vemos la diferencia entre las clases internas y las clases estáticas y como por eficiencia, es mejor utilizar la última ya que no tenemos que realizar una instancia de esta clase y ocupa menos espacio en memoria.

Sin duda las clases estáticas anidadas es mucho más fácil de realizarlas.😅😅

Wow si esta muy loco las clases locales a un metodo :0

O_O

😃

Definitivamente si se van a usar clases anidadas es mejor usar estaticas, es una forma mucho mas optima de trabajar ademas de evitar dolores de cabeza.

estoy de acuerdo, las clases estaticas son mas eficientes y menos engorrosas!

Algo interesante que note con este tipo de clases anidadas , sobre todo con las locales es que si bien pierdes eficiencia te permite ser mas versátil y riguroso con respecto al encapsulamiento.

Clases Internas: Las clases internas son clases anidadas dentro de
otras clases o métodos.

estas clases se usan en java para producir efectos de programación funcional.

Me duele la cabeza…

Clases locales son algo MÁS loco

Vaya que sí es una locura ésto de las clases locales.

En este enlace se puede aprender más de las clases anidadas, tanto las estáticas como las no estáticas.

https://www.tutorialesprogramacionya.com/javaya/detalleconcepto.php?punto=90&codigo=170&inicio=80






wow

Decian aprende Java, es super facil decian.

Se deben conocer las variedades de clases anidadas y reconocer su sintaxis
aunque lo mas común es usar las clases anidadas estáticas, ya que de esta forma se consigue un uso mas directo y mejor gestión de memoria.

Únicamente usar Static tan tan 😃

XD