Java - Herencia
La herencia se puede definir como el proceso en el que una clase adquiere las propiedades (métodos y campos) de otra. Con el uso de la herencia, la información se hace manejable en un orden jerárquico.
La clase que hereda las propiedades de otra se conoce como subclase (clase derivada, clase secundaria) y la clase cuyas propiedades se heredan se conoce como superclase (clase base, clase principal).
extiende palabra clave
extiende es la palabra clave utilizada para heredar las propiedades de una clase. La siguiente es la sintaxis de la palabra clave extends.
Sintaxis
class Super { ..... ..... } class Sub extends Super { ..... ..... }
Código de muestra
El siguiente es un ejemplo que demuestra la herencia de Java. En este ejemplo, puede observar dos clases, a saber, Calculation y My_Calculation.
Usando la palabra clave extends, My_Calculation hereda los métodos added() y Subtraction() de la clase Calculation.
Copie y pegue el siguiente programa en un archivo con el nombre My_Calculation.java
Ejemplo
Demostración en vivoclass Calculation { int z; public void addition(int x, int y) { z = x + y; System.out.println("The sum of the given numbers:"+z); } public void Subtraction(int x, int y) { z = x - y; System.out.println("The difference between the given numbers:"+z); } } public class My_Calculation extends Calculation { public void multiplication(int x, int y) { z = x * y; System.out.println("The product of the given numbers:"+z); } public static void main(String args[]) { int a = 20, b = 10; My_Calculation demo = new My_Calculation(); demo.addition(a, b); demo.Subtraction(a, b); demo.multiplication(a, b); } }
Compile y ejecute el código anterior como se muestra a continuación.
javac My_Calculation.java java My_Calculation
Después de ejecutar el programa, producirá el siguiente resultado −
Salida
The sum of the given numbers:30 The difference between the given numbers:10 The product of the given numbers:200
En el programa dado, cuando un objeto a My_Calculation se crea una clase, se hace una copia del contenido de la superclase dentro de ella. Por eso, usando el objeto de la subclase puedes acceder a los miembros de una superclase.
La variable de referencia de la superclase puede contener el objeto de la subclase, pero al usar esa variable solo puede acceder a los miembros de la superclase, por lo que para acceder a los miembros de ambas clases se recomienda crear siempre una variable de referencia para la subclase.
Si considera el programa anterior, puede crear una instancia de la clase como se indica a continuación. Pero usando la variable de referencia de la superclase ( cal en este caso) no puede llamar al método multiplicación() , que pertenece a la subclase My_Calculation.
Calculation demo = new My_Calculation(); demo.addition(a, b); demo.Subtraction(a, b);
Nota − Una subclase hereda todos los miembros (campos, métodos y clases anidadas) de su superclase. Los constructores no son miembros, por lo que las subclases no los heredan, pero el constructor de la superclase se puede invocar desde la subclase.
La súper palabra clave
El súper la palabra clave es similar a esto palabra clave. Los siguientes son los escenarios en los que se utiliza la palabra clave super.
-
Se utiliza para diferenciar los miembros de superclase de los miembros de subclase, si tienen los mismos nombres.
-
Se utiliza para invocar a la superclase constructor de la subclase.
Diferenciación de los miembros
Si una clase hereda las propiedades de otra clase. Y si los miembros de la superclase tienen los mismos nombres que la subclase, para diferenciar estas variables usamos la palabra clave super como se muestra a continuación.
super.variable super.method();
Código de muestra
Esta sección le proporciona un programa que demuestra el uso del super palabra clave.
En el programa dado, tiene dos clases, a saber, Sub_class y Super_clase , ambos tienen un método llamado display() con diferentes implementaciones y una variable llamada num con diferentes valores. Estamos invocando el método display() de ambas clases e imprimiendo el valor de la variable num de ambas clases. Aquí puede observar que hemos usado la palabra clave super para diferenciar los miembros de la superclase de la subclase.
Copie y pegue el programa en un archivo con el nombre Sub_class.java.
Ejemplo
Demostración en vivoclass Super_class { int num = 20; // display method of superclass public void display() { System.out.println("This is the display method of superclass"); } } public class Sub_class extends Super_class { int num = 10; // display method of sub class public void display() { System.out.println("This is the display method of subclass"); } public void my_method() { // Instantiating subclass Sub_class sub = new Sub_class(); // Invoking the display() method of sub class sub.display(); // Invoking the display() method of superclass super.display(); // printing the value of variable num of subclass System.out.println("value of the variable named num in sub class:"+ sub.num); // printing the value of variable num of superclass System.out.println("value of the variable named num in super class:"+ super.num); } public static void main(String args[]) { Sub_class obj = new Sub_class(); obj.my_method(); } }
Compile y ejecute el código anterior usando la siguiente sintaxis.
javac Super_Demo java Super
Al ejecutar el programa, obtendrá el siguiente resultado −
Salida
This is the display method of subclass This is the display method of superclass value of the variable named num in sub class:10 value of the variable named num in super class:20
Constructor de superclase de invocación
Si una clase hereda las propiedades de otra clase, la subclase adquiere automáticamente el constructor predeterminado de la superclase. Pero si desea llamar a un constructor parametrizado de la superclase, debe usar la palabra clave super como se muestra a continuación.
super(values);
Código de muestra
El programa dado en esta sección demuestra cómo usar la palabra clave super para invocar el constructor parametrizado de la superclase. Este programa contiene una superclase y una subclase, donde la superclase contiene un constructor parametrizado que acepta un valor entero, y usamos la palabra clave super para invocar el constructor parametrizado de la superclase.
Copie y pegue el siguiente programa en un archivo con el nombre Subclass.java
Ejemplo
Demostración en vivoclass Superclass { int age; Superclass(int age) { this.age = age; } public void getAge() { System.out.println("The value of the variable named age in super class is: " +age); } } public class Subclass extends Superclass { Subclass(int age) { super(age); } public static void main(String args[]) { Subclass s = new Subclass(24); s.getAge(); } }
Compile y ejecute el código anterior usando la siguiente sintaxis.
javac Subclass java Subclass
Al ejecutar el programa, obtendrá el siguiente resultado −
Salida
The value of the variable named age in super class is: 24
Relación ES-A
IS-A es una forma de decir:Este objeto es un tipo de ese objeto. Veamos cómo se extiende el palabra clave se utiliza para lograr la herencia.
public class Animal { } public class Mammal extends Animal { } public class Reptile extends Animal { } public class Dog extends Mammal { }
Ahora, según el ejemplo anterior, en términos orientados a objetos, lo siguiente es cierto −
- Animal es la superclase de la clase Mammal.
- Animal es la superclase de la clase Reptil.
- Mamífero y Reptil son subclases de la clase Animal.
- Perro es la subclase de las clases Mamífero y Animal.
Ahora, si consideramos la relación IS-A, podemos decir −
- Mamífero ES-UN Animal
- Reptil ES-UN Animal
- El perro es un mamífero
- Por lo tanto:el perro también es un animal
Con el uso de la palabra clave extends, las subclases podrán heredar todas las propiedades de la superclase excepto las propiedades privadas de la superclase.
Podemos asegurar que Mammal es en realidad un Animal con el uso del operador de instancia.
Ejemplo
Demostración en vivoclass Animal { } class Mammal extends Animal { } class Reptile extends Animal { } public class Dog extends Mammal { public static void main(String args[]) { Animal a = new Animal(); Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); } }
Esto producirá el siguiente resultado −
Salida
true true true
Dado que tenemos una buena comprensión de las extensiones palabra clave, veamos cómo implementa La palabra clave se utiliza para obtener la relación IS-A.
Generalmente, los implementos La palabra clave se usa con clases para heredar las propiedades de una interfaz. Las interfaces nunca pueden ser extendidas por una clase.
Ejemplo
public interface Animal { } public class Mammal implements Animal { } public class Dog extends Mammal { }
La instancia de la palabra clave
Usemos la instancia de operador para verificar si el mamífero es en realidad un animal y el perro es en realidad un animal.
Ejemplo
Demostración en vivointerface Animal{} class Mammal implements Animal{} public class Dog extends Mammal { public static void main(String args[]) { Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); } }
Esto producirá el siguiente resultado −
Salida
true true true
Tiene una relación
Estas relaciones se basan principalmente en el uso. Esto determina si una cierta clase TIENE-A cierta cosa. Esta relación ayuda a reducir la duplicación de código y los errores.
Veamos un ejemplo −
Ejemplo
public class Vehicle{} public class Speed{} public class Van extends Vehicle { private Speed sp; }
Esto demuestra que la clase Van HAS-A Speed. Al tener una clase separada para Speed, no tenemos que poner todo el código que pertenece a speed dentro de la clase Van, lo que hace posible reutilizar la clase Speed en múltiples aplicaciones.
En la función orientada a objetos, los usuarios no necesitan preocuparse por qué objeto está haciendo el trabajo real. Para lograr esto, la clase Van oculta los detalles de implementación de los usuarios de la clase Van. Entonces, básicamente, lo que sucede es que los usuarios le piden a la clase Van que realice una determinada acción y la clase Van hará el trabajo por sí misma o le pedirá a otra clase que realice la acción.
Tipos de herencia
Hay varios tipos de herencia como se demuestra a continuación.
Un hecho muy importante para recordar es que Java no admite la herencia múltiple. Esto significa que una clase no puede extenderse a más de una clase. Por lo tanto seguir es ilegal −
Ejemplo
public class extends Animal, Mammal{}
Sin embargo, una clase puede implementar una o más interfaces, lo que ha ayudado a Java a deshacerse de la imposibilidad de la herencia múltiple.
Java