Está en la página 1de 33

Programación avanzada

en Java

Miguel Ángel Corella


16 de Septiembre de 2005
Información general (I)
• Profesores:
– Miguel Ángel Corella, José María Fuentes y
Francisco Saíz.
• Índice del curso:
– Introducción.
• El lenguaje Java. Miguel Ángel Corella
• Programación orientada a objetos en Java.
– Jerarquías de clases.
José María Fuentes
– Excepciones.
– Applets.
Francisco Saíz
– Interfaces de usuario.
Información general (y II)

• Bibliografía:
– Core Java 1.2, Volúmenes I – II. C.S.
Horstmann, Gary Cornell, Prentice Hall, 1999.
– Tutorial de Java en http://java.sun.com
El lenguaje Java
Características principales (I)

• Lenguaje interpretado.
• Fuertemente tipado.
• Sintaxis similar a C/C++.
• Sin punteros: Garbage collection.
• 100% portable.
• Integra librearías estándar para:
– Interfaces de usuario.
– Objetos distribuidos.
– Threads.
Características principales (y II)

• Ejecutable desde navegadores web.


• Origen: Aumento de HTML para conseguir
páginas Web dinámicas.
• Versiones:
– 1995 – JDK 1.0
– 1997 – JDK 1.1
–…
– 2004 – JDK 1.5
Desarrollo en Java

• Java Development Kit (JDK):


– Java Runtime Environment (JRE):
• Java Virtual Machine.
• Java API: lenguaje básico y librerías estándar.
– Compilador a bytecode.
– Otras herramientas:
• Debuggers.
• Applet viewer.
• Compiladores RMI
• …
Compilación e interpretación
Ejemplo.java

class Ejemplo {
...
}
Java Virtual Machine
class Aux {
JVM
...
}
Compilador
Java

Ejemplo.class Aux.class
Comparativa: Java vs. C++ (I)
Java C++
• Interpretado • Compilado

• Portable • Aspectos no portables

• Todo memoria dinámica • Memoria automática y dinámica


• Garbage collection • Gestión del programador
• No existen punteros • Existen punteros

• Todos los métodos virtuales • No todos los métodos virtuales

• No hay herencia múltiple • Hay herencia múltiple

• Información sobre clases • Información muy escasa


en tiempo de ejecución. (dynamic_cast).

• Tratamiento genérico • Punteros a void.


de tipos (wrappers).
Comparativa: Java vs. C++ (y II)
Java C++

• Soporte estándar para interfaces: • No incluido en el lenguaje:


AWT, SWING Microsoft MFC, Borland OWL…

• Soporte estándar para concurrencia • No incluido en el lenguaje

• Soporte estándar para objetos • No incluido en el lenguaje:


distribuidos CORBA, ActiveX

• Ejecutable en navegadores web • No ejecutable por navegadores

• Homogeneidad del lenguaje • Múltiples sintaxis

• Lenguaje bien diseñado • Compatibilidad con C


Elementos del lenguaje
Aspectos léxicos

• Ignora múltiples espacios en blanco


• Sentencias separadas por “;”.
• Comentarios:
– /* … */  Múltiples líneas de comentario
– //  Una única línea de comentario
• Case – sensitive.
• Convenios de nomenclatura:
– Clases con mayúscula.
– Métodos y variables con minúscula.
– etc…
Valores y variables
• Tipos básicos:
byte 1 byte
char 2 bytes (sin signo, caracteres Unicode, incluyen los ASCII)
short 2 bytes
int 4 bytes
long 8 bytes
float 4 bytes
double 8 bytes
boolean 1 bit (true ó false, no compatible con tipos numéricos)

• Variables y literales:
– Declaración y utilización de variables y
literales similar a C/C++.
Compatibilidad entre tipos
byte b = 42;
char c = 'a'; // también válido: c = 97;
short s = 1024;
int i = 50000;
long l = 120000;
float f = 5.67f;
double d = .1234;
double result = (f*b) + (i/c) - (d*s);

Ensanchar: automático Estrechar: cast explícito char: cast explícito


f = c; c = (char) i; s = (short) c;
d = s; b = (byte) d; c = (char) s;
f = l; f = (float) d; c = (char) b;
Operadores

• En total hay 46 operadores.


– Numéricos:
+, -, *, /, %, +=, -=, *=, /=, %=, --, ++

– Lógicos:
&&, ||, !

– Operadores de bit:
&, |, ^, ~, >>, <<

– Relacionales:
>, <, >=, <=, ==, !=

– Condicional:
If-then-else: (condicion) ? acción1 : acción2
Precedencia de operadores
( ) [ ] .
++ -- ~ !
Orden de ejecución de operadores

new
* / %
+ -
>> >>> <<
> >= < <= instanceof
== !=
&
^
|
&&
||
? :
= += *= -= /=

Igualdad de precedencia
Arrays
• Declaración:
int a[];

• Reserva de tamaño:
a = new int[3];
int b[] = {1, 2, 3, 4};

• Asignación de valores:
a[1] = 7;
b = a;

• Errores:
a[6] = 7; // Fuera del rango
a = {1, 2, 3}; // Sólo válido en la inicialización
int c[5]; // La dimensión sólo al hacer new
char str[] = “hola”; // Los Strings no son arrays en Java
Arrays multidimensionales

float a[][] = new float [4][3];

float m[][] = new float [4][];


m[0] = new float [2];
m[1] = new float [5];
m[2] = new float [m[1].length];
float x[] = {4.5, 8/3, m[2][1]};
m[3] = x; // O cualquier expresión que devuelva un float[]
a[0] = m[1]; // Las variables de array no son constantes
a[2, 1] = 7.3 // Error de sintaxis: a[2][1]
Expresiones condicionales
• Dos tipos de condicionales.
if (condición1) acción1 [else acción2] [else if (condición2)…

switch (expresión) { byte, char, short o int


case valor1:

break; Tienen que ser literales
case valor2:

break;

default:

}
Iteraciones
• Tres tipos de iteraciones.
while (condición1) {

}

do {

} while (condición1)

for (inicialización; condición; iteración) {



}
Clases y objetos
en Java
Clases
• Estructura de datos + funciones.
class CuentaBancaria {

long numero;
String titular; Variables
long saldo; (datos)

void ingresar (long cantidad) {


saldo += cantidad;
}

Funciones
void retirar (long cantidad) {
if (cantidad > saldo)
System.out.println ("Saldo insuficiente");
else saldo -= cantidad;
}
}
Variables de una clase
• Definen una estructura de datos (similar al struct de C)
class CuentaBancaria { struct CuentaBancaria {
long numero; long numero;
String titular; char *titular;
long saldo; long saldo;
} };

• Pueden almacenar objetos de otras clases


class CuentaBancaria { class Cliente {
long numero; String nombre;
Cliente titular; long dni;
long saldo = 0; }
}

• Por defecto, se inicializan a 0, false y/o null.


Creación de objetos
• Una clase define un tipo de dato que se puede utilizar para declarar
variables.
CuentaBancaria cuenta1, cuenta2;

• Declarar un objeto es declarar una referencia al objeto.


• Los objetos se crean mediante el operador new.
CuentaBancaria

cuenta1 = new CuentaBancaria(); numero 0


titular null
saldo 0

• Crear un objeto es reservar memoria para sus variables.


• El operador new reserva memoria y devuelve una referencia.
Acceso a variables
• El acceso a las variables de un objeto se lleva a
cabo mediante la notación “.”
CuentaBancaria cuenta1, cuenta2;
cuenta1 = new CuentaBancaria ();
cuenta2 = cuenta1;
Cliente cliente1 = new Cliente ();

cliente1.nombre = "Luis Gomez";


cliente1.dni = 25672046;
cuenta1.numero = 6831531;
cuenta1.titular = cliente1;
cuenta1.saldo = 100000;
cuenta2.saldo = 200000;

cuenta2.titular.nombre = "Pilar Garcia";


Métodos
• Los métodos son funciones definidas dentro de un clase.

• Son similares a un puntero a función dentro de un struct


de C.

• Los métodos de una clase pueden referenciar


directamente las variables de la misma.

• Los métodos se invocan sobre un objeto de la clase a la


que pertenecen mediante la notación “.”.
cuenta2.ingresar(1000);

• Al ejecutar un método sobre un objeto de la clase X, las


variables de dicha clase X toman los valores que tiene el
objeto.
Llamadas desde métodos
• Los métodos pueden invocar directamente otros
métodos de la misma clase (sin “.”).
• Al ejecutar un método invocado sobre un objeto de clase
A, las llamadas a otros métodos de la clase A se
ejecutan sobre el mismo objeto a menos que se
invoquen sobre otro objeto
cuenta3 = new CuentaBancaria ();
cuenta2.transferencia (cuenta3, 1000);
class CuentaBancaria {
...
void transferencia (CuentaBancaria destino, long cantidad) {
if (cantidad <= saldo ) {
retirar (cantidad);
destino.ingresar (cantidad);
}
}
}
Acceso a objetos

class X { String nombre; }


class Y { int i; }
class Z { String nombre; }

class A { 1. Variable del objeto de la invocación


int num; 2. Objeto definido en variable local
X obj4; 3. Objeto pasado como argumento
void f (int n, Y obj3) { 4. Objeto almacenado en variable de clase
Z obj2 = new Z ();
4. obj4.nombre = obj2.nombre
num = obj3.i + n;
} 2.
}
1. 3.
Constructores
• Métodos ejecutados automáticamente al crear un objeto
de una clase (“new”).
• Se usan para llevar a cabo labores de inicialización.
• Simplifican la sintaxis y apoyan el encapsulamiento de
los datos.
• Los métodos constructores de una clase tienen que
tener el mismo nombre que la clase.
class Cliente {

// Constructor de la clase Cliente


Cliente (String str, long num) {
...;
}
}
Ejemplos de constructores
class Cliente {
String nombre;
long dni;
Cliente (String str, long num) {
nombre = str;
dni = num;
}
}
class CuentaBancaria {
long numero;
Cliente titular;
long saldo;
CuentaBancaria (long num, Cliente clt, long s) {
numero = num; titular = clt; saldo = s;
}
}
Ejemplos de invocación
• Automáticamente al crear objetos.

Cliente cliente1 = new Cliente ("Luis Gomez", 25672046);

CuentaBancaria cuenta1 =
new CuentaBancaria (6831531, cliente1, 100000);

CuentaBancaria cuenta2 =
new CuentaBancaria (8350284,
new Cliente ("Pilar Garcia", 15165442),
200000);
Constructor por defecto

• Si no se definen constructores, Java


proporciona uno por defecto.
– Sin parámetros: Llamadas del tipo new X();
– Sin funcionalidad: Variables inicializadas por defecto.

• Pero si se define un constructor (o más) el


constructor por defecto no es definido.
Programación avanzada
en Java

Miguel Ángel Corella


16 de Septiembre de 2005

También podría gustarte