Tarea 1
Leer la siguiente información, servirá como base para la tarea 2.
¿Que es Java?
Java es un lenguaje de programación orientado a objetos que ha sido diseñado para crear ambientes distribuídos y heterogéneos en Internet, aunque puede ser usado para elaborar aplicaciones que no necesariamente interactúen con Internet.
Un programa escrito
en Java puede ejecutarse por medio de un ambiente de navegación en el
WWW (un browser como Netscape) que soporte Java.
Características de Java
Java es entonces un lenguaje de programación, y tiene las siguientes características:
a) Simple
Es similar a C++, y no se require de mucha capacitación para poder programar, por lo que uno puede producir programas en Java al poco tiempo de comenzar a trabajar con el lenguaje.
b) Orientado a objetos.
c) Distribuído
Conjunta la filosofia cliente-servidor con el paso de mensajes entre objetos.
d) Interpretado
El intérprete Java ejecuta un código denominado "Java bytecode".
e) Robusto
Tiene un modelo de manejo de memoria que evita los apuntadores de C++.
f) Seguro
Las aplicaciones desarrolladas en Java y ejecutadas via Internet no pueden ser modificadas sin autorización.
g) Independiente de arquitectura
El compilador Java genera "Java bytecode" el cual es un formato independiente a cualquier arquitectura, diseñado para transportar código entre diferentes plataformas de hardware y software.
h) Portátil
Puede ejecutarse en diferentes plataformas, gracias a la especificaciãn de una maquina abstracta: la "Java Virtual Machine".
i) Alto desempeño
Java tiene un colector de basura automático que resulta en posibilidades de memoria disponible cuando es requerida. Puede tenerse una interfaz entre código ya elaborado en la máquina correspondiente y la aplicación escrita en Java. Esto es importante especialmente en lo referente a gráficos y animación.
j) Tiene "Multithread"
Permite varias actividades ejecutarse concurrentemente.
k) Dinámico
Las aplicaciones
son adaptables a cambios en el ambiente, pudiéndose cargar nuevos módulos
desde cualquier sitio de la red. Así mismo, esos nuevos módulos
pueden ligarse en tiempo de ejecución.
¿Que es lo que no tiene Java a diferencia de C y C++?
Lo que no tiene Java a diferencia de C y C++ es:
a) No hay #define.
b) No hay definición de clases como estructuras.
c) No hay herencia mltiple.
d) No hay goto.
e) No hay apuntadores.
f ) No hay funciones. Java permite una programación orientada a objetos
sin estilo funcional o procedural. Lo que hace una función en C++ se
hace en Java al definir una clase y creando los métodos
para dicha clase.
Debido a estas características, algunas personas definen a Java así:
Java = (C++) - C
Java es orientado a objetos por lo que permite:
a) Encapsulado.
La base para el encapsulado de Java es el concepto de clase.
Una clase representa una abstracción de un conjunto de objetos que tienen
el mismo comportamiento y la misma estructura. Un objeto es entonces una instancia
de una clase dada.
Las estructuras de datos de una clase se definen en base a un conjunto de variables
las cuales se denominan "variables de la instancia". Finalmente, un
método es la representación de las acciones del objeto.
Así pues, las estructuras y los métodos de una clase pueden ser
privados o pblicos. De esta manera los métodos de otros objetos no pueden
cambiar las variables de objetos cuyas estructuras son privadas.
b) Polimorfismo.
El polimorfismo permite mltiples implementaciones de métodos, dependiendo del tipo de objeto que se indica al invocar el método correspondiente. De esta manera el polimorfismo permite que el mismo mensaje enviado a diferentes objetos resulte en acciones dependientes del objeto que recibe el mensaje.
c) Herencia.
Un objeto de una clase hereda los métodos y estructuras de su super-clase. La herencia facilita la reutilización de código.
d) Alcance dinámico.
Es posible enviar mensajes a objetos sin conocer su tipo específico,
a través de la red. Esto permite una gran flexibilidad en tiempo de ejecución.
java.lang
Colección de tipos básicos siempre importados a cualquier unidad
de
compilación. Aquí estan las declaraciones de objetos, clases,
threads,
excepciones, wrappers de los tipos de datos primitivos y otras clases
fundamentales.
java.io
Archivos de stream y acceso aleatorio. Librería estándar de entrada
y
salida.
java.net
Librería que apoya interfaces con telnet y URLs.
java.util
Clases como diccionarios, tabla de hash, stack, técnicas de codificación
y decodificación, hora, fecha, etcétera.
java.awt
Abstract Windowing Toolkit que proporciona una capa abstracta que permite llevar
una aplicación en Java de un sistema de vantanas a otro. Contiene clases
para componentes básicos de la interfaz, tales como eventos, colores,
tipos de letra, botones, campos de texto, etc.
En Java, un identificador comienza con una letra, un subrayado (_) o un símbolo de dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen las mayúsculas de las minúsculas y no hay longitud máxima.
Serían identificadores válidos:
y su uso sería, por ejemplo:
identificador
nombre_usuario
Nombre_Usuario
_variable_del_sistema
$transaccion
int contador_principal;
char _lista_de_ficheros;
float $cantidad_en_Ptas;
Palabras clave
Las siguientes son las palabras clave que están definidas en Java y que no se pueden utilizar como indentificadores:
abstract continue
for new switch
boolean default goto null synchronized
break do if package this
byte double implements private threadsafe
byvalue else import protected throw
case extends instanceof public transient
catch false int return true
char final interface short try
class finally long static void
const float native super while
cast future generic inner
operator outer rest var
Literales
Un valor constante
en Java se crea utilizando una representación literal de él. Java
utiliza cinco tipos de elementos: enteros, reales en coma flotante, booleanos,
caracteres y cadenas, que se pueden poner en cualquier lugar del código
fuente de Java.
Cada uno de estos literales tiene un tipo correspondiente asociado con él.
Enteros: Tipo Por
ejemplo
byte 8 bits complemento a dos 21 077 0xDC00
short 16 bits complemento a dos
int 32 bits complemento a dos
long 64 bits complemento a dos
Reales en coma flotante: Tipo Por ejemplo
float 32 bits IEEE 754 3.18 2e12 3.1E12
double 64 bits IEEE 754
Booleanos:
true
false
|Caracteres:
Por ejemplo: a \t \u???? [????] es un número unicode
Cadenas:
Por ejemplo: "Esto es una cadena"
Arreglos
Se pueden declarar en Java arrays de cualquier tipo:
char s[];
int Array[];
Incluso se pueden construir arrays de arrays:
int tabla[][] = new int[4][5];
Los límites de los arrays se comprueban en tiempo de ejecución para evitar desbordamientos y la corrupción de memoria.
En Java un array es realmente un objeto, porque tiene redefinido el operador []. Tiene una función miembro: length. Se puede utilizar este método para conocer la longitud de cualquier array.
int a[][] = new
int[10][3];
a.length; /* 10 */
a[0].length; /* 3 */
Para crear un array en Java hay dos métodos básicos. Crear un array vacío:
int lista[] = new int[50];
o se puede crear ya el array con sus valores iniciales:
String nombres[]
= {
"Juan","Pepe","Pedro","Maria"
};
Esto que es equivalente a:
String nombres[];
nombres = new String[4];
nombres[0] = new String( "Juan" );
nombres[1] = new String( "Pepe" );
nombres[2] = new String( "Pedro" );
nombres[3] = new String( "Maria" );
No se pueden crear arrays estáticos en tiempo de compilación:
int lista[50]; // generará un error en tiempo de compilación
Tampoco se puede rellenar un array sin declarar el tamaño con el operador new:
int lista[];
for(int i=0; i < 10; i++ )
lista[i] = i;
Es decir, todos
los arrays en Java son estáticos. Para convertir un array en el equivalente
a un array dinámico en C/C++, se usa la clase vector, que permite operaciones
de inserción, borrado, etc. en el array.
[] ()
++ --
! ~
* / %
+ -
<< >>
< > <= >= == !=
& ^ |
&& ||
Los operadores numéricos se comportan como esperamos:
int + int = int
Los operadores relacionales devuelven un valor booleano.
Para las cadenas, se pueden utilizar los operadores relacionales para comparaciones además de + y += para la concatenación:
String nombre = "nombre" + "Apellido";
El operador = siempre hace copias de objetos, marcando los antiguos
para borrarlos, y ya se encargará el garbage collector de devolver al
sistema la memoria ocupada por el objeto eliminado.
Control de Flujo
Muchas de las sentencias de control del flujo del programa se han tomado del C:
Sentencias de Salto
if/else
if( Boolean ) {
sentencias;
}
else {
sentencias;
}
switch
switch( expr1 ) {
case expr2:
sentencias;
break;
case expr3:
sentencias;
break;
Default:
sentencias;
break;
}
Sentencias de Bucle
Bucles for
for( expr1 inicio;
expr2 test; expr3 incremento ) {
sentencias;
}
El siguiente trocito de código Java que dibuja varias líneas en pantalla alternando sus colores entre rojo, azul y verde. Este fragmento sería parte de una función Java (método):
int contador;
for( contador=1; contador <= 12; contador++ ) {
switch( contador
% 3 ) {
case 0:
setColor( Color.red );
break;
case 1:
setColor( Color.blue );
break;
case 2:
setColor( Color.green );
break;
}
g.drawLine( 10,contador*10,80,contador*10 );
}
También se soporta el operador coma (,) en los bucles for
for( a=0,b=0; a < 7; a++,b+=2 )
Bucles while
while( Boolean )
{
sentencias;
}
Bucles do/while
do {
sentencias;
}while( Boolean );
Manejo de memoria y recolección de basura
Java tiene un colector
automático de basura. El manejo de memoria en Java esta basado en objetos
y referencias a objetos. No hay apuntadores en Java (apuntadores como en C).
El manejador de memoria de Java lleva un registro de las referencias a un objeto.
Cuando un objeto no tiene referencias entonces se convierte en un candidato
para ser considerado basura.
Por ejemplo, veamos la siguiente clase:
// Voltea una cadena
de caracteres
class CADENA_ALREVES
{
public static String volteala(String FUENTE)
{
int I,
LONGITUD = FUENTE.length();
StringBuffer DESTINO = new StringBuffer(LONGITUD);
for ( I = (LONGITUD - 1); I >= 0; I--)
{
DESTINO.appendChar(FUENTE.charAt(I));
}
return DESTINO.toString();
}
}
En este ejemplo
la variable DESTINO es usada como un objeto temporal de referencia durante la
ejecución del proceso de invertir una cadena. Cuando el método
"volteala" llega a su return la referencia al objeto DESTINO ya no
existe, siendo entonces DESTINO un candidato a ser basura.
Los elementos de clase String (como FUENTE) tienen los métodos length
y charAt (el cual regresa el caracter correspondiente a la posicion indicada).
Los elementos de la clase StringBuffer tienen los métodos appendChar
(el cual incluye un caracter al final del buffer) y toString (el cual transforma
los datos del buffer en una representación de tipo String).