java - que - Implementa vs extiende: ¿Cuándo usarlo? ¿Cual es la diferencia?
implements java ejemplos (15)
Por favor explique en un lenguaje fácil de entender o en un enlace a algún artículo.
Ambas palabras clave se utilizan al crear su propia clase nueva en el lenguaje Java.
Diferencia: implements
significa que está utilizando los elementos de una interfaz Java en su clase. extends
significa que está creando una subclase de la clase base que está extendiendo. Solo puede extender una clase en su clase secundaria, pero puede implementar tantas interfaces como desee.
Consulte la página de documentación de Oracle en la interface para obtener más detalles.
Esto puede ayudar a aclarar qué es una interfaz y las convenciones acerca de su uso.
Como se muestra en la figura que se muestra a continuación, una clase extiende otra clase, una interfaz extiende otra interfaz pero una clase implementa una interfaz.
Para mas details
Cuando una subclase extiende una clase, le permite a la subclase heredar (reutilizar) y anular el código definido en el supertipo. Cuando una clase implementa una interfaz, permite que un objeto creado a partir de la clase se use en cualquier contexto que espere un valor de la interfaz.
El verdadero problema aquí es que mientras estamos implementando algo, simplemente significa que estamos usando esos métodos tal como son. No hay margen para el cambio en sus valores y tipos de retorno.
Pero cuando estamos extendiendo algo, se convierte en una extensión de tu clase. Puede cambiarlo, usarlo, reutilizarlo, usarlo y no necesariamente tiene que devolver los mismos valores que en la superclase.
En los términos más simples se usa extens para heredar de una clase e implementos para aplicar una interfaz en su clase.
extiende :
public class Bicycle {
//properties and methods
}
public class MountainBike extends Bicycle {
//new properties and methods
}
implementos :
public interface Relatable {
//stuff you want to put
}
public class RectanglePlus implements Relatable {
//your class code
}
Si aún tiene confusión, lea esto: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
Generalmente, los implementos se utilizan para implementar una interfaz y se extienden para ampliar el comportamiento de la clase base o la clase abstracta .
extiende : Una clase derivada puede extender una clase base. Puedes redefinir el comportamiento de una relación establecida. Clase derivada " es un " tipo de clase base
Implementos : Usted esta implementando un contrato. La clase que implementa la interfaz " tiene una " capacidad.
Con la versión java 8, la interfaz puede tener métodos predeterminados en la interfaz, lo que proporciona implementación en la interfaz en sí.
Consulte esta pregunta para saber cuándo usar cada uno de ellos:
Interfaz vs clase abstracta (OO general)
Ejemplo para entender las cosas.
public class ExtendsAndImplementsDemo{
public static void main(String args[]){
Dog dog = new Dog("Tiger",16);
Cat cat = new Cat("July",20);
System.out.println("Dog:"+dog);
System.out.println("Cat:"+cat);
dog.remember();
dog.protectOwner();
Learn dl = dog;
dl.learn();
cat.remember();
cat.protectOwner();
Climb c = cat;
c.climb();
Man man = new Man("Ravindra",40);
System.out.println(man);
Climb cm = man;
cm.climb();
Think t = man;
t.think();
Learn l = man;
l.learn();
Apply a = man;
a.apply();
}
}
abstract class Animal{
String name;
int lifeExpentency;
public Animal(String name,int lifeExpentency ){
this.name = name;
this.lifeExpentency=lifeExpentency;
}
public void remember(){
System.out.println("Define your own remember");
}
public void protectOwner(){
System.out.println("Define your own protectOwner");
}
public String toString(){
return this.getClass().getSimpleName()+":"+name+":"+lifeExpentency;
}
}
class Dog extends Animal implements Learn{
public Dog(String name,int age){
super(name,age);
}
public void remember(){
System.out.println(this.getClass().getSimpleName()+" can remember for 5 minutes");
}
public void protectOwner(){
System.out.println(this.getClass().getSimpleName()+ " will protect owner");
}
public void learn(){
System.out.println(this.getClass().getSimpleName()+ " can learn:");
}
}
class Cat extends Animal implements Climb {
public Cat(String name,int age){
super(name,age);
}
public void remember(){
System.out.println(this.getClass().getSimpleName() + " can remember for 16 hours");
}
public void protectOwner(){
System.out.println(this.getClass().getSimpleName()+ " won''t protect owner");
}
public void climb(){
System.out.println(this.getClass().getSimpleName()+ " can climb");
}
}
interface Climb{
public void climb();
}
interface Think {
public void think();
}
interface Learn {
public void learn();
}
interface Apply{
public void apply();
}
class Man implements Think,Learn,Apply,Climb{
String name;
int age;
public Man(String name,int age){
this.name = name;
this.age = age;
}
public void think(){
System.out.println("I can think:"+this.getClass().getSimpleName());
}
public void learn(){
System.out.println("I can learn:"+this.getClass().getSimpleName());
}
public void apply(){
System.out.println("I can apply:"+this.getClass().getSimpleName());
}
public void climb(){
System.out.println("I can climb:"+this.getClass().getSimpleName());
}
public String toString(){
return "Man :"+name+":Age:"+age;
}
}
salida:
Dog:Dog:Tiger:16
Cat:Cat:July:20
Dog can remember for 5 minutes
Dog will protect owner
Dog can learn:
Cat can remember for 16 hours
Cat won''t protect owner
Cat can climb
Man :Ravindra:Age:40
I can climb:Man
I can think:Man
I can learn:Man
I can apply:Man
Puntos importantes para entender:
- El perro y el gato son animales y extendieron
remember
() yprotectOwner
() al compartir elname,lifeExpentency
- El gato puede trepar () pero el perro no. El perro puede pensar () pero Cat no . Estas capacidades específicas se agregan a
Cat
yDog
mediante la implementación de esa capacidad. - El hombre no es un animal pero puede
Think,Learn,Apply,Climb
Al pasar por estos ejemplos, puedes entender que
Las clases no relacionadas pueden tener capacidades a través de la interfaz, pero las clases relacionadas anulan el comportamiento a través de la extensión de las clases base.
Los implementos se utilizan para las interfaces y las extensiones se utilizan para ampliar una clase.
Para que sea más claro en términos más fáciles, una interfaz es como suena, una interfaz, un modelo que debe aplicar, seguir, junto con sus ideas.
Extender se usa para las clases, aquí, estás extendiendo algo que ya existe al agregarle más funcionalidad.
Algunas notas más:
una interfaz puede extender otra interfaz.
Y cuando necesite elegir entre implementar una interfaz o extender una clase para un escenario particular, vaya a implementar una interfaz. Porque una clase puede implementar múltiples interfaces pero extender solo una clase.
Noté que tienes algunas preguntas de C ++ en tu perfil. Si entiendes el concepto de herencia múltiple de C ++ (refiriéndose a las clases que heredan características de más de otra clase), Java no lo permite, pero tiene una interface
palabras clave, que es algo así como una clase virtual pura en C ++ . Como lo mencionó mucha gente, extend
una clase (y solo puedes extender desde una), e implement
una interfaz, pero tu clase puede implementar tantas interfaces como quieras.
Es decir, estas palabras clave y las reglas que gobiernan su uso delinean las posibilidades de herencia múltiple en Java (solo puede tener una súper clase, pero puede implementar múltiples interfaces).
Una class
solo puede "implementar" una interface
. Una clase solo "extiende" una class
. Del mismo modo, una interface
puede extender otra interface
.
Una class
solo puede extender otra class
. Una class
puede implementar varias interface
s.
Si, en cambio, está más interesado en saber cuándo usar las abstract class
y las interface
, consulte este hilo: Interfaz vs Clase abstracta (OO general)
Una interfaz es una descripción de las acciones que puede realizar un objeto ... por ejemplo, cuando se acciona un interruptor de luz, la luz se enciende, no importa cómo, simplemente lo hace. En Programación Orientada a Objetos, una Interfaz es una descripción de todas las funciones que un objeto debe tener para ser una "X". De nuevo, como ejemplo, cualquier cosa que "HECHOS COMO" una luz, debería tener un método turn_on () y un método turn_off (). El propósito de las interfaces es permitir que la computadora aplique estas propiedades y saber que un objeto de TIPO T (cualquiera que sea la interfaz) debe tener funciones llamadas X, Y, Z, etc.
Una interfaz es una estructura / sintaxis de programación que le permite a la computadora imponer ciertas propiedades en un objeto (clase). Por ejemplo, digamos que tenemos una clase de autos y una clase de scooters y una clase de camiones. Cada una de estas tres clases debe tener una acción start_engine (). La forma en que se enciende el "motor" para cada vehículo se deja a cada clase en particular, pero el hecho de que deben tener una acción start_engine es el dominio de la interface .
Usamos SubClass extiende SuperClass solo cuando la subclase quiere usar alguna funcionalidad (métodos o variables de instancia) que ya está declarada en SuperClass , o si quiero modificar ligeramente la funcionalidad de SuperClass ( Anulación de método). Pero digamos, por ejemplo, tengo una clase Animal ( SuperClass ) y una clase Dog ( SubClass ) y hay pocos métodos que he definido en la clase Animal, por ejemplo. doEat (); , duerme (); ... y muchos más.
Ahora, mi clase de perros puede simplemente extender la clase de animales. Si quiero que mi perro use cualquiera de los métodos declarados en la clase de animales, puedo invocar esos métodos simplemente creando un objeto Perro. De esta manera puedo garantizar que tengo un perro que puede comer y dormir y hacer lo que quiera que haga el perro.
Ahora, imagina, un día un amante de los gatos entra en nuestro espacio de trabajo y trata de extender la clase Animal (los gatos también comen y duermen). Ella hace un objeto Cat y comienza a invocar los métodos.
Pero, digamos, alguien intenta hacer un objeto de la clase Animal. Puedes decir cómo duerme un gato, puedes decir cómo come un perro, puedes decir cómo bebe un elefante. Pero no tiene ningún sentido hacer un objeto de la clase Animal. Porque es una plantilla y no queremos ninguna forma general de comer.
Así que, en lugar de eso, preferiré crear una clase abstracta que nadie pueda instanciar, pero que pueda usarse como plantilla para otras clases.
Así que para concluir, la interfaz no es más que una clase abstracta (una clase abstracta pura) que no contiene implementaciones de métodos, sino solo las definiciones (las plantillas). Entonces, quienquiera que implemente la interfaz solo sabe que tiene las plantillas de doEat (); y duerme (); pero tienen que definir su propio doEat (); y duerme (); Métodos según su necesidad.
Usted se extiende solo cuando desea reutilizar alguna parte de la SuperClass (pero tenga en cuenta que siempre puede anular los métodos de su SuperClass según sus necesidades) e implementarlo cuando desee las plantillas y desee definirlas por su cuenta. (según su necesidad).
Compartiré con ustedes un código: lo prueba con diferentes conjuntos de entradas y observa los resultados.
class AnimalClass {
public void doEat() {
System.out.println("Animal Eating...");
}
public void sleep() {
System.out.println("Animal Sleeping...");
}
}
public class Dog extends AnimalClass implements AnimalInterface, Herbi{
public static void main(String[] args) {
AnimalInterface a = new Dog();
Dog obj = new Dog();
obj.doEat();
a.eating();
obj.eating();
obj.herbiEating();
}
public void doEat() {
System.out.println("Dog eating...");
}
@Override
public void eating() {
System.out.println("Eating through an interface...");
// TODO Auto-generated method stub
}
@Override
public void herbiEating() {
System.out.println("Herbi eating through an interface...");
// TODO Auto-generated method stub
}
}
Interfaces definidas :
public interface AnimalInterface {
public void eating();
}
interface Herbi {
public void herbiEating();
}
Extends
se usa cuando quiere atributos de clase / interfaz padre en su clase / interfaz hijo y implements
cuando quiere atributos de una interfaz en su clase.
Ejemplo:
Se extiende usando clase
clase padre
}
clase niño extiende padre
}
Extiende usando la interfaz
interfaz padre
}
interfaz hijo extiende padre
}
Implementos
interfaz A {
}
la clase B implementa A {
}
Combinación de extensiones e implementos.
interface A{
}
class B
{
}
class C implements A,extends B{
}
extends
es para extender una clase.
implements
es para implementar una interfaz
La diferencia entre una interfaz y una clase regular es que en una interfaz no puede implementar ninguno de los métodos declarados. Solo la clase que "implementa" la interfaz puede implementar los métodos. El equivalente en C ++ de una interfaz sería una clase abstracta (no EXACTAMENTE la misma, sino más o menos).
Además, Java no admite herencia múltiple para las clases. Esto se resuelve utilizando múltiples interfaces.
public interface ExampleInterface {
public void doAction();
public String doThis(int number);
}
public class sub implements ExampleInterface {
public void doAction() {
//specify what must happen
}
public String doThis(int number) {
//specfiy what must happen
}
}
ahora extendiendo una clase
public class SuperClass {
public int getNb() {
//specify what must happen
return 1;
}
public int getNb2() {
//specify what must happen
return 2;
}
}
public class SubClass extends SuperClass {
//you can override the implementation
@Override
public int getNb2() {
return 3;
}
}
en este caso
Subclass s = new SubClass();
s.getNb(); //returns 1
s.getNb2(); //returns 3
SuperClass sup = new SuperClass();
sup.getNb(); //returns 1
sup.getNb2(); //returns 2
Le sugiero que haga más investigación sobre el enlace dinámico, el polimorfismo y la herencia en general en la programación orientada a objetos.
extends
es para cuando se hereda de una clase base (es decir, amplía su funcionalidad).
implements
es para cuando estás implementando una interfaz .
Aquí es un buen lugar para comenzar: interfaces y herencia .
Extiende : se utiliza para obtener los atributos de una clase primaria en la clase base y puede contener métodos ya definidos que pueden ser anulados en la clase secundaria.
Implementos : esto se usa para implementar una interfaz (clase principal con firmas de funciones solamente pero no sus definiciones) definiéndola en la clase secundaria.
Hay una condición especial: "¿Qué sucede si deseo que una nueva interfaz sea hija de una interfaz existente?". En la condición anterior, la interfaz secundaria amplía la interfaz principal.
A extiende B:
A y B son ambas clases o ambas interfaces
A implementa B
A es una clase y B es una interfaz
El caso restante donde A es una interfaz y B es una clase no es legal en Java.