Java Fundamentals: De lo Visual a Código

Iníciate en el mundo de la programación Java de una forma amigable y progresiva. Comenzaremos con entornos visuales como Alice 3 y Greenfoot para construir una base sólida en lógica y Orientación a Objetos, para luego sumergirnos en la sintaxis y estructura de Java.

Nivel: Principiante Duración Estimada: 50 horas Enfoque: Programación Visual, Java Básico, POO

Módulo 1: Introducción a Alice 3

Alice 3 es un innovador entorno de programación basado en bloques que te permite crear animaciones 3D, contar historias interactivas y construir juegos simples. Su objetivo principal es enseñar conceptos de programación, especialmente la Programación Orientada a Objetos (POO), de una manera visual y atractiva, eliminando la barrera de la sintaxis compleja.

¿Cómo funciona Alice 3?

En lugar de escribir código, arrastras y sueltas bloques que representan instrucciones. Estos bloques se encajan como piezas de un rompecabezas, asegurando que solo se puedan formar combinaciones lógicas y sintácticamente correctas.

Escena 3D de Alice
Haz clic en los controles para interactuar
Código de la escena:
dragon.mover(ADELANTE, 1)
dragon.girar(DERECHA, 0.25)
dragon.decir("¡Hola Mundo!")

Características Destacadas de Alice 3:

  • Entorno 3D Interactivo: Cuentas con una galería rica en modelos 3D (personas, animales, vehículos, edificios) que puedes agregar a tu escena. Puedes manipular sus propiedades (color, tamaño, posición) y hacerlos interactuar.
  • Programación Orientada a Objetos (POO) Visual:
    • Objetos: Cada elemento en tu escena es un objeto. Por ejemplo, un `Dragon` es un objeto.
    • Clases: Los objetos se crean a partir de "planos" o plantillas llamadas clases. Alice proporciona clases como `Biped` (para humanoides), `Flyer` (para objetos voladores), `Quadruped` (para animales de cuatro patas). Puedes ver la jerarquía de clases y cómo un `Dragon` podría ser un `Flyer`.
    • Métodos (Procedimientos y Funciones): Son las acciones que los objetos pueden realizar (ej: `dragon.moveForward(1)`), o las preguntas que puedes hacer sobre ellos (ej: `dragon.distanceTo(princesa)`). En Alice, defines estos métodos arrastrando bloques de acción.
    • Propiedades: Atributos de los objetos que puedes cambiar (ej: `dragon.setPaint(Color.RED)`).
  • Estructuras de Control Visuales: Conceptos como bucles (`count`, `while`), condicionales (`if/else`) y eventos (when mouse clicks on object) se representan con bloques específicos que estructuran tu código.
  • Narración de Historias y Creación de Juegos: Alice fomenta la creatividad al permitirte diseñar escenarios y coreografiar las acciones de tus personajes para contar una historia o crear las mecánicas de un juego simple.
  • Puente hacia Java (Alice to Java Mode): Una característica clave es la capacidad de ver una representación en código Java del programa que has creado con bloques. Esto ayuda a los estudiantes a familiarizarse con la sintaxis de Java gradualmente.
Lógica en Alice (Conceptual)

// Bloque de Alice:
// HACER EN ORDEN
//   personaje.mover(ADELANTE, 1 metro)
//   personaje.decir("¡Hola Mundo!")
                            
Equivalente en Java (Simplificado)

// Código Java correspondiente:
// (Dentro de un método en una clase de personaje)
this.move(Direction.FORWARD, 1.0);
this.say("¡Hola Mundo!");
                            

Beneficios de Aprender con Alice 3:

  • Aprendizaje Intuitivo: Reduce la frustración inicial con la sintaxis, permitiendo enfocarse en la lógica y el diseño algorítmico.
  • Motivación y Compromiso: La creación de animaciones y juegos 3D es inherentemente atractiva.
  • Desarrollo del Pensamiento Computacional: Fomenta la descomposición de problemas, el reconocimiento de patrones y el diseño de algoritmos.
  • Sólida Base para POO: Introduce de forma tangible los conceptos de objetos, clases, métodos y propiedades.

Alice 3 es una excelente herramienta para dar tus primeros pasos en la programación antes de sumergirte en lenguajes basados en texto como Java.

Primeros Pasos con Alice

1. Descarga e instala Alice 3 desde su sitio web oficial.

2. Explora los tutoriales integrados para familiarizarte con la interfaz.

3. Desafío Creativo: Crea una escena simple con al menos dos personajes. Programa una interacción básica: un personaje se mueve hacia el otro y le "dice" un saludo. Experimenta cambiando sus propiedades (color, tamaño) y añadiendo más acciones.

Quiz Rápido: Conceptos de Alice

1. ¿Qué representa un objeto 3D en la escena de Alice?
Instancia de una Clase
Método
Variable
Estructura de Control
2. El bloque "personaje.mover(...)" en Alice representa:
Clase
Método
Propiedad
Herencia
3. La plantilla "Biped" en Alice es un ejemplo de:
Método
Objeto
Clase
Evento
4. El bloque "Si (condición) Entonces..." en Alice es un ejemplo de:
Método
Clase
Estructura de Control Condicional
Propiedad

Módulo 2: Explorando con Greenfoot

Greenfoot es un entorno de desarrollo integrado (IDE) diseñado para facilitar el aprendizaje de la programación en Java, especialmente para principiantes, a través de la creación de juegos 2D y simulaciones interactivas. Combina la programación visual con la escritura de código Java real, sirviendo como un excelente puente entre entornos puramente basados en bloques (como Alice) y los IDEs profesionales de Java.

La Metáfora de Greenfoot: Mundo y Actores

Greenfoot se basa en dos conceptos principales:

  • Mundo (World): Es el escenario o el fondo donde ocurren las acciones. Creas una subclase de greenfoot.World para definir tu propio mundo (ej: NivelJuego, Oceano).
  • Actores (Actors): Son los objetos que viven y actúan en el mundo (personajes, enemigos, proyectiles, obstáculos). Creas subclases de greenfoot.Actor (ej: Heroe, Moneda).
// Código de Caminante.java import greenfoot.*; public class Caminante extends Actor { private int velocidad = 2; public void act() { // El cursor simula este método move(velocidad); if (isAtEdge()) { turn(180); } if (Greenfoot.isKeyDown("space")) { turn(5); } } }

Características Clave de Greenfoot:

  • Programación Directa en Java: A diferencia de Alice, en Greenfoot escribes código Java estándar, pero con el apoyo de una API simplificada y un entorno visual.
  • Entorno Interactivo: Puedes colocar actores en el mundo manualmente, inspeccionar sus estados e invocar sus métodos directamente desde la interfaz para probarlos.
  • Ciclo de Actuación (act()): El corazón de la mayoría de los actores es el método public void act(). Este método es llamado repetidamente por Greenfoot cuando el escenario está "corriendo", permitiendo que los actores realicen acciones y reaccionen a su entorno en cada "paso" de la simulación.
  • API de Greenfoot: Proporciona clases y métodos útiles para tareas comunes en juegos y simulaciones:
    • Movimiento: move(int distance), turn(int angle), setLocation(int x, int y).
    • Detección de Teclas: Greenfoot.isKeyDown(String keyName).
    • Interacción con Objetos: isTouching(Class clss), getOneObjectAtOffset(int dx, int dy, Class clss), removeTouching(Class clss).
    • Sonido: Greenfoot.playSound(String soundFile).
    • Control del Mundo: getWorld(), addObject(Actor actor, int x, int y), removeObject(Actor actor).
  • Visualización Inmediata: Los cambios en el código se reflejan rápidamente en el comportamiento visual de los actores en el mundo.

Ejemplo Práctico: Un Actor que se Mueve

Creemos un actor simple llamado Caminante que se mueve de izquierda a derecha.

Caminante.java

import greenfoot.*;  // Importa las clases necesarias de Greenfoot

public class Caminante extends Actor {
    private int velocidad = 2; // Pixeles que se moverá por acto

    /**
     * El método act se ejecuta cuando se presiona el botón Act o Run.
     * Aquí es donde definimos el comportamiento principal del Caminante.
     */
    public void act() {
        move(velocidad); // Se mueve hacia adelante (según su rotación actual)
        
        // Si llega al borde del mundo, da la vuelta
        if (isAtEdge()) {
            turn(180); // Gira 180 grados
        }
        
        // Ejemplo de interacción con teclas (opcional)
        if (Greenfoot.isKeyDown("space")) {
            // Si se presiona espacio, podría saltar o hacer otra acción
            // Por ahora, solo giramos un poco
            turn(5); 
        }
    }
}
                            
