Está en la página 1de 74

Introduccin a Java (I)

Indice
2
ndice
Tipos de datos y operadores
Entradas y Salidas bsicas
Sentencias de control
Clases
Tipos de datos y operadores
Indice
4
Variables
Una variable no es algo muy diferente de lo que hemos aprendido en
matemticas. Pensemos en las siguientes operaciones:
El largo de la parcela es 60 metros
El ancho de la parcela es 70 metros
El rea es el producto del ancho por el largo: 4200

Por qu son necesarias las variables?
Porque necesitamos etiquetas o identificadores para cosas tales como ancho, largo,
etc.
Porque necesitamos almacenar datos asociados a dichos identificadores (60, 70, 4200)

Un ejemplo en Java:
public static void main(String[] args) {
System.out.println( "Ha entrado en la aplicacin");
float largo;
float ancho;
float area;
largo = 60;
ancho = 70;
area = ancho * largo; // Cmo visualizar el rea de la parcela
}

Indice
5
Variables: las reglas bsicas
Regla bsica: toda variable debe ser declarada antes de ser utilizada
En el formato de la declaracin hay que tener en cuenta:
Lo bsico, especificar:
El tipo de dato
El nombre o identificador de la variable
Lo opcional es:
Dar valor a la variable por primera vez (inicializar)
Declarar otras variables en la misma lnea (ojo: del mismo tipo)
Formato:
Tipo nombre [ = valor ] [, nombre [ = valor ] ... ];
Ejemplos:
int alto, ancho = 0, edad;
char x = s, b;
El programador tiene completa libertad a la hora de dar nombre a una variable. Por
ejemplo, no hay obligacin de llamar a las variables enteras con nombres como
nmero, entero, etc.
Lo mejor a la hora de dar un nombre es dejarse llevar por el sentido comn:
claridad, es decir, tratar de ser significativo sin alargarse en exceso. Por
ejemplo, el nombre edad es ms significativo que usar simplemente e. La
costumbre de dar nombres no significativos es uno de los vicios que conduce a crear
cdigo solipsista: slo lo comprende el programador que lo cre (siempre que no
haya pasado mucho tiempo, en cuyo caso lo normal es que no lo comprenda ni la
persona que lo hizo)
Indice
6
Los tipos de datos: enteros y coma
flotante
Del mismo modo que existen diferentes tipos de vehculos existen
diferentes tipos de variables
El tamao en bits, a diferencia de C/C++, es fijo, es decir, no vara
en funcin de la mquina. Esto facilita la portabilidad
Enteros:
byte: 8 bits (-128 a 127)
short: 16 bits (-32.768 a 32.767)
int: 32 bits (-2.147.483.648 a 2.147.483.647)
long: 64 bits (+/- 9x10
18
)
En coma flotante, tambin llamados reales. Se utilizan cuando se
precisan posiciones decimales:
float: 32 bits (3.4e-038 a 3.4e+038)
double: 64 bits (1.7e-308 a 1.7e+308)


Indice
7
Elegir un tipo de datos
En principio parece que lo ms fcil sera trabajar con un nico tipo
de dato. Parece lgico tener diferentes tipos de datos?
La respuesta ms sencilla es responder con una pregunta: parece
sensato tener el mismo tipo de vehculo para transportar 5
personas, transportar 3 toneladas de carga o para llevar a 55
personas?
Tenemos diferentes tipos de datos con la finalidad de optimizar. Del
mismo modo que no es sensato usar el motor de un autobus para
un turismo, no es sensato emplear 64 bits si queremos contar del 1
al 10
Por tanto, parece que el primer criterio para elegir el tipo es la
optimizacin: no malgastar memoria. Pero hay un criterio ms
importante, el sentido comn, que nos indica que resulta
prudente actuar con holgura. De hecho, en nuestra vida
cotidiana no llevamos nuestros coches siempre llenos y
perfectamente optimizados. Sino que con frecuencia, transportan
menos personas que su lmite mximo
Indice
8
Un ejemplo con double
Un ejemplo para calcular el rea de un crculo (PI*r
2
)
public class j01_radio {
public static void main(String[] args) throws IOException
{
double PI = 3.1416;
double radio = 3.2, area;

area = radio * radio * PI; // Calculo el rea
System.out.println( "El rea es: " + area);
}
}
Ejercicio: hacer un programa que calcule volumen de un
contenedor a partir de su largo, ancho y altura (pueden
admitir dos decimales).
Indice
9
Booleanos
Es un tipo de dato propio de una lgica binaria: slo tiene como
valores true o false.
int edad = 0;
boolean mayor_de_edad = false;
edad = 18;
mayor_de_edad = true;
Es el tipo utilizado para evaluar los condicionales:
int edad = 0;
boolean mayor_de_edad = false;
if (edad >= 18) // Si es verdad que la edad es > = que 18
mayor_de_edad = true; // entonces es mayor de edad
if (mayor_de_edad == true) // Si es verdad que es mayor de edad ...
System.out.println( Puede obtener el carnet B1 );
El ltimo condicional se puede escribir de manara ms cmoda (y
ms usual):
if (mayor_de_edad) // Si es verdad que es mayor de edad ...
System.out.println( Puede obtener el carnet B1 );


Indice
10
Caracteres (char)
En Java los caracteres se almacenan en variables de 16 bits. Se
utiliza un formato estndar e internacional denominado Unicode que
admite 65.537 caracteres, de esta forma podemos utilizar desde el
latn hasta el arbigo. Unicode es el formato ms utilizado en
Internet.
En el siguiente ejemplo cambiamos el valor de una variable char:
char cuadricula = A;
System.out.println( La cuadrcula del mapa es + cuadricula );
cuadricula = b;
System.out.println( La cuadrcula del mapa es + cuadricula );
El siguiente ejemplo nos muestra como funciona internamente el
ordenador: asocia a cada carcter un nmero. Puesto que con 16
bits podemos representar nmeros enteros de 0 a 65.536, entonces
podemos representar 65.537 caracteres. En nuestro ejemplo
asociamos a un char el nmero 126, que se representa en formato
de carcter como ~:
char a = 126;
System.out.println( El carcter es + a );
Observar que una cadenas de caracteres (String) se delimita por
comillas dobles y los caracteres aislados (char) se delimitan por
comillas simples.

Indice
11
String
String no es un tipo simple (como float, char, etc.), sino una clase que
nos ayuda a manejar de forma sencilla cadenas de caracteres.
Ejemplos de instancias:
String j = Hola mundo;
String k = new String( Hola mundo );
Podemos concatenar cadenas:
String k = "Hola, String m = "Adios";
String h = "Saludos: " + k + " y " + m;
System.out.println( h );
Podemos saber su ancho:
String k = Antonio;
System.out.println( k.length() );
Mediante compareTo() podemos ordenar diferentes cadenas (ver ms
adelante)
Conversin de nmerico a cadena mediante el mtodo static valueOf():
int anio = 1999;
String p = String.valueOf( anio);
System.out.println( p );
La conversin inversa se hace con mtodos static que estn en las clases
Double, Float, etc:
radio = Double.parseDouble( cadena ); // Convierto el String en double
Se puede acceder a un carcter de la cadena:
char car = c.charAt(1);
Indice
12
mbito de vida
El mbito de una variable u objeto es el espacio del programa en el
que esa variable existe. Por ello, se habla de mbito de vida

De forma general (hay excepciones que veremos ms adelante), la
vida de una variable comienza con su declaracin y termina
en el bloque en el que fue declarada (los bloques de cdigo se
delimitan por llaves: {}). Por ejemplo, cul es el mbito de la
variable radio y del vector args?:
public static void main(String[] args)
{
double PI = 3.1416;
double radio = 3;
System.out.println( El rea es + (PI*radio*radio) );
}

Ms adelante profundizaremos en los diferentes tipos de mbito
Indice
13
Conversin de tipos
Hemos visto que los datos tienen un tipo. Pero en ocasiones nos conviene
convertir un dato de su tipo original a otro
Tipos de conversin:
Automtica o implcita. El tipo destino es ms grande (mayor nmero de bits)
que el tipo origen (ensanchamiento o promocin):
int Origen = 65;
float Destino = 4.35f;
Destino = Origen; // Cul es el valor de Destino?
Tambin hay conversin automtica ante tipos compatibles. Por ejemplo, la
asignacin de un int a un char que vimos anteriormente

Explicita. La conversin se produce cuando el tipo destino es ms pequeo que
el origen (estrechamiento). Para ello debemos realizar un moldeado (cast):
double Origen = 65.13;
int Destino = 4;
Destino = (int) Origen; // Cul es el valor de Destino?

La conversin por medio de mtodos es en realidad una aplicacin de los tipos
de conversin anteriores. Para ver ejemplos (transparencia dedicada a la clase
String):
String p = String.valueOf( anio);
double radio = Double.parseDouble( cadena );

Indice
14
Comprender la conversin de tipos
Supongamos que tenemos en una variable (int) el precio de un producto. Queremos
incrementarlo en un 20%:
int precio = 10000;
precio = precio * 1.2;
Este cdigo parece correcto, sin embargo el compilador nos informa de un error:
Error num.: 355 : puede perderse precisin: double, haca falta int. Cul es la
razn? Para entenderlo, conviene comprender como trabaja el ordenador:
El ordenador trata de realizar el producto (precio*1.2) entre un int y un double (1.2), para
lo cual el ordenador convierte de forma automtica el int en un double. Hasta aqu todo va
bien, el resultado de multiplicar dos nmeros double es un double:
precio = precio * 1.2;
(int) (double)
(conversin
automtica a
double)
(double)
El problema viene a continuacin: no hay conversin automtica de un double (el resultado
del producto) a un int (la variable a la izquierda del operador =)
Para que se produzca esta conversin es necesario realizar un moldeado (cast):
precio = (int) (precio * 1.2); // Esto si es correcto
Indice
15
Matrices (I)
Una matriz es un conjunto ordenado de variables u objetos, con las siguientes
caractersticas:
Tienen el mismo tipo
Tienen el mismo nombre (aunque hay casos poco usuales de matrices annimas)
Si tienen el mismo nombre, cmo se diferencia un elemento de otro? La respuesta es por el
ndice

Formatos:
Con new: Tipo nombre[] = new tipo[tamao]
Sin new: Tipo nombre[] = {x, y, ...}

Un ejemplo:
int m[] = new int[3];
m[0] = 5;
m[1] = 9;
m[2] = 2;
System.out.println( m[1] );


Valor:
Posicin:
5 9 2
0 1 2
Matriz
Indice
16
Matrices (II)
Un ejemplo en el que incremento en un 50% el tercer elemento de
la matriz:

public static void main(String[] args) {
int depositos[];
int num_depositos = 4;
depositos = new int[num_depositos]; // Igual que: int depositos[] = new int[4];
depositos[0] = depositos[1] = 300;
depositos[2] = depositos[3] = 700;
System.out.println( "Litros del segundo deposito:" + depositos[1]);
depositos[2] = (int) (depositos[2] * 1.5); // Incremento de un 50%
System.out.println( "Litros del tercer deposito:" + depositos[2]);
}

Por qu necesito hacer casting?



Indice
17
Matrices (III)
Es importante destacar una diferencia a la hora de crear una matriz:
Si trabajamos con tipos simples (int, char, float, double, etc.)
tenemos que usar el operador new una vez, al crear la matriz:
int botes[] = new botes[4];
Botes[0] = 325;
Si trabajamos con tipos compuestos (todos los dems, es decir,
clases de Java como String, o cualquier otra creada por el programador),
entonces hay que usar dos veces dicho operador: una al crear la
matriz y luego tantas veces como objetos queramos almacenar
en ella:
public static void main(String[] args) {
Vehiculo mios[] = new Vehiculo[2];
mios[0] = new vehiculo();
mios[1] = new vehiculo();
mios[0].definir_precio_bajo();
mios[1].definir_precio_bajo();
mios[1].mostrar();
}


Vehiculo.java:
package xxx;

public class Vehiculo {
private int precio;

void definir_precio_bajo() {
precio = 12000;
}
void mostrar() {
System.out.println( " Precio:" + precio);
}
}
Indice
18
Matrices (IV)
Para obtener el ancho de una matriz: Nombre.length.
Ejemplo:
String nombres[] = new String[3];
nombres[0] = new String(Antonio);
System.out.println( nombres.length ); // Muestra el nmero 3

En comparacin con C/C++ la copia de matrices
completas resulta muy sencilla:
int Origen[] = { 200, 400, 600 };
int Destino[] = { 10, 20, 30 };
Destino = Origen;
System.out.println( Destino[0] );
System.out.println( Destino[1] );

Al intentar acceder a un elemento que est fuera del rango de la
matriz se genera un ArrayIndexOutOfBoundsException


200

400

Indice
19
Matrices multidimensionales
Utilizamos una pareja de corchetes ([]) para cada
dimensin. En el caso de una matriz bidimensional un
ejemplo sera:
int Lista[][] = new int[filas][columnas];

Java le permite no tener que especificar todas las
dimensiones al principio (con el primer new). Al menos
tiene que especificar la dimensin ms significativa (ms
a la izquierda). Adems puede hacer que las
dimensiones siguientes (menos significativas) difieran. El
siguiente ejemplo crea una matriz en la que la primera
fila tiene tres columnas y la segunda fila tiene cinco:
int M[][] = new int[2][];
M[0] = new int[3];
M[1] = new int[5];
Indice
20
Operadores aritmticos
Suma: +
Resta: -
Producto: *
Divisin: /
Mdulo: % (se puede aplicar a coma flotante y a int)
Incremento: ++ (a++ es equivalente a: a=a+1)
Decremento: -- (a-- es equivalente a: a=a-1)
Suma y asignacin: += (a+=3 es equivalente a: a=a+3)
Resta y asignacin: -= (a-=3 es equivalente a: a=a-3)


Indice
21
Operadores relacionales
El resultado de los operadores relacionales es un valor
boolean (true o false):
Igual a: == (no confundirlo con el operador de asignacin)
Distinto de: !=
Mayor que, mayor o igual: >, >=
Menor que, menor o igual: <, <=
Ejemplo 1:
int a = 5, b = 2;
boolean c = a >= b;
Ejemplo 2:
float a = 3;
if (a == 3)
System.out.println( El valor es: + a);

Indice
22
Qu ocurre con String?
A menudo necesitamos comparar cadenas de caracteres, para saber
si una es lexicogrficamente igual, mayor o menor que otra. El
ejemplo tpico es ordenar una lista de nombres

