inicio Formación Java Orientado a Objetos

Java JRE y JDK
This commit is contained in:
devfzn 2023-06-08 02:18:30 -04:00
parent 9aa82e3de8
commit 3d86b741a2
Signed by: devfzn
GPG Key ID: E070ECF4A754FDB1
6 changed files with 369 additions and 1 deletions

4
.gitignore vendored
View File

@ -1,2 +1,6 @@
*.pdf *.pdf
test/ test/
.idea/
out/
*.class
*.iml

351
008_java_oo/README.md Normal file
View File

@ -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
<style>div.mermaid{text-align: center;}</style>
```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."<init>":()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...<in
00000030: 6974 3e01 0003 2829 5609 0008 0009 0700 it>...()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."<init>":()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 <b>JDK</b>
subgraph <b>JRE</b>
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=<ruta_a_bins_java>
```
##### 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

BIN
008_java_oo/devstats.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,5 @@
public class Ejemplo {
public static void main(String[] args) {
System.out.println("Hola Pianola");
}
}

View File

@ -0,0 +1,5 @@
public class HolaMundo {
public static void main(String[] args) {
System.out.println("Hola Mundo!");
}
}

View File

@ -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 | 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 ### Guias de estudio
#### Etapa Selección #### Etapa Selección
@ -23,6 +25,7 @@ primoridiales en programación con Javascript.
- [Git](./005_Git_y_github/README.md) y Github. - [Git](./005_Git_y_github/README.md) y Github.
- Desafío [Encriptador](./006_challenge_encriptador/README.md). - Desafío [Encriptador](./006_challenge_encriptador/README.md).
#### Etapa Especialización #### Etapa Especialización - BackEnd
- [Business Agility](./007_business_agility/README.md) - [Business Agility](./007_business_agility/README.md)
- [Java](./008_java_oo/README.md) Orientado a Objetos