Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Java/Características del
lenguaje
Es un lenguaje sencillo de aprender. Su sintaxis es la de
C++ “simplificada”. Los creadores de Java partieron de la sintaxis de C++ y trataron de
eliminar de este todo lo que resultase complicado o fuente de errores en este lenguaje.
Características
Lenguaje totalmente orientado a Objetos. Todos los conceptos en los que se apoya
esta técnica, encapsulación, herencia, polimorfismo, etc., están presentes en Java.
Disponibilidad de un amplio conjunto de librerías. Como ya se mencionó
anteriormente, Java es algo más que un lenguaje. La programación de aplicaciones con
Java se basa no solo en el empleo del juego de instrucciones que componen el
lenguaje, sino, fundamentalmente, en la posibilidad de utilizar el amplísimo conjunto
de clases que Sun pone a disposición del programador y con las cuales es posible
realizar prácticamente cualquier tipo de aplicación.
Lenguaje simple. Java posee una curva de aprendizaje muy rápida. Resulta
relativamente sencillo escribir applets interesantes desde el principio. Todos aquellos
familiarizados con C++ encontrarán que Java es más sencillo, ya que se han eliminado
ciertas características, como los punteros. Debido a su semejanza con C y C++, y dado
que la mayoría de la gente los conoce aunque sea de forma elemental, resulta muy
fácil aprender Java. Los programadores experimentados en C++ pueden migrar muy
rápidamente a Java y ser productivos en poco tiempo.
Distribuido Java proporciona una colección de clases para su uso en aplicaciones de
red, que permiten abrir sockets y establecer y aceptar conexiones con servidores o
clientes remotos, facilitando así la creación de aplicaciones distribuidas.
Interpretado y compilado a la vez Java es compilado, en la medida en que su código
fuente se transforma en una especie de código máquina, los bytecodes, semejantes a
las instrucciones de ensamblador. Por otra parte, es interpretado, ya que los
bytecodes se pueden ejecutar directamente sobre cualquier máquina a la cual se
hayan portado el intérprete y el sistema de ejecución en tiempo real (run-time).
Robusto Java fue diseñado para crear software altamente fiable. Para ello proporciona
numerosas comprobaciones en compilación y en tiempo de ejecución. Sus
características de memoria liberan a los programadores de una familia entera de
errores (la aritmética de punteros), ya que se ha prescindido por completo los
punteros, y la recolección de basura elimina la necesidad de liberación explícita de
memoria.
Seguro (?) Dada la naturaleza distribuida de Java, donde las applets se bajan desde
cualquier punto de la Red, la seguridad se impuso como una necesidad de vital
importancia. A nadie le gustaría ejecutar en su ordenador programas con acceso total
a su sistema, procedentes de fuentes desconocidas. Así que se implementaron
barreras de seguridad en el lenguaje y en el sistema de ejecución en tiempo real.
Indiferente a la arquitectura Java está diseñado para soportar aplicaciones que serán
ejecutadas en los más variados entornos de red, desde Unix a Windows Nt, pasando
por Mac y estaciones de trabajo, sobre arquitecturas distintas y con sistemas
operativos diversos. Para acomodar requisitos de ejecución tan diversos o variopintos,
el compilador de Java genera bytecodes: un formato intermedio indiferente a la
arquitectura diseñada para transportar el código eficientemente a múltiples
plataformas hardware y software. El resto de problemas los soluciona el intérprete de
Java.
Portable La indiferencia a la arquitectura representa sólo una parte de su portabilidad.
Además, Java especifica los tamaños de sus tipos de datos básicos y el
comportamiento de sus operadores aritméticos, de manera que los programas son
iguales en todas las plataformas. Estas dos últimas características se conocen como la
Máquina Virtual Java (JVM).
Alto rendimiento
Multihebra Hoy en día ya se ven como terriblemente limitadas las aplicaciones que
sólo pueden ejecutar una acción a la vez. Java soporta sincronización de múltiples hilos
de ejecución (multithreading) a nivel de lenguaje, especialmente útiles en la creación
de aplicaciones de red distribuidas. Así, mientras un hilo se encarga de la
comunicación, otro puede interactuar con el usuario mientras otro presenta una
animación en pantalla y otro realiza cálculos.
Dinámico El lenguaje Java y su sistema de ejecución en tiempo real son dinámicos en
la fase de enlazado. Las clases sólo se enlazan a medida que son necesitadas. Se
pueden enlazar nuevos módulos de código bajo demanda, procedente de fuentes muy
variadas, incluso desde la Red.
Produce applets Java puede ser usado para crear dos tipos de programas: aplicaciones
independientes y applets. Las aplicaciones independientes se comportan como
cualquier otro programa escrito en cualquier lenguaje, como por ejemplo el navegador
de Web HotJava, escrito íntegramente en Java. Por su parte, las applets son pequeños
programas que aparecen embebidos en las páginas Web, como aparecen los gráficos o
el texto, pero con la capacidad de ejecutar acciones muy complejas, como animar
imágenes, establecer conexiones de red, presentar menús y cuadros de diálogo para
luego emprender acciones, etc.
Tipo de variable
Cada variable debe tener un tipo de dato predefinido. Esto determina el rango de valores
que puede almacenar y que operaciones se pueden realizar. Por ejemplo una variable de
tipo entero puede almacenar números sin decimales y puede realizarse operaciones
aritméticas, pero no puede contener palabras.
Existen dos categorías de variables: las de tipo primitivo o las referenciadas. Una
variable de tipo primitivo accede al valor asignado directamente. Las referenciadas se
accede a través de un puntero, es decir que no almacenan un valor sino una dirección de
memoria. Estas últimas son utilizadas por las matrices , las clases e interfaces.
enteros
números reales
otros
En java a diferencia del lenguaje C, existe un tipo de variable “especial”, el Array. Este
tipo de variables no es más que un conjunto secuencial de memoria a las que se accede a
través de un índice de posición.
Los arreglos en Java son objetos, por lo que cuentan con propiedades y métodos para
manipularlos. Se pueden declarar arreglos de tipos de datos primitivos y de objetos.
Sintaxis:
Como podrás concluir la primera declaras el array nada más diciéndole la cantidad de
memoria secuencial que se debe reservar, en el segundo ejemplo se inicializa el array
dándole los valores que va a contener (obviamente la cantidad de memoria secuencial
reservada sera igual a la cantidad de elementos insertados).
cada posición del arreglo sera inicializada con el valor por defecto del tipo de variable.
Por ejemplo si el arreglo si el arreglo es de tipo boolean, todas las posiciones del arreglo
serán inicializadas con el valor false (ya que este es valor por defecto de este tipo de
dato), por el contrario si el arreglo fuese de un tipo no primitivo, el valor que contendrá
cada casilla sera null.
A continuación tienes una lista de los valores por defecto de cada tipo de dato
Tipo de Dato-->Valor
byte-->0
short-->0
int-->0
long-->0
float-->0.0
double-->0.0
char-->/u0000
boolean-->false
Object (Cualquier tipo de Objeto)-->null
Al momento de tratar de acceder a una posición fuera del rango del arreglo se lanzara un
exception de tipo java.lang.ArrayIndexOutOfBoundsException (esta exception es
una exception no chequeada es por eso que no es necesario colocar un bloque try/catch
en el código)
//Inicialización de la clase
USO DE OBJETOS
Un objeto es la instancia de una clase. Por ejemplo, si tenemos una clase perro definida
de la siguiente manera:
En este caso estamos definiendo una nueva instancia de la clase "Perro" que llamamos
snoopy, que definimos con pelo blanco y 4 patas (si, según esto podríamos crear perros
o aberraciones de la naturaleza con otro número, XD).
SENTENCIA IF - else
if (condición) {
sentencia;
} else {
sentencia;
}
Los operadores lógicos nos permiten simplificar la estructura. Sin ellos nos veríamos en
la necesidad de anidar las sentencias. Veamos que ocurre si en elejemplo anterior
descartamos el AND y el OR.
if ( x % 4 == 0 ) {
if ( x % 100 == 0 ) {
if ( x % 400 == 0 ) {
System.out.println("Es bisiesto");
} else {
System.out.println("No es bisiesto");
}
} else {
System.out.println("Es bisiesto");
}
} else {
System.out.println("No es bisiesto");
}
Parece complicado, pero nos demuestra muchas cosas. En primer lugar observamos que
se pueden anidar las sentencias if-else. Cada resultado de una condición puede caer en
una nueva comprobación para formar una estructura compleja de selección.
También vemos que hay cierta relación entre conectores lógicos y la estructura.
Conjunción
if (condición1 && condición2){ if ( condición1 ) {
sentecia1; if ( condición2 ) {
} else { sentencia1;
sentencia2; } else {
} sentencia2;
}
} else {
sentencia2;
}
Disyunción
if ( condición1 || condición2 ) { if ( condición1 ){
sentencia1; sentencia1;
} else { } else {
sentencia2; if ( condición2 ) {
} sentencia1;
} else {
sentencia2;
}
}
Negación
if ( ! condición1) { if ( condición1) {
sentencia1; sentencia2;
} else { } else {
sentencia2; sentencia1;
} }
USO DEL SWITCH
System.out.println("3 x 1 = 3");
System.out.println("3 x 2 = 6");
System.out.println("3 x 3 = 9");
System.out.println("3 x 4 = 12");
System.out.println("3 x 5 = 15");
System.out.println("3 x 6 = 18");
System.out.println("3 x 7 = 21");
System.out.println("3 x 8 = 24");
System.out.println("3 x 9 = 27");
Pero ya conocemos las estructuras que nos ahorran el esfuerzo de escribir tanto código.
Utilizaremos una sentencia que ya conocemos: el while
int factor = 1;
while ( factor <= 9 ) {
System.out.println("3 x " + factor + " = " + 3*factor );
factor++;
}
Veremos como este código cambia ligeramente si en lugar de while presentamos una
nueva sentencia denominada for
sintaxis
for ( ;;){}
Operador coma :
for mejorado
Java ofrece una funcionalidad extra para la orden for, mediante la que se puede
simplificar notablemente el codigo anterior, quedando así:
En este caso, liElemento toma el valor de cada uno de los elementos de laiEnteros,
permitiendo una navegación más simple, puesto que se evitan posibles errores derivados
del uso de los arreglos en forma directa. También se puede usar esta forma, para
estructuras más complejas como objetos de la clase Collection
public void Presenta (Collection <Integer> poConjunto){
for (Iterator <Integer> loElemento : poConjunto)
System.out.println (loElemento)
}
SENTENCIA DO-WHILE
Resulta útil para los casos en donde tendremos que realizar ciertas acciones antes de
verificar una condición.
Realicemos un programa que cuente la cantidad de dígitos que posee un número. Para
ello tendremos que dividir por diez el número que nos han dado, hasta que el resultado
se vuelva cero. Entonces recurrimos al while para realice los ciclos necesarios.
¿Qué ocurre si el número que nos dan es el cero? El resultado nos dará cero.
Obviamente es erróneo, debería devolver un dígito. Pero no entra en el ciclo debido a
que de entrada no satisface la condición. Podríamos implementar una solución "ad hoc".
número /=10;
dígitos++;
while ( número > 0 ) {
número /=10;
dígitos++;
}
SENTENCIA WHILE
La condición tiene que tomar un valor booleano (verdadero o falso). Si este valor es
verdadero, se ejecutará la sentencia. Concluida esta acción se vuelve a evaluar la
condición. Proseguirán los ciclos hasta que la condición no cambie a falso.
int n = 0;
while ( n > 0 ) System.out.println("Esto nunca lo verás");
Dentro del conjunto de sentencia que controla, debe existir alguna que cambie el valor
de la condición que se está evaluando.
Como no sabemos de antemano cuantas vueltas debe dar, simplemente esperamos que
el resultado de las divisiones sucesivas sea igual a cero.
También se pueden realizar ciclos con while en donde ya conocemos, antes de entrar en
la estructura, cuantas vueltas debe dar para terminar. Para esto nos auxiliamos con un
contador de vueltas. Previamente tiene que inicializarse antes de ingresar al ciclo. Luego
en cada vuelta se modificara según la lógica del algoritmo.
Para tener varias veces el asterisco sin necesidad de imprimirlo asi "*****", utilizamos
otro ciclo while y otra variable que inicializaremos dentro del ciclo para que se cumpla
la cual llamaremos "contador2", obtendremos el mismo resultado que el anterior, el
codigo quedaria asi: