CodeGym /Blog Java /Random-ES /Instanceof y Herencia en Java
Autor
Aditi Nawghare
Software Engineer at Siemens

Instanceof y Herencia en Java

Publicado en el grupo Random-ES
¡Hola! En lecciones anteriores, ya nos hemos familiarizado brevemente con el concepto de herencia. Hoy, volveremos a tocar este tema, pero de nuevo no demasiado profundamente. Todavía vamos a tener una lección más detallada sobre esto en el futuro. Hoy solo echaremos un vistazo rápido a algunos ejemplos prácticos y nos familiarizaremos con un operador interesante en Java.

Herencia

Entonces, ¿qué es la herencia? instancia de y Herencia 101 - 1 La herencia es un mecanismo de programación (incluso en Java) que le permite declarar una nueva clase basada en una existente. La clase derivada luego obtiene acceso a los campos y métodos de la clase principal. ¿Por qué necesitaríamos esto? Bueno, imagina que necesitas crear varias clases de autos en un programa: Truck, RaceCar, Sedan, Pickup, etc. Incluso antes de escribir cualquier código, sabes con certeza que todas estas clases tienen mucho en común: todos los autos tienen un modelo nombre, año de fabricación, tamaño del motor, velocidad máxima, etc. (sin mencionar que todos tienen ruedas y otras partes en común). En esta situación, puede:
  • Cree estos campos en cada clase (agregándolos a cada nueva clase de automóvil a medida que la crea)
  • Traiga los campos comunes a todos los autos a una Carclase principal y luego use la palabra clave extends para derivar todas las clases para tipos específicos de autos de la Carclase.
Naturalmente, la segunda opción es mucho más conveniente:

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Como mínimo, evitamos la duplicación innecesaria de código (y siempre debemos esforzarnos por lograrlo al escribir programas). Además, tenemos una estructura de clases simple y comprensible, con todos los campos comunes a todos los autos consolidados en una sola clase. Si los camiones tienen campos especiales que otros autos no tienen, pueden declararse en la Truckclase. Lo mismo ocurre con los métodos. Todos los automóviles tienen cierto comportamiento común que se puede describir con métodos, por ejemplo, encender el automóvil, acelerar/frenar, etc. Estos métodos comunes se pueden consolidar en la clase Carprincipal, y cada tipo específico de automóvil puede definir sus acciones únicas en sus clases derivadas. .

public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {
      
       // Only race cars make pit stops
   }

   public static void main(String[] args) {
      
       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Agregamos los métodos comunes a todos los autos a la Carclase. Pero, mira la F1Carclase, que representa los autos de carreras de "Fórmula 1". Las paradas en boxes (paradas para el mantenimiento urgente del automóvil) solo se realizan en las carreras, por lo que agregamos esta funcionalidad específica a la clase derivada correspondiente. instancia de y Herencia 101 - 2

instancia del operador

En Java, hay un operador especial, instanceof , para verificar si un objeto se creó en función de una clase en particular. Devuelve verdadero o falso según el resultado de la comprobación. Veamos cómo funciona usando las clases en nuestro ejemplo de automóvil:

public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Salida: verdadero El instanceofoperador devuelve verdadero , ya que tenemos un Truckobjeto y todos los camiones son automóviles. La Truckclase se deriva de la Carclase. Todos los camiones se crean en función del padre común, la Carclase. Mire de cerca cómo instanceofse usa el operador. Lo escribes sin punto, ya que es un operador, no un método ("objeto instancia de Clase"). Probemos de otra manera:

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Salida: falso La Carclase (y los objetos del automóvil) no se derivan de la Truckclase. Todos los camiones son automóviles, pero no todos los automóviles son camiones. Carlos objetos no se basan en la Truckclase. Un ejemplo más:

public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Salida: Verdadero Aquí la lógica también es simple: todas las clases en Java, incluidas las clases que crea, descienden de la Objectclase (aunque no escriba "Objeto extendido", ya está implícito). ¿Cómo y cuándo sería útil? El instanceofoperador se usa más comúnmente cuando se anula el equals()método. Por ejemplo, así es como equalsse implementa el método en la Stringclase:

public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
Antes de comparar a Stringcon el objeto pasado, el método prueba para ver si el objeto es incluso una cadena. Solo entonces comienza a comparar las propiedades de los dos objetos. Si esta prueba no existiera, cualquier objeto con campos de valor y longitud podría pasarse al método y compararse con una Cadena, lo que sería incorrecto, por supuesto.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION