Download Repaso de Java

Document related concepts
no text concepts found
Transcript
Repaso de Java
[Tema 1]
1 / 31
¿Cuáles son las características de Java?
2 / 31
Características
Estas son las principales características de Java
Orientado a Objetos: Salvo los tipos primitivos (char, int, short...) el resto
de elementos son objetos que heredan de Object.
Semi Intreptetado: El código es compilado a bytecode, un lenguaje
intermedio que es ejecutado sobre la máquina virtual.
Fuertemente tipado: Las variables han de ser declaradas especificando
un tipo y solo podrán asignarse valores de dicho tipo.
Memoria Autogestionada: Al crear una variable de asigna
automáticamente la memoria y cuando no hay ninguna referencia a esta
es eliminada por el recolector de basura.
Herencia Simple: Java solo permite heredar desde una clase. Para
mantener el polimorfismo se hace uso de las interfaces.
3 / 31
Variables y Constantes
Variables
Las variables referencia a un valor que puede cambiar con el tiempo siempre
y cuando mantenga el tipo. Han de ser declaradas e inicializadas para
utilizarse.
Constantes
Puede ser variables cuyo valor no cambia una vez asignado o valores
incluídos en el propio código y que forman parte del programa.
4 / 31
Ejemplos
Variables
Declaración de un variable
int entero;
Declaración y asignación
int entero = 1;
Declaración, asignación y cambio.
int entero = 1;
entero = 2;
5 / 31
Ejemplos
Constantes
Declaración usando la palabra reservada final
final int ENTERO = 1;
Si intentamos modificar una constante dará error.
final int ENTERO = 1;
ENTERO = 2; //Error
6 / 31
Tipos Primitivos
Llamamos tipos primitivos a aquellos tipos que hacen referencia a una
cantidad atómica de información:
byte: enteros de -128 a 127.
short: enteros de -32.768 a 32.767.
int: números 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: carácter Unicode con valor de 0 a 65.535 (casi todo UTF8). Se
escriben con comillas simples: 'a'.
float: números con decimales con poca precisión. Se pueden escribir
como 1.0f.
double: números decimales con alta precisión.
7 / 31
Objetos
Llamamos objetos a ideas más complejas.
Un objeto es una entidad que contiene información y funcionalidad propias.
Un ejemplo de objeto podría ser un Avión, el cual contiene Alas y acciones
como despegar.
Avion avion1 = new Avion();
avion.despegar();
8 / 31
Objetos y Clases
En Java, cada archivo .java es una clase.
Una clase es un molde o una idea. Siguiendo el ejemplo anterior, tendríamos
la clase Avion y el objeto avion ALM-MAD.
La clase Avion podría tener la siguiente forma:
public class Avion {
public Ala alaDerecha;
public Ala alaIzquierda;
public Turbina turbina;
public String origen;
public String destino:
public void despegar() {
}
}
9 / 31
Objetos y Clases
Podríamos crear un nuevo avión de la siguiente forma
Avion avionALMMAD = new Avion();
avion.origen = "Almería";
avion.destino = "Madrid";
Cómo se puede ver, tras crear el objeto le hemos asignado valores a sus
propiedades origen y destino.
Sin embargo, podemos usar métodos especiales denominados constructores
para asignar los valores en el momento de inicialización del objeto
10 / 31
Objetos y Clases
public class Avion {
public Ala alaDerecha;
public Ala alaIzquierda;
public Turbina turbina;
public String origen;
public String destino:
public Avion(String ori, String dest) {
origen = ori;
destino = dest;
}
public void despegar() {
}
}
Avion avionALMMAD = new Avion("Almería", "Madrid");
11 / 31
Métodos
Los métodos permiten dotar de funcionalidades a las clases.
Cada método tiene:
Tipo de valor a devolver: Cada método puede devolver un único valor o
ninguno como salida. En caso de devolver un valor ha de especificarse el
tipo y asegurase que se devuelve.
Parámetros: Los métodos pueden contener parámetros de entrada
Operaciones a realizar: El método ha de contener una serie de
operaciones a realizar antes de devolver el valor.
Ejemplo
public int suma(int enteroA, int enteroB) {
int resultado = enteroA + enteroB;
return resultado;
}
12 / 31
Paquetes e imports
Cada clase Java deberá estar contenida dentro de un paquete del tipo:
mi.nombre.de.paquete
Y para ello hay que declalarlo en el archivo Java de la siguiente forma:
package mi.nombre.de.paquete;
Para que una clase pueda usar otra contenida en un paquete diferente, esta
deberá importarlo.
13 / 31
Paquete e imports
package mi.nombre.de.paquete;
import paquete.de.otro.ClaseAjena;
import paquete.de.otro.OtraClase;
class MiClase {
...
}
14 / 31
Visibilidad y modificadores
Las clases pueden contener variables y métodos como vimos anteriormente.
Todos ellos tienen visibilidad la cual indican quien pueden acceder a ellos.
Pública public: El método o variable es visible para cualquier otra clase
que pueda acceder al objeto.
Privada private: El método o variable es visible sólo para el propio objeto o
clase. Si cualquier otra clase intenta acceder a él habrá un error de
compilación.
Protegida protected: Sólo es visible para la propia clase u objeto y para
aquellos que desciendan de él (lo veremos más adelante).
De paquete - sin modificador: si no añadimos ningún modificador, dicha
variable o método será accesible para clases que se encuentren en el
mismo paquete que la que lo contiene.
Así mismo, las propias clases pueden ser públicas o privadas.
Finalmente, tenemos el modificar estático static el cual determina que una
variable o método es común a todos los objetos de la misma clase.
15 / 31
Visibilidad y modificadores
public class MiClase {
// Creamos una constante accesible mediante MiClase.NOMBRE;
public static final String NOMBRE = "MiClase";
// Se llama con MiClase.metodoEstatico();
public static void metodoEstatico() { ... }
// Se llamaría con miObjeto.metodoInstanciaPublico() siempre que se esté en el mismo paquete
int metodoInstanciaPublico() {
int result = metodoInstanciaPrivado();
return result;
}
// No podría llamarse desde fuera
private int metodoInstanciaPrivado() { ... }
}
16 / 31
Herencia
Una clase puede heredar de otra. Esto es, que una clase puede tener
información y funcionalidad común de una clase además de información y
funcionalidad propia.
Un ejemplo sería que Ave sería un Animal puesto que tiene comportamientos
comunes con todos los animales. Además, Animal puede ser un Organismo.
Cuando una clase hereda de otra, además de adquirir su información y
funcionalidad, también adquirirá su tipos, pudiendo asignar a una variable de
tipo Organismo tanto otro Organismo, como un Animal como un Ave.
Para hacer uso de la herencia se utiliza la palabra extends.
17 / 31
Herencia
public class Organismo {
...
}
public class Animal extends Organismo {
...
}
public class Ave extends Animal {
...
public void vuela() {
}
}
Organismo aguila = new Ave("Águila");
18 / 31
Herencia
Sin embargo, si intentamos acceder a algún método o variable de una clase
que no corresponde con la declarada, el compilador nos dará error. Para
solucionarlo, deberemos castear la variable.
Organismo aguila = new Ave("Águila");
aguila.vuela(); // Daría error, ya que un Organismo no tiene el comportamiento "volar"
Ave aveAguila = (Ave) aguila;
aveAguila.vuela(); // Funcionaría sin problema
((Ave) aguila).vuela(); // También funcionaría
19 / 31
Herencia
Al heredar es posible modificar parcial o totalmente los métodos de la clase
padre. Para ello, basta con escribir el método con el mismo nombre, retorno y
parámetros y añadir la anotación @Override.
Si deseamos llamar al método original podremos hacerlo con els sufijo super..
public class ClasePadre {
public int operacion(int intA, int intB) {
return intA + intB;
}
}
20 / 31
Herencia
public class ClaseHija extends ClasePadre {
@Override
public int operacion(intA, intB) {
// La clase hija, además 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
return intA * intB;
}
}
21 / 31
Interfaces
Una interfaz es un contrato, una serie de comportamientos que la clase que la
implemente debe tener obligatoriamente.
public interface MiInterfaz {
public int operacion(String parametro) {
}
}
De esta forma, cualquier clase que implemente la interfaz MiInterfaz tendrá que
tener un método void operacion(String parametro).
22 / 31
Interfaces
public class MiClase implements MiInterfaz {
@Override
public int operacion(String parametro) {
...
return valorEntero;
}
}
Puesto que MiClase implementa MiInterfaz podremos asignar elementos del tipo
MiClase a variables MiInterfaz y usar las funcionalidades definidas en estas
última:
// De cara al código, operador es de tipo MiInterfaz
MiInterfaz operador = new MiClase();
operador.operacion("Uno");
23 / 31
Clases Abstractas
Por último, existen un tipo de clases llamadas abstractas, que están 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() {
...
}
}
24 / 31
Estructuras de Datos
En Java, se pueden tener listas de 2 formas:
Listas inmutables (arrays):
Se debe conocer el tamaño 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"};
25 / 31
Listas modificables:
// El tipo de variable se escribe entre < > y DEBE SER UNA CLASE (no primitivos)
// No tiene por qué saberse el tamaño 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");
26 / 31
Genéricos
Para guardar cualquier dato y recuperarlo sin tener que hacer casteo se usan
tipos genéricos.
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 genérico "Tipo", que será al menos de
tipo Object. Si quisiéramos usar sólo strings:
public class <T extends String> MiClase<T> {
public T operacion(int arg) {
T resultado = ...
return T;
}
}
27 / 31
Condicionales y bucles
Para hacer comprobaciones usaremos las sentencias if/else:
int valor;
...
if(valor > 5) {
if(valor == 10) {
...
}
} else {
...
}
También es posible usar else if para evitar que se "aniden" demasiado los ifs
unos dentro de otros.
Una forma más corta de hacer un if es con ?:
(valor > 5) ? operacionSiTrue : operacionSiFalse;
28 / 31
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;
}
Si valor fuera 0, se ejecutaría el caso 0 y luego el 1 hasta encontrar un break.
29 / 31
Bucles
Para hacer bucles podemos usar while, que ejecutará el código que contenga
mientras que se cumpla la condición establecida:
int i = 0;
while(i < 5) {
i++; // i = i + 1;
}
// Aquí i valdría 5
Este mismo código podría haberse escrito con un for. for tiene 3 partes:
Declaración de la variable
Declaración de la comprobación
Declaración de la operación a realizar tras cada iteración:
for(int i = 0; i < 5; i++) {
...
}
30 / 31
Si tenemos una estructura que implemente la interfaz Iterable, además
podremos hacer lo siguiente:
List<String> lista;
...
for(String string : lista) {
string.replaceAll("a", "e");
}
Si quisiéramos salir rápidamente de un bucle podemos hacerlo con la
instrucción break, como en los switch:
for(int i = 0; i < 5; i++) {
if(i == 2) {
// Saldría en la 3º iteración
break;
}
}
31 / 31