Ya sabemos que String no es un tipo simple, sino que es una clase.
Para ayudarnos en la comparacin tenemos los mtodos
compareTo y compareToIgnoreCase. Podemos saber el orden
de las cadenas en funcin de lo que devuelvan los mtodos:
String j = "Beln", k = "Susana", m = "Beln", n = "Antonio";
if (j.compareTo(m) == 0)
System.out.println( j + " es igual a " + m);
if (j.compareTo(k) < 0)
System.out.println( j + " es menor que " + k);
if (j.compareTo(n) > 0)
System.out.println( j + " es mayor que " + n);

Existe tambin el mtodo equals( String ), que devuelve true si
las cadenas son iguales. Hay otra versin
equalsIgnoreCase(String)

Beln es igual a Beln
Beln es menor que Susana
Beln es mayor que Antonio
Indice
23
Operadores lgicos
Operan solamente con valores booleanos:
Conjuncin (Y): &&
Disyuncin inclusiva (O): ||
Negacin: !
Ejemplo:
int edad = 17;
float nota = 6f;
boolean mayoria_edad = edad >= 18;
if (mayoria_edad && nota >= 5)
System.out.println( "aprobado" );
if (!mayoria_edad)
System.out.println( "Le falta(n) " + (18-edad) + " ao(s)" );

Entradas y Salidas bsicas
Indice
25
Streams (I)
Cualquier programa realizado en Java que necesite llevar a cabo una operacin de
I/O lo har a travs de un stream.
Un stream, cuya traduccin literal es "flujo", es una abstraccin de todo aquello que
permite introducir o extraer informacin. As, un stream de teclado es un flujo de
entrada para el programa y un stream de pantalla es un flujo de salida del programa
Input:
Teclado
Output:
Pantalla
La vinculacin de este stream al dispositivo fsico (teclado, pantalla, impresora,
etc.) la hace el sistema de entrada y salida de Java.
Indice
26
Streams (II)
El paquete System define tres clases:
in (entrada estndar)
out (salida estndar)
err (salida de errores estndar)

La escritura hacia pantalla se hace con System.out

System.out.println(Hola Mundo); // Aade nueva lnea al final
System.out.print(Adios); // NO aade nueva lnea al final

La lectura desde teclado se hace con System.in


Indice
27
Stream de entrada por teclado
Para manejar entradas por teclado tenemos que crear un BufferedReader a partir de
System.in:
import java.io.*;

public class inicio {
public static void main(String[] args) throws IOException {
String cadena;
BufferedReader entrada;

entrada = new BufferedReader(new InputStreamReader(System.in)); // Crear objeto de entrada

System.out.println("Escribe tu nombre:");
cadena = entrada.readLine(); //leemos cadena de caracteres mediante readLine()
}
}
Condiciones previas a la creacin de un BufferedReader:
Tengo que importar las clases que uso (BufferedReader y InputStreamReader), que estn en el paquete
java.io, por medio de import.
Tengo que poner throws IOException en la funcin que usa BufferedReader (ya se explicar ms adelante el
manejo de excepciones).
Una vez creado el objeto de entrada para teclado, mediante BufferedReader, puedo leer la entrada
por teclado mediante una llamada a objeto.readLine() (la entrada termina al pulsar Enter). No
olvidar que esta funcin devuelve un String, es decir, cualquier cosa que el usuario
teclea se almacena como una cadena, sea pedro o 3420. Java es un lenguaje fuertemente
tipado y si queremos que lo tecleado se convierta en un nmero habr que hacer posteriormente
una conversin mediante mtodos, como veremos en el siguiente ejemplo.
Indice
28
Un ejemplo entrada por teclado y
conversin
public static void main(String[] args) throws IOException {
double PI = 3.1416, radio;
int area_int;
String c;

/* Creo el objeto 'entrada', es un lector de entradas por teclado */
BufferedReader entrada = new BufferedReader( new InputStreamReader(System.in));

System.out.print( "Escriba el radio: " );
c = entrada.readLine(); // Leo un String de la entrada de teclado

radio = Double.parseDouble( c ); // Convierto el String en double radio

System.out.println( "El rea es: " + radio * radio * PI);

area_int = (int) (radio * radio * PI); // Calculo el rea entera del crculo. Hago casting
System.out.println( "El rea (entera) es: " + area_int);
}
Desde un String existen conversiones a otros tipos: Integer.parseInt( cadena ) o
Float.parseFloat( cadena). La conversin inversa utiliza String.valueOf( numero).
Para que todo funcione: una vez que se ha dado la orden de ejecucin, se debe
hacer click en la ventana de mensajes, de esta forma la ventana de mensajes
obtiene el foco de teclado. A partir de aqu todo lo que se teclea va a dicha ventana.
Sentencias de control
Indice
30
Introduccin
Las sentencias de control nos ayudan a que el flujo de ejecucin del
programa deje de tener un carcter lineal.
Ejemplos de sentencias de control en la vida cotidiana:
Ejemplo 1:
Si el cheque es correcto y hay fondos
Entonces pagar
Si no:
No pagar
Ejemplo 2:
Mientras la salsa no este densa:
Calentar y remover
Ejemplo 3:
Siga adelante
Cuando llegue a la plaza:
Si es hora punta
Entonces tuerza a la derecha
Si no:
Siga todo recto
Vamos a ver los siguientes tipos de sentencias de control:
Seleccin
Iteracin
Salto
Indice
31
if / else (I)
La sentencia bsica para realizar bifurcaciones o
ramificaciones. Formato:
if (condicin)
sentencia 1;
[else
sentencia 2]
La condicin es una expresin booleana. Si es true, se
hace la sentencia 1; si es false, se hace la sentencia 2
(si existiese)
Ejemplo:
int a = 3, b = 9, c;
if (a < b && a != 0)
c = b a;
else
c = a b;
Precaucin:
La tabulacin es
fundamental para realizar
cdigo legible
Indice
32
if / else (II)
Si hay ms de una sentencia debemos delimitar los bloques por
llaves {}. En el siguiente ejemplo vamos a determinar las ventajas que
tiene un cliente en funcin de los puntos de su tarjeta de compra:
if (puntos > 1000) {
tipo_cliente = "VIP";
descuento = 0.05f;
}
else {
tipo_cliente = "Normal";
descuento = 0.02f;
}
System.out.println( "Tipo: " + tipo_cliente + "\tDescuento: " + descuento*100 + "%");
Los condicionales pueden ser anidados, es decir, que uno este dentro de
otro. En nuestro ejemplo vamos a aadir otra condicin: para los clientes
de ms de 1000 puntos, si su antigedad es mayor de 1825 das, les
haremos un descuento del 6%:
if (puntos > 1000) {
tipo_cliente = "VIP";
descuento = 0.05f;
if (antiguedad > 1825)
descuento = 0.06f;
}
Indice
33
switch
Formato:
switch ( expresin ) { // expresin: no tiene que ser booleano
case constante1:
secuencia de sentencias
break;
case constante2:
secuencia de sentencias
break;
...
default:
secuencia de sentencias
}

