Fundamentos de Java: desde la entrada por teclado hasta la orientación a objetos avanzada

Captura de datos desde consola

Para leer información del usuario empleamos la clase java.util.Scanner. El flujo típico consiste en importar la clase, instanciar un objeto y utilizar sus métodos next(), nextInt() o nextDouble() según el tipo esperado.

import java.util.Scanner;

public class EntradaConsola {
    public static void main(String[] args) {
        Scanner lector = new Scanner(System.in);

        System.out.print("Nombre: ");
        String nombre = lector.next();

        System.out.print("Edad: ");
        int edad = lector.nextInt();

        System.out.print("Salario: ");
        double salario = lector.nextDouble();

        System.out.printf("Datos -> %s, %d años, $%.2f%n", nombre, edad, salario);
    }
}

Tabla de multiplicar con bucles anidados

Un clásico para practicar for anidados es la tabla Pitágoras del 1 al 9:

public class TablaMultiplicar {
    public static void main(String[] args) {
        for (int fila = 1; fila <= 9; fila++) {
            for (int col = 1; col <= fila; col++) {
                System.out.print(col + "×" + fila + "=" + (fila * col) + "\t");
            }
            System.out.println();
        }
    }
}

Clases y objetos básicos

Una clase define el "molde"; un objeto es la instancia concreta. A continuación se crea la clase Gato y se utilizan sus atributos:

public class DemoGato {
    public static void main(String[] args) {
        Gato michi = new Gato();
        michi.nombre = "Luna";
        michi.edad   = 3;
        michi.color  = "negro";
        System.out.println(michi);
    }
}

class Gato {
    String nombre;
    int    edad;
    String color;
}

Métodos de instancia

Los métodos encapsulan comportamiento y pueden recibir parámetros o devolver valores. Ejemplo con tres utilidades:

class CalculadoraHumana {
    public void saludo() {
        System.out.println("¡Hola!");
    }

    public int sumatoria(int limite) {
        int total = 0;
        for (int i = 1; i <= limite; i++) total += i;
        return total;
    }

    public int suma(int a, int b) {
        return a + b;
    }
}

Sobrecarga de métodos

Java permite varios métodos con el mismo nombre siempre que difieren en firma (tipo, número u orden de parámetros):

class Calculadora {
    public int    add(int a, int b)          { return a + b; }
    public double add(int a, double b)       { return a + b; }
    public double add(double a, int b)       { return a + b; }
    public int    add(int a, int b, int c)   { return a + b + c; }
}

Parámetros variables (varargs)

Desde Java 5 podemos declarar métodos que acepten un número arbitrario de argumentos del mismo tipo:

public int sumar(int... numeros) {
    int total = 0;
    for (int n : numeros) total += n;
    return total;
}

Ámbito de variables

Las variables de instancia (atributos) viven mientras exista el objeto; las locales solo dentro del bloque o método donde se declaran. Ejemplo de sombreado:

class DemoAmbito {
    int valor = 10;

    void mostrar() {
        int valor = 5;        // sombrea al atributo
        System.out.println(valor);          // 5
        System.out.println(this.valor);     // 10
    }
}

Constructores

Se ejecutan automáticamente al crear un objetto. Permiten inicializar el estado de forma controlada:

class Libro {
    String titulo;
    double precio;

    public Libro(String titulo, double precio) {
        this.titulo = titulo;
        this.precio = precio;
    }
}

Palabra clave this

Resuelve ambigüedades entre parámetros y atributos, y permite invocar a otros constructores de la misma clase:

class Empleado {
    String nombre;
    int edad;

    public Empleado() { this("Sin nombre", 18); }

    public Empleado(String nombre, int edad) {
        this.nombre = nombre;
        this.edad   = edad;
    }
}

Recursividad

Un método puede invocarse a sí mismo para resolver subproblemas más pequeños:

public int factorial(int n) {
    if (n == 1) return 1;
    return n * factorial(n - 1);
}

Herencia y super

Con extends reutilizamos código. Con super accedemos a miembros del padre:

class Vehiculo {
    int velocidadMax = 120;
}

class Coche extends Vehiculo {
    int velocidadMax = 180;

    void mostrarMax() {
        System.out.println(super.velocidadMax); // 120
        System.out.println(this.velocidadMax);  // 180
    }
}

Polimorfismo

El polimorfismo permite tratar objetos de distintas clases mediante una referencia común. Ejemplo con animales:

Animal a = new Perro();   // up-casting
a.sonido();               // ejecuta el de Perro
((Perro) a).ladrar();   // down-casting para métodos propios

Encapsulamiento

Ocultamos datos internos y exponemos solo operaciones seguras:

class CuentaBancaria {
    private double saldo;

    public void depositar(double cantidad) {
        if (cantidad > 0) saldo += cantidad;
    }

    public double getSaldo() { return saldo; }
}

Clases y métodos estáticos

Pertanecen a la clase, no a las instancias, y se comparten entre todos los objetos:

class Contador {
    static int total = 0;

    public Contador() { total++; }
    public static int obtenerTotal() { return total; }
}

Clases internas

Permiten agrupar lógica relacionada y acceder a miembros privados del exterior:

class Exterior {
    private int secreto = 42;

    class Interior {
        void mostrar() {
            System.out.println(secreto);
        }
    }
}

Enumeraciones

Conjunto finito de constantes con nombre:

enum Dia { LUNES, MARTES, MIERCOLES, JUEVES, VIERNES }

Interfaces

Contratos que obligan a las clases a implementar ciertos métodos:

interface Imprimible {
    void imprimir();
}

class Documento implements Imprimible {
    public void imprimir() { System.out.println("Imprimiendo..."); }
}

Gestión de excepciones

Capturamos errores para evitar fallos críticos y ofrecer mensajes claros:

try {
    int x = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("División por cero");
} finally {
    System.out.println("Operación finalizada");
}

Clases de utilidad

Java proporciona utilidades para arrays, fechas, matemáticas, etc. Ejemplos breves:

int[] nums = {5, 2, 9};
Arrays.sort(nums);

BigDecimal precio = new BigDecimal("19.99");
BigDecimal iva     = precio.multiply(new BigDecimal("0.21"));

LocalDate hoy = LocalDate.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");
System.out.println(hoy.format(fmt));

Etiquetas: java Scanner oop inheritance Polymorphism

Publicado el 9-16 13:56