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


Dado que Java es orientado a objetos, ¿que es lo que permite?

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.

Librerías de Java

Existen diferentes librerias en Java, entre las cuales se encuentran:

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.


Identificadores

Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar.

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




Palabras Reservadas

Además, el lenguaje se reserva unas cuantas palabras más, pero que hasta ahora no tienen un cometido específico. Son:

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.

Operadores

Los operadores de Java son muy parecidos en estilo y funcionamiento a los de C. En la siguiente tabla aparecen los operadores que se utilizan en Java, por orden de precedencia:

[] ()
++ --
! ~
* / %
+ -
<< >>
< > <= >= == !=
& ^ |
&& ||
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).