Domina Java: Entendiendo Objetos, Clases y Conceptos Básicos de POO
Java es un lenguaje Orientado a Objetos. Como lenguaje con características de POO, Java soporta los siguientes conceptos fundamentales:
- Polimorfismo
- Herencia
- Encapsulamiento
- Abstracción
- Clases
- Objetos
- Instancia
- Método
- Paso de Mensajes
En este capítulo veremos los conceptos: Clases y Objetos.
Objeto – Los objetos tienen estados y comportamientos. Ejemplo: Un perro tiene estados - color, nombre, raza - y comportamientos: mover la cola, ladrar, comer. Un objeto es una instancia de una clase.
Clase – Una clase es una plantilla/modelo que describe el comportamiento/estado que soportan los objetos de su tipo.
Objetos en Java
Veamos en profundidad qué son los objetos. En el mundo real hay muchos objetos: coches, perros, humanos. Todos tienen estado y comportamiento.
Si consideramos un perro, su estado es: nombre, raza, color; comportamiento: ladrar, mover la cola, correr.
Comparando objeto software con objeto real, tienen características muy similares.
Los objetos software también tienen estado y comportamiento. El estado se almacena en campos y el comportamiento se muestra vía métodos.
En desarrollo de software, los métodos operan sobre el estado interno de un objeto y la comunicación objeto-a-objeto se hace vía métodos.
Clases en Java
Una clase es un modelo a partir del cual se crean objetos individuales.
Ejemplo de una clase:
Ejemplo
public class Perro {
String raza;
int edad;
String color;
void ladrando() { }
void hambriento() { }
void durmiendo() { }
}
Una clase puede contener cualquiera de los siguientes tipos de variables:
Variables locales – Definidas dentro de métodos, constructores o bloques. Se declaran e inicializan dentro del método y se destruyen cuando este termina.
Variables de instancia – Dentro de una clase pero fuera de cualquier método. Se inicializan cuando la clase se instancia. Accesibles desde cualquier método, constructor o bloque de esa clase.
Variables de clase – Declaradas dentro de una clase, fuera de cualquier método, con la palabra clave
static.
Una clase puede tener cualquier número de métodos para acceder al valor de varios tipos de métodos. En el ejemplo, ladrando(), hambriento() y durmiendo() son métodos.
Constructores
Al hablar de clases, uno de los subtemas más importantes son los constructores. Toda clase tiene un constructor. Si no escribimos explícitamente uno, el compilador de Java crea un constructor por defecto.
Cada vez que se crea un nuevo objeto, se invoca al menos un constructor. La regla principal: deben tener el mismo nombre que la clase. Una clase puede tener más de un constructor.
Ejemplo de constructor:
Ejemplo
public class Cachorro {
public Cachorro() { }
public Cachorro(String nombre) {
// Este constructor tiene un parámetro, nombre.
}
}
Java también soporta Clases Singleton donde solo puedes crear una instancia de una clase.
Nota – Hay dos tipos de constructores. Los discutiremos en detalle en capítulos posteriores.
Creando un Objeto
Como se mencionó, una clase proporciona los planos para objetos. Básicamente, un objeto se crea a partir de una clase. En Java, la palabra clave new se usa para crear nuevos objetos.
Tres pasos al crear un objeto:
Declaración – Declaración de variable con nombre y tipo objeto.
Instanciación – La palabra clave 'new' crea el objeto.
Inicialización – 'new' seguido de llamada a constructor. Esta llamada inicializa el nuevo objeto.
Ejemplo de creación de objeto:
Ejemplo
Demo en Vivopublic class Cachorro {
public Cachorro(String nombre) {
System.out.println("Nombre pasado: " + nombre);
}
public static void main(String []args) {
// Crear objeto miCachorro
Cachorro miCachorro = new Cachorro("tommy");
}
}
Al compilar y ejecutar, produce:
Salida
Nombre pasado: tommy
Acceso a Variables de Instancia y Métodos
Se accede vía objetos creados. Para acceder a una variable de instancia:
/* Primero crear un objeto */ ReferenciaObjeto = new Constructor(); /* Llamar a una variable */ ReferenciaObjeto.nombreVariable; /* Llamar a un método de clase */ ReferenciaObjeto.NombreMetodo();
Ejemplo
Este ejemplo explica cómo acceder a variables de instancia y métodos de una clase.
Demo en Vivopublic class Cachorro {
int edadCachorro;
public Cachorro(String nombre) {
System.out.println("Nombre elegido: " + nombre);
}
public void setEdad(int edad) { edadCachorro = edad; }
public int getEdad() {
System.out.println("Edad del cachorro: " + edadCachorro);
return edadCachorro;
}
public static void main(String []args) {
Cachorro miCachorro = new Cachorro("tommy");
miCachorro.setEdad(2);
miCachorro.getEdad();
System.out.println("Valor Variable: " + miCachorro.edadCachorro);
}
}
Al compilar y ejecutar:
Salida
Nombre elegido: tommy Edad del cachorro: 2 Valor Variable: 2
Reglas de Declaración en Archivo Fuente
Reglas esenciales al declarar clases, sentencias import y package en un archivo fuente:
- Solo puede haber una clase pública por archivo fuente.
- Un archivo puede tener múltiples clases no públicas.
- El nombre de la clase pública debe ser el nombre del archivo con .java al final. Ejemplo: public class Empleado{} → Empleado.java.
- Si la clase está en un paquete, la sentencia
packagedebe ser la primera en el archivo. - Si hay sentencias
import, deben ir entrepackagey la declaración de clase. Sinpackage,importdebe ser la primera línea. importypackageafectan a todas las clases del archivo. No se pueden declarar diferentes imports/packages para diferentes clases en el mismo archivo.
Las clases tienen varios niveles de acceso y tipos: abstractas, final, etc. Explicaremos en el capítulo de modificadores de acceso.
Además de los tipos mencionados, Java tiene clases especiales: clases internas y anónimas.
Paquete Java
En palabras simples, es una forma de categorizar clases e interfaces. Al desarrollar aplicaciones en Java, se escriben cientos de clases e interfaces, por lo que categorizarlas es imprescindible y facilita la vida.
Sentencias Import
Si se da un nombre completamente calificado (paquete + nombre de clase), el compilador puede localizar fácilmente el código fuente o clases. La sentencia import da la ubicación correcta al compilador para encontrar esa clase.
Ejemplo: la siguiente línea pide al compilador cargar todas las clases en java_installation/java/io:
import java.io.*;
Estudio de Caso Simple
Crearemos dos clases: Empleado y EmpleadoTest.
Primero abre el bloc de notas y añade el siguiente código. Esta es la clase Empleado, pública. Guárdalo como Empleado.java.
La clase Empleado tiene cuatro variables de instancia: nombre, edad, cargo y salario. Tiene un constructor explícito que toma un parámetro.
Ejemplo
import java.io.*;
public class Empleado {
String nombre;
int edad;
String cargo;
double salario;
// Constructor de la clase Empleado
public Empleado(String nombre) { this.nombre = nombre; }
// Asignar edad
public void empEdad(int empEdad) { edad = empEdad; }
// Asignar cargo
public void empCargo(String empCargo) { cargo = empCargo; }
// Asignar salario
public void empSalario(double empSalario) { salario = empSalario; }
// Imprimir detalles del empleado
public void printEmpleado() {
System.out.println("Nombre: " + nombre);
System.out.println("Edad: " + edad);
System.out.println("Cargo: " + cargo);
System.out.println("Salario: " + salario);
}
}
El procesamiento empieza en el método main. Para ejecutar Empleado, necesitamos un main y crear objetos. Crearemos una clase separada para esto.
Clase EmpleadoTest, crea dos instancias de Empleado e invoca métodos para asignar valores.
Guarda como EmpleadoTest.java.
import java.io.*;
public class EmpleadoTest {
public static void main(String args[]) {
Empleado empUno = new Empleado("James Smith");
Empleado empDos = new Empleado("Mary Anne");
empUno.empEdad(26);
empUno.empCargo("Ingeniero de Software Senior");
empUno.empSalario(1000);
empUno.printEmpleado();
empDos.empEdad(21);
empDos.empCargo("Ingeniero de Software");
empDos.empSalario(500);
empDos.printEmpleado();
}
}
Compila ambas clases y ejecuta EmpleadoTest:
Salida
C:\> javac Empleado.java C:\> javac EmpleadoTest.java C:\> java EmpleadoTest Nombre:James Smith Edad:26 Cargo:Ingeniero de Software Senior Salario:1000.0 Nombre:Mary Anne Edad:21 Cargo:Ingeniero de Software Salario:500.0
¿Qué Sigue?
En la próxima sesión, discutiremos los tipos de datos básicos en Java y cómo usarlos al desarrollar aplicaciones.
Java
- Clases y objetos en C#: Fundamentos para POO robusta
- Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
- Funciones y clases amigas en C++: dominando el control de acceso
- Variables y Literales en Java: Guía Completa
- Clases y Objetos en Java: Guía Práctica
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Clases y métodos abstractos en Java: Guía completa
- Dominando clases anidadas e internas en Java: Tipos, ejemplos y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura