Programacion Basica en Java
Programacion Basica en Java
Sin embargo C también tiene sus problemas. Uno de los principales es que
cuando la aplicación crece, el código es muy difícil de manejar. Las técnicas
de programación estructurada y programación modular, que en C pueden ser
aplicadas, paliaban algo el problema. Pero fue la programación orientada a
objetos (POO u OOP) la que mejoró notablemente el situación.
No obstante C sigue siendo uno de los lenguajes más utilizados y
académicamente sigue utilizándose por su versatilidad, que permite aprender
todas las características de la programación clásica. De hecho a un buen
programador de lenguaje C no le debería ser difícil aprender a programar en
otros lenguajes (una vez que conozca las bases de la programación orientada a
objetos).
la influencia de la programación orientada a objetos
La POO permite fabricar programas de forma más parecida al pensamiento
humano. De hecho simplifica el problema dividiéndolo en objetos y
permitiendo centrarse en cada objeto, para de esa forma eliminar la
complejidad. Cada objeto se programa de forma autónoma y esa es la
principal virtud.
Al aparecer la programación orientada a objetos (en los años setenta),
aparecieron varios lenguajes orientados a objetos y también se realizaron
versiones orientadas a objetos (o semiorientadas a objetos) de lenguajes
clásicos.
Una de las más famosas adaptaciones fue la que capacitó al lenguaje C a
utilizar objetos. A ese lenguaje se le llamó C++ indicando con esa simbología
que era un incremento del lenguaje C (en el lenguaje C, como en Java, los
símbolos ++ significan incrementar). Las ventajas que añadió C++ a C fueron:
♦ Añadir soporte para objetos (POO)
♦ Librerías de clases de objetos (como MFC 1 por ejemplo) que
facilitaban el uso de código ya creado para las nuevas aplicaciones.
♦ Todo lo bueno del C (incluso compatibilidad con este lenguaje)
1
Microsoft Foundation Classes, librería creada por Microsoft para facilitar la creación
de programas para el sistema Windows.
C++ pasó a ser el lenguaje de programación más popular a principios de los 90
y sigue siendo un lenguaje muy utilizado. Muchas personas le consideran el
lenguaje de programación más potente.
Otras adaptaciones famosas de lenguajes clásicos a lenguajes orientados a
objetos, fueron:
♦ El paso de Pascal a Turbo Pascal y posteriormente a Delphi.
♦ El paso de Basic a QuickBasic y después a Visual Basic.
A pesar de las evidentes ventajas del lenguaje C++. Tiene sus serios
inconvenientes.
♦ Su complejidad
♦ El hecho de ser un lenguaje híbrido, es decir que permite programar
de forma no orientada a objetos, lo que provoca malas prácticas de
programador.
♦ Los punteros, que requieren un especial cuidado por parte de la
programadora o programador, ya que son los responsables de los
errores más peligrosos y difíciles de detectar.
♦ El que sea un lenguaje apto para crear programas dañinos como virus y
programas espías.
♦ No es un lenguaje apto para transmitirse en redes de ordenadores;
especialmente en Internet (porque al ser compilado requiere cargar
todo el código para ser compilado).
2
La simbología del café sigue presente en Java. El logotipo oficial de Java es una taza
humeante de café. Mucho software desarrollado para Java ha mantenido esa simbología:
Visual Café, Kawa (café en ruso),…
Java y JavaScript
Una de las confusiones actuales la provoca el parecido nombre que tienen
estos dos lenguajes. Sin embargo no tienen mucho que ver entre sí. Sun creó
Java y la empresa Netscape creó JavaScript. Java es un lenguaje completo
que permite realizar todo tipo de aplicaciones. JavaScript es un lenguaje que
permite incrustar código dentro de las páginas web.
La finalidad de JavaScript es mejorar las páginas web, hacerlas más
vistosas y dinámicas. La finalidad de Java es crear aplicaciones de todo tipo
(aunque está muy preparado para crear sobre todo aplicaciones en red).
Aunque la sintaxis tiene elementos en común, desde luego no se parece
tanto. De hecho Javascript es mucho más fácil que Java.
La "compilación" en Java
En Java el código no se traduce a código ejecutable. En Java el proceso se
conoce como precompilación y sirve para producir un archivo (de extensión
class) que contiene código que no es directamente ejecutable (no es código
Java). Es un código intermedio llamado bytecode (también se le llama J-
code).
Al no ser ejecutable, el archivo class no puede ejecutarse directamente
con un doble clic en el sistema. El bytecode tiene que ser interpretado (es
decir, traducido línea a línea) por una aplicación conocida como la máquina
virtual de Java (JVM). Hoy se conoce como JRE (Java Runtime Environment,
entorno de ejecución de Java).
La gran ventaja es que el entorno de ejecución de Java lo fabrica Sun para
todas las plataformas; lo que significa que un archivo class se puede ejecutar
en cualquier ordenador o máquina que incorpore el JRE. Sólo hay una pega, si
programamos utilizando por ejemplo la versión 1.6 de Java, el ordenador en el
que queramos ejecutar el programa deberá incorporar el JRE al menos de la
versión 1.6.
El JRE o la máquina virtual de Java son un programas muy pequeños y que
se distribuyen gratuitamente para prácticamente todos los sistemas
operativos.
A la forma de producir código final de Java se la llama JIT (Just In Time,
justo en el momento) ya que el código ejecutable se produce sólo en el
instante de ejecución del programa. Es decir, no hay en ningún momento
código ejecutable.
Ilustración 3-2, Proceso de compilación de un programa Java
Seguridad
Al interpretar el código, el JRE puede delimitar las operaciones peligrosas, con
lo cual la seguridad es fácilmente controlable. Además, Java elimina las
instrucciones dependientes de la máquina y los punteros que generaban
terribles errores en C y la posibilidad de generar programas para atacar
sistemas. Tampoco se permite el acceso directo a la memoria y recursos del
ordenador.
La primera línea de seguridad de Java es un verificador del bytecode que
permite comprobar que el comportamiento del código es correcto y que sigue
las reglas del lenguaje Java. Normalmente los compiladores de Java no pueden
generar código que se salte las reglas de seguridad de Java. Pero un
programador malévolo podría generar artificialmente bytecode que se salte
las reglas. El verificador intenta eliminar esta posibilidad.
Hay un segundo paso que verifica la seguridad del código que es el
verificador de clase que es el programa que proporciona las clases necesarias
al código. Lo que hace es asegurarse que las clases que se cargan son
realmente las del sistema original de Java y no clases creadas reemplazadas
artificialmente.
Finalmente hay un administrador de seguridad que es un programa
configurable que permite al usuario indicar niveles de seguridad a su sistema
para todos los programas de Java.
Hay también una forma de seguridad relacionada con la confianza. Esto se
basa es saber que el código Java procede de un sitio de confianza y no de una
fuente no identificada. Se consigue gracias a que en Java se permite añadir
firmas digitales al código para verificar la autoría del mismo.
Tipos de aplicaciones Java
applets
Son programas Java pensados para ser colocados dentro de una página web.
Pueden ser interpretados por cualquier navegador con capacidades Java. Estos
programas se insertan en las páginas usando una etiqueta especial (como
también se insertan vídeos, animaciones flash u otros objetos).
Los applets son programas independientes, pero al estar incluidos dentro
de una página web las reglas de éstas le afectan. Normalmente un applet sólo
puede actuar sobre el navegador.
Hoy día mediante applets se pueden integrar en las páginas web
aplicaciones multimedia avanzadas (incluso con imágenes 3D o sonido y vídeo
de alta calidad)
aplicaciones de consola
Son programas independientes al igual que los creados con los lenguajes
tradicionales.
aplicaciones gráficas
Aquellas que utilizan las clases con capacidades gráficas (como awt por
ejemplo).
servlets
Son aplicaciones que se ejecutan en un servidor de aplicaciones web y que
como resultado de su ejecución resulta una página web.
midlet
Aplicación creada con Java para su ejecución en sistemas de propósito simple
o dispositivos móviles. Los juegos Java creados para teléfonos móviles son
midlets.
Plataformas
Actualmente hay tres ediciones de Java. Cada una de ellas se corresponde con
una plataforma que incluye una serie de funciones, paquetes y elementos del
lenguaje (es decir la API, Application Program Interface).
Java SE
Java Standard Edition. Antes se la conocía como J2SE (el dos se refiere a
Java 2). Permite escribir código Java relacionado con la creación de
aplicaciones y applets en lenguaje Java común. Es decir, es el Java normal.
Java EE
Java Enterprise Edition. Todavía conocida como J2EE. Pensada para la
creación de aplicaciones Java empresariales y del lado del servidor. Su última
versión es la 1.4
Java ME
Java Mobile Edition. También conocida como J2ME. Pensada para la creación
de aplicaciones Java para dispositivos móviles.
PATH=C:\WINNT\SYSTEM32;C:\WINNT;C:\WINNT\SYSTEM32\WBE
M;C:\Archivos de programa\Microsoft Visual Studio\Common\Tools\
WinNT;C:\Archivos de programa\Microsoft Visual Studio\Common\
MSDev98\Bin;C:\Archivos de programa\Microsoft
Visual Studio\Common\Tools;C:\Archivos de programa\Microsoft Visual
Studio\VC98\bin;C:\Archivos de programa\java\jsdk1.6.2\bin
.
Entornos de trabajo
El código en Java se puede escribir en cualquier editor de texto. Y para
compilar el código en bytecodes, sólo hace falta descargar la versión del JDK
deseada. Sin embargo, la escritura y compilación de programas hecha de esta
forma es un poco incomoda. Por ello numerosas empresas fabrican sus propios
/* Comentario
de varias líneas */
//Comentario de una línea
{
...código dentro del bloque
}
código fuera del bloque
El primer programa en Java
public class PrimerPrograma
{
public static void main(String[] args)
{
System.out.println(“¡Mi primer programa!”);
}
}
Este código sirve para escribir ¡Mi primer programa! en la pantalla. Para
empezar a entender el código:
♦ La primera línea (public class PrimerPrograma) declara el
nombre de la clase del código. Más adelante se explicará
que significa el concepto de clase; por ahora entenderemos
que el nombre de la clase es el nombre del programa.
♦ La línea public static void main(String args[]), sirve para
indicar el inicio del método main. Este método contiene
las instrucciones que se ejecutarán cuando el programa
arranque. Es decir lo que está tras las llaves del main, es el
programa en sí.
♦ La instrucción System.out.println sirve para escribir en
pantalla.
Como lo que escribimos es un texto, se encierra entre
comillas.
Además, el archivo tiene que llamarse obligatoriamente PrimerPrograma.java
ya que el nombre del programa (en realidad el nombre de la clase) y el del
archivo deben coincidir.
Por último, aunque no es obligatorio, es más que aconsejable que el
nombre del programa comience con una letra mayúscula y le sigan letras en
minúsculas. Si consta de varias palabras no pueden utilizarse espacios en
blanco, por lo que se suelen juntar las palabras poniendo cada inicial de la
palabra en mayúsculas.
Éste tipo de reglas no obligatorias sino aconsejables (como por ejemplo el
hecho de que las instrucciones interiores a un bloque dejen espacio a su
izquierda) producen un código más legible y sobre todo hace que todos los
programadores del planeta adoptemos la misma forma de escribir,
simplificando el entendimiento del código.
Ejecución de programas Java
Proceso de compilación desde la línea de comandos
La compilación del código java se realiza mediante el programa javac incluido
en el software de desarrollo de Java (el SDK). La forma de compilar es (desde
la línea de comandos):
javac archivo.java
java archivoClass
import paquete.subpaquete.subsubapquete....clase
Esta instrucción se coloca arriba del todo en el código. Para la clase Date
sería:
import java.util.Date;
import java.util.*;
Esto significa que se va a incluir en el código todas las clases que están dentro
del paquete util de java.
En realidad no es obligatorio incluir la palabra import para utilizar una
clase dentro de un paquete, pero sin ella deberemos escribir el nombre
completo de la clase. Es decir no podríamos utilizar el nombre Date, sino
java.util.Date.
Variables
Introducción
Las variables son contenedores que sirven para almacenar los datos que utiliza
un programa. Dicho más sencillamente, son nombres que asociamos a
determinados datos. La realidad es que cada variable ocupa un espacio en la
memoria RAM del ordenador para almacenar el dato al que se refiere. Es decir
cuando utilizamos el nombre de la variable realmente estamos haciendo
referencia a un dato que está en memoria.
Las variables tienen un nombre (un identificador) que sólo puede contener
letras, números (pero no puede empezar el nombre con un número) y el
carácter de subrayado. El nombre puede contener cualquier carácter Unicode
que simbolice letras (valen símbolos como la ñ, á,… no permitidos en la
mayoría de lenguajes por no ser parte del ASCII estándar)
Declaración de variables
Antes de poder utilizar una variable, ésta se debe declarar. Lo cual se debe
hacer de esta forma:
tipo nombrevariable;
int días=365;
Y se puede declarar más de una variable a la vez del mismo tipo en la misma
línea si las separamos con comas
int x=7;
Pero la asignación se puede utilizar en cualquier momento (tras haber
declarado la variable):
int x;
x=7;
x=x*2;
Enteros
Los tipos byte, short, int y long sirven para almacenar datos enteros. Los
enteros son números sin decimales. Se pueden asignar enteros normales o
enteros octales y hexadecimales. Los octales se indican anteponiendo un cero
al número, los hexadecimales anteponiendo 0x.
int i=12;
byte b=i;//error de compilación, posible pérdida de precisión
int i=12;
byte b=(byte) i; //El (cast) evita el error
Hay que tener en cuenta en estos castings que si el valor asignado sobrepasa el
rango del elemento, el valor convertido no tendrá ningún sentido ya que no
puede almacenar todos los bits necesarios para representar ese número:
int i=1200;
byte b=(byte) i; //El valor de b no tiene sentido
Números en coma flotante
Los decimales se almacenan en los tipos float y double. Se les llama de coma
flotante por como son almacenados por el ordenador. Los decimales no son
almacenados de forma exacta por eso siempre hay un posible error. En los
decimales de coma flotante se habla, por tanto de precisión. Es mucho más
preciso el tipo double que el tipo float.
Para asignar valores literales a una variable de coma flotante, hay que
tener en cuenta que el separador decimal es el punto y no la coma. Es decir
para asignar el valor 2,75 a la variable x se haría:
x=2.75;
A un valor literal (como 1.5 por ejemplo), se le puede indicar con una f al final
del número que es float (1.5f por ejemplo) o una d para indicar que es
double. Si no se indica nada, un número literal siempre se entiende que es
double, por lo que al usar tipos float hay que convertir los literales.
Los valores decimales se pueden representar en notación decimal:
3
1.345E+3 significaría 1,345·10 o lo que es lo mismo 1345.
Lógicamente no podemos asignar valores decimales a tipos de datos
enteros:
pero perderemos los decimales (en el ejemplo, x vale 9). El caso contrario sin
embargo sí se puede hacer:
int x=9;
double y=x; //correcto
la razón es que los tipos de coma flotante son más grandes que los enteros,
por lo que no hay problema de pérdida de valores.
Al declarar números del tipo que sean, si no se indican valores iniciales, Java
asigna el valor cero.
Booleanos
Los valores booleanos (o lógicos) sirven para indicar si algo es verdadero (true)
o falso (false).
boolean b=true;
char letra;
letra=’C’; //Los caracteres van entre comillas
letra=67; //El código Unicode de la C es el 67. Esta línea
//hace lo mismo que la anterior
También hay una serie de caracteres especiales que van precedidos por el
símbolo \, son estos:
carácter significado
\b Retroceso
\t Tabulador
\n Nueva línea
\f Alimentación de página
\r Retorno de carro
\” Dobles comillas
\’ Comillas simples
\\ Barra inclinada (backslash)
\udddd Las cuatro letras d, son en realidad números en hexadecimal.
Representa el carácter Unicode cuyo código es representado
por las dddd
Conversión entre tipos ( casting)
Ya se ha comentado anteriormente la necesidad de uso del operador de
casting para poder realizar asignaciones entre tipos distintos. Como resumen
general del uso de casting véanse estos ejemplos:
El código anterior es correcto porque un dato byte es más pequeño que uno
int y Java le convertirá de forma implícita. Lo mismo pasa de int a double por
ejemplo. Sin embargo en:
int a=1;
byte b;
b=a;
int a=1;
byte b;
b= (byte) a; //correcto
En el siguiente ejemplo:
Aunque el resultado es 100, y ese resultado es válido para un tipo byte; lo que
ocurrirá en realidad es un error. Eso es debido a que la multiplicación 100 *
100 da como resultado 10000, es decir un número de tipo int. Aunque luego
se divide entre 100, no se vuelve a convertir a byte; ya que ante cualquier
operación el tipo resultante siempre se corresponde con el tipo más grande
que intervenga en la operación. Lo correcto sería:
Una vez que la variable ha sido eliminada, no se puede utilizar. Dicho de otro
modo, no se puede utilizar una variable más allá del bloque en el que ha sido
definida. Ejemplo:
{
int x=9;
}
int y=x; //error, ya no existe x
Operadores
Introducción
Los datos se manipulan muchas veces utilizando operaciones con ellos. Los
datos se suman, se restan, ... y a veces se realizan operaciones más
complejas.
Operadores aritméticos
Son:
operador significado
+ Suma
- Resta
* Producto
/ División
% Módulo (residuo)
resultado1= d1 / d2;
resultado2= i1 / i2;
double resultado;
int i1=7,i2=2;
resultado=i1/i2; //Resultado valdrá 3
resultado=(double)i1/i2; //Resultado valdrá 3.5
El operador del módulo (%) sirve para calcular el resto de una división entera.
Ejemplo:
Operadores condicionales
Sirven para comparar valores. Siempre devuelven valores booleanos. Son:
operador significado
< Menor
> Mayor
>= Mayor o igual
<= Menor o igual
== Igual
!= Distinto
! No lógico (NOT)
&& “Y” lógico (AND)
|| “O” lógico (OR)
El operador && (AND) sirve para evaluar dos expresiones de modo que si
ambas son ciertas, el resultado será true sino el resultado será false. Ejemplo:
boolean carnetConducir=true;
int edad=20;
boolean puedeConducir= (edad>=18) && carnetConducir;
//Si la edad es de al menos 18 años y carnetConducir es
//true, puedeConducir es true
El operador || (OR) sirve también para evaluar dos expresiones. El resultado
será true si al menos uno de las expresiones es true. Ejemplo:
operador significado
& AND
| OR
~ NOT
^ XOR
>> Desplazamiento a la derecha
<< Desplazamiento a la izquierda
>>> Desplazamiento derecha con relleno de ceros
<<< Desplazamiento izquierda con relleno de ceros
Operadores de asignación
Permiten asignar valores a una variable. El fundamental es “=”. Pero sin
embargo se pueden usar expresiones más complejas como:
x += 3;
+= -= *= /=
&= |= ^= %=
>>= <<=
x1 = x2 = x3 = 5; //todas valen 5
expresionlogica?valorSiVerdadero:valorSiFalso;
Ejemplo:
paga=(edad>18)?6000:3000;
En este caso si la variable edad es mayor de 18, la paga será de 6000, sino será
de 3000. Se evalúa una condición y según es cierta o no se devuelve un valor u
otro. Nótese que esta función ha de devolver un valor y no una expresión
correcta. Es decir, no funcionaría:
resultado = 8 + 4 / 2;
resultado = (8 + 4) / 2;
resultado = 9 / 3 * 3;
Constantes
Una constante es una variable de sólo lectura. Dicho de otro modo más
correcto, es un valor que no puede variar (por lo tanto no es una variable).
La forma de declarar constantes es la misma que la de crear variables, sólo
que hay que anteponer la palabra final que es la que indica que estamos
declarando una constante y por tanto no podremos variar su valor inicial:
Esta función tras escribir añade un salto de línea, de modo que lo siguiente
que se escriba saldrá en otra línea. Existe una variante de esta función que no
inserta el salto de línea es System.out.print:
System.out.print("todo en la ");
System.out.print("misma línea ");
import javax.swing.JOptionPane;
Esta es una clase pensada para manejar cuadros de diálogo de tipo Swing
(véase tema ¡Error! No se encuentra el origen de la referencia. ¡Error! No
se encuentra el origen de la referencia.). Uno de estos cuadros permite
introducir datos y que una variable les almacene. El problema es que todos los
datos les devuelve en forma de String (texto), lo que implica almacenarles en
una variable de ese tipo y luego convertirlos al tipo apropiado (int, double,
char,…). Ejemplo:
Función Convierte a
Integer.parseInt int
Short.parseShort short
Byte.parseByte byte
Long.parseLong long
Float.parseFloat float
Double.parseDouble double
Boolean.parseBoolean boolean
Hay que tener cuidado con las mayúsculas, son obligatorias donde aparezcan.
La clase Math
Se echan de menos operadores matemáticos más potentes en Java. Por ello se
ha incluido una clase especial llamada Math dentro del paquete java.lang.
Para poder utilizar esta clase, se debe incluir esta instrucción (aunque
normalmente no es necesario porque todo el paquete java.lang ya estará
incluido en nuestro código):
import java.lang.Math;
Esta clase posee métodos muy interesantes para realizar cálculos matemáticos
complejos. Por ejemplo:
constante significado
double E El número e (2, 7182818245...)
double PI El número ∏ (3,14159265...)
operador significado
double ceil(double x) Redondea x al entero mayor siguiente:
♦ Math.ceil(2.8) vale 3
♦ Math.ceil(2.4) vale 3
♦ Math.ceil(-2.8) vale -2
double floor(double x) Redondea x al entero menor siguiente:
♦ Math.floor(2.8) vale 2
♦ Math. floor (2.4) vale 2
♦ Math. floor (-2.8) vale -3
int round(double x) Redondea x de forma clásica:
♦ Math.round(2.8) vale 3
♦ Math. round (2.4) vale 2
♦ Math. round (-2.8) vale -3
operador significado
double rint(double x) Idéntico al anterior, sólo que éste método da
como resultado un número double mientras
que round da como resultado un entero tipo
int
double random() Número aleatorio decimal situado entre el 0 y
el 1
tiponúmero abs( tiponúmero x) Devuelve el valor absoluto de x.
tiponúmero min( tiponúmero x, Devuelve el menor valor de x o y
tiponúmero y)
tiponúmero max( tiponúmero x, Devuelve el mayor valor de x o y
tiponúmero y)
double sqrt(double x) Calcula la raíz cuadrada de x
y
double pow(double x, double y) Calcula x
x
double exp(double x) Calcula e
double log(double x) Calcula el logaritmo neperiano de x
double acos(double x) Calcula el arco coseno de x
double asin(double x) Calcula el arco seno de x
double atan(double x) Calcula el arco tangente de x
double sin(double x) Calcula el seno de x
double cos(double x) Calcula el coseno de x
double tan(double x) Calcula la tangente de x
double toDegrees( Convierte de radianes a grados
double anguloEnRadianes)
double toRadians( Convierte de grados a radianes
double anguloEnGrados)
double signum(double n) Devuelve el valor del signo del número n. Si n
vale cero, la función devuelve cero; si es
positivo devulve 1.0 y si es negativo -1.0
Math.random()*10
Math.random()*9+1
(int) Math.floor(Math.random()*10+1)
Entre 10 y 30 sería:
(int) Math.floor(Math.random()*21+10)