Breaking

Post Top Ad

Your Ad Spot

jueves, 19 de diciembre de 2019

Clase anidada e interna de Java

En este artículo, aprenderá a trabajar con clases anidadas e internas en Java con la ayuda de ejemplos.
En Java, puede definir una clase dentro de otra clase. Dicha clase se conoce como nested class.
clase OuterClass {
    // ...
    clase NestedClass {
        // ...
    }
}
Hay dos tipos de clases anidadas que puede crear en Java.
  • Clase anidada no estática (clase interna)
  • Clase anidada estática
Primero veamos las clases anidadas no estáticas.

Clase anidada no estática

La clase anidada no estática es una clase dentro de otra clase, donde la clase tiene acceso a los miembros de la clase adjunta (clase externa). Es comúnmente conocido como inner class.
Como la clase interna existe dentro de la clase externa (para crear una instancia de una clase interna, primero debe crear una instancia de la clase externa).
Aquí hay un ejemplo de cómo puedes declarar clases internas en Java.

Ejemplo 1: clase interna

  1. class CPU {
  2. double price;
  3. class Processor{
  4. double cores;
  5. String manufacturer;
  6. double getCache(){
  7. return 4.3;
  8. }
  9. }
  10. protected class RAM{
  11. double memory;
  12. String manufacturer;
  13. double getClockSpeed(){
  14. return 5.5;
  15. }
  16. }
  17. }
  18. public class Main {
  19. public static void main(String[] args) {
  20. CPU cpu = new CPU();
  21. CPU.Processor processor = cpu.new Processor();
  22. CPU.RAM ram = cpu.new RAM();
  23. System.out.println("Processor Cache = " + processor.getCache());
  24. System.out.println("Ram Clock speed = " + ram.getClockSpeed());
  25. }
  26. }
Cuando ejecuta el programa anterior, la salida será:
Caché del procesador = 4.3
Ram Velocidad de reloj = 5.5
En el programa anterior, la clase CPUencapsula dos clases internas, es decir, ProcessorRAMComo, la clase RAMes una clase interna, puede declararla como protected.
En la Mainclase, la instancia de CPUse crea al principio. Y para crear la instancia de Processor. (dot)se utiliza el operador.
Procesador CPU.Processor = cpu.new Processor ();

Acceso a miembros de la clase externa dentro de la clase interna

Como discutimos, las clases internas pueden acceder a los miembros de la clase externa. Esto es posible usando Java esta palabra clave . 

Ejemplo 2: Acceso a miembros

  1. public class Car {
  2. String carName;
  3. String carType;
  4. public Car(String name, String type) {
  5. this.carName = name;
  6. this.carType = type;
  7. }
  8. private String getCarName() {
  9. return this.carName;
  10. }
  11. class Engine {
  12. String engineType;
  13. void setEngine() {
  14. // Accessing carType property of Car
  15. if(Car.this.carType.equals("4WD")){
  16. // Invoking method getCarName() of Car
  17. if(Car.this.getCarName().equals("Crysler")) {
  18. this.engineType = "Bigger";
  19. } else {
  20. this.engineType = "Smaller";
  21. }
  22. }else{
  23. this.engineType = "Bigger";
  24. }
  25. }
  26. String getEngineType(){
  27. return this.engineType;
  28. }
  29. }
  30. }
  31. public class CarMain {
  32. public static void main(String[] args) {
  33. Car car1 = new Car("Mazda", "8WD");
  34. Car.Engine engine = car1.new Engine();
  35. engine.setEngine();
  36. System.out.println("Engine Type for 8WD= " + engine.getEngineType());
  37. Car car2 = new Car("Crysler", "4WD");
  38. Car.Engine c2engine = car2.new Engine();
  39. c2engine.setEngine();
  40. System.out.println("Engine Type for 4WD = " + c2engine.getEngineType());
  41. }
  42. }
