You are on page 1of 12

26/11/2014

Markdown Edit

Curso de introduccin a Android


Sesin 1: Repaso de Java
Java es un lenguaje de programacin:
Altamente orientado a objetos. Salvo los tipos primitivos (int, char, boolean...), el resto hereda
de Object.
Semi-interpretado: compilado a bytecode, un "lenguaje" intermedio entre el cdigo Java y el
cdigo mquina.
Fuertemente tipado: las variables se declaran con un tipo y no pueden asignarse valores de
otro tipo.
La memoria se gestiona automticamente. Al declarar una memoria se reserva y al perder
una variable toda referencia se elimina automticamente por el recolector de basura
(Garbage Collector o GC). Es posible forzar una llamada al GC para liberar memoria en un
momento determinado con System.gc() .
NO PERMITE herencia mltiple.
No es necesario manejar punteros (Java lo hace internamente).

Variables y constantes
En Java, tenemos 2 tipos de valores:
Variables: una referencia a un valor que puede cambiar con el tiempo (manteniendo siempre
el mismo tipo) y anotada con un nombre. Deben declararse e inicializarse para poder usarlas.
Constantes: pueden ser o variables cuyo valor nunca cambia o simplemente valores
includos en las instrucciones de nuestros programas y que forman parte del propio
programa.

Ejemplos:
Declaracin de una variable de tipo int (entero):
int entero;

Declaracin e inicializacin de esa variable (se declara y se le asigna un valor constante 1):
int entero = 1;

Modificacin del valor de la variable tras la declaracin e inicializacin:


int entero = 1;
entero = 2;
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

1/12

26/11/2014

Markdown Edit

En todos los ejemplos anteriores, los nmeros asignados eran constantes que se convertan en el
contenido de una variable. Por lo tanto, una variable puede ser un "almacn" de constantes de un
mismo tipo.
Si quisiramos usar una constante referenciada por un nombre, lo haramos con el modificador
final, que indica que el valor que se proporciona al inicializar ser el valor final que tendr la
constante:
final int ENTERO = 1;

Por convencin, los nombres de variable empiezan por minscula y los de constantes se escriben
totalmente en maysculas. Si ahora intentramos cambiar el valor de ENTERO, el programa nos
dara error al compilar:
final int ENTERO = 1;
ENTERO = 2; // ILEGAL

Tipos primitivos y objetos


Se denominan tipos primitivos a aquellos tipos que hacen referencia a una cantidad atmica de
informacin:
byte: enteros de -128 a 127.
short: enteros de -32.768 a 32.767.
int: nmeros enteros de -2.147.483.648 a 2.147.483.647.
long: enteros de 9.223.372.036.854.775.808 a +9.223.372.036.854.775.807.
boolean: valores verdaderos y falsos (true, false).
char: carcter Unicode con valor de 0 a 65.535 (casi todo UTF8). Se escriben con comillas
simples: 'a' .
float: nmeros con decimales con poca precisin. Se pueden escribir como 1.0f .
double: nmeros decimales con alta precisin.
Un objeto, por su parte, es una idea ms compleja. Es una entidad que contiene informacin y
funcionalidad propias. Un ejemplo de objeto es un String , o cadena de caracteres.
String, adems de ser una sucesin de char , tiene formas de interactuar con esta, como por
ejemplo subString , que devuelve otra cadena de texto con parte del contenido de la actual. A
un String tambin se le puede asignar un valor de forma similar a la de un tipo primitivo:
String hola = "Hola Mundo!";

Adems, los tipos primitivos tienen unos Wrapper o envoltorios que permiten tener objetos con
sus valores y adems poder hacer operaciones sobre ellos. As, por ejemplo, tendramos:
boolean -> Boolean
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

2/12

26/11/2014

Markdown Edit

Y Boolean , adems de tener valor verdadero o falso, tiene funcionalidad como


parseBoolean() , que le permite convertir valores de otros tipos a verdaderos o falsos.

Objetos y clases
En Java, cada archivo .java es una clase.
Una clase puede verse como un molde o una idea de un objeto. Por ejemplo, si tenemos que el
avin de Iberia que hace la ruta ALM-MAD es un objeto, su clase podra ser "Avin". Qu es un
avin? Un avin es un objeto que tiene alas, turbinas y vuela.
Un ejemplo de clase avin sera:

class Avion {
Ala alaDerecha;
Ala alaIzquierda;
Turbina turbinaAvion;
void vuela() {
}
}

Ah tenemos una clase Avion (anotada con class ), que contiene 2 objetos de clase Ala y uno
de tipo Turbina y que tiene la funcionalidad de volar (mtodo vuela() ).
Por convencin, los nombres de las clases comienzan en mayscula y los de los mtodos en
minscula. Adems, se sigue un tipo de notacin "CamelCase", es decir, como las jorobas de un
camello:
minsculaMaysculaMayscula
Ya hemos visto como inicializar una variable con un tipo primitivo (constante), pero no con un
objeto. Los objetos se crean con unos mtodos especiales llamados constructores, de la forma:
Avion() {
// Operaciones
}

Este constructor se considera un constructor "vaco" y por defecto todas las clases tienen uno
aunque en su cdigo no aparezca. As, con el cdigo original de Avion.java , podramos
hacer:
Avion avionAlmeriaMadrid = new Avion();
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

3/12

26/11/2014

Markdown Edit

Vemos cmo para crear un objeto, le pedimos una nueva instancia al constructor con new .
Si tuviramos un constructor ms complejo, podramos tener, por ejemplo:
Avion avionAlmeriaMadrid = new Avion("Almera", "Madrid");

Donde le pasamos 2 String con el origen y el destino del avin.

Mtodos:
Los mtodos permiten dotar de funcionalidad a clases y objetos.
Cada mtodo tiene:
Un tipo de valor a devolver o return type. Esto quiere decir que cada mtodo debe especificar
qu tipo de valor dar como salida y asegurar que dicho retorno de valor existe.
Unos parmetros que le proporcionan informacin para actuar.
Operaciones a realizar antes de terminar y devolver valores.
Un ejemplo de mtodo podra ser:
int suma(int enteroA, int enteroB) {
int resultado = enteroA + enteroB;
return resultado;
}

En este cdigo tenemos un mtodo que declara que devolver un valor int , recibe dos
parmetros int tambin, realiza una operacin de suma que guarda en una variable y
efectivamente hace un return de un valor entero, el de dicha variable.
Los mtodos siempre deben estar dentro de una clase.

Paquetes e imports
Cada clase Java debera estar contenida dentro de un paquete del tipo:
mi.nombre.de.paquete
Y este "estar contenido en un paquete" se declara en el archivo Java como:
package mi.nombre.de.paquete;

Para hacer uso de clases que estn en otros paquetes debemos hacer uso de import . Si
tuviramos una clase ClaseAjena en el paquete paquete.de.otro , tendramos que
hacer:
import paquete.de.otro.ClaseAjena;
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

4/12

26/11/2014

Markdown Edit

// o
import paquete.de.otro.*;
// Esto importara todas las clases de dicho paquete.

Tanto la directiva package como los import deben usarse antes de declarar la clase en s:
package mi.nombre.de.paquete;
import paquete.de.otro.ClaseAjena;
import paquete.de.otro.OtraClase;
class MiClase {
...
}

Visibilidad y modificadores
Las clases pueden contener variables y mtodos como vimos antes. Todos ellos tienen un
concepto de "visibilidad", es decir, quin puede acceder a ellos o simplemente saber que existen.
Hay varios niveles de visibilidad y se declaran mediante modificadores:
Pblica - public : el mtodo o variable es visible para cualquier otra clase que pueda
acceder al objeto.
Privada - private : el mtodo o variable es visible slo para el propio objeto o clase. Si
cualquier otra clase intenta acceder a l habr un error de compilacin.
Protegida - protected : slo es visible para la propia clase u objeto y para aquellos que
desciendan de l (lo veremos ms adelante).
De paquete - sin modificador: si no aadimos ningn modificador, dicha variable o mtodo
ser accesible para clases que se encuentren en el mismo paquete que la que lo contiene.
Las clases tambin pueden ser pblicas o privadas.
Adems de esto, cada variable o mtodo puede pertenecer tanto a un objeto o instancia de una
clase como a la propia clase. Esto se regula con el modificador static .
Por ejemplo:

public class MiClase {


// Creamos una constante accesible mediante MiClase.NOMBRE;
public static final String NOMBRE = "MiClase";
// Se llama con MiClase.metodoEstatico();
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

5/12

26/11/2014

Markdown Edit

public static void metodoEstatico() { ... }

// Se llamara con miObjeto.metodoInstanciaPublico() siempre que se est en el mismo


int metodoInstanciaPublico() {
int result = metodoInstanciaPrivado();
return result;
}
// No podra llamarse desde fuera
private int metodoInstanciaPrivado() { ... }
}

A las variables y mtodos estticos se los llama tambin "de clase", mientras que el resto son
"de instancia". Por ltimo, si una variable se declara dentro de un mtodo, sera "local".
Es posible, incluso, hacer lo siguiente:

public class MiClase {


public static int valor = 0;
static {
MiClase.valor = 1;
}
}

El cdigo de dentro del static { ... } se ejecutara antes de la primera utilizacin de la


clase, ya sea de sus variables, sus mtodos, o instanciando un objeto de dicha clase.

Herencia e interfaces
Herencia
Unas clases pueden heredar de otras. Esto es, pueden tener informacin y funcionalidad comn a
otra clase y adems informacin y funcionalidad propia. Intentando hacer una similitud, un guila
sera de clase Ave . Sin embargo, tenemos que Ave es un Animal , puesto que tiene
comportamientos comunes con todos los animales. Adems, Animal puede ser un
Organismo .
Esta "herencia" de informacin y comportamiento se declara con extends :
public class Organismo { ... }
public class Animal extends Organismo { ... }
public class Ave extends Animal { ... }
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

6/12

26/11/2014

Markdown Edit

...
Organismo aguila = new Ave("guila");

Podemos ver cmo al ser Ave un caso concreto de Organismo, un Ave puede ser una variable de
tipo Organismo. Sin embargo, qu pasara si quisiramos acceder a un mtodo o variable que
slo Ave tiene? El compilador no nos dejara, tendramos que aclarar que queremos usar "aguila"
como Ave y no como Organismo, o lo que es lo mismo, castear:
Organismo aguila = new Ave("guila");

aguila.vuela(); // Dara error, ya que un Organismo no tiene el comportamiento "volar"


Ave aveAguila = (Ave) aguila;
aveAguila.vuela(); // Funcionara sin problema
((Ave) aguila).vuela(); // Tambin funcionara

Una clase de la que se hereda comportamiento se conoce como una clase padre, mientras que la
que lo hereda se considerara hija.
En Java, toda clase hereda de Object.
Es posible que queramos aadir ms cdigo a los mtodos de una clase padre en los de una hija
o incluso reescribir totalmente el funcionamiento de dicho mtodo. Para esto, debemos crear otro
en la clase hija con el mismo tipo, nombre y parmtros y aadir la anotacin @Override antes.
Si queremos que se ejecute el cdigo original lo llamaramos con
super.metodoOriginal(parametros) y si no, no llamaramos a nada.
public class ClasePadre {
public int operacion(int intA, int intB) {
return intA + intB;
}
}
public class ClaseHija extends ClasePadre {
@Override
public int operacion(intA, intB) {
// La clase hija, adems de hacer la suma, le suma uno al resultado
return super.operacion(intA, intB) + 1;
}
}
public class OtraClaseHija extends ClasePadre {
@Override
public int operacion(intA, intB) {
// En este caso, queremos que "operacion" multiplique, no sume
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

7/12

26/11/2014

Markdown Edit

return intA * intB;


}
}

Interfaces
Y qu es una interfaz? Una interfaz es un contrato, una serie de comportamientos que la clase
que la implemente publica que contiene.
public interface MiInterfaz {
public int operacion(String parametro);
}

Con esto lo que hacemos es avisar de que cualquier clase que implemente MiInterfaz
tendr un mtodo void operacion(String parametro) , que no sabemos qu valor
devolver, pero s que necesitar un parmetro String y que el valor de retorno ser de tipo int.
Para implementar la interfaz, lo haramos as:
public class MiClase implements MiInterfaz {
@Override
public int operacion(String parametro) {
...
return valorEntero;
}
}

Como hemos dicho, MiClase implementa la interfaz y la dota de funcionalidad, mientras que una
clase que sepa que MiClase implementa MiInterfaz podr usar "operacion" sin problemas, an sin
saber el que un objeto es de tipo MiClase:
// De cara al cdigo, operador es de tipo MiInterfaz
MiInterfaz operador = new MiClase();
operador.operacion("Uno");

Una clase puede implementar cuantas interfaces quiera de la forma:


public class MiClase implements InterfazA, InterfazB, InterfazC... { ... }

Una interfaz adems, puede implementarse independiente de una clase:


MiInterfaz miInterfaz = new MiInterfaz() {
@Override
public int operacion(String parametro) {
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

8/12

26/11/2014

Markdown Edit

...
return valorEntero;
}
};

Clases abstractas
Por ltimo, existen un tipo de clases llamadas abstractas, que estn a medio camino entre una
interfaz y una clase normal:
public abstract class ClaseAbstracta {
public abstract void operacion();
public void otraOperacion() {
...
}
}
public class MiClase extends ClaseAbstracta {
@Override
public void operacion() {
...
}
}

Estructuras de datos
En Java, se pueden tener listas de 2 formas:
Listas inmutables (arrays):
Se debe conocer el tamao que quieren que se tengan de antemano para inicializarlo con l. Se
notan como Tipo[] :
// Lista de 3 strings
String[] arrayStrings = new String[2];
arrayStrings[0] = "Hola";
arrayStrings[1] = "Mundo";
arrayString.length() // 2
arrayStrings = new String[] {"Hola", "Mundo"};

Listas modificables:
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

9/12

26/11/2014

Markdown Edit

// El tipo de variable se escribe entre < > y DEBE SER UNA CLASE (no primitivos)
// No tiene por qu saberse el tamao final
// Ponemos ArrayList porque "List" es una interfaz
List<String> miLista = new ArrayList<String>();
miLista.add("Hola");
miLista.add("Mundo");
miLista.remove(1);
miLista.add(1, "Mundo");
miLista.size(); // 2

Mapas o diccionarios:
Toman parejas de ["clave", "valor"] para guardar los datos:
Map<String, Integer> mapa = new HashMap<String, Integer>();
mapa.put("Uno", 1);
int valor = mapa.get("Uno");
mapa.remove("Uno");

Genricos
Para poder guardar cualquier dato y recuperarlo sin tener que hacer casteo List y Map hacen uso
de tipos genricos.
public class <Tipo extends Object> MiClase<Tipo> {
public Tipo operacion(int arg) {
Tipo resultado = ...
return Tipo;
}
}

Esto le dice a la clase que se usar el tipo genrico "Tipo", que ser al menos de tipo Object. Si
quisiramos usar slo strings:
public class <T extends String> MiClase<T> {
public T operacion(int arg) {
T resultado = ...
return T;
}
}

De esta forma, MiClase slo aceptar que los valores del tipo genrico "T" sean String o hereden
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

10/12

26/11/2014

Markdown Edit

de String.

Condicionales y bucles
Condiciones
Para hacer comprobaciones usaremos las sentencias if / else :
int valor;
...
if(valor > 5) {
if(valor == 10) {
...
}
} else {
...
}

Tambin es posible usar else if para evitar que se "aniden" demasiado los ifs unos dentro de
otros.
Una forma ms corta de hacer un if es con ? :
(valor > 5) ? operacionSiTrue : operacionSiFalse;

Si tenemos valores de tipo entero (o Strings en Java 7 o mayor), podemos usar switch como
si fuera un if:
int valor;
...
switch(valor) {
case 0:
break;
case 1:
break;
// Si el valor no coincide con ninguno de los superiores
default:
...
}

Es necesario utilizar break entre un caso y otro ya que de lo contrario:


switch(valor) {
case 0:
...
case 1:
break;
}
file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

11/12

26/11/2014

Markdown Edit

Si valor fuera 0, se ejecutara el caso 0 y luego el 1 hasta encontrar un break.

Bucles
Para hacer bucles podemos usar while , que ejecutar el cdigo que contenga mientras que se
cumpla la condicin establecida:
int i = 0;
while(i < 5) {
i++; // i = i + 1;
}
// Aqu i valdra 5

Este mismo cdigo podra haberse escrito con un for . for tiene 3 partes, declaracin de la
variable, declaracin de la comprobacin, declaracin de la operacin a realizar tras cada
iteracin:
for(int i = 0; i < 5; i++) {
...
}

Si tenemos una estructura que implemente la interfaz Iterable , adems podremos hacer lo
siguiente:
List<String> lista;
...
for(String string : lista) {
string.replaceAll("a", "e");
}

Si quisiramos salir rpidamente de un bucle podemos hacerlo con la instruccin break , como
en los switch :
for(int i = 0; i < 5; i++) {
if(i == 2) {
// Saldra en la 3 iteracin
break;
}
}

file://localhost/Users/Arasthel/Documents/Curso%20Android/Sesion01/Sesion01-Repaso%20de%20Java.html

12/12

You might also like