MiMundo.java

import greenfoot.*;

public class MiMundo extends World {
    public MiMundo() {    
        super(600, 400, 1); // Crea un mundo de 600x400 celdas con tamaño de celda 1x1 pixels.
        prepararMundo();
    }

    private void prepararMundo() {
        Caminante miCaminante = new Caminante();
        addObject(miCaminante, 50, 200); // Añade el caminante en la posición (50, 200)
        
        Caminante otroCaminante = new Caminante();
        addObject(otroCaminante, 50, 100);
        otroCaminante.turn(90); // Lo hacemos mirar hacia abajo
    }
}
                            

Diagrama de Flujo: método act() del Caminante

Inicio act()
move(velocidad)
¿isAtEdge()?
turn(180)
No
¿Tecla espacio?
turn(5)
No
Fin act()

Beneficios de Greenfoot:

  • Introducción Amigable a Java: Permite escribir código Java real en un contexto visual y menos abstracto.
  • Aprendizaje de POO: Conceptos como clases, objetos, herencia (extends Actor) y polimorfismo se vuelven prácticos.
  • Desarrollo de Habilidades en Diseño de Juegos/Simulaciones: Lógica de juego, manejo de eventos, interacciones entre objetos.
  • Comunidad y Escenarios: Existe una galería de escenarios y proyectos compartidos por la comunidad que pueden ser estudiados y modificados.

Alice 3 vs. Greenfoot

Característica Alice 3 Greenfoot
Paradigma Principal Bloques visuales, enfocado en POO conceptual y storytelling 3D. Código Java textual, enfocado en juegos/simulaciones 2D y POO práctica.
Curva de Aprendizaje Muy baja, ideal para principiantes absolutos. Baja a media, requiere aprender sintaxis Java básica.
Transición a Java Ofrece un modo "Alice to Java" para ver código. Se escribe Java directamente, una transición más natural a IDEs estándar.
Uso Principal Introducir lógica de programación y POO sin la carga de la sintaxis. Enseñar Java y POO en un contexto interactivo y motivador.

Desafío Greenfoot

1. Descarga e instala Greenfoot desde su sitio oficial.

2. Completa el tutorial "Cráteres de Erizos" (Hedgehog scenario) que suele venir con Greenfoot o está disponible en su web.

3. Modifica el actor `Caminante` del ejemplo anterior para que, además de moverse, cambie de color cada vez que toca el borde del mundo. (Pista: necesitarás la clase `GreenfootImage` y sus métodos como `setColor()` y `fill()`).

Ver Pista/Solución

Módulo 3: Conceptos Fundamentales de Java y Estructura de un Programa

Una vez familiarizados con la lógica de programación a través de entornos visuales, es hora de sumergirnos en Java, uno de los lenguajes de programación más robustos, versátiles y demandados en el mundo del desarrollo de software.

¿Qué es Java?

Java es un lenguaje de programación de alto nivel, orientado a objetos, concurrente y fuertemente tipado, desarrollado originalmente por Sun Microsystems (ahora Oracle). Su lema "Write Once, Run Anywhere" (WORA - Escribe una vez, ejecuta en cualquier lugar) se refiere a su capacidad de ejecutar código compilado en cualquier plataforma que tenga una Máquina Virtual de Java (JVM) instalada.

Funcionamiento de Java

Código Fuente
(.java)
Compilador
(javac)
Bytecode
(.class)
JVM
(Java Virtual Machine)

El proceso de "Write Once, Run Anywhere" de Java:

El código fuente Java (.java) se compila a bytecode (.class) que puede ejecutarse en cualquier plataforma que tenga instalada una JVM, independientemente del sistema operativo o hardware.

Aplicaciones Comunes:

  • Desarrollo de aplicaciones empresariales a gran escala.
  • Aplicaciones móviles para Android.
  • Aplicaciones web del lado del servidor (Servlets, JSPs, Spring Framework).
  • Herramientas de Big Data (como Hadoop).
  • Sistemas embebidos y dispositivos IoT.

