Logo Studenta

Arquitectura y Lenguaje Java

¡Este material tiene más páginas!

Vista previa del material en texto

1
Arquitectura y Lenguaje Java
2
Introducción
■ El lenguaje de programación Java así como 
su arquitectura se diseñaron para resolver 
problemas que se presentan en la 
programación moderna. 
■ Se inició como parte de un proyecto cuyo 
objetivo fue el de desarrollar software 
avanzado para dispositivos electrónicos. 
3
Introducción
■ Se creó un equipo de trabajo en Sun para 
tratar de resolver este problema. 
Inicialmente se pretendió utilizar C++ pero 
se identificaron numerosos problemas y se 
buscó diseñar un nuevo lenguaje.
■ Como resultado, en 1990, el nuevo lenguaje 
recibió el nombre de Oak y era pequeño, 
confiable, y de arquitectura independiente. 
4
Introducción
■ En 1993, mientras el equipo continuaba 
trabajando, apareció la Red Mundial (www) 
en Internet y tuvo una gran aceptación.
■ Los desarrolladores de Java pensaron que 
un lenguaje de arquitectura neutral sería 
ideal para programar en internet porque el 
programa podría ejecutarse en todos los 
tipos de computadoras conectadas a la red.
5
Introducción
■ Java es un lenguaje simple, orientado a 
objetos, distribuido, interpretado, robusto, 
seguro, de arquitectura neutral, portable, de 
alto rendimiento, multi hilos, y dinámico.
6
Simple
■ Aprenderse fácilmente y que fuera familiar 
(C y C++)
■ Omite la sobrecarga de operadores (aunque 
sí existe la sobrecarga de métodos) y la 
herencia múltiple. 
■ Las construcciones como struct no son 
válidas. 
7
Simple
■ Descarta la instrucción goto, sin embargo, 
provee instrucciones etiquetadas de break y 
continue. 
■ Incorpora la recolección de basura para 
manejo automático de memoria.
■ Elimina los apuntadores. 
■ Maneja automáticamente la referenciación y 
dereferenciación de objetos.
8
Orientado a Objetos
■ Permite la definición clara de interfaces y la 
reusabilidad de código; así como las ventajas 
mencionadas previamente en este curso sobre la 
programación orientada a objetos. 
■ Java cuenta con un conjunto extenso de clases 
guardadas en paquetes. 
java.awt, java.io, java.net, java.lang. 
9
Distribuido
■ Las aplicaciones de Java pueden acceder a 
objetos a través de la red por medio de 
URL's con la misma facilidad que si 
accediéramos a objetos en nuestro sistema 
local de archivos.
10
Interpretado
■ El compilador de Java genera byte-codes, en 
lugar de código nativo de la máquina. 
■ Para ejecutar un programa en Java se utiliza 
el intérprete para ejecutar los byte-codes
compilados, y por ello java es un lenguaje 
interpretado. 
11
Interpretado
■ Los byte-codes de Java proveen un archivo objeto 
de arquitectura neutral que permite que los 
programas puedan transportarse a múltiples 
plataformas. 
■ Un programa en Java puede ejecutarse en 
cualquier sistema que cuente con el intérprete de 
Java y el sistema de run-time. 
Máquina Virtual de Java
12
Anexo A
❍ Figura 1
13
Robusto
■ Java pretende que se escriban programas 
confiables. 
■ Es un lenguaje fuertemente tipificado que 
permite, a tiempo de compilación, verificar 
problemas potenciales de asignación de 
tipos. 
14
Robusto
■ La verificación de tipos es más fuerte que la de 
C++ ya que no permite declaraciones implícitas de 
métodos. 
■ Una de las mejoras de confiabilidad de Java es su 
modelo de memoria. Java no permite apuntadores, 
lo que elimina la posibilidad de sobreescribir en la 
memoria y corromper información valiosa.
15
Robusto
■ La recolección automática de memoria evita 
la fragmentación de la misma por la 
petición y borrado dinámico. 
■ El intérprete de Java realiza verificaciones a 
tiempo de ejecución para determinar que los 
accesos a arreglos y cadenas de caracteres 
se encuentren dentro de los límites. 
16
Robusto
■ Otra característica de Java es el manejo de 
excepciones. Esto simplifica la tarea de 
manejo de errores y recuperación de los 
mismos.
17
Seguro
■ La seguridad es una preocupación 
primordial ya que se pretende que Java se 
utilice en ambientes de red. 
■ Mecanismos de seguridad que impidan que 
algún programa trate de crear un virus o 
invadir el sistema de archivos. 
18
Seguro
■ El modelo de alojamiento de memoria de 
Java es una de las principales defensas 
contra código corrupto. El sistema de run-
time realiza la verificación de los byte-
codes para asegurarse de que el código que 
transportamos por la red no viola la 
integridad del medio en el que nos 
encontramos. 
19
Seguro
■ Java maneja la tecnología de encriptación
para verificar que un applet, que se recibe a 
través de la red, tiene su origen en un lugar 
autorizado y no ha sido modificado.
■ Java conoce y puede combatir la mayoría de 
las técnicas que se han utilizado para 
desarrollar software corrupto. 
20
Arquitectura Neutral
■ Los programas de Java se compilan en un 
formato de arquitectura neutral conocido 
como byte-codes. 
■ La principal ventaja de esto es que Java 
puede ejecutarse en cualquier sistema 
mientras que se implemente la Máquina 
Virtual de Java. 
21
Portable
■ Java garantiza que no existen aspectos de 
dependencia de implementación en la 
especificación del lenguaje. 
■ El ambiente de Java es portable hacia nuevas 
plataformas de hardware y sistemas operativos. El 
compilador de Java está escrito en Java mientras 
que el sistema de run-time está escrito en ANSI C.
22
Alto Rendimiento
■ Java es un lenguaje interpretado y es por 
ello que nunca será tan rápido como un 
lenguaje compilado, como C. De hecho 
Java es, en promedio, 20 veces más lento 
que C. 
23
Alto Rendimiento
■ Los diseñadores de Java están trabajando en 
compiladores just-in-time que pueden 
traducir los byte-codes de Java en código de 
máquina para un CPU específico a tiempo 
de ejecución. 
24
Multihilos
■ En una aplicación como un browser de 
Web, es fácil imaginar múltiples tareas 
realizándose al mismo tiempo. 
■ Java es un lenguaje multihilos que puede 
contar con múltiples hilos de ejecución para 
manejar diferentes tareas.
25
Multihilos
■ Java hace de la programación multihilos 
una tarea más sencilla que en C y C++, al 
proporcionar utilerías que permiten iniciar, 
ejecutar, detener y verificar hilos. Además, 
cuenta con rutinas de sincronización.
26
Dinámico
■ Java se diseñó para adaptarse a un ambiente 
cambiante. Las definiciones de la clase run-
time de Java hace posible que 
dinámicamente se liguen clases en un 
sistema en ejecución.
27
Características del lenguaje
■ Estructura y ambiente de un programa
➀ Definición de una o más clases (.class).
➁ Alguna de estas clases debe contar con un método 
principal main().
➂ Para ejecutar un programa en Java se debe utilizar 
el intérprete, java.
➃ Un applet de Java no es una aplicación (Browser 
de Web, appletviewer).
28
Características del lenguaje
// Programa 1
public class echo {
public static void main (String argv[]) {
for (int i=0; i < argv.length; i++)
System.out.print (argv[i] + “ “);
System.out.print (“\n”);
System.exit(0); }
}
29
Características del lenguaje
■ Valor de Salida del programa
Cabe notar que el método main() debe de 
regresar un valor void. Por ello, no es 
posible regresar un valor de un programa de 
Java con una instrucción return. 
30
Características del lenguaje
■ Ambiente
El API (application programming interface) 
de Java no permite que sean leídas variables 
de ambiente del sistema operativo debido a 
que son dependientes de la plataforma. Un 
programa de Java puede buscar el valor de 
una determinada propiedad con el método 
System.getProperty().
31
Características del lenguaje
■ Paquetes, Clases y Campos
Java, como un lenguaje diseñado para 
considerar lecturas de módulos 
dinámicamente dentro de internet, tiene 
cuidado para evitar conflictos de espacio. 
Por ejemplo, no existen las variables 
globales, ni las funciones globales.
32
Variables globales y paquetes
■ Variables globales. En Java, toda variable y 
método se declaran dentro de una clase y 
forman parte dela misma. También, cada 
clase es parte de un paquete. 
■ Paquetes, clases y estructura de directorio. 
Java cuenta con una organización jerárquica 
dividida en niveles. 
33
Paquetes
■ Para diseñar un paquete:
package nombre_del_paquete;
Por ejemplo:
package CTI.cem.itesm.graphics;
34
Paquetes
■ En Java, cada clase compilada se guarda en un 
archivo separado. El nombre de este archivo debe 
ser el mismo que la clase. Este archivo de clase 
debe guardarse en un directorio que tiene los 
mismos componentes que el nombre del paquete. 
angeles.curso.java.HolaMundo
angeles\curso\java\HolaMundo.class.
35
Paquetes
■ Un archivo de código Java debe tener la 
extensión .java. Este consiste de una o más 
definiciones de clases. Si se define más de 
una clase en un archivo .java, sólo una de 
ellas debe de declararse public (disponible 
fuera del paquete), y debe tener el mismo 
nombre que el archivo principal.
36
Anexo B
❍ Figura 2
37
import
■ La instrucción import hace que las clases de 
Java sean accesibles a la clase actual 
utilizando un nombre abreviado. 
import paquete;
import paquete.class;
import paquete.*;
38
Comentarios
■ Java cuenta con tres tipos de comentarios:
/* */
//
/** */
39
Constantes
■ Cualquier variable declarada como final es 
una constante en Java. Su valor debe de 
especificarse al declararse y no puede 
cambiar. 
public static final double PI = 3.14159;
40
Anexo B
❍ Figura 3
41
Tipos de datos referenciados
■ Los tipos de datos no primitivos en Java son 
objetos y arreglos (tipos referenciados)
■ Los tipos primitivos se manejan por valor. 
■ En C, es posible manejar un valor por 
referencia tomando su dirección y 
dereferenciar una dirección utilizando los 
operadores * y ->. Estos operadores no 
existen en Java. 
42
Tipos de datos referenciados
■ Debido a que los objetos se utilizan por referencia, 
dos variables diferentes pueden hacer referencia al 
mismo objeto:
Button a,b;
p = new Button();
q = p;
p.setLabel("ok");
String s = q.getLabel();
43
Tipos de datos referenciados
■ Esto no ocurre con los tipos primitivos:
int i = 3;
j = i;
i = 2;
44
Copia de objetos
■ Debido a que los tipos referenciados no se 
utilizan por valor, asignar un objeto a otro 
en Java no copia el valor del objeto. 
Simplemente asigna una referencia al 
objeto. 
Button a = new Button ("Ok");
Button b = new Button ("Cancelar");
a = b;
45
Copia de objetos
■ Para copiar los datos de un objeto a otro se 
puede utilizar el método clone().
Vector b = new Vector;
c = b.clone();
46
Apuntadores
■ Java no maneja apuntadores
➀ Java maneja en forma automática la referenciación 
y dereferenciación de objetos. 
➁ No permite hacer un cast de objetos o arreglos, a 
enteros o viceversa
➂ No permite la aritmética de apuntadores
➃ No permite calcular el tamaño, en bytes, de 
cualquier tipo primitivo u objeto
47
null
■ El valor de default de todos los tipos de 
variables referenciadas es null, que indica 
"ausencia de referencia", es decir, esa 
variable no hace referencia a ningún objeto 
o arreglo. 
48
Recolección de basura
■ Los objetos en Java se crean con la palabra 
new. Sin embargo, no existe un delete o 
free para liberarse de ellos cuando ya no 
son necesarios. 
■ Java cuenta con mecanismos de recolección 
de basura para detectar automáticamente 
objetos que ya no son utilizados y 
liberarlos. 
49
Arreglos
■ Son manipulados por referencia
■ Se crean dinámicamente con new
■ Cuando ya no son referenciados, automáticamente 
se eliminan
■ Existen dos formas para crear arreglos en Java. La 
primera es utilizando new e indicando el tamaño 
el arreglo.
byte a[ ] = new byte [1024];
button botones[ ] = new Button [10];
50
Arreglos
■ Cuando se crea un arreglo, no se generan 
los objetos que están almacenados en él y es 
por ello que no existe un constructor que 
llamar y no existe lista de argumentos. 
■ La segunda manera de crear un arreglo es 
con un inicializador estático:
int tabla [ ] = {1, 2, 3, 4, 5};
51
Arreglos multidimensionales
■ Java puede manejar este tipo de arreglos 
que son implementados como arreglos de 
arreglos.
int arreglo[ ] [ ] = new int [12] [8];
52
Cadenas de caracteres
■ En Java, las cadenas de caracteres no son 
arreglos terminados con caracter null como 
en C. En cambio, son instancias de la clase 
java.lang.String. 
■ No es necesario indicar la terminación null
ya que Java verifica los límites de las 
cadenas de caracteres automáticamente.
53
Cadenas de caracteres
■ Una de las características principales de los 
objetos tipo String es que son incambiables. 
Es decir, no existen métodos para cambiar 
el contenido de un String.
■ Para poder hacer esto, es necesario definir 
un objeto StringBuffer a partir del objeto 
String
54
Cadenas de caracteres
■ Algunos de los métodos, que se encuentran 
en el java.lang.String:
int i;
boolean b;
String myString = "HolaMundo";
b = myString.equals("holamundo");
55
Cadenas de caracteres
b= myString.equalsIgnoreCase 
("holamundo");
i = myString.indexOf( 'l' );
i = myString.lastIndexOf( 'o' );
i = myString.indexOf( "Mu" );
56
Cadenas de caracteres
String subst = myString.substring( i );
subst = subst.concat(subst).concat(subst);
57
Clases 
■ Las clases definen la estructura, 
el comportamiento y los mecanismos para 
crear instancias de las clases.
■ Las clases son una especialización de las 
estructuras de C (struct).
■ Las clases en Java contienen métodos y 
atributos.
58
Ejemplo
59
Clase Alumno en Java
60
Clase Alumno en Java
61
Acceso a los miembros de la clase
■ Los campos y métodos de una clase se 
pueden acceder desde cualquier parte de la 
misma.
■ El acceso, por parte de otras clases, es 
dependiente de los modificadores de acceso: 
publico, privado, protegido, paquete y
privado protegido
62
Objetos
■ Creando objetos. El declarar una variable para 
manejar un objeto no crea al objeto en sí; sólo 
maneja la referencia al objeto. Para crear un objeto 
hay que utilizar la palabra new, seguida de la clase 
del objeto (su tipo) y una lista opcional de 
argumentos entre paréntesis. 
java.awt.Button b = new java.awt.Button();
63
Objetos
■ Accediendo a objetos. La forma de acceder 
a los campos de un objeto es igual que en C 
cuando se manejan estructuras:
ComplexNumber c = new 
ComplexNumber();
c.x = 1.0;
c.y = -1.414;
64
Objetos
■ Para acceder a los métodos en un objeto es 
igual que en C++:
ComplexNumber c = new 
ComplexNumber(1.0,-1.414);
double magnitude = c.magnitude();
65
super y this
■ En Java encontramos dos variables 
asociadas a cada objeto: super y this. 
■ this es una referencia al 
objeto que el programa está utilizando en 
ese momento. 
■ super es una referencia a la clase padre del 
objeto this. 
66
Aplicaciones y Applets
■ En Java es posible implementar 
aplicaciones o applets. 
■ Las primeras se ejecutan en la línea de 
comandos como cualquier programa 
ejecutable y los segundos se ejecutan en un 
browser de Web. 
67
Aplicaciones y Applets
68
Aplicación. Hola Mundo
// Programa 2
public class HolaMundo_aplicacion {
public static void main (String args[]) {
System.out.println(" Hola Mundo !!!!");
}
}
$ javac HolaMundo_aplicacion.java
$ java HolaMundo_aplicacion
69
Applets
■ Un applet hereda la clase Applet de Java. 
No requiere de un método main(). 
■ Un applet cuenta con cinco métodos 
principales, todos de tipo public void:
1. init( ) 3.stop( ) 5.paint( )
2.start( ) 4.destroy( )
70
Applets
■ Un applet, a diferencia de una aplicación, 
debe de ejecutarse en un browser de Web. 
Para ello, es necesario generar un archivo 
HTML (Hyper Text Markup Language) 
donde se mandará llamar el applet 
compilado.
71
Applet. Hola Mundo
// Programa 3
import java.applet.*; import java.awt.*;
public class HolaMundo extends Applet {
public void paint(Graphics g) {
setBackground(Color.blue);
g.drawString("Hola Mundo Java!", 25,25);
}
}
72
HTML. Hola Mundo
<html>
<applet 
codebase="http:// www.tec.mx /java / applets"
code = "HolaMundo.class"
width = 200 height = 35>
</applet>
</html>
73
Variables de clase
■ Una variable de clase es aquella que es 
compartida por todas las instancias de dicha 
clase. 
public static float pi = 2.1416;
■ Existe sólo una copia de esta variable
■ Esta variable existe aún cuando no se hayan 
creado instancias de la clase.
74
Variables de instancia
■ Una variable de instancia de una clase tiene un 
rango de alcance de la clase, que se define desde el 
primer { de la definición de la clase hasta el último 
} de la misma. Esto significa que todos los 
métodos de la clase tienen acceso a esa variable. 
■ Existe una copia de esta variable en cada instancia 
de la clase.
75
Ejemplo 1. Notación UML
76
Anexo B
❍ Ejemplo 1
77
Anexo A
❍ Programa 4
❍ Programa 5
❍ Programa 6
❍ Programa Addition.java
78
Métodos de clase
■ Se declaran con la palabra static
■ Se conocen también como métodos 
estáticos
■ Se invocan a través de una clase en lugar de 
una instancia 
■ Son lo más parecido a las funciones 
globales de C. 
■ No utilizan this
79
Anexo B
❍ Ejemplo 2
❍ Ejemplo 3
❍ Programa 7
❍ Programa 8
80
Herencia
■ En Java toda clase herada de manera implícita a la 
clase Object predefinida
■ Para heredar los métodos y variables de una clase 
(excepto los privados), es necesario utilizar la 
palabra reservada extends.
81
Herencia
■ Java sólo soporta el concepto de herencia 
simple, es decir, sólo hereda directamente 
de una superclase.
■ La subclase hereda el comportamiento y la 
estructura de la superclase.
■ Se heredan todos los miembros públicos, 
protegidos o de paquete.
■ Los constructores no se heredan.
82
Encapsulamiento
■ Se utiliza el modificador public para indicar 
qué variables o métodos de una clase están 
disponibles en cualquier parte. 
■ Se utiliza el modificador private para 
ocultar variables o métodos de una clase. 
83
Encapsulamiento
■ Una variable o método privado de una clase 
es visible solamente por los métodos 
definidos para esa clase. No son accesibles 
por subclases ni son heredados por ellas. 
84
Encapsulamiento
■ Una variable o método protected es 
accesible dentro de la clase donde están 
definidos, dentro de todas las subclases de 
la clase, y por las clases que se encuentran 
en el mismo paquete que la clase donde se 
encuentran.
85
Encapsulamiento
■ La protección default es más estricta que la 
protected. Si una variable o método se declara sin 
alguna de las llaves de public, private o protected, 
sólo es accesible para la clase que la o lo declara, 
así como dentro de las clases que forman parte del 
mismo paquete. No es accesible para las subclases 
(a menos que sean subclases en el mismo 
paquete).
86
Encapsulamiento
■ Las subclases heredan los campos private 
protected y protected, pero no pueden 
acceder a estos campos en instancias de la 
superclase. 
87
Anexo A y Anexo B
❍ Figura 4
❍ Programa 9
❍ Programa 9-a
❍ Programa 10
88
Ejemplo.
89
Ejemplo. Notación UML
90
Ejemplo. Notación UML
91
Ejemplo. Notación UML
92
Anexo A
■ Programa 11
■ Programa 11-a
■ Programa 11-b
93
Superposición de métodos
■ Si una clase define un método con la misma 
firma que un método de alguna de sus 
superclases, se dice que este método está 
siendo redefinido (overriding)
■ Se utiliza la palabra super dentro del 
método de la subclase para invocar a la 
operación original de la superclase.
94
Métodos de utilería
■ No todos los métodos en Java tienen que ser 
públicos
■ Algunos métodos se declaran como 
privados (private) y sirven como métodos 
de utilería para otros métodos de la clase.
95
Anexo A
■ Programa 12
■ Programa 12-a
96
Composición
■ La composición se refiere a la facilidad de 
poder tener objetos como variables de 
instancia de otras clases
■ Un objeto puede tener objetos de otras 
clases como miembros
97
Anexo A
■ Programa 13
■ Programa 13-a
■ Programa 13-b
98
Clases abstractas
■ Una clase abstracta es aquella que no puede 
ser instanciada
■ Normalmente no implementa todos los 
métodos que declara, sino que delega esta 
responsabilidad a sus subclases
99
Clases abstractas
■ Una clase se define como abstracta si se 
incluye la palabra reservada abstract
■ Un método abstracto es un método de una 
clase abstracta que no contiene código
■ El método abstracto deberá implementarse 
en toda aquella clase que concreta que 
hereda de la clase abstracta
■ Un método abstracto no puede ser privado
100
Clases abstractas
■ Supongamos que se desea implementar clases para 
diferentes figuras: rectángulo, cuadrado, elipse, 
etc. 
■ Lo como un arreglo de figuras que se derivan de 
una superclase Shape. Así, Shape encapsulará las 
características que son comúnes en todas las 
figuras (como área y perímetro). 
101
Clases abstractas
■ Sin embargo, la clase genérica Shape no puede 
implementar estos métodos ya que varían de una 
figura a otra. Para poder manejar esto Java utiliza 
los métodos abstractos. 
■ Un método abstracto no tiene cuerpo; sólo tiene un 
nombre seguido por un punto y coma.
102
Clases abstractas
■ Cualquier clase con un método abstracto es 
abstracta automáticamente.
■ Una clase abstracta no puede instanciarse.
■ Una subclase de una clase abstracta puede 
instanciarse si sobreescribe cada uno de los 
métodos abstractos de su superclase.
■ Si una subclase de una clase abstracta no
implementa todos los métodos abstractos que 
hereda, esa subclase es abstracta.
103
Anexo B
❍ Ejemplo 4
❍ Figura 5
104
Anexo A
■ Programa 14
■ Programa 14-a
■ Programa 14-b
■ Programa 14-c
■ Programa 14-d
■ Programa 14-e
	Arquitectura y Lenguaje Java
	Introducción
	Introducción
	Introducción
	Introducción
	Simple
	Simple
	Orientado a Objetos
	Distribuido
	Interpretado
	Interpretado
	Anexo A
	Robusto
	Robusto
	Robusto
	Robusto
	Seguro
	Seguro
	Seguro
	Arquitectura Neutral
	Portable
	Alto Rendimiento
	Alto Rendimiento
	Multihilos
	Multihilos
	Dinámico
	Características del lenguaje
	Características del lenguaje
	Características del lenguaje
	Características del lenguaje
	Características del lenguaje
	Variables globales y paquetes
	Paquetes
	Paquetes
	Paquetes
	Anexo B
	import
	Comentarios
	Constantes
	Anexo B
	Tipos de datos referenciados
	Tipos de datos referenciados
	Tipos de datos referenciados
	Copia de objetos
	Copia de objetos
	Apuntadores
	null
	Recolección de basura
	Arreglos
	Arreglos
	Arreglos multidimensionales
	Cadenas de caracteres
	Cadenas de caracteres
	Cadenas de caracteres
	Cadenas de caracteres
	Cadenas de caracteres
	Clases
	Ejemplo
	Clase Alumno en Java
	Clase Alumno en Java
	Acceso a los miembros de la clase
	Objetos
	Objetos
	Objetos
	super y this
	Aplicaciones y Applets
	Aplicaciones y Applets
	Aplicación. Hola Mundo
	Applets
	Applets
	Applet. Hola Mundo
	HTML. Hola Mundo
	Variables de clase
	Variables de instancia
	Ejemplo 1. Notación UML
	Anexo B
	Anexo A
	Métodos de clase
	Anexo B
	Herencia
	Herencia
	Encapsulamiento
	Encapsulamiento
	Encapsulamiento
	Encapsulamiento
	Encapsulamiento
	Anexo A y Anexo B
	Ejemplo.
	Ejemplo. Notación UML
	Ejemplo. Notación UML
	Ejemplo. Notación UML
	Anexo A
	Superposición de métodos
	Métodos de utilería
	Anexo A
	Composición
	Anexo A
	Clases abstractas
	Clases abstractas
	Clases abstractas
	Clases abstractas
	Clases abstractas
	Anexo B
	Anexo A

Continuar navegando

Materiales relacionados

320 pag.
Java_-_Jorge_Sanchez

ULT

User badge image

Manuel Rodrigues Monameo

274 pag.
601 pag.
Java_8_Los_Fundamentos

SIN SIGLA

User badge image

luz angela Diaz