You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
10 Hrs
10 Min
31 Seg
Curso Avanzado de Java SE

Curso Avanzado de Java SE

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Clases anidadas y tipos

11/40
Resources

What are nested classes in Java?

Nested classes in Java represent a fundamental concept that, although not always perceived as a high level of sophistication, plays a crucial role in software architecture. This idea consists of declaring one class inside another, calling the outer class the "outer class" and the inner class the "nested class". This structure allows grouping related logic in a way that favors code readability and maintainability.

Why use nested classes?

  1. Logical grouping: They allow keeping together classes that are only relevant within the context of a specific class.
  2. Improved readability: They facilitate code organization and simplification, crucial in complex projects.
  3. Use in advanced projects: They are common in Java Enterprise Edition and Android developments, where libraries tend to use them extensively.

Types of nested classes

Nested classes fall into two main categories:

  1. Static classes(static nested classes):

    • They are declared with the static keyword.
    • They function as static members of the containing class.
    • They do not require an instance of the outer class to be accessible.
    class OuterClass { static class StaticNestedClass { void display() { System.out.println("Inside StaticNestedClass"); } }} } }
  2. Non-static classes (inner classes):

    • They do not carry the static keyword.
    • They need an instance of the outer class for access.
    • They include variants such as method-local classes and anonymous classes.
    class OuterClass { class InnerClass { void display() { System.out.println("Inside InnerClass"); } }} } }

Detail about each type of class

How do static classes work?

Static classes in Java are closely associated with the static keyword. This allows them to:

  • Be called directly using the outer class as a reference point.
  • Function just like static methods or attributes, easily accessible without the need to instantiate the outer class.

Example implementation:

class Enclosing { static int x = 10;    
 static class StaticNested { void display() { System.out.println("Value of x: " + x); } }} }
public class Main { public static void main(String[] args) { Enclosing.StaticNested nested = new Enclosing.StaticNested(); nested.display(); } }}

What are inner classes?

Inner classes, unlike static classes, require an instance of the outer class to be used. They allow flexibility when interacting with non-static elements of the outer class.

Local and anonymous classes

  1. Classes Local to Methods: They are defined within a specific method and their scope is limited to it.

    class Outer { void run() { class Local { void display() { System.out.println("Inside Local"); } } }        
     Local local = new Local(); local.display(); } }}
  2. Anonymous classes: Perfect for quick and specific implementations without the need for a 100% defined class.

    abstract class Anonymous { abstract void display();}
    public class Main { public static void main(String[] args) { Anonymous anonymous = new Anonymous() { void display() { System.out.println("Anonymous class implementation."); } } }; anonymous.display(); } }}

When should you use them?

  • Static classes: Useful when your methods and variables are mainly static and do not require access to non-static instances of the outer class.
  • Nested non-static classes: Ideal when you need to access and manipulate non-static attributes and methods of the outer class.

Nested classes are more than just a level of abstraction; they are powerful tools for organizing your code and making it easier to maintain. It is advisable to limit them to one or two per class to avoid extreme complexity. Now you are ready to experiment and keep integrating them into your projects!

Contributions 37

Questions 5

Sort by:

Want to see more contributions, questions and answers from the community?

Clase estatica: son básicamente lo mismo que una clase no estática, pero hay una diferencia: una clase estática no puede ser instanciada.

Clase anidada: Las clases anidadas te permiten agrupar lógicamente clases que solo se utilizan en un lugar, por lo tanto, esto aumenta el uso de la encapsulación y crea un código más fácil de leer y de mantener.

Se vuelve muy engorroso aplicar TODOS los estándares y TODOS los conceptos de clases de java, creo que lo mejor es utilizar las clases sin anidar o a lo mucho anidar 1 sola clase; se vuelve como la canción: “Hay un hoyo… hay un hoyo en la orilla del mar… Una chicha, en bikini, una chica en bikini sentada en el hoyo en la orilla del mar…”

Pero la utilidad de las clases anidadas cual es? no comprendo la lógica quien me explica? Que refleja una clase anidada una relación de composición ejemplo class carro { class motor{} }?

Pregunta, ¿La clases anidadas no terminan siendo una mala práctica? ¿esto va en contra del principio de alta cohesión y bajo acoplamiento ?

La verdad no he usado las clases estáticas y muy poco las clases anidadas.

  • En mi percepcion la utilidad de las clases anidadas es tener un codigo legible, y controlado no siempre modularizar el codigo lo hace mas legible, y cuando me refiero a controlado ,es que al anidar le estoy dando una limitacion al scope de mi clase interna y sus metodos , obviamente mencionando los los modificadores de acceso

  • En cuanto a los distintos tipo de clases anidadas dejo mis ejemplos con sus apuntes de su funcionalidad

Inner Class

Al instanciar un objeto de mi clase interna tengo que llamar previamente mi clase externa
ClaseExterna.ClaseInterna Objeto

Clase Static Anidada

Utilizamos el objeto creado de la clase interior y con el punto llamamos especificamente el metodo de la clase interior
ObjetoClaseInterior.metodoClaseInterior

Varios tipos de clases andiadas

Pueden convivir varias clases anidadas y de diferente tipo

Clase dentro del metodo

En este caso el metodo que esta dentro de la clase interna, es el que mencionamos en el test ya que previamente se instancio un objeto de la clase local

Tengo una inquietud, ¿las clases anidadas no van en contra vía del principio de alta cohesión y bajo acoplamiento?

Es un poco raro las clases anónimas porque una clase abstracta no podías declarar un objeto, pero aquí justamente dice “declarar un objeto de la clase abstracta” jajaja