Entorno de Desarrollo Java (JDK, JRE, IDE)

  • JDK (Java Development Kit): Esencial para desarrolladores. Incluye el compilador (javac), la JVM, bibliotecas estándar y otras herramientas.
  • JRE (Java Runtime Environment): Necesario para *ejecutar* aplicaciones Java. Incluye la JVM y bibliotecas, pero no herramientas de desarrollo.
  • IDE (Integrated Development Environment): Entornos como IntelliJ IDEA, Eclipse o VS Code con extensiones para Java facilitan la escritura, compilación, depuración y gestión de proyectos Java.
Para este curso, se recomienda instalar el JDK más reciente y un IDE de tu elección. Hay muchas guías online para ello.

Estructura Básica de un Programa en Java

Todo programa en Java se organiza dentro de clases. El punto de entrada para la ejecución es el método main.


// Nombre del archivo: HolaMundo.java
package com.moridevedu.ejemplos; // Opcional: define un paquete

import java.util.Date; // Opcional: importa clases de otros paquetes

/**
 * Esta es una clase de ejemplo para demostrar la estructura básica.
 * El nombre de la clase pública debe coincidir con el nombre del archivo.
 */
public class HolaMundo {

    /**
     * El método main es el punto de entrada de la aplicación Java.
     * @param args Argumentos pasados desde la línea de comandos (un array de Strings).
     */
    public static void main(String[] args) {
        // Esta es una sentencia. Termina con punto y coma.
        System.out.println("¡Hola, Mundo Java desde MoriDevEdu!"); 
        
        Date fechaActual = new Date(); // Creando un objeto de la clase Date
        System.out.println("La fecha y hora actual es: " + fechaActual.toString());
    } // Fin del método main
} // Fin de la clase HolaMundo
                    

Explorando la Estructura del Código

Vista de Código
Vista de Estructura
Estructura
  • com.moridevedu.ejemplos
  • HolaMundo.java
  • HolaMundo
  • main(String[] args)
Elemento Seleccionado:
Método main
Firma del método:
public static void main(String[] args)
Descripción:
  • public: Es un modificador de acceso que indica que el método puede ser llamado desde cualquier otra clase.
  • static: Significa que el método pertenece a la clase HolaMundo y no a una instancia específica. Se puede llamar sin crear un objeto.
  • void: Indica que el método no devuelve ningún valor.
  • main: Es el nombre especial que la JVM busca para iniciar la ejecución.
  • String[] args: Es un parámetro que representa un array de cadenas de texto. Son los argumentos que se pueden pasar al programa al ejecutarlo.

Compilación y Ejecución

Terminal
user@laptop : ~/java-proyectos $ javac HolaMundo.java
user@laptop : ~/java-proyectos $ java HolaMundo
¡Hola, Mundo Java desde MoriDevEdu!
La fecha y hora actual es: Thu May 15 10:30:45 COT 2025

Conceptos Clave Iniciales en Java:

1. Variables y Tipos de Datos Primitivos

Una variable es un contenedor que almacena un valor. En Java, debes declarar el tipo de dato de una variable antes de usarla.

Visualizador de Tipos de Datos Java

edad
byte
25
1 byte (-128 a 127)
población
short
30000
2 bytes
contador
int
100
4 bytes
estrellas
long
10000000000L
8 bytes
precio
float
19.99f
4 bytes
pi
double
3.14159
8 bytes
inicial
char
'J'
2 bytes (Unicode)
esValido
boolean
true
1 bit lógico
nombreCurso
String
"Java Fundamentals"
No es primitivo

2. Operadores

Java soporta diversos operadores:

  • Aritméticos: +, -, *, / (división), % (módulo/resto).
  • Asignación: =, +=, -=, *=, /=, %=.
  • Incremento/Decremento: ++ (incrementar en 1), -- (decrementar en 1). Pueden ser prefijos (++a) o postfijos (a++).
  • Relacionales (Comparación): == (igual a), != (no igual a), >, <, >=, <=. Devuelven boolean.
  • Lógicos: && (Y lógico), || (O lógico), ! (NO lógico).
  • Operador Ternario: condicion ? valorSiVerdadero : valorSiFalso;

Tabla Interactiva de Operadores

Operador Categoría Ejemplo Resultado
+ Aritmético 10 + 5 15
- Aritmético 10 - 5 5
* Aritmético 10 * 5 50
/ Aritmético 10 / 5 2
% Aritmético 10 % 3 1 (resto)
++ Incremento int a = 5; a++; a = 6
== Relacional 5 == 5 true
&& Lógico true && false false
?: Ternario a > b ? a : b El mayor valor

