¡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? 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
Car
clase principal y luego use la palabra clave extends para derivar todas las clases para tipos específicos de autos de laCar
clase.
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 Truck
clase. 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 Car
principal, 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 Car
clase. Pero, mira la F1Car
clase, 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 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 instanceof
operador devuelve verdadero , ya que tenemos un Truck
objeto y todos los camiones son automóviles. La Truck
clase se deriva de la Car
clase. Todos los camiones se crean en función del padre común, la Car
clase. Mire de cerca cómo instanceof
se 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 Car
clase (y los objetos del automóvil) no se derivan de la Truck
clase. Todos los camiones son automóviles, pero no todos los automóviles son camiones. Car
los objetos no se basan en la Truck
clase. 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 Object
clase (aunque no escriba "Objeto extendido", ya está implícito). ¿Cómo y cuándo sería útil? El instanceof
operador se usa más comúnmente cuando se anula el equals()
método. Por ejemplo, así es como equals
se implementa el método en la String
clase:
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 String
con 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.
GO TO FULL VERSION