No olvidar break. Pero a veces es adecuado omitirlo:
switch ( categoria ) {
case 1:
case 2:
porcen = 0.2; // Tanto para 1 como para 2
break;
case 3:
porcen = 0.15;
break;
default:
porcen = 0.1;
}
Indice
34
while
Formato:
while (condicin)
Sentencia
La sentencia puede ser un bloque delimitado por llaves ({}). El bucle se
realiza mientras la condicin sea cierta
Ejemplo en el que modificamos un vector de nmeros, de tal modo que
ponemos el cuadrado del nmero que antes estuviese:
double serie[] = {23, 4, 36, 9};
int i = 0;
while ( i < serie.length ) {
System.out.print( "Posicin: " + i + "\t Anterior: " + serie[i] );
serie[i] = serie[i] * serie[i];
System.out.println( "\t Cuadrado: " + serie[i] );
i++;
}
Posicin: 0 Anterior: 23.0 Cuadrado: 529.0
Posicin: 1 Anterior: 4.0 Cuadrado: 16.0
Posicin: 2 Anterior: 36.0 Cuadrado: 1296.0
Posicin: 3 Anterior: 9.0 Cuadrado: 81.0
Bucle
Indice
35
for (I)
En la vida cotidiana hay numerosos casos de iteraciones (repeticiones). Por ejemplo,
si alguien tiene que asignar un nmero a las cinco personas que hay en una
habitacin hara algo as:
for (el nmero es 1; mientras que el nmero sea < 6; incremento el nmero)
Digo en voz alta el nmero, sealando a la persona correspondiente
De forma semejante, el formato de for es:
for ( inicializacin; condicin; variacin )
Sentencia
Con un ejemplo puede aclararse. Supongamos que queremos mostrar por pantalla
los cuatro primeros nmeros enteros, empezando por el 3:
La inicializacin sera: empezar con el nmero 3
Condicin: mientras que el nmero sea menor que 7 (es aquello que debe cumplirse para
poder volver a repetir la sentencia)
Variacin: incrementar en uno el nmero
Sentencia (aquello que se debe iterar o repetir, en nuestro ejemplo 4 veces): mostrar el
nmero por pantalla
Ejemplo:
int i;
for ( i = 3; i < 7; i++)
System.out.println( i );
Nos podemos saltar la inicializacin (empieza en el valor previo)
int i = 3;
for ( ; i < 7; i++)
System.out.println( i );
Indice
36
for (II)
Vamos a ver paso a paso como
actua la iteracin

Ejemplo:
int i;
for ( i = 1; i < 3; i++)
System.out.println( i );

Al observar la ejecucin paso a
paso es importante recordar:
Siempre se evala la condicin
ANTES de ejecutar la sentencia
DESPUS de la sentencia
siempre se realiza la variacin

Se pueden iterar varias variables, para
lo cual necesitamos comas: for(i=0,
k=5; i < 5; i++, k=k+5)
1. INICIO: la variable i se inicia a 1
2. CONDICIN: se comprueba la
condicin: i<3 ? SI
3. SENTENCIA: se ejecuta la sentencia
println
4. VARIACIN: al terminar el bucle, se
incrementa i. Ahora vale 2
5. CONDICIN: se comprueba la
condicin: i<3 ? SI
6. SENTENCIA: se ejecuta la sentencia
println
7. VARIACIN: al terminar el bucle, se
incrementa i. Ahora vale 3
8. CONDICIN: se comprueba la
condicin: i<3 ? NO, fin del bucle
9. IMPORTANTE: al salir del bucle el
valor de i es 3. Cul sera su valor si
la condicin fuese i<=3?

Indice
37
for (III)
Igual que los casos anteriores: utilizan {} para acotar conjuntos de sentencias y
adems son anidables.
Ejemplo en el que se calcula la media y el mximo de un vector de nmeros:
public static void main(String[] args) {
float serie[] = {-8, -12, -4, -14};
float media, sumatorio = 0;
int contador;
float maximo = serie[0]; // Funcionaria si asignamos el 0?

/*** Hallamos el mximo y sumamos todos los nmeros ***/
for ( contador = 0; contador < serie.length; contador++ ) {
if (serie[contador] > maximo)
maximo = serie[contador];
sumatorio = sumatorio + serie[contador];
}
/*** Calculamos media. Mostramos la media y el maximo ***/
media = sumatorio / contador;
System.out.println( "La media es " + media + " y el max es " + maximo);
}
Se pueden clasificar las variables en virtud de su funcin o uso (hasta ahora
las hemos clasificado en virtud del tipo de dato). Entre estos tipos de usos hay dos
que son muy comunes y aparecen en nuestro ejemplo:
Variables contador
Variables sumatorio
Indice
38
do-while
Formato:
do {
Sentencia
} while (condicin);
A diferencia de while, analiza la condicin al final del bucle. Por
tanto, la sentencia se realiza al menos una vez
Ejemplo. Qu hace?:
int i = 1;
do {
System.out.println( i*i*i );
i++;
} while ( i < 3 );
do-while es muy til en la gestin de mens. El diseo sera:
do {
Muestro las opciones de men
Solicito la opcin por teclado
switch (opcion) {
En funcin de la opcin elegida realizo una u otra accin
}
} while (la opcin no sea Salir);
A continuacin puede verse un ejemplo de gestin de men para una
calculadora
Indice
39
Calculadora
public static void main(String[] args) throws IOException {
char opcion;
String cadenaTeclado;
double operando1 = 0, operando2 = 0;
/* Creo el obj. 'entrada', es un lector de entradas por teclado */
BufferedReader entrada = new BufferedReader( new
InputStreamReader(System.in));

do {
/********* Mostrar menu y pedir opcion por teclado ****/
System.out.print("\r\n S - Suma\r\n R - Resta\r\n P - Producto"
+ "\r\n D - Divisin\r\n Q - Salir\r\n Su opcin:");
cadenaTeclado = entrada.readLine(); // Teclado
opcion = cadenaTeclado.charAt( 0 ); // Conv a char

/********* Si la opcin no es salir, solicito operandos ***/
if ( opcion != 'Q' && opcion != 'q') {
System.out.print( "Nmero 1: " );
cadenaTeclado = entrada.readLine(); // Teclado
operando1 = Double.parseDouble( cadenaTeclado ); // Conv
System.out.print( "Nmero 2: " );
cadenaTeclado = entrada.readLine(); // Teclado
operando2 = Double.parseDouble( cadenaTeclado ); // Conv
}

/**** En funcin de la opcin: opero o salgo ***/
switch (opcion) {
case 's':
case 'S':
System.out.print( operando1 + operando2 );
break;
case 'r':
case 'R':
System.out.print( operando1 - operando2 );
break;
case 'p':
case 'P':
System.out.print( operando1 * operando2 );
break;
case 'd':
case 'D':
System.out.print( operando1 / operando2 );
break;
case 'q':
case 'Q':
System.out.print( "Adios" );
break;
default:
System.out.print( "Opcin no disponible" );

} /////////////////////////////// Fin de switch
} while (opcion != 'Q' && opcion != 'q');
} //////////////////////////////// Fin de funcin

