🌎 Clases en Java¶
Las clases es el componente fundamental en la POO. Para entender el concepto de clase, primero necesitamos entender que son los objetos ya que son la clave en la tecnología orientada a objetos.
Objetos¶
Los objetos de software son una parte fundamental de la programación orientada a objetos. Son muy similares a los objetos que representan cosas del mundo real. Como puede ser un micrófono, altavoz, ordenador, etc. Como ya estudiamos en la unidad 1, los objetos del mundo real tienen tres características, identidad, estado y comportamiento.
❇️ Identidad¶
La identidad de un objeto normalmente se implementa a través de un ID único. El valor del ID no es visible para el usuario externo. Sin embargo, la JVM lo utiliza internamente para identificar cada objeto de forma única.
❇️ Estado - Campos o Atributos¶
Representa el valor de los datos. Por ejemplo, para un ordenador, el estado podría ser la cantidad de memoria RAM que tiene, el sistema operativo que incluye, tamaño del disco duro, etc. En el caso de una persona, el estado puede ser la edad, el nombre, si está casada, etc.
❇️ Comportamiento - Métodos¶
Atendiendo al comportamiento de un ordenador podría ser arrancando, apagándose, reiniciando, escribir en la pantalla, etc. Para una persona será comer, beber, dormir, etc.
Los objetos de software almacenan su estado en atributos o propiedades. Es lo que conocemos como variables. Y exponen su comportamiento en lo que llamamos métodos.
Instancias de la clase
Un objeto es una instancia de la clase. Una clase es una plantilla o modelo a partir del cual se crean objetos. Un objeto es la instancia (resultado) de una clase.
Clases¶
Teniendo en cuenta todo esto, podemos pasar a hablar de clase.
Una clase es una plantilla para crear objetos.
Para crear un clase en Java utilizamos la palabra reservada class
.
La nomenclatura del nombre de la clase es primera letra en mayúsculas y usar la regla CamelCase para palabras compuestas.
public class Coche {
}
public
: es un modificador de acceso, determina qué acceso queremos permitir a otros en la clase. Existen tres tipos de modificadores de acceso:
- public: en este caso, public especifica que no hay ninguna restricción de acceso.
- private: nadie puede acceder a la clase.
- protected: permite a las clases de este paquete acceder y subclases.
- class: identificador de clase.
¿De qué forma nos ayudan las clases en nuestro código? Bien, hasta ahora solo hemos trabajado con tipos de datos primitivos como int, short, char, etc. Este tipo de datos es bastante limitado. Por tanto, las clases se podrían considerar como un tipo de dato extra poderoso definido por el usuario que nos permite realizar acciones en las que los datos primitivos se quedan cortos.
Una clase puede contener:
- Campos
- Métodos
- Constructores
- Bloques de código
- Clases o interfaces anidadas
Miembros de la clase : atributos y métodos¶
Atributos, campos de la clase o variables de instancia¶
Hasta ahora hemos creado variables dentro de un método. A éstas se les llama variables locales porque son propias del método en si. Y no puedes acceder a ellas desde fuera de ese método. También vimos esto dentro de bloques de código {}, donde las variables creadas en un bloque más interno no eran accesibles en bloques más externos. Ejemplo:
public static void sumar() {
int contador = 0;
while (contador < 10) {
int suma = 0;
suma += contador;
contador ++;
}
System.out.println(suma); // esto da error, la variable
// suma aquí no existe.
}
A diferencia de esto, las clases nos permiten crear variables que pueden ser accesibles desde cualquier lugar dentro de la clase que estamos creando. A estas variables se les conoce con el nombre de variables miembro/instancia, o de manera más común como campos o atributos de la clase.
Creación de atributos de la clase¶
Para crear un campo de la clase se debe especificar:
un modificador de acceso(opcional) + tipo de dato + nombre de la variable + inicialización(opcional).
Si no se pone modificador utiliza el de por defecto en el que la variable es accesible por las clases dentro del mismo paquete.
El modificador de acceso funciona de la misma forma a como lo hemos explicado anteriormente para la creación de una clase.
public class Coche {
private int puertas;
private int ruedas;
private String modelo;
private String color;
}
Estamos definiendo el estado del coche, es decir, sus características.
Modificadores de acceso de atributos¶
Un buen diseño de software refuerza la encapsulación. Aquí es donde las variables de instancia de un objeto son visibles solo para los propios métodos del objeto. El código fuera del objeto no puede acceder directamente a estas variables. Se utiliza para hacer esto el modificador de visibilidad privada. Como regla general, cuando definimos campos para la clase el modificador de acceso será privado. Es decir, usamos el concepto de encapsulación que es una clave fundamental de la programación orientada a objetos. Lo que hacemos es ocultar los campos de la clase del acceso público para que nadie pueda acceder y modificar los campos de la clase. Significa que la representación del objeto se ocultará a la vista, es decir, el funcionamiento interno del objeto.
Existen los siguientes tipos de modificadores, ordenados de menor a mayor restricción:
- public: son accesibles desde cualquier lugar.
- protected: son accesibles desde dentro del mismo paquete y en clases heredadas.
- sin modificador: son accesibles desde la propia clase y clases dentro del mismo paquete.
- private: solo son accesibles desde la propia clase, no son accesibles desde fuera.
//modificador público
public int speed;
//modificador protegido
protected int speed;
//sin modificador
int speed;
//modificador privado
private int speed;
Encapsulación¶
Uno de los pilares de la POO es la encapsulación, y se refiere al ocultamiento de los datos miembro de un objeto, de manera que solo se pueda cambiar mediante las operaciones definidas para ese objeto.
Consejos para elegir un nivel de acceso.¶
- Utiliza el nivel de acceso más restrictivo que tenga sentido para un miembro en particular. Usa private a menos que tengas una buena razón para no hacerlo.
- Evita los campos públicos a excepción de las constantes.
Métodos de acceso: Getters y Setters¶
Hemos visto que la encapsulación se aconseja la ocultación de la información.
¿Cómo accedemos a la información?
Para actualizar las propiedades de la clase, como su acceso es privado se utilizan los métodos de acceso.
Para crear los métodos que actualizan los campos debemos usar la siguiente nomenclatura:
-
Setters: Permiten modificar una propiedad del objeto.
public void setNombreCampo(TipoDatoCampo nombreCampo), donde el parámetro del método debe ser del mismo tipo ya que vamos a actualizar su valor mediante el método.
-
Getters: devuelven el valor de una propiedad de un objeto de la clase
public tipoDatoCampo getNombreCampo()
public class Coche {
private int puertas;
private int ruedas;
private String modelo;
private String color;
public void setPuertas(int puertas) {
this.puertas = puertas;
}
public int getPuertas() {
return this.puertas;
}
public void setRuedas(int ruedas) {
this.ruedas = ruedas;
}
public int getRuedas() {
return this.ruedas;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
public String getModelo() {
return this.modelo;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return this.color;
}
}
Palabra reservada this¶
This hace referencia al objeto actual de la clase. En un método set, como el nombre del parámetro del método es igual al del campo de la clase, necesitamos algo que nos permita distinguir entre uno u otro. Para esto se utiliza la palabra reservada this que hace alusión al campo de la clase.
Protección de datos de la clase¶
Los setter y getter nos permite la introducción de datos correctos en el objeto. Por ejemplo, si las especificaciones nos indican que el número de puertas solamente pueden ser 3, 4 ó 5. Podemos tener un método setter
public void setPuertas(int puertas){
if(puertas>=3 || puertas<=5){
this.puertas=puertas;
}else {
System.err.println("Error: número de puertas incorrecto");
}
}
Transformación de datos¶
También se puede dar el caso que queramos mostrar siempre el modelo en mayúsculas. Podemos tener un setter que transforme los datos de entrada
public void setModelo(String modelo) {
this.modelo = modelo.toUpperCase();
}
Si quisiéramos mantener los datos de entrada del usuario para la propiedad modelo pero al obtener el dato lo queremos devolver siempre en mayúsculas, la solución puede ser:
public void setModelo(String modelo) {
this.modelo = modelo;
}
public String getModelo() {
//devolvemos el string en mayúsculas
return modelo.toUpperCase();
}
Clase Object en java¶
Es necesario conocer a grandes rasgos la clase Object
. También es llamada como clase cósmica, ya que la clase Object
, es la clase que está por encima de todas las clases de la api de java.
Esto quiere decir que todas las clases de java que vienen predefinidas en el lenguaje de programación, como las que nosotros construimos, heredan de la clase object
.
Por eso, cuando creamos un objeto, viene ya definido con ciertos métodos que se han heredado de la clase Object
.
JavaDoc: Documentación de la clase¶
Como ya indicamos en el tema de programación modular, tenemos la siguientes tags para documentar con JavaDoc
Las etiquetas que podemos utilizar
TAG | DESCRIPCIÓN |
---|---|
@author | Nombre del desarrollador. |
@deprecated | Indica que el método o clase es obsoleto (propio de versiones anteriores) y que no se recomienda su uso. |
@param | Definición de un parámetro de un método, es requerido para todos los parámetros del método. |
@return | Informa de lo que devuelve el método, no se aplica en constructores o métodos "void". |
@see | Asocia con otro método o clase. |
@version | Versión del método o clase. |
Las etiquetas @author y @version se usan para documentar clases e interfaces, de esta manera, podemos documentar la clase Coche:
/**
* La clase Coche contiene la información básica de los coches de
* la empresa
* @version 2.11.2023
* @author Pepito Grillo
*/
public class Coche {
private int puertas;
private double peso;
private double precio;
private String motor;
private int ruedas;
private String modelo;
private String color;
}