3. Estructuras de Control de Flujo

Dirigen el orden en que se ejecutan las sentencias.

Visualizador de Estructuras de Control

Estructura if-else

int edad = 18;
if (edad >= 18) {
    System.out.println("Es mayor de edad.");
} else if (edad > 0 && edad < 18) {
    System.out.println("Es menor de edad.");
} else {
    System.out.println("Edad no válida.");
}
                                    
0 15 30
Resultado:
Es mayor de edad.
Bucle for

for (int i = 0; i < 5; i++) {
    System.out.println("Iteración: " + i);
}
                                    
1 5 10
Salida:
Iteración: 0
Iteración: 1
Iteración: 2
Iteración: 3
Iteración: 4

4. Métodos

Bloques de código reutilizables que realizan una tarea específica. Pueden recibir parámetros y devolver un valor.

Métodos en acción: Calculadora


public class Calculadora {
    // Método que no devuelve valor (void) y recibe dos parámetros enteros
    public static void sumar(int num1, int num2) {
        int resultado = num1 + num2;
        System.out.println(num1 + " + " + num2 + " = " + resultado);
    }

    // Método que devuelve un valor (double) y recibe un parámetro
    public static double calcularAreaCirculo(double radio) {
        if (radio < 0) {
            return 0.0; // Manejo de valor inválido
        }
        return Math.PI * radio * radio;
    }

    public static void main(String[] args) {
        // Llamamos al método sumar
        sumar(10, 5);
        
        // Llamamos al método calcularAreaCirculo y guardamos su resultado
        double area = calcularAreaCirculo(3.5);
        System.out.println("Área del círculo: " + area);
        
        // Probemos con un valor inválido
        double areaInvalida = calcularAreaCirculo(-2);
        System.out.println("Área con radio negativo: " + areaInvalida);
    }
}
                                
Calculadora Interactiva
Método sumar(int, int)
+
10 + 5 = 15
Método calcularAreaCirculo(double)
Área del círculo: 38.48451001

Ejercicio: Mini Calculadora

1. Crea una clase `MiniCalculadora`.

2. Implementa métodos estáticos para las cuatro operaciones básicas (suma, resta, multiplicación, división). Cada método debe aceptar dos números (double) y devolver el resultado.

3. El método de división debe manejar el caso de división por cero (ej: imprimiendo un error y devolviendo 0.0 o `Double.NaN`).

4. En el método `main`, prueba cada una de tus funciones con diferentes valores e imprime los resultados.

Ver Ejemplo de Solución

Módulo 4: Arrays (Matrices), Excepciones y Profundización en Clases y Objetos

Este módulo expande nuestros conocimientos sobre cómo agrupar datos con arrays, cómo manejar errores de forma robusta con excepciones, y cómo la Programación Orientada a Objetos (POO) se materializa en Java a través de clases y objetos.

Arrays (Matrices) en Java

Un array es una estructura de datos que almacena una colección de tamaño fijo de elementos del mismo tipo. Los elementos se acceden mediante un índice numérico (empezando en 0).

Visualizador de Arrays

Array de enteros

int[] numeros = {10, 20, 30, 40, 50};
                                
Índice:
0
1
2
3
4
Valor:
10
20
30
40
50
Acceso a elementos:
numeros[0] = 10
numeros[2] = 30
numeros.length = 5

Recorriendo Arrays:

Con for tradicional

// Usando un bucle for tradicional
System.out.println("Nombres:");
for (int i = 0; i < nombres.length; i++) {
    nombres[i] = "Nombre " + (i + 1); // Asignar valores
    System.out.println(nombres[i]);
}
                            
Con for-each (enhanced for)

// Usando un bucle for-each - para leer elementos
System.out.println("\nCalificaciones (for-each):");
for (double calif : calificaciones) { 
    // "por cada double calif en calificaciones"
    System.out.println(calif);
}
                            

Arrays Multidimensionales:

Arrays de arrays, comúnmente usados para representar matrices o tablas.

Matriz Bidimensional


int[][] matriz = {
    {1, 2, 3},  // fila 0
    {4, 5, 6},  // fila 1
    {7, 8, 9}   // fila 2
};
                            
