Java SE & POO
Java SE & POO
Introducción a Java SE
¿Qué es Java?
Java es un lenguaje de programación orientado a objetos de alto nivel, creado en 1991 por
James Goslim mientras trabajaba en Sun Microsystems, este lenguaje fue creado para ser
multiplataforma y poder funcionar en diferentes sistemas operativos mediante una máquina
virtual que se instala en cada equipo, este lenguaje fue comprado por Oracle en el año de
2009 pero personas o comunidades Open source le dan mantenimiento a Java haciendolo
mas accesible a todas las personas.
Java sigue la filosofía de Write Once, Run Anywhere (WORA) gracias a su máquina virtual,
también todo lo que aprendas en Java SE lo podrás aplicar también con Java EE.
● Java Runtime Environment (JRE): La máquina virtual de Java, lo que nos permite
que al escribir el mismo código funcione igual en todos los dispositivos y sistemas
operativos.
● Compilador de Java: El encargado de traducir nuestro código en Java a un lenguaje
que puede entender e interpretar nuestra máquina virtual.
● APIs de desarrollo: Una base de código lista para ayudarnos a desarrollar.
Las APIs de desarrollo con Java han evolucionado con el tiempo, por lo que existen
diferentes versiones de java que puedes utilizar. La versión que más elevó la popularidad y
las ofertas de trabajo con Java fue Java SE 6.
En Java SE 9 anunciaron que las actualizaciones ocurrirían cada 6 meses, pero las
versiones LTS (Long Time Support) tendrán mantenimiento por 3 años, así que las
actualizaciones son necesarias, pero no urgentes.
En este curso vamos a trabajar con la versión Java SE 11 LTS, la primera versión de Java
con licencia. Solo podremos usarlo gratis cuando trabajamos en ambientes de desarrollo y
testing. De otra forma, debemos pagar 2.5 USD al mes por usuario de escritorio y 25 USD
por procesador para aplicaciones de servidor.
Afortunadamente, OpenJDK es una versión gratis y open source de usar Java SE Platform
Edition.
Esta es una imagen donde se representa toda la arquitectura y entorno de Java.
Java 10 introdujo algunos cambios en la forma de declarar variables, así que en este curso
vamos a trabajar con las versiones 8 y 11 de Java.
La herramienta más usada para construir proyectos web con Java es Maven, pero también
existen otras alternativas como Gradle. También existen frameworks como Spring para
trabajar con Java EE y ORMs como Hibernate para trabajar con bases de datos.
El IDE recomendado por Oracle es NetBeans, pero también están Eclipse e IntelliJ IDEA,
este último es el que más fuerza ha tomado gracias a Kotlin. Las tres herramientas son
gratuitas, pero IntelliJ IDEA también tiene una versión de pago.
JShell
Sabías que Java tiene una herramienta interactiva en dónde puedes ir probando segmentos
de código en vez de realizar todo el proceso de creación de un programa en Java. Escribir,
compilar y correr.
Sintaxis de Java
Variables y tipos de datos
Consideraremos que las variables son entidades elementales muy similares a contenedores
al que se le deposita o asigna un valor: un número, un carácter, un valor verdadero o falso,
mientras que los objetos son entidades complejas que pueden estar formadas por la
agrupación de muchas variables y métodos estos tipos de datos lo abordaremos más
adelante cuando veamos POO. Pero ambas cosas ocupan lo mismo: un espacio de
memoria (que puede ser más o menos grande).
⚠️ Nota:
- Desde la versión de Java10 se implementó un tipo de dato
genérico que se puede usar para todo tipo de variables.
- var saludo = "Hola mundo"; var dinero = 10.5;
Tipos primitivos
Los tipos de datos primitivos que Java utiliza como se observa en la imagen anterior, son los
tipos de datos simples que al declararlos no es necesaria una invocación y estos carecen de
métodos.
char letra = 'a';
int numero = 123;
boolean enojado = false;
Estos tipos de datos se utilizan para guardar cifras y se dividen en dos categorías
"enteros" y "decimales", estos tipos de datos tienen la característica de que tienen un
límite de almacenamiento, si el valor que se le asigna sobrepasa el límite ocasionará un
desbordamiento y el código fuente marcara errores, por eso es muy importante elegir el tipo
de dato que se utiliza y analizar si el valor incrementará con el tiempo.
Enteros
En Java, se pueden utilizar los siguientes tipos de datos numéricos para números enteros:
1. byte : ocupa 1 byte de memoria.
2. short: ocupa 2 bytes de memoria.
3. int : ocupa 4 bytes de memoria
4. long : ocupa 8 bytes de memoria.
⚠️ Nota:
- Para diferenciar un int de un long es necesario poner una ‘L’
al final del número de tipo long.
- long numLong = 1234L;
Decimales
Para datos numéricos con punto decimal o flotante existen dos opciones: float y double.
1. float : ocupa 4 bytes de memoria y no tiene tanta precisión como double.
2. double: ocupa 8 bytes de memoria y tiene más precisión qué float.
⚠️ Nota:
- Para hacer la distinción entre estos, es necesario poner una ‘F’ al
final del número flotante.
- float numf = 1234F;
Carácter
Para datos de tipo texto o más bien caracteres el único tipo de dato primitivo que podemos
utilizar es el char y solo podrá contener un carácter en su valor.
⚠️ Nota:
- El valor de este dato siempre debe declararse con comillas
simples.
- char letra = 'a';
Lógicos
Para utilizar datos lógicos y poder representar decisiones se utiliza el tipo de dato boolean
donde su valor puede ser: false y true.
Constantes
Estas son simplemente variables como cualquier otra, estas tienen su espacio en memoria y
se acceden a ellas de la misma manera, pero lo que las diferencia de una normal es que su
valor no se puede actualizar o están hechas para que sus valores no varien. Un caso muy
común es el del número PI que es un valor que nunca cambia y por eso se suele declarar
como una variable constante. "final" es la palabra reservada que va a diferenciar a las
constantes en Java esta va antes de el tipo de dato de la variable.
⚠️ Nota:
- Por convención al nombrar constantes siempre será en
mayúsculas para identificar rápidamente el tipo.
- final int HORASDIA = 24;
Técnicas de Naming
Upper Camel Case y Lower Camel Case
Upper Camel Case se le llama así a la técnica de que la primera letra del nombre o
identificador de una variable inicie con MAYÚSCULAS. Normalmente usado en clases.
Caso contrario, Lower Camel Case es para MINÚSCULAS. Se usa en variables y nombre
de métodos.
class Class4ConvencionNombres //UpperCamelCase (Clases)
String nombrePais = "España"; //LowerCamelCase (Variables)
public static void main(String[] args) //LowerCamelCase (Métodos)
Operadores aritméticos
Asignación
Los operadores de asignación son muy útiles al momento de querer dar un valor a una
variable o reasignar un valor, como se puede apreciar en la siguiente tabla hay
abreviaciones para poder agilizar el tiempo de desarrollo pero es importante comprender lo
que cada operador realiza internamente.
Incremento y decremento
Estos son sumamente útiles para definir valores que van incrementando su valor o por lo
contrario reduciendo su valor.
Math
Math es un api o conjunto de funciones o constantes nativas de Java que nos ofrece una
gran cantidad de ecuaciones matemáticas., a continuación se muestran unas cuantas
funcionalidades básicas del objeto math.
Scanner
La clase Scanner permite a los usuarios contestar algunas preguntas para que nuestro
programa actúe de una forma u otra. Para usarla solo debemos importar la clase Scanner
de las APIs de desarrollo de Java:
import java.util.Scanner;
int response = 0;
En la programación hay situaciones en las que se necesita cambiar el tipo de dato esto
dependiendo de nuestra necesidad, podemos realizar castings por:
Estimación : Se utiliza cuando no nos importa la cantidad de decimales que tiene un
número, sino que se busca representar la parte entera del número.
Exactitud : Se hace uso de esta para realizar un alcance más preciso posible del número.
Archivos JAR
Los ficheros Jar (Java Archives) permiten recopilar en un sólo fichero varios ficheros .class,
reuniendolos en un formato comprimido para que ocupen menos espacio. Es por tanto, algo
similar a un fichero .zip (de hecho están basados en ficheros .zip) para luego ser ejecutados
por la máquina virtual (JVM).
La particularidad de los ficheros .jar es que no necesitan ser descomprimidos para ser
usados, es decir que el intérprete de Java es capaz de ejecutar los archivos comprimidos en
un archivo jar directamente.
Para poder correr estos archivos .jar es necesario que la máquina virtual instalada en el
equipo sea igual o mayor a la versión usada para compilarse el .jar.
Sentencias
If / else
Los condicionales son la forma en que las computadoras toman decisiones, evaluarán si la
condición para ejecutar una parte del código se cumple. Si el resultado de la operación es
verdadero ejecutarán esta parte del código, en caso de que no, seguirán con las siguientes
instrucciones.
La forma de programar condicionales es usando la sentencia IF (hay más, pero las veremos
más adelante) de la siguiente manera:
if (condición) {
// instrucciones
}
En el siguiente ejemplo vamos a guardar algunas instrucciones dentro del condicional IF,
Java solo ejecutará esta parte del código si se cumple la condición, en este caso, que la
variable Bluetooth Enabled sea igual a true:
if (isBluetoothEnabled) {
fileSended++;
System.out.println("Archivo enviado");
}
if (condición) {
// instrucciones
} else {
// entra aca si no se cumple la condición principal
}
Las variables locales: Son las que se definen para un proceso en específico en un función
específica y solo van a ser reconocidas para esa función o proceso, es decir que si
intentamos hacer la llamada a una variable local en otra función que no sea la de origen no
la reconocerá como declarada.(USO PRIVATIZADO).
Por ejemplo:
boolean condicionA = true; // verdadero
boolean condicionB = false; // falso
Operadores de equidad:
Igualdad: ==
Desigualdad: !=
Operadores Relacionales:
if (noHayInternet) {
System.out.println("No hay Internet");
} else if (hayInternetPeroMuyPoquito) {
System.out.println("Tienes muy poquito Internet");
} else if (hayBuenInternetPeroNoEsSuficiente) {
System.out.println("Casi casi, falta solo un poquito más");
} else {
System.out.println("¡Tienes suficiente Internet!");
}
Switch
La sentencia Switch nos ayuda a tomar decisiones con base en una o más condiciones,
pero funciona un poco diferente:
Sentencias if ternario
Los operadores ternarios son otra forma de evaluar condiciones, así como los condicionales
IF y ELSE`:
// Operador Ternario:
isTurnOnLight = (isTurnOnLight) ? false : true;
// IF y ELSE:
if (isTurnOnLight) {
isTurnOnLight = false;
} else {
isTurnOnLight = true;
}
Funciones
Las funciones nos ayudan a ejecutar código que dependiendo de las opciones que le
enviemos, transformará y devolverá un cierto resultado. Gracias a las funciones podemos
organizar, modularizar, reutilizar y evitar repeticiones en nuestro código.
Por ejemplo:
public int suma(int a, int b) {
return a + b;
}
Si nuestra función NO devuelve ningún tipo de dato podemos usar la palabra reservada
void.
Para utilizar nuestras funciones solo debemos asignar el resultado de la función y sus
parámetros a una variable con el mismo tipo de dato de la función:
int c = suma(5, 7);
Java Docs
Los Javadocs son una herramienta usada por muchas otras herramientas y aplicaciones
porque nos ayuda a documentar todo nuestro código usando comentarios. Además, nos
permite visualizar la documentación en formato HTML.
Tipos de comentarios
// Comentarios de una sola línea
/* Comentario
* en múltiples
* líneas */
/**
* Comentario para Java Docs
* */
/**
* Descripción: función que permite convertir divisas a dólares
*
* @param quantity cantidad de dinero
* @param currency tipo de moneda
*/
public static double converToDolar(double quantity, String currency)
{
switch (currency) {
case "MXN":
quantity *= 0.052;
break;
case "COP":
quantity *= 0.0031;
break;
default:
break;
}
return quantity;
}
Bucles
Los bucles (ciclos) nos ayudan a ejecutar una parte de nuestro código una cantidad de
veces hasta que se cumpla alguna condición y podamos continuar con la ejecución de
nuestro código.
Los ciclos evaluarán si la condición se cumple y cuando deje de hacerlo no ejecutarán más
el código del ciclo. Las instrucciones son las encargadas de que esta condición cambie de
verdadero a falso. De otra forma, si las instrucciones nunca cambian la condición, el ciclo no
se detendrá nunca, lo que conocemos como un ciclo infinito.
While / do while
do {
// instrucciones
} while (condición);
For
El Ciclo For también nos ayuda a ejecutar una parte de nuestro código las veces que sean
necesarias para que se cumpla una condición. De hecho, el ciclo FOR nos da muchas
ayudas para lograr este resultado de la forma más fácil posible:
// Estructura:
for (inicialización; condición; incremento o decremento;) {
// Instrucciones
}
Controladores de flujo
Break
En Java esta sentencia la verás en dos situaciones específicamente:
1. En un Switch: en esta situación break hace que el flujo del switch no continúe
ejecutándose a la siguiente comparación, esto con el objetivo de que solo se cumpla
una sola condición:
switch (colorModeSelected){
case "Light":
System.out.println("Seleccionaste Light Mode");
break;
case "Night": //Ambar
System.out.println("Seleccionaste Night Mode");
break;
case "Blue Dark":
System.out.println("Seleccionaste Blue Dark Mode");
break;
}
2. Para salir de un bucle: Como acabamos de ver un break es capaz de detener el flujo
en el código, en este caso detendremos el ciclo como tal terminándolo y haciendo
que saltemos a la siguiente instrucción después del ciclo.
3. for (int i = 1; i <= 10; i++) {
4. printSOS();
5. break;
6. }
Continue
Continue en cierto modo también nos va a servir para detener un ciclo pero en lugar de
terminarlo como en el caso de break, este volverá directo a la condición.
Return
Aunque en algunos lenguajes esta sentencia sirve como un tipo goto, dónde se rompe el
flujo del programa la mejor forma de usarlo en Java es en Funciones, cuando lo usamos
aquí siempre viene acompañado de un valor, el cuál indica el dato que se estará
devolviendo en la función.
Arrays / Arraylist
Array => Tamaño definido
ArrayList => Tamaño dinámico
Los arreglos o arrays son objetos en los que podemos guardar más de una variable, una
lista de elementos. Los arrays son de una sola dimensión, pero si guardamos arrays dentro
de otros arrays podemos obtener arrays multidimensionales.
Ya que los arrays pueden guardar múltiples elementos, la convención es escribir los
nombres de las variables en plural.
ejemplo de un ArrayList:
public class ArraysTest {
public static void main(String[] args) {
List<String> Days = new ArrayList<>();
Days.add("Monday");
Days.add("Tuesday");
Índices
Los índices son variables simples que nos ayudan a identificar las posiciones en un arreglo.
Estas variables siempre guardan números, comienzan en 0 e incrementan de abajo a arriba
y de izquierda a derecha a medida que guardamos más elementos en nuestros arrays.
Para guardar un valor en alguna posición de nuestro array solo debemos usar el índice de la
siguiente forma:
nombreVariable[indice] = valor;
Multidimensionales
Una propiedad de los arrays o colecciones es que se pueden anidar dependiendo de la
necesidad
//Array multidimensional
String[][] cities = new String[4][2]; // 4*2 = 8
/*
* pais | ciudad
* Mexico | CDMX
* Mexico | GDL
* Col | Bogota
* Col | Medellin
*/
cities[0][0] = 'Colombia';
cities[0][1] = 'Medellin';
cities[1][0] = 'Colombia';
cities[1][1] = 'Bogota';
cities[2][0] = 'Mexico';
cities[2][1] = 'GDL';
cities[3][0] = 'Mexico';
cities[3][1] = 'CDMX';
Como vimos en el los temas anteriores java es un lenguaje muy potente y versátil pero aún
no hemos entrado en lo que realmente java sale a relucir y es en el trabajo con la
programación orientada a objetos.
En esta ocasión nos abstendremos de entrar demasiado a los conceptos básicos de POO
por que ya existe un documento en donde explica a detalle las columnas que componen la
programación orientada a objetos.
Sintaxis de Java
Variables y tipos de datos
Tipos objetos
Estos tipos de datos comúnmente llamados wrappers son utilizados en java porque ya traen
una lista de métodos definidos que nos agilizan el trabajo en un problema concreto y
necesitan una invocación para poder declararlos.
Ejemplo de declaración de algunos wrappers:
String palabra= "Hola";
Integer num = 1234;
num.toString(); //Método del tipo de dato Integer