Indice
40
Salto
Hay sentencias que controlan el flujo de ejecucin, de tal forma que
realizan saltos fuera del bloque en el que se encuentran:
break: salta fuera del bucle o switch
return: salta fuera del mtodo
Un ejemplo con break. Busca un nombre en una lista y, si lo
encuentra, sale del bucle:
private static void funcion() {
int i = 0;
String nombre[] = { "Ana", "Belen", "Juan", "Pedro"};
String nombrBuscado = Belen";
boolean encontrado = false;

while (i < nombre.length) {
if (nombre[i].equals(nombreBuscado)) {
System.out.println(nombre_buscado + " est en la posicin " + i);
encontrado = true;
break;
}
i++;
}
if (!encontrado)
System.out.println("No encontrado");
}
Clases
Indice
42
Introduccin (I)
Hasta ahora las clases las hemos usado como soporte al mtodo
main. A partir de aqu vamos a adentrarnos en el manejo de clases
Una clase puede entenderse como un modelo o patrn: la
representacin abstracta de un conjunto
Un conjunto en la vida cotidiana puede ser definido por sus
atributos y/o por acciones (comportamiento). Por ejemplo:
El conjunto de los mamferos con aletas
El conjunto de los profesionales en extincin del fuego
Un bombero en concreto sera una instancia del conjunto de los
bomberos
Cuando definimos el conjunto de los bomberos no hacemos
referencia a ningn bombero en concreto, de la misma manera,
cuando definimos una clase no hacemos referencia ni creamos un
objeto o instancia de la clase
Indice
43
Introduccin (II)
Del mismo modo que ocurre con los conjuntos de la vida cotidiana, las clases se
definen por sus atributos y/o mtodos (funciones que definen el comportamiento de
la clase). Por ahora vamos a empezar con los atributos.
Veamos el siguiente ejemplo en el que la clase Inicio hace una instancia de la clase
Circulo:












Creamos la clase Circulo. Es importante entender que la sentencia Circulo a; NO
CREA un objeto, sino que crea una referencia o etiqueta (vaca o nula). Por
ello, si queremos acceder al atributo radio para asignarle un valor (23), el
compilador nos dar un mensaje de error. SOLO se crea un objeto si se utiliza
new. Lo correcto sera:
Circulo a;
a = new Circulo(); // O bien: Circulo a = new Circulo();
a.radio = 23;


/******** Circulo.java ********/
package figuras.dominio;

public class Circulo {
public double radio;
public double PI = 3.1416;
}
/********* Inicio.java *****/
package figuras.inicio;
import figuras.dominio.Circulo;

public class Inicio {
public static void main(String[] args) {
Circulo a; // ERROR
a.radio = 23;
}
}
Indice
44
Introduccin (III)
El error anterior era un error en tiempo de compilacin. La mayor
parte de IDEs nos darn un mensaje del estilo variable no inicializada
antes de compilar, es decir, el entorno de desarrollo ha detectado que
no hay un objeto, que la etiqueta no hace referencia a un
objeto.
Podemos engaar a la mayor parte de los IDEs con el siguiente
cdigo, que se puede compilar sin errores:
Circulo a = null;
a.radio = 23; // Lnea nmero 7
Decimos engaar ya que este cdigo har que el IDE no nos muestre
el error en tiempo de compilacin. Pero el problema es el mismo: no
hay objeto para la etiqueta a.
El error surge en tiempo de ejecucin:
java.lang.NullPointerException at figuras.inicio.Inicio.main(Inicio.java:7)
Este es el error ms frecuente en programacin Java (y en otros
lenguajes como C/C++) y siempre indica lo mismo: tratamos de
acceder a un atributo o mtodo del objeto, pero ocurre que no hay
objeto
Indice
45
Introduccin (IV)
Una clase es un patrn o modelo, no crea un objeto. Se
crea un objeto con new
Cada objeto tiene sus atributos o variables miembro
(hay una excepcin a esta regla: los atributos static).
En el siguiente ejemplo, el primer crculo tiene un
atributo radio que es diferente al mismo atributo del
segundo crculo. Es ms, ocupan posiciones de
memora diferentes
public static void main(String[] args) {
Circulo a = new Circulo();
Circulo b = new Circulo();
a.radio = 23;
b.radio = 35.6;
}

Indice
46
El primer mtodo
Vamos a introducir un mtodo en nuestra clase Circulo, que
simplemente muestra el rea:









Una llamada al mtodo implica un SALTO: el ordenador pasa a
ejecutar el cdigo del mtodo y una vez que este termina se
devuelve el control a main
Las flechas muestran los saltos que da el control de ejecucin del
programa
El mtodo muestra los atributos de SU OBJETO
public class Circulo {
public double radio;
public double PI = 3.1416;
public void mostrarArea() {
System.out.println( radio*radio*PI );
}
}
public class Inicio {
public static void main(String[] args) {
Circulo a = new Circulo();
Circulo b = new Circulo();
a.radio = 23;
b.radio = 35.6;
a.mostrarArea();
b.mostrarArea();
}
}
Indice
47
Formato de los mtodos
El formato de los mtodos es:
Tipo_acceso tipo_devuelto Nombre_mtodo( parmetros ) {
Cuerpo del mtodo
}
El tipo de acceso puede ser:
Para clases que estn en el mismo paquete (por defecto: public):
public: se puede llamar al mtodo desde fuera de la clase
protected: se puede llamar al mtodo desde fuera de la clase
private: no se accede desde fuera de la clase
Para clases que estn en diferentes paquetes (por defecto: protected):
public: se puede llamar al mtodo desde fuera de la clase
protected: no se accede desde fuera de la clase
private: no se accede desde fuera de la clase
El tipo devuelto es el tipo de dato que devuelve el mtodo

Indice
48
Devolviendo valores
En nuestro ejemplo calculamos el rea en println, pero esto no es muy inteligente. Ya
que si necesitamos de nuevo el rea, tenemos que volver a calcularla. Lo lgico es
realizar el clculo EN UN NICO MTODO y que este mtodo devuelva el
resultado. En el siguiente ejemplo vamos a crear un mtodo pblico que devuelve el
rea:
public class Circulo {
public double radio;
public double PI = 3.1416;
public void mostrarArea() {
System.out.println( getArea() );
}
public double getArea() {
return radio*radio*PI;
}
}
La flecha muestra como se transfiere el control de ejecucin. La sentencia return es una
orden de salto.
Error de principiante: no hay coherencia entre el tipo que declaramos que
vamos a devolver y el tipo efectivamente devuelto. En nuestro ejemplo hay
coherencia:
Declaramos que vamos a devolver double al escribir public double obtener_area() ...
Efectivamente devolvemos double, el resultado de multiplicar variables de tipo double como
radio y PI
Indice
49
Introduccin a los parmetros
Veamos el siguiente ejemplo de funcin que calcula y devuelve el
cuadrado de un nmero:
double cuadrado() {
return 5*5;
}
Esto es evidentemente un absurdo, slo nos sirve si el nmero es 5.
Resulta ms lgico que el mtodo calcule con independencia de cual
es el nmero base. Para ello, el mtodo debe tener parmetros:
public class Param {
public static void main(String[] args) {
double h = cuadrado(3); // Argumentos
System.out.println( h );
}
/*** Devuelve el cuadrado ***/
public static double cuadrado( double base ) { // Parmetros
return ( base * base );
}
}
El parmetro base recibe el argumento 3
Indice
50
Parmetros: los nombres son lo de menos
El principiante poco informado puede pensar que los nombres de los
parmetros dependen de los nombres de los argumentos. Puede creer
que si el argumento se llama X, el parmetro debe llamarse X:
public static void main(String[] args) {
double largo = 3, ancho = 2;
double h = getArea( largo, ancho);
System.out.println( h );
}