Cuando ejecuta el programa anterior, la salida será:
Tipo de motor para 8WD = más grande
Tipo de motor para 4WD = más pequeño
En el programa anterior, dentro de la Engineclase interna, utilizamos thispalabras clave para obtener acceso a la variable miembro carType de la clase externa Carcomo:
Car.this.carType.equals ("4WD)
Esto es posible aunque carType sea privatemiembro de la Carclase.
También puede ver, hemos utilizado Car.thispara acceder a miembros de CarSi solo hubiera usado esto en lugar de Car.this, solo representaría miembros dentro de la Engineclase.
Del mismo modo, también hemos invocado el método getCarName()al Carusar esta palabra clave como:
Car.this.getCarName (). Igual a ("Crysler")
Aquí, getCarName()método es un método privado de Car.

Clase interna estática

En Java, también puede definir una clase anidada estática . Tal clase se conoce como static nestedclase. Sin embargo, no se llaman clase interna estática.
A diferencia de la clase interna, la clase anidada estática no puede acceder a las variables miembro de la clase externa porque la clase anidada estática no requiere que cree una instancia de clase externa. Por lo tanto, no existe ninguna referencia de la clase externa con OuterClass.this.
Por lo tanto, puede crear una instancia de clase anidada estática directamente como esta:
OuterClass.InnerClass obj = new OuterClass.InnerClass ();

Ejemplo 3: clase interna estática

  1. Public class MotherBoard {
  2. String model;
  3. public MotherBoard(String model) {
  4. this.model = model;
  5. }
  6. static class USB{
  7. int usb2 = 2;
  8. int usb3 = 1;
  9. int getTotalPorts(){
  10. return usb2 + usb3;
  11. }
  12. }
  13. }
  14. public class Main {
  15. public static void main(String[] args) {
  16. MotherBoard.USB usb = new MotherBoard.USB();
  17. System.out.println("Total Ports = " + usb.getTotalPorts());
  18. }
  19. }
Cuando ejecuta el programa anterior, la salida será:
Puertos totales = 3
En el programa anterior, hemos declarado la clase interna estática USBusando la palabra clave static.
También puede ver, en la Mainclase, creamos directamente una instancia de USBfrom MotherBoardcon el . (dot)operador sin crear una instancia de Motherboardfirst.
MotherBoard.USB usb = nueva MotherBoard.USB ();
Veamos qué sucedería si intentas acceder a los miembros de la clase externa:

Ejemplo 4: Acceso a miembros de la clase externa dentro de la clase interna estática

  1. public class MotherBoard {
  2. String model;
  3. public MotherBoard(String model) {
  4. this.model = model;
  5. }
  6. static class USB{
  7. int usb2 = 2;
  8. int usb3 = 1;
  9. int getTotalPorts(){
  10. if(MotherBoard.this.model.equals("MSI")) {
  11. return 4;
  12. }
  13. else {
  14. return usb2 + usb3;
  15. }
  16. }
  17. }
  18. }
  19. public class Main {
  20. public static void main(String[] args) {
  21. MotherBoard.USB usb = new MotherBoard.USB();
  22. System.out.println("Total Ports = " + usb.getTotalPorts());
  23. }
  24. }
Cuando ejecuta el programa anterior, obtendrá un error:
error: variable no estática a la que no se puede hacer referencia desde un contexto estático
Esto se debe a que no Motherboardse almacena ninguna referencia de clase externa Motherboard.this.

Puntos clave para recordar

  • Java trata la clase interna como un miembro regular de una clase. Son como métodos y variables declarados dentro de una clase.
  • Como la clase interna es miembro de la clase externa, puede aplicar cualquier modificador de acceso como privado, protegido a su clase interna, lo que no es posible en las clases normales.
  • Dado que la clase Nested es miembro de su clase externa Outer, puede usar la . (dot)notación para acceder a la clase Nested y sus miembros.
  • El uso de la clase anidada hará que su código sea más legible y proporcionará una mejor encapsulación.
  • Las clases anidadas no estáticas (clases internas) tienen acceso a otros miembros de la clase externa / envolvente, incluso si se declaran privadas.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas