CLASES EN JAVA
¿Qué son las clases?
Las clases en Java son básicamente una plantilla que sirve para crear un objeto. Si
imaginásemos las clases en el mundo en el que vivimos, podríamos decir que la clase
«persona» es una plantilla sobre cómo debe ser un ser humano. Todos y cada uno de
nosotros, los seres humanos, somos objetos de la clase «persona», ya que todos somos
personas. La clase «persona» contiene la definición de un ser humano, mientras que cada ser
humano es una instancia u objeto de dicha clase. Por lo tanto:
Una clase no es más que un modelo o plantilla sobre la cual creamos
nuestros objetos.
¿Que son objetos?
Un Objeto es una instancia (derivación de algo) de una clase, un objeto en Java es
creado a partir de una clase, si tenemos un objeto “Materia, de código 001“, es una instancia
de la clase Materia.
Características de una clase en Java
Existe una estructura fundamental para todas las clases definidas en Java, que
debemos tener en cuenta al momento de construir clases:
Nombre: Identifica la clase de forma única en nuestro proyecto.
Propiedades: Hacemos referencia a los atributos o campos de nuestra clase.
Constructor: Aquí definimos las acciones que ocurrirán por defecto cuando creamos
un objeto a partir de nuestra clase.
Métodos: Estos son los procesamientos o acciones disponibles para el objeto creado a
partir de nuestra clase, normalmente aquí se definen métodos para asignar valores a
las propiedades (Atributos), como también métodos para obtener valores de las
propiedades.
HERENCIA EN JAVA
La herencia es un pilar importante de OOP (Programación Orientada a Objetos). Es el
mecanismo en Java por el cual una clase permite heredar las características (atributos y
métodos) de otra clase.
¿Qué es Herencia?
Podemos definir la herencia como la capacidad de crear clases que adquieren de
manera automática los miembros (atributos y métodos) de otras clases que ya existen,
pudiendo al mismo tiempo añadir atributos y métodos propios.
En el lenguaje de Java, una clase que se hereda se denomina superclase. La clase que
hereda se llama subclase. Por lo tanto, una subclase es una versión especializada de una
superclase. Hereda todas las variables y métodos definidos por la superclase y agrega sus
propios elementos únicos.
Terminología importante
Superclase: la clase cuyas características se heredan se conoce como superclase (o
una clase base o una clase principal).
Subclase: la clase que hereda la otra clase se conoce como subclase (o una clase
derivada, clase extendida o clase hija). La subclase puede agregar sus propios campos
y métodos además de los campos y métodos de la superclase.
Reutilización: la herencia respalda el concepto de “reutilización”, es decir, cuando
queremos crear una clase nueva y ya hay una clase que incluye parte del código que
queremos, podemos derivar nuestra nueva clase de la clase existente. Al hacer esto,
estamos reutilizando los campos/atributos y métodos de la clase existente.
Ventajas de la Herencia
Entre las principales ventajas que ofrece la herencia en el desarrollo de aplicaciones, están:
Reutilización del código: En aquellos casos donde se necesita crear una clase que,
además de otros propios, deba incluir los métodos definidos en otra, la herencia evita
tener que reescribir todos esos métodos en la nueva clase.
Mantenimiento de aplicaciones existentes: Utilizando la herencia, si tenemos una
clase con una determinada funcionalidad y tenemos la necesidad de ampliar dicha
funcionalidad, no necesitamos modificar la clase existente (la cual se puede seguir
utilizando para el tipo de programa para la que fue diseñada) sino que podemos crear
una clase que herede a la primera, adquiriendo toda su funcionalidad y añadiendo la
suya propia.
ABSTRACCIÓN EN JAVA
En Java se dice que son clases abstractas aquellas clases base (superclases) de las que
no se permite la creación de objetos.
(La abstracción es como se pueden representar los objetos en modo de código.)
Una de las características más útiles de cualquier lenguaje orientado a objetos es la
posibilidad de declarar clases que definen como se utiliza solamente, sin tener que
implementar métodos. Esto es muy útil cuando la implementación es específica para cada
usuario, pero todos los usuarios tienen que utilizar los mismos métodos. Un ejemplo sencillo
para comprender este concepto:
Ejemplo 1
¿Qué características podemos abstraer de los automóviles? o ¿Qué características semejantes
tienen todos los automóviles?
Características: Marca, Modelo, Número de chasis, Peso llantas o cauchos, Puertas,
Ventanas... Comportamiento: Acelerar, Frenar, Retroceder...
Ejemplo 2
La gerencia de un taller mecánico necesita un sistema para controlar los vehículos que
ingresan a sus instalaciones. En este caso, las características esenciales de la clase vehículo
son: Marca, Modelo, Color, Falla detectada, Nombre del Propietario, Dirección del
Propietario, Teléfono del Propietario...
A esto se le llama abstracción. En general un programa no es más que una descripción
abstracta de un procedimiento o fenómeno que existe o sucede en el mundo real.
POLIMORFISMO
Veremos que el polimorfismo y la herencia son dos conceptos estrechamente ligados.
Conseguimos implementar polimorfismo en jerarquías de clasificación que se dan a través de
la herencia. Por ejemplo, tenemos una clase vehículo y de ella dependen varias clases hijas
como coche, moto, autobús, etc.
¿Para qué nos sirve en la práctica el polimorfismo?
Tenemos la clase Parqueo. Dentro de ésta tenemos un método estacionar (). Puede que en un
Parqueo tenga que estacionar coches, motos o autobuses. Sin polimorfismo tendría que crear
un método que permitiese estacionar objetos de la clase "Coche", otro método que acepte
objetos de la clase "Moto" para estacionarlos, etc. Pero todos estaremos de acuerdo que
estacionar un coche, una moto o un bus es bastante similar: "entrar en el Parqueo, recoger el
ticket de entrar, buscar una plaza, situar el vehículo dentro de esa plaza...".
Lo ideal sería que nuestro método me permita recibir todo tipo de vehículos para
estacionarlos, primero por reutilización del código, ya que es muy parecido estacionar uno u
otro vehículo, pero además porque así si mañana el mercado trae otro tipo de vehículos,
como una van, todoterreno hibrido, o una nave espacial, mi software sea capaz de aceptarlos
sin tener que modificar la clase Parqueo.
Gracias al polimorfismo, cuando declaro la función estacionar () puedo decir que recibe
como parámetro un objeto de la clase "Vehículo" y el compilador me aceptará no solamente
vehículos genéricos, sino todos aquellos objetos que hayamos creado que hereden de la clase
Vehículo, o sea, coches, motos, buses, etc. Esa relajación del sistema de tipos para aceptar
una gama de objetos diferente es lo que llamamos polimorfismo.
ENCAPSULAMIENTO
Consiste en unir en la Clase las características y comportamientos, esto es, las variables y
métodos. Es tener todo esto en una sola entidad.
En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se
logra gracias a la abstracción. La utilidad del encapsulamiento va por la facilidad para
manejar la complejidad, ya que tendremos a las Clases como cajas rojas donde sólo se
conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos
interesará conocer que hace la Clase pero no será necesario saber cómo lo hace.
Ejemplo 1
De un televisor, el usuario conoce su apariencia y parte de su funcionamiento. Sólo le
importa que funcionen el selector de canales, el video y el audio; no le interesa saber cómo
funciona
Ejemplocada
2 una de las partes internas del aparato, ese detalle sólo le interesan al fabricante
y al técnico de servicio.
De un animal no sólo es necesario conocer su apariencia; también se requiere conocer qué
sabe hacer y cómo reacciona ante determinadas situaciones.
Caja Negra
Un objeto en el que su comportamiento y atributos son conocidos pero no así su trabajo
interno, el cual continúa siendo un misterio.