public static double getArea(double largo, double ancho) {
return (largo * ancho);
}
Este personaje desconoce que los nombres son indiferentes, lo
que importa es que el parmetro, se llame como se llame,
recibe el contenido del argumento (ms adelante distinguiremos
llamadas por valor de llamadas por referencia). La aprueba es que el
mtodo anterior acta igual si se escribiese as:
public static double getArea(double PinPanPun, double segundo) {
return (PinPanPun * segundo);
}

Indice
51
Una pequea excepcin a la regla anterior
Hemos visto que los nombres son lo de menos en el ejemplo de las variables ancho y
largo (no hay conflicto porque tienen mbitos de vida independientes)
Bien, pero la excepcin es: salvo cuando hay conflicto de nombres con un
atributo de la clase, aqu hay conflicto con los mbitos de vida. Supongamos que usamos
de parmetros para almacenar los valores en atributos de un objeto:
public class Camino {
private double largo;

public void setLargo( double largo ) { largo = largo; }
}
Esto es un error absurdo: almacenamos el valor de la variable parmetro largo en ella
misma (no en el atributo). Con el agravante de que ese valor se pierde al terminar el
mtodo.
Lo que queremos es almacenar el valor en el atributo, para lo cual usaremos la palabra
reservada this:
public void setLargo( double largo ) { this.largo = largo; }
this es una forma de hacer referencia al objeto, es la forma que tiene el propio
objeto de decir yo. Este nombre se usa para hacer referencia a atributos o
mtodos del objeto. Resumiendo, en nuestro ejemplo:
this.largo: variable atributo de la clase
largo: variable parmetro
Volveremos ms adelante sobre this y veremos por qu es incompatible con su uso
dentro de mtodos static
Indice
52
Parmetros: encapsulando
En nuestro ejemplo del crculo podemos acceder a los atributos de Circulo
directamente desde fuera de la clase:
Circulo a = new Circulo();
a.radio = 3;
Cambiemos de forma de trabajar. Vamos a hacer que slo se pueda acceder a
los datos por medio de los mtodos. Esto implica que debemos poner
mtodos que devuelvan valores (usan return, get) y otros que asignen valores
(usan parmetros, set):
public class Circulo {
private double radio;
private double PI = 3.1416;

public double getArea() {
return radio * radio * PI;
}
public void setRadio(double nuevoRadio) {
radio = nuevoRadio;
}
public double getRadio() {
return radio;
}
}
Reglas importantes:
Encapsular: desde fuera de la clase slo se
accede a los mtodos pblicos. No se accede
directamente a los datos
Modularizar: separar procesamiento de datos
de su presentacin. Un ejemplo es que los
clculos se hacen en mtodos diferentes a la
presentacin de datos (incluso, lo que es an mejor,
en clases diferentes). Tambin es una forma de
hacer software cohesivo
Indice
53
Encapsular
En la ingeniera del software se especifican reglas que deben
seguirse para ayudarnos a realizar software robusto (no proclive a
fallos), fcilmente entendible y de fcil mantenimiento
(modificaciones poco costosas)
El principio de Encapsulamiento (ocultamiento de informacin)
nos indica (entre otras cosas) que debemos hacer que los detalles
de la clase estn ocultos para el exterior (tambin se
denomina implementacin encapsulada). Una aplicacin de este
principio implica que los atributos sern privados y slo se puede
acceder a ellos desde los mtodos de la clase
Ventaja: desde el cdigo de la clase controlamos el acceso a los
atributos. En caso de fallo o modificacin del cdigo, el
programador comprueba los mtodos de la clase y no tiene que
revisar todo el cdigo de los otros archivos
Los mtodos pblicos son el intermediario entre los datos y los
otros objetos

Mtodo 1
Mtodo 2

Datos
Objeto
Llamada
Los mtodos
pblicos de la clase
son el interfaz de la
clase
Indice
54
Un ejemplo de encapsulamiento
Supongamos que tenemos una clase que representa los productos de un
comercio, en el que hay un precio normal y un precio rebajado:
public class Producto {
private float precio;
private float precioRebajado;

public void setPrecioRebajado( float porcentajeRebaja ) {
precioRebajado = precio * (1-porcentajeRebaja);
}

}
Por qu decimos que es una implementacin encapsulada? Por dos
razones ligadas:
Encapsular datos: slo se accede al atributo privado precioRebajado
por medio de un mtodo pblico de la clase
Encapsulamos el clculo: la forma de calcular el dato queda oculta al
exterior de la clase. Supongamos que debemos cambiar la forma de calcular
el precio rebajado (bien por corregir un error de programacin o bien por
cambiar la poltica de rebajas), entonces slo tendremos que cambiar el mtodo
setPrecioRebajado().