1
2
3
4
5
6
7
8
9
Acceso por coordenadas [fila][columna]:
matriz[0][0] = 1
matriz[1][2] = 6
matriz[2][1] = 8
La clase java.util.Arrays ofrece métodos útiles para trabajar con arrays: Arrays.toString(), Arrays.sort(), Arrays.fill(), Arrays.binarySearch().

Excepciones en Java (Manejo de Errores)

Las excepciones son eventos anómalos que ocurren durante la ejecución de un programa y que interrumpen el flujo normal. Java proporciona un robusto mecanismo para manejarlas.

Jerarquía de Excepciones

  • Throwable
    • Error
      • OutOfMemoryError
      • StackOverflowError
    • Exception
      • RuntimeException
        • NullPointerException
        • ArrayIndexOutOfBounds
      • Checked Exceptions
        • IOException
        • SQLException
Runtime Exceptions

No es obligatorio manejarlas. Indican errores de programación (ej: divisiones por cero, índices fuera de rango).

Checked Exceptions

El compilador obliga a manejarlas con try-catch o declararlas con throws. Indican condiciones externas (ej: problemas de E/S, fallos de red).

Bloque try-catch-finally:

Simulador de Try-Catch


try {
    int[] numeros = {1, 2, 3};
    System.out.println("Intentando acceder al elemento en índice " + indice);
    int valor = numeros[indice]; // Puede lanzar ArrayIndexOutOfBoundsException
    System.out.println("Valor obtenido: " + valor);
    
    int resultado = 10 / divisor; // Puede lanzar ArithmeticException
    System.out.println("Resultado de división: " + resultado);
    
} catch (ArrayIndexOutOfBoundsException e) {
    System.err.println("Error: Índice fuera de los límites del array");
    System.err.println("Detalle: " + e.getMessage());
} catch (ArithmeticException e) {
    System.err.println("Error: División por cero no permitida");
    System.err.println("Detalle: " + e.getMessage());
} finally {
    System.out.println("Bloque 'finally' ejecutado. Limpieza finalizada.");
}
                                
Selecciona los valores y haz clic en "Ejecutar" para ver el resultado.
Consejo:

Prueba diferentes combinaciones para ver cómo se comporta el mecanismo de excepciones de Java. Observa cómo se capturan diferentes excepciones en sus respectivos bloques catch.

Cláusula throws: Un método puede declarar que *puede* lanzar ciertas excepciones verificadas, delegando su manejo al código que lo llama.


import java.io.IOException;
import java.io.FileReader;

public class LectorArchivo {
    // Este método declara que puede lanzar una IOException
    public static void leerPrimerCaracter(String nombreArchivo) throws IOException {
        FileReader fr = null;
        try {
            fr = new FileReader(nombreArchivo);
            System.out.println("Primer caracter: " + (char)fr.read());
        } finally {
            if (fr != null) fr.close(); // Asegura cerrar el archivo
        }
    }

    public static void main(String[] args) {
        try {
            leerPrimerCaracter("miarchivo.txt");
        } catch (IOException e) {
            System.err.println("Error al leer el archivo: " + e.getMessage());
        }
    }
}
                    
Para lanzar una excepción manualmente, usa la palabra clave throw:
throw new IllegalArgumentException("Argumento inválido");

Clases y Objetos: Fundamentos de POO en Java

Java es intrínsecamente orientado a objetos. El código se organiza en clases, que son plantillas para crear objetos.

Clases y Objetos Visualizados

Clase Producto (Plantilla)
Atributos (Estado):
  • String codigo
  • String nombre
  • double precio
  • int stock
Métodos (Comportamiento):
  • mostrarInformacion()
  • agregarStock(int cantidad)
  • vender(int cantidad)
  • getPrecio()
  • setPrecio(double nuevoPrecio)
Instanciación
new Producto(...)
Objeto: laptop
  • codigo = "LAP001"
  • nombre = "Laptop Gamer Pro"
  • precio = 1200.50
  • stock = 10
Objeto: mouse
  • codigo = "MOU002"
  • nombre = "Mouse Óptico Inalámbrico"
  • precio = 25.99
  • stock = 50

Definición de una Clase:

Una clase define el estado (campos o atributos) y el comportamiento (métodos) de los objetos que se crearán a partir de ella.


// Archivo: Producto.java
public class Producto {
    // Campos (estado del objeto) - Variables de instancia
    String codigo;
    String nombre;
    double precio;
    int stock;

