java - programa - ¿Por qué los métodos abstractos solo pueden ser declarados en clases abstractas?
metodo abstracto java (8)
La respuesta simple es que si la clase no es abstracta (clase concreate), podría ser capaz de crear una instancia de esa clase y llamar a cualquier método en esa clase. Pero digamos que si ha declarado un método abstracto en esa clase no abstracta, es imposible llamar a esa clase método abstracto en particular (para evitarlo, no podemos declarar métodos abstractos en una clase no abstracta)
Entiendo que en las clases abstractas los métodos pueden ser abstractos o no. Pero ¿por qué no puedo crear un método abstracto en una clase "normal", no abstracta?
Gracias de antemano por cualquier explicación!
Porque tener un método abstracto lo convierte en una clase abstracta. El razonamiento es circular.
Si desea llamar a un método que proporciona una implementación, esa es la esencia de la programación .
Basados en esta idea, las reglas de Java son:
- No puedes instanciar una clase abstracta.
- Solo puede crear una instancia de una clase no abstracta.
¿Qué pasaría si Java le permitiera llamar a un método en una instancia de una clase no abstracta con ... sin implementación, ya que el método sería abstract
=> sin sentido alguno ?
Es por eso que Java y cualquier otro lenguaje que trate con un mecanismo similar como C # (método virtual) impide declarar un método abstracto en una clase no abstracta.
Si una clase concreta pudiera tener un método abstracto, no podría crear un objeto a partir de ella. Imagine una Shape
con un método concreto getColor()
y un método abstracto draw()
. Es genial referirse a algunas cosas de una manera abstracta, por lo que alguien puede decirle "renderizar una forma":
public void render(Shape s) { ... }
Pero cuando usa esa referencia para llamar a draw()
, espera que el objeto referido por s
sepa cómo hacerlo:
s.draw();
Si a las clases concretas se les permitiera tener métodos abstractos, podría crear una instancia de un objeto Shape, pero cuando llamó al método draw, ¡no sabría qué dibujar! Incluso si supiera decir su color, posición u otras 1000 cosas. Si no está especificado al 100%, no puede existir como objetos de trabajo.
Por lo tanto, Java requiere que esas clases estén marcadas como abstractas Entonces no podrás usarlos para crear objetos, ya que no saben cómo hacer el 100% de las cosas que esperas del objeto. Solo puedes usar clases abstractas para referirte a ellas. Puede estar seguro ahora de que solo las clases que tienen todos sus métodos implementados se utilizarán para crear objetos, y probablemente también tendrán nombres que parecen menos abstractos:
Shape shape = new Rectangle();
render(shape);
Ahora puede decir "renderizar la forma" y programar, usando la referencia al rectángulo, sabrá cómo draw()
.
Tener un método abstracto evita que una clase sea instanciada, lo que la convierte en una clase abstracta de facto. Java insiste en que declare este hecho explícitamente por coherencia: técnicamente, el compilador de Java no necesita esta marca adicional para decidir si una clase es abstracta en función de la presencia de métodos abstractos, pero como es posible que desee hacer una clase abstracta sin hacer cualquiera de sus métodos abstractos, requiriendo la declaración en la clase fue el camino a seguir.
los métodos abstractos están destinados a dejar la implementación a las clases secundarias. Si la clase normal contiene un método abstracto, entonces uno puede crear el objeto para esa clase y puede llamar al método abstracto al igual que el método normal. Entonces ocurrirá el problema. los métodos abstractos de la razón deben estar en clase abstracta (de modo que uno no pueda crear el objeto para la clase abstracta) o solo interfaces.
El método abstracto básicamente dice que no hay implementación del método y debe implementarse en una subclase . Sin embargo, si tuviera un método abstracto en una clase no abstracta , podría crear una instancia de la clase y obtener un objeto, que tendría un método no implementado, al que no podría llamar.
Comencemos por entender por qué necesitamos algo como un método abstracto . La respuesta es simple. No quiero que mis extensores utilicen mis métodos tal como están, quiero que definan su propio comportamiento de un método en particular. Ya que uso este método en otros métodos de mi clase abstracta. Puedo proporcionar un / ** java doc ** / en la clase abstracta y señalarlos para que usen un comportamiento predeterminado.
class abstract LoveTheWorld {
private int myKindness ;
public int defaultGiveKindness() {
myKindness -= 5 ;
return 5 ;
}
/**
you can use the defaultGiveKindness method, and not define your own behavior
**/
public abstract int giveKindness() ;
}
Esto también le dice al extensor que pueden extender solo una clase (según las reglas de herencia de Java). Ahora, si quiere distorsionar esta historia, puede usar la interfaz en lugar de una clase abstracta. Pero todo depende de las restricciones que desee que cumpla su futuro desarrollador, estrictas o flexibles . Strict lo mantendrá firme y garantizará la reducción de errores, flexible lo mantendrá libre y libre y promoverá la innovación. La pregunta es ** ¿Qué necesitas? * 8.