Indice
55
Un ejemplo de NO encapsulamiento
Tomemos el ejemplo anterior y supongamos que la clase es as:
public class Producto {
public float precio;
public float precioRebajado;

Estoy permitiendo el acceso externo a los datos del producto.
Por tanto en una clase externa se podra escribir algo como esto:
static public void main() {
Producto a = new Producto();
a.precio = 25.5;
a.precioRebajado = a.precio *0.80;

Producto b = new Producto();
b.precio = 19;
b.precioRebajado = b.precio *0.80;

La irracionalidad suele ser costosa. Si tenemos que cambiar nuestra
poltica de rebajas tendremos que cambiar todas las lneas de
cdigo donde calculamos el precio rebajado para cada
producto, en una implementacin encapsulada slo tenemos que
cambiar el mtodo setPrecioRebajado() de la clase Producto
En una implementacin encapsulada tendramos que modificar un
bloque de cdigo, no N bloques de cdigo.
Indice
56
Modularizar
Un diseo modular se basa en la conocida estrategia de
divide y vencers. Descomponer de forma lgica la
aplicacin
Para conseguir la modularidad debemos hacer que
nuestros componentes de software sean especialistas
En un ejemplo bsico y tpico separaremos:
Inicio de aplicacin: paquete y clase donde est main()
Clases del dominio de problema: por ejemplo, paquete
figuras.dominio con las clases Circulo, Rectangulo, etc
Clases de presentacin: paquete para el interfaz de la
aplicacin (men de opciones, presentacin de clases de
dominio, etc.)
Clases para persistencia o almacenamiento en base de
datos, archivos, etc.
Indice
57
Un ejemplo de modularizacin
En el siguiente ejemplo separamos las clases del dominio (en este caso
Circulo.java) de la clase responsable de la presentacin:
package figuras.dominio;

public class Circulo {
private double radio;
private double PI = 3.1416;

public Circulo() { }
public Circulo( double nuevoRadio ) {
setRadio( nuevoRadio );
}
public double getArea() {
return radio * radio * PI;
}
public void setRadio( double radio ) {
this.radio = radio;
}
public double getRadio() {
return radio;
}
public String toString() {
return "Radio: " + radio + " Area: " + getArea();
}
}
package figuras.presentacion;

import figuras.dominio.*;

public class VistaFiguras {

public static void mostrar( Circulo cir ) {
System.out.println( cir.toString() );
}

public static void mostrar( Rectangulo rec ) {
System.out.println( rec.toString() );
}
}
Cmo se hara un main() que use estas
clases?
Indice
58
Constructores
Un constructor es un mtodo al que se llama cuando se crea un objeto con new:
Slo son llamados inmediatamente despus de la creacin del objeto
Tienen el mismo nombre que la clase y no devuelven valores
Son pblicos
En nuestro ejemplo vamos a crear un constructor que inicia el radio con 1:
Circulo() {
radio = 1;
}
Pero en muchas ocasiones al crear un objeto nos interesa inicializar atributos (en
nuestro caso el radio). Para ello, los constructores admiten parmetros:
class Circulo {
private double radio;
private double PI = 3.1416;

public Circulo( double nuevoRadio ) {
setRadio( nuevoRadio );
}
public void setRadio( double radio ) {
this.radio = radio;
}

Utilizamos el nombre de constructores por ser el ms extendido, pero no
confundirse: el constructor no construye el objeto; sino que es invocado
inmediatamente despus de la construccin
Si no implementamos un constructor, Java pone uno por defecto (constructor vaco)
Circulo a = new Circulo();
...
Circulo a = new Circulo(21);
...
Indice
59
finalize()
En lenguajes como C++ la memoria ocupada por los objetos creados por
new es liberada manualmente, mediante el operador delete . En Java la
orientacin es diferente: tiene un procedimiento automtico de recogida
de basura. Este procedimiento examina las referencias y el mbito,
cuando considera que un objeto no va a ser utilizado lo elimina, es decir,
libera la memoria que ocupa
Inmediatamente antes de que se libere la memoria se invoca
automticamente al mtodo finalize(). El programador puede
implementarlo cuando desee realizar una accin antes de la eliminacin del
objeto:
protected void finalize() {
System.out.println( Adios );
}
Tngase en cuenta que no se puede garantizar el momento exacto en el
que el programa invocar al mtodo:
El procedimiento de recogida de basura no se ejecuta siempre que se deja de
utilizar un objeto, sino que se ejecuta de manera espordica
Adems cada interprete de Java tiene su procedimiento de recogida de basura
Por tanto, no se puede confundir con los destructores de C++. Java no
tiene el concepto de destructor
Indice
60
Sobrecarga de mtodos
Java nos permite tener mtodos con el mismo nombre y
que se diferencian por sus argumentos:
Al llamar a un mtodo, Java busca la versin del
mtodo que coincide con los argumentos de la
llamada
package figuras.presentacion;

import figuras.dominio.*;

public class VistaFiguras {

public static void mostrar( Circulo cir ) {
System.out.println( cir.toString() );
}

public static void mostrar( Rectangulo rec ) {
System.out.println( rec.toString() );
}
}
Por qu hace falta hacer import de las clases
del paquete figuras.domino? Porque estn
en un paquete diferente que VistaFiguras

Indice
61
Sobrecarga de constructores
Los constructores, como cualquier otro mtodo, pueden ser
sobrecargados:
class Circulo {
private double radio;
private double PI = 3.1416;

/****** Constructores sobrecargados ***/
public Circulo() { }
public Circulo( double nuevoRadio ) {
setRadio( nuevoRadio );
}
public Circulo( Circulo circulo ) {
setRadio( circulo.getRadio() );
}
...
}
Observe que el ltimo constructor define el radio a partir del radio de otro
crculo, que se ha pasado como argumento
Cmo sera la llamada que ejecutase dicho constructor?

Indice
62
El proyecto de las figuras. Los puntos
package figuras.dominio;

public class Punto {
private int x;
private int y;

public Punto(int x, int y) {
setPunto(x, y);
}
public Punto(Punto p) {
setPunto(p );
}
public void setPunto(int x, int y) {
this.x = x;
this.y = y;
}
public void setPunto(Punto p) {
x = p.getX();
y = p.getY();
}

public int getX() { return x; }
public int getY() { return y; }

public String toString() {
return "(" + x + "," + y + ")";
}
}
Aspectos a resaltar:
Encapsulamiento
Sobrecarga de constructores
Constructor de copia: Punto(Punto p). Con este
constructor se hace un punto que es una copia (tiene la
misma posicin) que el objeto que se pasa como
argumento (p)

Indice
63
El proyecto de las figuras. Los crculos (I)
package figuras.dominio;

public class Circulo {
private Punto posicion;
private double radio;
static final public double PI = 3.1416;

public Circulo() { }
public Circulo( double nuevoRadio, Punto nuevaPosicion ) {
setRadio( nuevoRadio );
setPosicion( nuevaPosicion );
}
public Circulo( double nuevoRadio, int posicionX, int posicionY ) {
setRadio( nuevoRadio );
posicion = new Punto( posicionX, posicionY );
}
public Circulo( Circulo circulo ) {
setRadio( circulo.getRadio() );
setPosicion( circulo.getPosicion());
}
public void setRadio( double radio ) { this.radio = radio; }
public void setPosicion( Punto posicion ) { this.posicion = posicion; }
public Punto getPosicion() { return posicion; }
public double getRadio() { return radio; }
public double getArea() { return radio * radio * PI; }
public String toString() {
return "Radio: " + radio + " Posicion: " + posicion.toString() +
" Area: " + getArea();
}
}

Aspectos a resaltar:
Encapsulamiento
Un atributo (posicion) es un objeto de otra
clase (Punto)
PI es static (lo comentaremos ms
adelante)
PI es final: es una constante, no puede
cambiarse. Esto evita modificaciones
accidentales por parte del programador
Sobrecarga de constructores
Constructor de copia: Circulo(Circulo
circulo). Con este constructor se hace un
crculo que es una copia del objeto que se
pasa como argumento (circulo)
Por qu no hace falta import de la clase
Punto? Porque est en el mismo paquete

Indice
64
El proyecto de las figuras. Los crculos (II)
Interesa distinguir dos constructores:
public Circulo( double nuevoRadio, Punto nuevaPosicion ) {
setRadio( nuevoRadio );
setPosicion( nuevaPosicion );
}
public Circulo( double nuevoRadio, int posicionX, int posicionY ) {
setRadio( nuevoRadio );
posicion = new Punto( posicionX, posicionY );
}
En el primer caso recibimos un objeto (nuevaPosicion), que
almacenamos en el atributo posicion. No tiene nada de extrao
En el segundo caso no se recibe un objeto, sino que recibimos dos
variables (posicionX y posicionY), sin embargo la clase de los crculos
requiere tener un objeto para el atributo posicion. Por ello, se
tiene que crear (new) el objeto de la clase Punto.
Indice
65
El proyecto de las figuras. La visualizacin
package figuras.presentacion;

import figuras.dominio.*;

public class VistaFiguras {

public static void mostrar( Circulo cir ) {
System.out.println( cir.toString() );
}

public static void mostrar( Rectangulo rec ) {
System.out.println( rec.toString() );
}
}
Aspectos a resaltar:
Modularidad: separamos la presentacin
(VistaFiguras) de las clases de dominio de
problema (puntos, crculos, etc.)
Sobrecarga de constructores
Por qu hace falta import de las clases del
paquete figuras.dominio? Porque dichas
clases estn en un paquete diferente al de
VistaFiguras

Indice
66
El proyecto de las figuras. El inicio
package figuras.inicio;
import figuras.dominio.*;
import figuras.presentacion.*;

class Inicio {
public static void main(String[] args) {
Circulo primero = new Circulo( 23, 2, 3 );
Circulo copia = new Circulo( primero );
Circulo tercero = new Circulo( 17, new Punto(8,9) );

VistaFiguras vista = new VistaFiguras();

vista.mostrar( primero );
vista.mostrar( copia );
vista.mostrar( tercero );
}
}
Aspectos a resaltar:
Sobrecarga de constructores
Usamos constructor de copia
Por qu hacen falta imports?
Si hubiera que hacer la clase Rectangulo,
cmo sera?

Indice
67
Llamadas por valor
Cuando hacemos una llamada a un mtodo, que tiene argumentos
que son tipos simples, se hace una copia del valor y se traslada al
parmetro del mtodo. Para que se entienda:
public static void main(String[] args) {
/******** Llamada por valor (copia del valor) *****/
double d = 11.5;
cuadrado( d );
System.out.println( d );
}
public static void cuadrado( double num ) {
num = num * num;
}
El programa muestra el nmero 11.5, es decir, la funcin no ha
modificado la variable argumento (d).
Esto significa que la funcin cuadrado() no modifica el valor de la
variable d. Modifica una copia de d.


Copia del valor: 11.5
Indice
68
Llamadas por referencia
Cuando los argumentos son objetos (no usamos tipos simples) no se pasa
una copia del objeto, sino que se pasa el propio objeto. Los parmetros
del mtodo reciben el objeto (llamada por referencia):
public static void main(String[] args) {
Circulo primero = new Circulo( 23, 2, 3 );
trasladar( primero, new Punto(111,111) ); // Llamada por referencia
vista.mostrar( primero );
}

public static void trasladar( Circulo c, Punto nuevaPosicion ) {
c.setPosicion( nuevaPosicion );
}
Pasamos a la funcin trasladar() el circulo primero con su nueva
posicin
La funcin modifica el argumento (primero)

Indice
69
String es una excepcin
Hemos dicho que todas las clases (no los tipos simples) son
pasadas en llamadas por referencia.
String es una excepcin: las llamadas son por copia.
En el siguiente ejemplo el mtodo no cambia el argumento,
sigue teniendo el valor Adios:
public static void main(String[] args) {
String despedida = "Adios";
cambiarDespedida( despedida ); // String es una excepcin: llamada por valor
System.out.println( despedida );
}

public static void cambiarDespedida( String mensaje ) {
mensaje = "Hasta luego";
}

Indice
70
Devolucin de objetos
Hemos visto que return puede servir para devolver el valor de una variable de tipo simple.
Tambin puede servir para devolver un objeto (no una copia del objeto, sino un objeto). En el
siguiente ejemplo los objetos de la clase Persona son capaces de clonarse a si mismos.
public class Persona {
private String nombre;
private int edad;
public Persona( String nuevoNombre, int nuevaEdad ) {
setPersona( nuevoNombre, nuevaEdad );
mostrarSaludo();
}
public void setPersona( String nuevoNombre, int nuevaEdad ) {
nombre = nuevoNombre;
edad = nuevaEdad;
}
public persona clonar( ) {
Persona p = new Persona( nombre, edad );
System.out.println( nombre + " se ha clonado a si misma/o");
return p;
}
public void mostrarSaludo() {
System.out.println( "Hola, acaba de crear una nueva persona: " + nombre);
}
}
public static void main(String[] args) {
Persona ana = new Persona( "Ana", 18 );
Persona clon_de_ana = ana.clonar();
// Error, no existe el constructor:
// Persona juan = new Persona();
}
Hola, acaba de crear una nueva persona: Ana
Hola, acaba de crear una nueva persona: Ana
Ana se ha clonado a si misma/o
Indice
71
Tipos de mbito
Ya vimos que el mbito de una variable u objeto es el espacio del
programa en el que esa variable existe. Por ello, se habla de mbito de
vida

Los principales tipos de mbitos son:
mbito de objeto. Los atributos de un objeto (que no son static)
viven en el espacio de vida del objeto y son accesibles por cualquier
mtodo del objeto (siempre que el mtodo no sea static). Por ello, a
veces se llaman variables de objeto o variables de instancia
mbito de mtodo. Variables y objetos declarados en un mtodo. Su
mbito de vida se cie al mtodo en el que fueron declaradas, por ello
a veces se llaman variables de mtodo o funcin
mbito de clase. Las variables static viven con independencia de que
hayamos hecho instancias de la clase. Podemos acceder a ellas (si son
pblicas) usando el nombre de la clase y viven desde que se declara la
clase, por ello se llaman variables de clase
Indice
72
Ambitos de objeto y de mtodo
En el ejemplo de los crculos,
hay variables de objeto
como:
posicion
radio
Y variables de clase (PI).
Tambin hay variables de
mtodo (locales a la
funcin):
package figuras.dominio;

public class Circulo {
private Punto posicion;
private double radio;
static final public double PI = 3.1416;

public Circulo() { }
public Circulo( double nuevoRadio, Punto nuevaPosicion ) {
setRadio( nuevoRadio );
setPosicion( nuevaPosicion );
}
public Circulo( double nuevoRadio, int posicionX, int posicionY ) {
setRadio( nuevoRadio );
posicion = new Punto( posicionX, posicionY );
}
public Circulo( Circulo circulo ) {
setRadio( circulo.getRadio() );
setPosicion( circulo.getPosicion());
}
public void setRadio( double radio ) { this.radio = radio; }
public void setPosicion( Punto posicion ) { this.posicion = posicion; }
public Punto getPosicion() { return posicion; }
public double getRadio() { return radio; }
public double getArea() { return radio * radio * PI; }
public String toString() {
return "Radio: " + radio + " Posicion: " + posicion.toString() +
" Area: " + getArea();
}
}

Indice
73
mbito de clase. static
Las variables static viven con independencia de que hayamos hecho instancias de la clase
Podemos acceder a ellas (si son pblicas) usando el nombre de la clase (no hay que
hacer instancias) y viven desde que se declara la clase, por ello se llaman variables de
clase. Ejemplo:






Todas las instancias de la clase comparten la misma variable static. Cosa que no
ocurre con las variables no static, en estas cada objeto tiene su variable
En el ejemplo es lgico que el atributo PI sea static: el nmero PI es nico y el mismo sea
cual sea el crculo
Con los mtodos static ocurre algo semejante. Son accesibles desde la clase, sin
necesidad de hacer instancias. Ejemplo que convierte una cadena en un double:
String c = new String( 123.72 );
double r;
r = Double.parseDouble( c ); // Double es una clase, no un objeto
Ahora podemos explicarnos por qu main debe ser static: debe ser accesible por el
interprete Java antes de crear ningn objeto
Tienen restricciones: no pueden utilizar atributos de objeto (variables no static) ni pueden
llamar a mtodos de objeto (mtodos no static)
Por ello un mtodo static no puede usar la expresin this, ya que un mtodo static tiene
mbito de clase y this por definicin tiene mbito de objeto
class Circulo {
private punto posicion;
private double radio;
static public double PI = 3.1416;
...
public static void main(String[] args) {
System.out.println( circulo.PI);
}
Indice
74
final
Cuando se declara una variable como final estamos
dando la orden de que no se modifique. Es como definir
una constante
Debe ser inicializada en la declaracin, ya que cualquier
intento de modificarla provoca un error de compilacin
Utilidad: no permitir que un error de programacin
altere el valor de una constante. Ejemplo:
class circulo {
private punto posicion;
private double radio;
static final public double PI = 3.1416;
El uso de final en mtodos tiene otro sentido: no
permitir que una clase hija sobreescriba un mtodo de la
clase padre

También podría gustarte