Clases en Java
La clase es uno de los elementos fundamentales de los programas en Java. En una clase se definen las propiedades y el comportamiento de una unidad de software, conocida como objeto. Estos conceptos vienen de la programación orientada a objetos (POO). En este artículo aprenderás sobre las clases en Java y como implementarlas.
A una clase se le puede ver como el plano de una casa, donde se establecen las partes que debe tener la casa y cómo se deben conectar las habitaciones entre sí, el plano no es la casa en sí misma, pero usando el plano es como se puede construir una casa con esas características, y con el mismo plano se pueden construir muchas casas concretas.
Así mismo, una clase en Java es la que contiene todas las instrucciones y los elementos que deberán tener los objetos que son construidos a partir de esta.
Por otro lado, ciertas cosas pueden variar de una casa a otra, pero sin violar las especificaciones del plano, por ejemplo, una casa puede ser blanca y otra azul, pero ambas tienen color; una casa puede tener alfombra y otra cerámica, pero ambas tienen suelo.
Así pues, una clase define las características que puede tener un objeto que se construye a partir de ella, a estas características se les denomina propiedades, y se permite que los valores de las propiedades varíen de un objeto a otro, de hecho, en la misma clase se pueden implementar los mecanismos para modificar los valores de las propiedades, estos mecanismos se implementan en forma de métodos (llamados funciones en otros lenguajes de programación)
¿Cómo hacer una clase en Java?
La clase más básica que se puede declarar en Java es como sigue:
class Perro {
}
Por supuesto que esta clase no sería de mucha utilidad,
ya que solo define el nombre de la clase.
Observa como se utiliza la palabra reservada class
,
seguida del nombre que el programador asigna a la clase,
luego llaves que abren y cierran, dentro de estas llaves
es donde se deben incluir las propiedades y los métodos.
Los nombres de las clases en Java siguen las mismas reglas de nomenclatura que las variables, te recomiendo que sigas la convención de camel case, la cual propone nombrar las clases empezando con mayúscula y el resto con minúsculas, si hay más de una palabra formando el nombre de la clase, cada palabra debe empezar con mayúscula.
class ClaseConCuatroPalabras {
}
Las clases deben estar contenidas en archivos con la extensión “.java
”.
Paquetes en Java
Para mantener las clases organizadas en los programas de Java, se utilizan paquetes. Un paquete puede tener tanto clases como sub paquetes.
La forma en la que especificas a qué paquete pertenece una clase,
es con la palabra reservada package
seguida del nombre del paquete
(La convención es utilizar minúsculas para los nombres de paquetes),
y debe ser la primera línea de código en el archivo.
package geometria;
class Rectangulo {
}
Cuando se define un paquete para una clase,
esta debe estar contenida en un directorio que corresponda al nombre del paquete,
por ejemplo, la clase Rectangulo
de aquí arriba pertenece al paquete geometria
,
por lo tanto, el archivo Rectangulo.java
debe estar contenido en el directorio geometria
,
si no lo hicieras así, la clase puede ser compilada sin problemas,
pero a la hora de ejecutar el código obtendríamos un error como el que sigue,
Error: Could not find or load main class Rectangulo
Caused by: java.lang.NoClassDefFoundError: geometria/Rectangulo (wrong name: Rectangulo)
Si la clase está contenida en un sub paquete,
para separar cada paquete en la ruta se utiliza el punto “.
”.
/*
* Esta clase puede estar contenida en el archivo C:\geometria\figuras\Triangulo.java
*/
package geometria.figuras;
class Triangulo {
}
Por lo general no debes preocuparte por crear manualmente los directorios que contendrán las clases de tus programas, porque afortunadamente los editores de código se encargan de eso, tú solo debes especificar los paquetes a los que pertenecen tus clases.
Niveles de acceso de una clase en Java
Los cuatro niveles de acceso de una clase en Java son público, privado, protegido, y paquete, si la clase es pública, el archivo se debe llamar igual que la clase. En este artículo hablaré del nivel de acceso de clases más común, acceso público.
Clases públicas
Para declarar una clase pública, solo tienes que utilizar la palabra reservada public
,
como se muestra a continuación,
package restaurante;
public class Lechuga {
}
Cuando las clases pertenecen al mismo paquete, estas tienen acceso entre sí, ya sea para herencia o composición (más adelante puedes aprender sobre estos conceptos)
package restaurante;
public class Platillo {
Lechuga lechuga; // Declaramos un objeto de tipo Lechuga, el cual será un colaborador de Platillo.
}
Las clases públicas también pueden ser accedidas por clases que estén en un paquete distinto,
pero para ello se tiene que importar con la palabra reservada import
e indicar el paquete de la clase que deseas importar, junto con el nombre de la clase,
por ejemplo, si las clases Platillo y Lechuga pertenecieran a paquetes distintos,
y aún quisieramos utilizar un objeto de la clase Lechuga dentro de la clase Platillo,
lo lograríamos de la siguiente forma,
/*
* Dentro del archivo C:\restaurante\ingredientes\Lechuga.java
*/
package restaurante.ingredientes;
public class Lechuga {
}
Luego nuestra clase Platillo se tendría que definir así,
/*
* Dentro del archivo C:\restaurante\menu\Platillo.java
*/
package restaurante.menu;
import restaurante.ingredientes.Lechuga;
public class Platillo {
Lechuga lechuga;
}
En el código anterior, si no se importara explícitamente la clase Lechuga, habría un error de compilación, porque Java no sabría dónde encontrar la clase, dado que Platillo y Lechuga pertenecen a paquetes distintos.
Constructores en Java
Cuando creas una clase en Java, la creas con el propósito de construir objetos a partir de ella (recuerda que la clase es simplemente un “plano” que define las propiedades y comportamiento que deberán tener los objetos que instancian la clase), y para construir objetos necesitamos un constructor.
Si no especificas un constructor cuando defines una clase, Java creará un constructor sin parámetros por defecto, pero si creas un constructor manualmente, ya sea sin o con parámetros, Java no añadirá ningún constructor por defecto. Si por algún motivo aún quisieras tener disponible un constructor sin parámetros en tu clase, junto con el constructor con parámetros, tendrías que agregarlo manualmente.
A veces es necesario definir uno o varios constructores manualmente, porque los objetos necesitan inicializar su estado al momento de ser creados.
El estado de un objeto es el conjunto de valores que tienen sus propiedades en un momento en particular, y como los valores de las propiedades pueden cambiar, el estado de un objeto varía durante la ejecución del programa.
Los constructores deben tener el mismo nombre que la clase y se definen dentro de la clase misma, estos pueden o no recibir parámetros.
A continuación te muestro cómo puedes crear un constructor sin parámetros para tu clase,
class Circulo {
Circulo() {
}
}
Y ahora un constructor con parámetros,
class Triangulo {
Triangulo(float base, float altura) {
// Aquí irá algún código que utiliza los parámetros **_base_** y **_altura_**
}
}
La forma de utilizar el constructor es por medio de la palabra reservada new,
Circulo miCirculo = new Circulo();
La línea anterior crea un objeto a partir de la clase Circulo
,
a esto también se le conoce como instanciar la clase.
Se debe empezar con el nombre de la clase,
luego el nombre que le asignarás al objeto,
y finalmente la palabra reservada new
junto con la llamada al constructor Circulo()
En Java, los constructores
- Se utilizan para crear objetos y definir el estado inicial de los mismos
- Deben tener el mismo nombre que la clase
- No deben especificar un tipo a regresar
- Pueden sobrecargarse, es decir, puede haber más de un constructor por clase siempre y cuando reciban diferentes parámetros
Propiedades de una clase
Como mencioné anteriormente, las propiedades de una clase representan las características que tendrán los objetos que la instancian,
Las propiedades también pueden contener colaboradores de la clase, un colaborador es un objeto de una clase externa, por ejemplo, si tuvieses una clase llamada Auto, esta va a necesitar de un motor, pero el motor es tan complejo en sí mismo, que se puede crear una clase exclusivamente para definir al motor, y después declaramos un objeto de tipo Motor dentro de la clase Auto, así, el objeto de la clase Motor sería efectivamente un colaborador de Auto.
class Motor {
int numCilindros;
String tipoCombustible;
public Motor(int numCilindros, String tipoCombustible) {
this.numCilindros = numCilindros;
this.tipoCombustible = tipoCombustible;
System.out.println("El motor ha sido creado...");
}
}
public class Auto {
Motor motor;
public Auto(Motor motor) {
this.motor = motor;
System.out.println("El auto ha sido creado...");
}
}
En el código anterior se crean 2 clases con sus respectivos constructores.
Las propiedades de Motor
son numCilindros
y tipoCombustible
,
y Auto
solo tiene una propiedad, que representa al colaborador Motor
.
Pasos para definir una clase en Java
- Crear un archivo que contendrá la definición de la clase, con extensión .java
- Indicar el paquete de la clase (No es obligatorio, pero sí recomendado)
- Importar clases necesarias de otros paquetes (No es obligatorio, pero generalmente es necesario)
- Especificar el nivel de acceso (private, public, protected, o nivel paquete que no requiere modificador)
- Nombrar la clase, si es una clase pública debe llamarse igual que el archivo que la contiene (sin la extensión)
- Agregar las propiedades y métodos que almacenarán el estado y comportamiento de los objetos
- Definir el constructor o constructores que establecerán el estado inicial de los objetos
Referencias Bibliográficas
Selikoff, S., Boyarsky, J. (2014). OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808. Reino Unido: Wiley.
Referencias Digitales
Tutorial de Clases en Java, del sitio de la comunidad de Java.