Me van a perdonar por mi opinión pero para mi todo eso es complicarse la vida.

Honestamente no encuentro un caso de uso para implementar clases anidadas. Esto rompe completamente el paradigma orientado a objetos y sus fundamentos/principios.

Las clases anidadas te permiten agrupar lógicamente clases que solo se utilizan en un lugar, por lo tanto, esto aumenta el uso de la encapsulación y crea un código más fácil de leer y de mantener.

  • Una clase anidada no existe independientemente de su clase adjunta. Por lo tanto, el alcance de una clase anidada está limitado por su clase externa.

  • Una clase anidada también es miembro de su clase adjunta. También es posible declarar una clase anidada que es local a un bloque.

  • Como miembro de su clase adjunta, una clase anidada se puede declarar private, public, protected, o default (Leer sobre Modificadores de acceso).

  • Una clase anidada tiene acceso a los miembros, incluidos los miembros privados, de la clase en la que está anidado. Sin embargo, lo inverso no es verdadero, es decir, la clase adjunta no tiene acceso a los miembros de la clase anidada.

  • Hay dos tipos generales de clases anidadas: las que están precedidas por el modificador static (static nested class) y las que no lo están (inner class).

9:25 - “los modificares de acceso para la clase estática debe ser público a menos que solo quieras que la clase exterior los use”

entiendo entonces que a pesar de que la clase interior declare métodos y atributos privados, solo ella y la clase exterior podrán acceder a ellos?

La explicación de los tipos de clases para las anidaciones es posible expresarlas en sentido de patrones? Como por ejemplo un singleton para una clase con un constructor privado y un unico metodo de acceso static getInstance()?

class OuterClass {
  int x = 10;

  class InnerClass {
    int y = 5;
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.y + myOuter.x);
  }
}```

Si una clase estática está anidada dentro de otra clase, sigue siendo una clase estática y no se puede instanciar directamente. Sin embargo, la clase externa puede crear instancias de la clase interna estática.

Cuando se declara una clase estática dentro de otra clase, se establece una relación de pertenencia, pero la clase interna estática no depende de una instancia de la clase externa. Esto significa que la clase interna estática se puede utilizar sin necesidad de crear una instancia de la clase externa.

Para acceder a la clase estática anidada, se utiliza la sintaxis ClaseExterna.ClaseInterna. Por ejemplo, si tienes una clase llamada ClaseExterna que contiene una clase estática anidada llamada ClaseInterna, puedes acceder a la clase interna de la siguiente manera:

java
Copy code
ClaseExterna.ClaseInterna instancia = new ClaseExterna.ClaseInterna();
Es importante destacar que la clase interna estática no puede acceder a los miembros no estáticos de la clase externa, ya que no tiene una referencia a una instancia específica de la clase externa. Solo puede acceder a los miembros estáticos de la clase externa.

En resumen, una clase estática anidada sigue siendo una clase estática y no se puede instanciar directamente. Se accede a ella utilizando la sintaxis ClaseExterna.ClaseInterna, y la clase externa puede crear instancias de la clase interna estática.

Gracias!

Can an inner class access the outter class attributes?

Ejemplo de clase estática:

excelente explicación!!!

package ar.com.martinjm.practice;

import ar.com.martinjm.practice.nestedclasses.OuterClass;

public class Application {
    public staticvoid main(String args[]){
        System.out.println("nested classes");
        System.out.println("");

        //TestStaticNestedClasswithstaticmethodand non static methods
        OuterClass.StaticNestedClass.hereIAm();
        OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();
        staticNestedClass.hereIam();

        //TestInner class
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.hereIam();

        //Test class in a method
        OuterClass.hereIAm();

    }
}

La clase anidadas las podemos utilizar según la necesidad con un máximo de 2 , para acceder a ella desde otra clase, estas tienen que contener la palabra static en la subclase ya con ello solo referenciamos mapeando la clase hasta llegar a la clase estática y luego a sus métodos.😃

Por ejemplo: para crear un objeto para la clase estática se usa esta sintaxis:
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();

Source

Que bien

Muy útil

Está bien disponer de las herramientas que nos da java, buena clase.

Nunca lo habia visto en el lenguaje que conozco, Buena!

tambien se puede definir una clase anonima a partir de una clase no abstracta. Solamente tienes que sobrescribir los metodos

en la linea 12 dice @Test que significa???

Estupenda explicación sobre las clases anidadas y sus tipos instructora Anahí, básicamente dependerá de la lógica que use nuestro proyecto para saber si seria eficiente implementarlas.

Excelente explicación teórica, muy buena definición de las clases anónimas que son abstractas, ya que nos proveen de una instancia con un comportamiento implementado por nosotros sin necesidad de crear otra clase que herede de la clase abstracta

Explicacion breve de Clases Anidadas

Genial.

cuando Java compila, como queda la creacion de los .class?

Excelente 😃 super útil para cuando no queremos tener más clases que solo será utilizada por una clase. 😃

Entonces pensando en System.out.println
Podemos decir que println es un método de la clase out
Y que out es una clase anidada a System?

Respecto a las clases estáticas anidadas, la tutora expresa lo siguiente: “S quiero utilizar un método de la clase Enclosing, ese método tiene que ser forzosamente estático, sino no voy a poder llamarlo o tener acceso a el”. Difiero respecto a esto, ya que si creo un método no estatico dentro de la clase “ENCLOSING” y declaro una instancia de la misma clase, puedo acceder a dicho método sin ningún problema. Opiniones respecto a esto?

excelente explicacion