Aunque ambas palabras clave extends e implements en Java se utilizan para implementar el concepto de herencia de la programación orientada a objetos, hay una sutil diferencia entre ellas. La palabra clave extends se utiliza principalmente para extender una clase, es decir, para crear una subclase en Java, mientras que la palabra clave implements se utiliza para implementar una interfaz en Java. La palabra clave extends también puede ser utilizada por una interfaz para extender otra interfaz. Para entender mejor la diferencia entre extends e implements, también hay que aprender y entender la diferencia entre clase e interfaz en Java.
Aunque ambos son una parte integral del desarrollo de aplicaciones utilizando la metodología orientada a objetos, una interfaz es más abstracta que la clase, por lo que se utiliza para definir la API o el contrato.
Por otro lado, una clase proporciona la implementación concreta de la interfaz, es decir, el código real que hace el trabajo. Aunque una clase también puede ser abstracta para definir un contrato, es el trabajo mejor hecho por una interfaz en Java. Incluso Joshua Bloch ha aconsejado en Java efectiva sobre el uso de interfaces para declarar el tipo en Java, ya que promueve múltiples herencias en Java, que es restringido en comparación con C ++.
Incluso después de Java 8, sólo múltiples herencias de tipo y el comportamiento se apoya en Java (mediante la introducción de métodos por defecto en Java 8), pero múltiples herencias del estado todavía no son compatibles. Si desea obtener más información acerca de por qué las herencias múltiples no se admite en Java, ver aquí.
Y, Si usted es nuevo en el mundo de Java, entonces también recomiendo que vaya a través de The Complete Java MasterClass en Udemy para aprender Java de una manera mejor y más estructurada. Este es uno de los mejores y más actualizados cursos para aprender Java online.
¿Cuál es el significado de extender una clase
Una clase en Java puede extender otra clase para convertirse en una subclase. Cuando la clase B extiende la clase A, B se convierte en subclase (hijo) y A se convierte en superclase (padre). Una subclase puede reutilizar todas las características de la clase padre y la reutilización de código es una de las principales razones para extender una clase, pero pocos entienden que lo más importante es la relación de definición que más tarde es aprovechada por el Polimorfismo.
Por ejemplo, si la clase B extiende a la clase A, entonces una variable de referencia de tipo A puede contener el objeto de B, lo que significa que A ahora se convierte en polimórfico porque puede contener tanto A como B. Esto da lugar a una técnica de creación de software flexible, conocida como programación para la interfaz que para la implementación, en la que siempre se utilizan variables de la clase padre o de la interfaz para definir el algoritmo central.
El beneficio de hacer esto es que cualquier clase nueva que extienda la clase padre tendrá acceso a ese algoritmo.
Aquí hay un ejemplo de extensión de una clase en Java:
clase A { public void show() { System.out.println("mostrar"); }}clase B extends A { public void display() { System.out.println("mostrar"); } public void show() { System.out.println("mejor mostrar"); }}public class Main { public static void main(String args) { A a = new B(); // posible porque B extends A a.show(); // esto ahora llamará al método show() de la clase B }}Outputbetter show
Puedes ver que al extender la clase A, B ahora tiene acceso al método show(), incluso puede anular el comportamiento del método show(), lo que se conoce como anulación de métodos en Java. Este inmenso poder viene por el uso de la palabra clave extends.
También puedes leer el Patrón de Diseño Head First en Java para aprender más sobre la técnica de programar para la interfaz que para la implementación. El libro también se ha actualizado recientemente para cubrir Java SE 8.
Cuál es el significado de implementar una interfaz
El significado de implementar una interfaz no es muy diferente de extender una clase, pero viene con una advertencia adicional. Cuando una clase implementa una interfaz tiene que proporcionar una implementación de todos los métodos declarados dentro de la interfaz. Si no desea proporcionar todas las implementaciones, puede declararse como una clase abstracta.
No seguir estas reglas significa que su programa no puede compilar. Hay muchos ejemplos de implementación de una interfaz en el código Java, pero creo que la implementación de Runnable es la más popular. Esto se utiliza para crear una tarea Runnable que puede ser ejecutada por un hilo.
class R implements Runnable{public void run(){ System.out.println("do nothing"); }}
Una instancia de R ahora se puede pasar a cualquier método que espera un Runnable como usted puede pasar esto a ambos execute() y submit() método de la clase ExecutorService para ejecutar esa tarea en un grupo de hilos. Como nuestra clase ha implementado el método run(), el único método de la interfaz Runnable, es una clase concreta. Si no hubiera implementado el método run() habría que hacerla abstracta añadiendo la palabra clave abstract delante de class, por ejemplo
clase abstracta R implements Runnable{}
Puntos importantes
Aquí están algunos de los puntos importantes relacionados con la palabra clave extends e implements en Java:
1) Una clase sólo puede extender otra clase en Java, el uso de la palabra clave extends con la interfaz dará lugar a un error de compilación como se muestra a continuación:
interfaz I{}clase A{}clase B extends A{}clase C extends I{}
Cuando compile este archivo fuente obtendrá el siguiente error:
$ javac Main.javaMain.java:27: no interface expected hereeclass C extends I{^1 error
2) Una clase sólo puede extender una clase, al intentar extender más de una clase volverá a producirse un error de compilación como se muestra a continuación:
class C extends A, B{}$ javac Main.javaMain.java:27: '{' expectedclass C extends A, B{^1 error
3) Una interfaz puede utilizar la palabra clave extends para crear subinterfaces en Java e.g. siguiente es perfectamente legal en Java
interfaz J extends I{}
4) Una interfaz puede incluso extender múltiples interfaces utilizando la palabra clave extends como se muestra a continuación:
interfaz k extends I, J{}
5) Una clase puede utilizar la palabra clave implements para implementar una o más interfaces en Java como se muestra a continuación:
clase D implements I, J, K{}
6) Una clase también puede utilizar tanto la palabra clave extends como implements juntas para extender una clase e implementar una interfaz, es bastante común en Java como se muestra en el siguiente ejemplo:
la clase E extiende A implementa I, J{}
Cuando una clase hace eso es ahora una subclase de A y subinterfaz de I y J, lo que significa que se puede utilizar una variable de referencia de la clase E y la interfaz I, J para almacenar el objeto de la clase E como se muestra a continuación:
I i = new E();J j = new E();A a = new E();
Esto le da un inmenso poder a la clase E en cuanto al uso de la Herencia y el Polimorfismo.
7) Por último, pero no menos importante, una interfaz no puede usar la palabra clave implements para implementar una interfaz, es ilegal en Java y el compilador lanzará un error como se muestra a continuación:
interfaz L implements J{}javac Main.javaMain.java:49: '{' expectedinterface L implements J{^1 error
Eso es todo acerca de la diferencia entre extends y la palabra clave implements en Java. Está claro que extends se utiliza generalmente para extender una clase y implements se utiliza generalmente para implementar una interfaz. Aunque hay más sutilezas, por ejemplo, una interfaz también puede extender otra interfaz para convertirse en una subinterfaz, una clase también puede ser abstracta incluso después de implementar una interfaz, pero lo que no cambia es que ambos se utilizan para crear la relación padre-hijo en Java.
Si la clase B extiende otra clase A se convierte en sus hijos y la clase A se convierte en un padre. Lo mismo ocurre con la interfaz. Puedes seguir leyendo Head First Java y Head First Object-Oriented Analysis para aprender más sobre los bloques básicos de la programación orientada a objetos en java.
Otras preguntas de la entrevista de Java que te pueden gustar
- ¿La diferencia entre agregación, asociación y composición en Java? (respuesta)
- ¿La diferencia entre Clase Abstracta e Interfaz en Java? (respuesta)
- ¿La diferencia entre Herencia y Polimorfismo en Java? (respuesta)
- ¿La diferencia entre Abstracción y Polimorfismo en Java? (respuesta)
- ¿Por qué la Composición es mejor que la Herencia en Java? (artículo)
- ¿La diferencia entre las variables estáticas y no estáticas en Java? (respuesta)
- ¿Por qué la clase abstracta es importante en Java? (opinión)
Aprendizaje adicional
Clases magistrales completas de Java
Fundamentos de Java: El lenguaje Java
Java a fondo: Conviértete en un completo ingeniero Java