    // Constructor: Método especial para inicializar un objeto cuando se crea.
    // Tiene el mismo nombre que la clase y no tiene tipo de retorno.
    public Producto(String codigo, String nombre, double precio, int stockInicial) {
        // 'this' se refiere a la instancia actual del objeto
        this.codigo = codigo;
        this.nombre = nombre;
        this.precio = precio;
        this.stock = stockInicial;
        System.out.println("Producto '" + this.nombre + "' creado.");
    }
    
    // Otro constructor (sobrecargado) con valores por defecto
    public Producto(String codigo, String nombre, double precio) {
        this(codigo, nombre, precio, 0); // Llama al otro constructor usando 'this()'
    }

    // Métodos (comportamiento del objeto) - Métodos de instancia
    public void mostrarInformacion() {
        System.out.println("--- Información del Producto ---");
        System.out.println("Código: " + this.codigo);
        System.out.println("Nombre: " + this.nombre);
        System.out.println("Precio: $" + this.precio);
        System.out.println("Stock: " + this.stock + " unidades");
    }

    public void agregarStock(int cantidad) {
        if (cantidad > 0) {
            this.stock += cantidad;
            System.out.println(cantidad + " unidades agregadas al stock de " + this.nombre);
        } else {
            System.out.println("La cantidad a agregar debe ser positiva.");
        }
    }

    public boolean vender(int cantidad) {
        if (cantidad > 0 && cantidad <= this.stock) {
            this.stock -= cantidad;
            System.out.println("Venta realizada: " + cantidad + " unidades de " + this.nombre);
            return true;
        } else {
            System.out.println("No se pudo realizar la venta. Stock insuficiente o cantidad inválida.");
            return false;
        }
    }

    // Método getter para el precio (Encapsulación)
    public double getPrecio() {
        return this.precio;
    }

    // Método setter para el precio (Encapsulación)
    public void setPrecio(double nuevoPrecio) {
        if (nuevoPrecio > 0) {
            this.precio = nuevoPrecio;
        } else {
            System.out.println("El precio debe ser positivo.");
        }
    }
}
                    

Creación y Uso de Objetos:

Simulador de Objetos

Laptop Gamer Pro

Objeto de la clase Producto (código: LAP001)

código
"LAP001"
nombre
"Laptop Gamer Pro"
precio
1200.50
stock
10
Métodos disponibles:

Encapsulación: Es uno de los pilares de la POO. Consiste en ocultar el estado interno de un objeto y exponer solo las operaciones necesarias a través de métodos públicos (getters y setters son comunes para controlar el acceso a los campos privados).

Palabra clave this: Dentro de una clase, this se refiere a la instancia actual del objeto. Se usa para desambiguar entre campos de instancia y parámetros con el mismo nombre, o para llamar a otro constructor de la misma clase (this(...)).

Miembros Estáticos (static): Los campos y métodos declarados como `static` pertenecen a la clase en sí, no a una instancia particular. Se accede a ellos usando el nombre de la clase (ej: `Math.PI`, `Integer.parseInt()`). El método `main` es siempre `static`.

Ejercicio: Clase `CuentaBancaria`

1. Define una clase `CuentaBancaria` con los siguientes campos: `numeroCuenta` (String), `titular` (String), `saldo` (double).

2. Crea un constructor para inicializar estos campos.

3. Implementa los siguientes métodos:

  • depositar(double cantidad): Incrementa el saldo. Debe validar que la cantidad sea positiva.
  • retirar(double cantidad): Decrementa el saldo. Debe validar que la cantidad sea positiva y que haya saldo suficiente.
  • consultarSaldo(): Devuelve el saldo actual.
  • mostrarDatosCuenta(): Imprime todos los datos de la cuenta.

4. En una clase `BancoApp` con un método `main`, crea al menos dos objetos `CuentaBancaria` y prueba todas sus funcionalidades (depósitos, retiros, consultas).

5. (Opcional Avanzado) Maneja las validaciones (cantidad negativa, saldo insuficiente) lanzando excepciones personalizadas (ej: `SaldoInsuficienteException` que extienda de `Exception`).

Prototipo de Solución Interactiva
Cuenta: 10001
Titular: Ana García
Saldo: $1,500.00
Cuenta: 10002
Titular: Carlos López
Saldo: $2,300.00
// Registro de operaciones bancarias
// Haz clic en los botones para ver el resultado
¡Has completado los fundamentos!