diff --git a/.gitignore b/.gitignore index 14654a3..cba0fcd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ *.pdf test/ +.idea/ +out/ +*.class +*.iml diff --git a/008_java_oo/README.md b/008_java_oo/README.md new file mode 100644 index 0000000..c61a8ea --- /dev/null +++ b/008_java_oo/README.md @@ -0,0 +1,351 @@ +# Java Orientado a Objetos + +Tablero en [trello](https://trello.com/b/dSotNCw1/g5-formaci%C3%B3n-java) + +## Java [primeros pasos](https://app.aluracursos.com/course/java-primeros-pasos) + +### ¿Que es Java? + +Algunas [estadisticas](https://www.jetbrains.com/es-es/lp/devecosystem-2022/java/) +de jetbrains (2022). + +![img](./devstats.png) + +#### Máquina Virtual Java - JVM + + + +```mermaid +graph TD + A(Código Java)-->B(Ejecutable JAR) + B-->C(Máquina Virtual JVM) + C--> E(Linux) + C--> F(Windows) + C--> G(Mac) +``` + +ej. código Java + +```java +package com.alura.java; + +public class Persona { + + String nombre; + String apellido, + int edad; + + void datosDefault() { + this.nombre = "Diego"; + this.apellido = "Arguelles"; + this.edad = 28; + } + +} +``` + +ej. bytecode + +```java +{ + java.lang.String nombre; + descriptor: Ljava/lang/String; + flags: (0x0000) + + java.lang.String apellido; + descriptor: Ljava/lang/String; + flags: (0x0000) + + int edad; + descriptor: I + flags: (0x0000) + + public com.alura.java.Persona(); + descriptor: ()V + flags: (0x0001) ACC_PUBLIC + Code: + stack=1, locals=1, args_size=1 + 0: aload_0 + 1: invokespecial #1 // Method java/lang/Object."":()V + 4: return + LineNumberTable: + line 3: 0 + + void datosDefault(); + descriptor: ()V + flags: (0x0000) + Code: + stack=2, locals=1, args_size=1 + 0: aload_0 + 1: ldc #7 // String Diego + 3: putfield #9 // Field nombre:Ljava/lang/String; + 6: aload_0 + 7: ldc #15 // String Arguelles + 9: putfield #17 // Field apellido:Ljava/lang/String; + 12: aload_0 + 13: bipush 28 + 15: putfield #20 // Field edad:I + 18: return + LineNumberTable: + line 10: 0 + line 11: 6 + line 12: 12 + line 13: 18 +} +``` + +#### Características de JVM + +- Administración de memoria +- Multiplataforma +- Seguridad +- Optimización +- Librerías + +Otros lenguajes soportados por la máquina virtual de Java son: +***Ruby, Scala, Python, Groovy, Clojure*** + +Principales características de Java: + +- Orientado a objetos +- Parecido a C++ +- Muchas librerías y una gran comunidad +- Para ejecutar el Bytecode necesitamos tener la máquina virtual de Java +- El Bytecode es independiente del sistema operativo + +Principales componentes de la plataforma Java: + +- Java Virtual Machine (JVM) +- Lenguaje Java +- Librerias Java (API) + +#### Youtube alura [JVM](https://youtu.be/GrEO8nZzyZM) + +Archivo [`HolaMundo.java`](./yt_alura_jvm/HolaMundo.java) + +```java +public class HolaMundo { + public static void main(String[] args) { + System.out.println("Hola Mundo!"); + } +} +``` + +- Compilar: `javac HolaMundo.java` +- Correr: `java HolaMundo` +- Salida: `Hola Mundo!` + +Archivo [`HolaMundo.class`](./yt_alura_jvm/HolaMundo.class) en formato hexadecimal +con `:%!xxd` en **vim** + +```hex +00000000: cafe babe 0000 0040 001d 0a00 0200 0307 .......@........ +00000010: 0004 0c00 0500 0601 0010 6a61 7661 2f6c ..........java/l +00000020: 616e 672f 4f62 6a65 6374 0100 063c 696e ang/Object......()V....... +00000040: 0a0c 000b 000c 0100 106a 6176 612f 6c61 .........java/la +00000050: 6e67 2f53 7973 7465 6d01 0003 6f75 7401 ng/System...out. +00000060: 0015 4c6a 6176 612f 696f 2f50 7269 6e74 ..Ljava/io/Print +00000070: 5374 7265 616d 3b08 000e 0100 0b48 6f6c Stream;......Hol +00000080: 6120 4d75 6e64 6f21 0a00 1000 1107 0012 a Mundo!........ +00000090: 0c00 1300 1401 0013 6a61 7661 2f69 6f2f ........java/io/ +000000a0: 5072 696e 7453 7472 6561 6d01 0007 7072 PrintStream...pr +000000b0: 696e 746c 6e01 0015 284c 6a61 7661 2f6c intln...(Ljava/l +000000c0: 616e 672f 5374 7269 6e67 3b29 5607 0016 ang/String;)V... +000000d0: 0100 0948 6f6c 614d 756e 646f 0100 0443 ...HolaMundo...C +000000e0: 6f64 6501 000f 4c69 6e65 4e75 6d62 6572 ode...LineNumber +000000f0: 5461 626c 6501 0004 6d61 696e 0100 1628 Table...main...( +00000100: 5b4c 6a61 7661 2f6c 616e 672f 5374 7269 [Ljava/lang/Stri +00000110: 6e67 3b29 5601 000a 536f 7572 6365 4669 ng;)V...SourceFi +00000120: 6c65 0100 0e48 6f6c 614d 756e 646f 2e6a le...HolaMundo.j +00000130: 6176 6100 2100 1500 0200 0000 0000 0200 ava.!........... +00000140: 0100 0500 0600 0100 1700 0000 1d00 0100 ................ +00000150: 0100 0000 052a b700 01b1 0000 0001 0018 .....*.......... +00000160: 0000 0006 0001 0000 0001 0009 0019 001a ................ +00000170: 0001 0017 0000 0025 0002 0001 0000 0009 .......%........ +00000180: b200 0712 0db6 000f b100 0000 0100 1800 ................ +00000190: 0000 0a00 0200 0000 0300 0800 0400 0100 ................ +000001a0: 1b00 0000 0200 1c0a ........ +``` + +Oracle Docs [Opcode Mnemonics](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-7.html) + +`javap -c HolaMundo` + +```java +Compiled from "HolaMundo.java" +public class HolaMundo { + public HolaMundo(); + Code: + 0: aload_0 + 1: invokespecial #1 // Method java/lang/Object."":()V + 4: return + + public static void main(java.lang.String[]); + Code: + 0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream; + 3: ldc #13 // String Hola Mundo! + 5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V + 8: return +``` + +### Primeros Pasos + +```mermaid +flowchart LR +subgraph JDK +subgraph JRE + c(JVM) + style c fill:#f9f,stroke:#333,stroke-width:2px + d(Librerías) + style d fill:#f9f,stroke:#333,stroke-width:2px +end + a(Tools) +end +``` + +#### Instalación + +##### Archlinux + +```sh +# última versión +sudo pacman -S jdk-openjdk + +# Versiones LTS +# jdk8-openjdk +# jdk11-openjdk +# jdk17-openjdk +``` + +Cambiar la versión de Java a utlizar + +``` +# listar verisones instaladas +sudo archlinux-java status + +# establecer versión a utilizar +sudo archlinux-java set java-20-openjdk +``` + +##### Ubuntu + +```sh +sudo apt install openjdk-17-jdk + +# headless +# sudo apt install openjdk-17-jdk-headless +``` + +Exportar variable `JAVA_HOME` + +```sh +# Buscar ruta de instalación +sudo update-alternatives --config java + +# o +whereis java + +# agregar en .bashrc +export JAVA_HOME= +``` + +##### Comprobar instalación + +```sh +javac --version +javac 20.0.1 +``` + +```sh +java --version +openjdk 20.0.1 2023-04-18 +OpenJDK Runtime Environment (build 20.0.1+9) +OpenJDK 64-Bit Server VM (build 20.0.1+9, mixed mode, sharing) +``` + +**Java** es un lenguaje de programación que se actualiza periódicamente por **Oracle**, +la empresa responsable de su desarrollo. Cada nueva versión de Java trae consigo +nuevas características, mejoras de rendimiento, correcciones de errores y +actualizaciones de seguridad. Estas versiones se numeran, siguiendo un patrón +específico. + +Cuando se lanza una nueva versión, puede incluir nuevas bibliotecas, clases, +métodos y otros recursos que los desarrolladores pueden utilizar para crear +aplicaciones Java más eficientes y con menos errores. + +Aquí hay algunos ejemplos de algunas de las principales versiones de Java y sus +características: + +- [Java **8**](https://www.java.com/es/download/help/java8_es.html#:~:text=Una%20de%20las%20funciones%20destacables,el%20lenguaje%20de%20programaci%C3%B3n%20Java.&text=Esta%20nueva%20API%20permitir%C3%A1%20a,natural%20y%20f%C3%A1cil%20de%20comprender) + Introdujo la programación funcional, incluyendo la **interfaz** `java.util.function`, + que permite el uso de expresiones lambda. Además, se agregó una nueva API de + fecha y hora que proporciona una forma más simple y segura de manejar fechas y horas. + +- Java **11** + Introdujo el sistema de módulos de Java, que ayuda a simplificar la creación y + mantenimiento de aplicaciones complejas. Además, se agregó la **clase** `HttpClient`, + que admite comunicaciones HTTP/2. + +- Java **15** + Agregó características como la palabra clave `sealed`, que permite que las + clases restrinjan qué otras clases pueden extenderlas o implementarlas, + y también agregó mejoras a la API Records, que ayuda a simplificar la creación + de clases de datos inmutables. + +- [Java **17**](https://www.oracle.com/cl/news/announcement/oracle-releases-java-17-2021-09-14/) + Introduce nuevas características y mejoras, como patrones de coincidencia que + mejoran la sintaxis al trabajar con estructuras de datos complejas. Además, + se mejoran el rendimiento del recolector de basura para reducir la latencia en + las aplicaciones Java. + También se agregan funcionalidades a los registros, que + son clases inmutables y compactas utilizadas para representar datos, incluyendo + la capacidad de definir registros locales dentro de métodos. + Otra adición importante son las nuevas clases y métodos en el paquete + `java.util` para trabajar con estructuras de datos persistentes, lo que permite + realizar cambios en los datos sin modificar las estructuras originales. + Por último, se agrega soporte para **CGroups** en la API de Java, lo que permite + una mejor administración de recursos en entornos de contenedores. + +Al actualizar a una nueva versión de Java, es importante tener en cuenta la +compatibilidad con versiones anteriores. A veces, se eliminan o modifican +características o funcionalidades en una nueva versión, lo que puede afectar el +código existente. Por esta razón, es importante probar su código al actualizar +a una nueva versión de Java. + +Además, es posible que coexistan diferentes versiones de Java en un sistema, +lo que permite que las aplicaciones se ejecuten en versiones específicas de la JVM +(Java Virtual Machine) para garantizar la compatibilidad con el código existente. + +Otras características de las +[diferentes versiones de Java](https://www.aluracursos.com/blog/caracteristica-destacables-java8-delante). + +### IDE + +#### Eclipse + +Instalación desde AUR, o descarga desde +[eclipse.org](https://www.eclipse.org/downloads/packages/) + +#### IntelliJ IDEA + +```sh +sudo pacman -S intellij-idea-community-edition +``` + +Al crear projectos con IDEs estos crean la estrucutura principal del proyecto y al +compilar guardan los bytecodes en un directorio distinto de donde esta el codigo +fuente. + +Para correr un archivo bytecode en otra ruta se puede usar el flag `--clas-path`. + +ej. [proyecto](./intellij_idea/java_primeros_pasos/) creado con IntelliJ IDEA + +```sh +java --class-path ./intellij_idea/java_primeros_pasos/out/production/java_primeros_pasos/ Ejemplo +``` + +### Tipos y Variables + +#### Tipo entero + diff --git a/008_java_oo/devstats.png b/008_java_oo/devstats.png new file mode 100644 index 0000000..afed001 Binary files /dev/null and b/008_java_oo/devstats.png differ diff --git a/008_java_oo/intellij_idea/java_primeros_pasos/src/Ejemplo.java b/008_java_oo/intellij_idea/java_primeros_pasos/src/Ejemplo.java new file mode 100644 index 0000000..9cb48f0 --- /dev/null +++ b/008_java_oo/intellij_idea/java_primeros_pasos/src/Ejemplo.java @@ -0,0 +1,5 @@ +public class Ejemplo { + public static void main(String[] args) { + System.out.println("Hola Pianola"); + } +} diff --git a/008_java_oo/yt_alura_jvm/HolaMundo.java b/008_java_oo/yt_alura_jvm/HolaMundo.java new file mode 100644 index 0000000..c78f946 --- /dev/null +++ b/008_java_oo/yt_alura_jvm/HolaMundo.java @@ -0,0 +1,5 @@ +public class HolaMundo { + public static void main(String[] args) { + System.out.println("Hola Mundo!"); + } +} diff --git a/README.md b/README.md index b696d26..0a2f885 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ para certificación ORACLE. Notas, apuntes, resumenes y actividades. [G5 ONE | Business Agility](https://app.aluracursos.com/formacion-business-agility-grupo5-one). +[G5 ONE | Java Orientado a Objetos](https://app.aluracursos.com/formacion-javaoo-grupo5-one). + ### Guias de estudio #### Etapa Selección @@ -23,6 +25,7 @@ primoridiales en programación con Javascript. - [Git](./005_Git_y_github/README.md) y Github. - Desafío [Encriptador](./006_challenge_encriptador/README.md). -#### Etapa Especialización +#### Etapa Especialización - BackEnd - [Business Agility](./007_business_agility/README.md) +- [Java](./008_java_oo/README.md) Orientado a Objetos