martes, 2 de octubre de 2012

Clases Abstractas

Buenas amigos, en este nuevo tema vamos a ver las clases abstractas. Estas clases se caracterizan por tener algunos de sus métodos declarados como abstractos, pero ¿qué es un método abstracto?. Un método abstracto es aquel que está definido, pero no tiene cuerpo, es decir, le declaramos el nombre, los parámetros y el tipo de devolución pero no le declaramos lo que va entre llaves "{}", es más, no le ponemos llaves.



Estas clases se utilizan para permitir que otras clases hereden de ella y proporcionar un modelo a seguir.

La declaración de una clase y método abstracto es el siguiente:

      • Public abstract class nombreClase{
        • public abstract tipo nombre(argumentos (si los lleva));
      • }
Reglas básicas de este tipo de clases:
  • Como ya he mencionado, una clase se declara abstracta si tiene algún método abstracto. 
  • Una clase abstracta no puede crear objetos, es decir, no podemos utilizar "new" para una clase abstracta, ya que tiene métodos que no están definidos.
  • Una clase abstracta no puede ser a la vez "final".
  • Si una clase hereda de una clase abstracta, deberá de sobreescribir todos los métodos abstractos, si no es así, la clase que hereda deberá ser pasada a abstracta.
  • Una clase abstracta puede llevar métodos NO abstractos, pero solo con que exista un método abstracto, la clase deberá ser pasada a abstracta.
  • Como los métodos estáticos no pueden ser redefinidos, un método abstracto no puede ser estático.
  • Una clase abstracta si puede tener constructores. Como sabemos, no es posible crear objetos de una clase abstracta, pero de una clase, la cual herede de una clase abstracta, si se pueden crear objetos, y como sabemos cuando creamos un objeto de una clase que hereda, la primera llamada de su constructor es una llamada al constructor de la clase "padre", lo que permite que aunque no cree un objeto, si se pueda utilizar su constructor.
Pongamos un ejemplo:


Bien, en esta clase abstracta tenemos:

  • un atributo de tipo "String" llamado "color".
  • Un constructor al cual le pasamos un parámetro de tipo "String".
  • 2 métodos abstracto.
  • Un método NO abstracto

Creamos una clase llamada cuadrado que herede de Figura la cual posee:

  • 2 atributos "x" e "y".
  • Un constructor al cual le pasamos 3 parámetros.
  • Una llamada al constructor de la superclase "Figura", la cual, como le pusimos un parámetro, a super() le tenemos que pasar un parámetro.
  • Los 2 métodos heredados, a los cuales les damos cuerpo.

Creamos una clase Circulo que herede de figura, la cual posee lo siguiente:

  • Un atributo.
  • Un constructor con parámetros.
  • Una llamada al constructor de la superclase "Figura" a la cual le pasamos el parámetro correspondiente.
  • Los 2 métodos heredados de "Figura" con cuerpo.

Bien en esta última clase realizamos un pequeño menú con los bucles "SWITCH" y "DO/WHILE"
  • Comenzamos introduciendo una opción, por ejemplo 1.
  • El switch nos manda a la opción "case 1". En ella se nos pide el radio y el color del futuro Circulo.
  • Una vez introducido los datos que nos pide, creamos un objeto de la clase Circulo, al cual le pasamos  los parámetros que nos pide. Cabe mencionar, que como ya dijimos, no es posible crear un objeto de la clase "Figura" ya que es una clase abstracta, pero con la ayuda del polimorfismo podemos crear un objeto de la clase Circulo y así poder utilizar atributos y métodos de la clase "Figura"
      • Figura f=new Figura();// Esto nos da error
      • Figura f=new Circulo();//Esto está bien.
  • Nos imprime por pantalla el área, el perímetro y el color.
  • Tras esto, nos vuelve aparecer el menú para crear otro objeto, o para salir de la aplicación, en cuyo caso no volverá a aparecer el menú.
No se si me dejo algo, disculpad, si es así. Espero que os haya servido de ayuda.

Un saludo.

14 comentarios:

  1. Me sirvio mucho hermano, explicación sencilla pero concisa, saludos desde México.

    ResponderEliminar
  2. Muy buena explicacion!!!

    ResponderEliminar
  3. Muchas gracias entendi a la perfeccion este tema. Mira que en me costo trabajo aprender pero en unos minutos comprendi muy bien el concepto.

    Sigue adelante...saludos desde Peru

    ResponderEliminar
  4. excelente explicacion, muchas gracias

    ResponderEliminar
  5. Gracias, me ha sido de gran ayuda y sencillo de entender.

    ResponderEliminar
  6. Que buena informacion, corta, concreta y precisa, muy buen trabajo.

    ResponderEliminar
  7. muchas gracias BARTOLOMÉ

    ResponderEliminar
  8. La definición esta mal, una clase abstracta NO PERMITE QUE OTRAS HEREDEN de ella, sino que solo se implementan

    ResponderEliminar