Download Tema 08 – Características principales del lenguaje Java

Document related concepts
no text concepts found
Transcript
Programación Java y
Desarrollo de
Aplicaciones
Modulo 3
Lenguaje de programación Java
Tema 09
Características principales del
lenguaje Java
Índice





Clases y objetos
Variables
Funciones y procedimientos
Instrucciones
Excepciones
Clases y objetos




En Java, las clases representan cada uno de
los nuevos tipos de datos que se crean.
A partir de las clases, creamos los llamados
objetos, que son variables del tipo de dato de
la clase.
Las clases en java se estructuran en paquetes
(packages).
Los paquetes sirven para organizar las clases,
normalmente según la funcionalidad.
Clases y objetos




Las clases java se crean en ficheros de
fuente, con extensión “.java”.
Mediante el compilador, los ficheros .java se
convierten en ficheros compilados java, con
extensión “.class”.
Dentro de un fichero .java pueden estar
declaradas más de una clase, pero sólo una
puede ser pública.
La clase pública de un fichero .java debe
llamarse exactamente igual que el fichero.
Clases y objetos



Una clase pertenece a un paquete.
Para que la organización en paquetes (organización
lógica) sea efectiva, es requisito que los ficheros
.java que contienen dichas clases estén
almacenados en una estructura de carpetas
equivalente al árbol de paquetes.
IMPORTANTE: la estructura de paquetes no
respeta el anidamiento.

Aunque las carpetas físicas estén anidadas, los paquetes,
para java, son totalmente independientes, tanto a nivel de
visibilidad como a nivel de importación.
Clases y objetos





La clase es la “plantilla” de valores y métodos que van a
tener los distintos objetos que a partir de ella se
declaren.
Los valores determinan el estado del objeto en tiempo
de ejecución. A estos valores se les denomina atributos.
Los métodos de la clase son operaciones que se
pueden realizar sobre el estado del objeto, normalmente
con la intención de consultarlo o de modificarlo (en su
totalidad o en parte).
El estado del objeto suele ser privado, y su modificación
y consulta se realiza a través de los métodos públicos.
La privacidad o publicidad de los métodos/atributos
conlleva la utilización de unos modificadores de
visibilidad.
Clases y objetos

Modificadores de visibilidad en Java
Clases y objetos



Con los modificadores de visibilidad
establecemos el “reglamento” de manejo de
los objetos.
Normalmente, el estado del objeto (atributos)
es privado, mientras que los métodos son
públicos.
La declaración de objetos y su manipulación
se verá más en profundidad en los siguientes
apartados de variables e instrucciones.
Clases y objetos

Definición de clases
/**
* Constructores
*/
public EjemploClase(){
// La llamada al constructor del padre,
// si existe, debe ser la primera instrucción.
super();
// ... Inicialización de los atributos
}
/**
* Paquete al que pertenece la clase
* Debe ser siempre la primera directriz
* del fichero .java
*/
package mensajes;
/**
* Métodos y funciones
*/
public void metodo1(int parametro1, String parametro2){
// Cuerpo del método
}
/**
* Nombre de la clase.
* La clase pública de un fichero .java
* debe llamarse igual que el mismo.
*/
public int funcion_int(int parametro1, String parametro2){
// Cuerpo de la función
int resultado = 1; // Como la función devuelve un int
return resultado; // debemos añadir una instrucción return
}
public class EjemploClase {
/**
* Atributos
*/
private int atributo1 = 0;
private String atributo2 = "";
// ...
// … más métodos.
}
Clases y objetos


Aunque java es un lenguaje orientado a
objetos, existen ocasiones en las que no es
estrictamente
necesario,
puesto
que
buscamos una simple funcionalidad, no una
relación entre objetos.
Por ejemplo:



Calcular un factorial de un número.
Comprobar si un número es par.
Comprobar si dentro de un array existe un valor
(búsqueda).
Clases y objetos


En java disponemos de un recurso para poder crear
funcionalidades independientes de objetos: static
La palabra static, antepuesta a un atributo o a un
método, indica que el ámbito de aplicación del
mismo/a es el de la clase, no del objeto.



Un atributo estático contiene un valor común a todos los
objetos creados: si modificamos el valor de un atributo
estático de una clase, esa modificación afecta a toda la
aplicación.
Un método estático se aplica sobre atributos estáticos o
parámetros, y su ejecución es independiente de cualquier
objeto.
La invocación de métodos y atributos estáticos es
diferente a la de los no estáticos. Se verá con más
detalles posteriormente.
Clases y objetos
Para completar lección,
leer el capítulo 7 del libro.
Variables



Las variables son uno de los elementos más
importantes en programación.
Son el símil más cercano a nuestra memoria
cuando estamos programando, pues el
ordenador “no recuerda nada”.
En ellas, almacenamos los valores
necesarios para controlar la información
“cambiante” que maneja el programa.
Variables



Las variables se “declaran” antes de ser
utilizadas.
Para poder declarar una variable, debemos
especificar el tipo de datos y el nombre de
la misma.
Cuando le damos un valor por primera vez,
estamos “inicializando” la variable.
Variables


El tipo de datos hace referencia al tipo de
información a la que hace referencia la clase.
Es necesario especificarlo por varios motivos:



El tamaño que ocupa la información en memoria es
distinto según el tipo de la variable.
La forma en la que la información se almacena varía
según el tipo de datos.
Dependiendo del tipo de datos de la variable, el
compilador nos permitirá realizar distintas operaciones
sobre la misma.
Variables

El tipo de datos nos permite diferenciar
distintos tipos de variables:





Variables primitivas
Variables envolventes de tipos primitivos
Variables Arrays
Variables referencias u objetos
Variable String
Variables

Variables primitivas


Los tipos primitivos son aquellos que pueden
encontrarse en casi cualquier lenguaje de
programación, y sirven para almacenar
información muy básica, como números, valores
lógicos o caracteres.
Los variables primitivas hacen referencia a una
única posición de memoria. Esto se traduce en
que si se asigna a otra, lo que realmente se
transfiere es el valor de la misma.
Variables
Nombre
Descripción
Tamaño (bytes)
byte
Entero
1
short
Entero
2
int
Entero
4
long
Entero
8
float
Decimal
4
double
Decimal
8
char
Carácter
2
boolean
Lógico booleano
1
Variables



Las variables por referencia u objetos son
aquellas cuyo tipo de datos es un tipo de
dato abstracto.
En java, los tipos abstractos se definen a
partir de las Clases.
Un objeto no es un valor, sino una entidad
con un estado y una serie de funciones y
procedimientos.
Variables




Los arrays son un tipo especial de variable.
Son colecciones de valores.
Una vez declaradas, los arrays son de un
tipo de datos y tienen un tamaño fijo.
Una variable de tipo array hace referencia a
una zona de memoria, y sus asignaciones y
traspaso por parámetros se realizan por
referencia, es decir, el contenido no se copia,
es único en memoria.
Variables

Variables primitivas (valor)
5
6
Y
6
5
X
Variables

Variables por referencia u objetos
(referencia)
Y[0]
6
5
X[0]
Variables




El tipo de datos cadena (String) es un tipo de
datos especial.
Formalmente, es un objeto, ya que es una
variable de un tipo abstracto, por lo que tiene
métodos (java.lang.String).
Cuando una variable String se pasa por
parámetro o su valor es asignado, este se
produce por valor.
Admite valores literales, reconocidos por ir
entre comillas “literal de cadena”.
Variables

Algo parecido al tipo String pasa con los tipos
envolventes de tipos primitivos:
Integer i = 5;
Float f = 2.5f;
Boolean b = false;

Estos tipos de datos contienen métodos
ideados para poder tratar variables de tipos
primitivos como objetos.
Variables

Nombres de variables y valores literales



El nombre de las variables está sujeto a las
condiciones de la página 49 del libro de clase.
Los valores constantes o literales son aquellos
que nos sirven para dar un valor concreto a cada
variable.
Los valores constantes que se pueden asignar a
una variable dependen del tipo de dato de esta.
Variables

Ciclo de vida de las variables


La vida de las variables comienza con su
declaración, por lo que no podrá ser utilizada
antes.
La variable finaliza cuando el espacio de memoria
al que hace referencia deja de ser utilizado, es
decir, queda totalmente desvinculado de
cualquier variable activa.
Variables

Ciclo de vida de las variables


Para las variables primitivas, este ciclo suele
restringirse al método donde se declara, puesto
que, en caso de ser pasadas por parámetros a
otro método, o asignadas a algún valor de
retorno, este traspaso de información se realiza
“por copia”, es decir, se duplica la información.
Las variables de tipo String o de algún tipo
envolvente de tipos primitivos (Integer, Float, etc.)
se comportan como variables primitivas.
Variables

Ciclo de vida de las variables



Para las variables por referencia (objetos), el ciclo de vida de la
variable es, en casi todos los casos, distinto al de la información
física en memoria.
La variable comienza y acaba tal como las variables primitivas.
El contenido de la variable es único, para todas las asignaciones
que se hagan.



Si se declara una variable objeto y se inicializa con un “new”, y
posteriormente se asigna o se devuelve a otra variable, aunque
la variable original finalice, el contenido perdura.
Si se declara una variable objeto y no se inicializa, se interpreta
que tiene el valor null (puntero vacío).
Si se declara una variable objeto y se inicializa con un valor
procedente de otra variable (o parámetro), el contenido es el
mismo, aunque las variables sean distintas.
Variables
Para completar lección,
leer el capítulo 2 del libro.
Funciones y procedimientos

Elementos de los métodos en java:

Cabecera:
 Estructura:
[visibilidad, opc] [static, opc] [tipo_dato] nombre_metodo ([parám])

Ejemplos:
public static void main (String[] args)
private int calculaFactorial(int numero)




Etiquetas de apertura y cierre: En Java, estas etiquetas
son las llaves de apertura y cierre, “{“ y “}”.
Zona de variables: No existe.
Cuerpo del método: Todas las instrucciones que se
encuentran entre las llaves del mismo.
Valor resultado (funciones): El valor que se devuelve en
las funciones java es el que aparece en la instrucción
return. (Se verá con más detalle).
Funciones y procedimientos

Una excepción en esta sintaxis son los métodos
constructores.




Son métodos a los que la máquina virtual llama tal y como
se hace una reserva de memoria para una variable de esa
clase (new).
Cuando comienza su ejecución, la memoria ya está
asignada, y los atributos tienen los valores que están
especificados en la clase.
Se utilizan para asignar valores iniciales a los atributos,
normalmente a partir de parámetros.
Si se produce un error durante la ejecución de este
método, se aborta la creación del objeto, por lo que el
valor asignado será null.
Funciones y procedimientos

El método public static void main(String[] args)






Es el método principal de una aplicación java.
Es estático porque no se invoca a partir de ningún objeto.
Es de tipo void porque no devuelve ningún valor.
El parámetro args contiene los parámetros que se le han
pasado a la invocación de la aplicación, en el mismo
orden.
Toda aplicación ejecutable debe tener, al menos un
método main.
En una aplicación pueden existir más de una clase que
contenga un método main, pero sólo uno será el punto de
entrada a la aplicación.
Funciones y procedimientos

Aspectos a tener en
procedimientos/funciones…




cuenta
sobre
los
Los métodos de las clases, en la POO en general, y en java en
particular, se entienden como las operaciones que se pueden
realizar para modificar/consultar el estado de un objeto, o bien
para obtener un servicio del componente al que este representa.
Los métodos constructores son necesarios en las clases en las
que sea necesario llevar a cabo alguna inicialización, operación,
comprobación, etc.
Los métodos estáticos se interpretan como funcionalidades
propias de un tipo de datos general, no de sus objetos.
Los métodos estáticos sólo pueden invocar directamente a otros
métodos estáticos.
Funciones y procedimientos
Para completar lección,
leer el capítulo 8 del libro.
Instrucciones


Las instrucciones son las herramientas que
tenemos para programar los métodos de las clases.
Las instrucciones son totalmente diversas, pero en
líneas generales podemos encontrar los siguientes
tipos:





Directivas (Declaración de paquetes, clases, import’s,
declaración de métodos…).
Declaración de variables: Sirven para declarar variables,
parámetros, etc. Un tipo particular son los atributos.
Operaciones: Se realizan entre tipos primitivos, o entre tipos
envolventes o String, mediante operadores y literales.
Llamadas a funciones: Efectúan una llamada a un
procedimiento o función.
Instrucciones condicionales: bucles y condicionales
Instrucciones

Las directivas sirven para especificar ciertos aspectos
no programables:


package: se escribe al comienzo del fichero, y especifica el
paquete al que pertenece la clase. Debe ser la primera
instrucción.
import: se utiliza para importar otras clases que no se
encuentran en nuestro mismo paquete. Se pueden importar
clases completas o paquetes enteros:



import java.util.Date;
import java.util.*
Comentarios: Se utilizan para detallar el código fuente. Una
vez se compila la clase, estas directivas se ignoran.


// … : Comentario de una sola línea.
/* … */ : Comentario de varias líneas.
Instrucciones

La declaración de variables se realiza siempre
con el mismo formato:

Variables primitivas

[tipo_dato] nombre_variable = valor_literal.



int i = 0;
char c = ‘c’;
Objetos
 [nombre_clase] nombre_variable
= new [nombre_clase]([parámetros]);


Date fecha = new Date();
Persona persona
= new Persona(“Manuel”, “Gallego”, “Vela”);
Instrucciones

String y tipos envolventes.
 Admiten tanto inicialización como primitiva o como objeto.





String cadena = “este es el valor inicial de la cadena.”;
String cadena = new String(“este es el valor inicial de la cadena.”);
Integer integer = 1;
Integer integer = new Integer(1);
Arrays
 [tipo_dato] [] nombre variable = new [tipo_dato] [tamaño]



int [] array_int = new int[5];
Date [] array_fecha = new Date[12];
También se pueden dar valores iniciales: { … }


int[] array_int = {1,2,3,4,5};
String[] array_str = {“primera”, “segunda”, “tercera”};
Instrucciones

Las operaciones se realizan sobre los tipos
primitivos, y dependen del tipo de datos de cada
uno de ellos.

int, float, long, double, shor, byte:
 Operaciones aritméticas: +, -, /, * , +=, -=, *=…
 Operaciones lógicas: <, >, <=, >=, !=, ==

Boolean


String


Operaciones lógicas: &&, ||, !
Concatenación: +
Char

Operaciones similares a las de números, pero utilizando el
código unicode del carácter.
Instrucciones

Las llamadas a métodos se realizan mediante su
nombre, los paréntesis y los parámetros necesarios:



Si el método no devuelve ningún valor, lo llamamos tal
cual, por su nombre, con sus parámetros.
 System.out.println(“cadena a imprimir”);
Si la función devuelve un valor, la llamada equivale al
mismo, por lo que puede operarse con él.
 if(es_par(2))
 int i = variable + funcion(3);
 return funcion(valor);
Si la función devuelve un valor, pero no queremos
utilizarlo para nada, podemos llamarla como si fuera
un método.
Instrucciones

Lo normal en la llamada de funciones es que estas sean invocadas a
partir de un objeto creado.

¿Cómo se invocan los métodos de un objeto?

nombre_objeto.nombre_metodo(parámetros).
Integer integer = new Integer(5);
integer.intValue();
Date fecha = new Date();
fecha.toString();

¿Y a los atributos públicos? Exactamente igual:


¿Y los métodos estáticos? A través del nombre de la clase.



array.length
Nombre_clase.nombre_metodo_static(…);
Nombre_clase.nombre_atributo_static;
¡ Pero a mi no me da un error llamando a un método estático a través
de un objeto !

En teoría no está mal, pero no es correcto. Habitualmente, el compilador te
avisará con un warning.
Instrucciones


Las instrucciones condicionales son aquellas que nos permiten alterar la
ejecución secuencial de nuestro programa.
Existen dos tipos de instrucciones condicionales:

Ejecución condicionada:

bloque if-else/ if-else if-else





Ejecuta el cuerpo (conjunto de instrucciones) del if si se cumple la condición
establecida. En caso contrario, ejecuta el cuerpo del else.
El uso de else if sirve para añadir más casos diferenciados.
if(condicion) { [cuerpo_del_if] } else { [cuerpo_del_else] }
if(condicion) { [cuerpo_del_if] } else if { [cuerpo_del_2º_if] } else {[cuerpo_del_else] }
Bloque switch





Se evalúa el valor de una variable primitiva, y según sea el caso se salta la ejecución
al caso concreto (case).
Cada valor a considerar se identifica mediante la palabra reservada case.
Si no se cumple ninguno de los casos considerados, disponemos de un tratamiento
genérico, identificado mediante la palabra default.
Una vez se ha saltado a un case, la ejecución no finaliza hasta encontrarse, o bien la
llave del final del switch, o la instrucción break.
switch([variable]){ case VALOR_1: [INSTRUCCIONES] case VALOR_2:
[INSTRUCCIONES]
…
case
VALOR_N:
[INSTRUCCIONES]
default:
[INSTRUCCIONES] }
Instrucciones



Los bucles son estructuras de repetición.
Ejecutan un cuerpo de instrucciones mientras se cumple
una condición lógica.
Existen en java distintas estructuras de bucles:

Bucle for:
 Normalmente se utiliza para realizar iteraciones de cuenta,
en las que la condición de repetición suele ser que una
variable no sea mayor/menor/igual a un número, e iteración
tras iteración, dicha variable esté sometida a un
incremento/decremento constante.
 for([inicialización];[condición];[iteración])
Instrucciones

Bucle while:
 Normalmente se utiliza para realizar iteraciones sometidas
a un hecho, como por ejemplo:







Finalización del juego
Final de fichero
El usuario no ha pulsado la tecla “X”
Etc.
while([condición]) { [cuerpo_del_bucle] }
Los dos bucles, for y while, sirven para lo mismo.
Todo lo que se hace con un for se puede hacer
con un while y viceversa.
Instrucciones

Bucle do-while:
 Se diferencia de los anteriores en que en este, la
evaluación de la condición es a posteriori, es decir, en los
otros se puede hablar de condición de iteración y en este
es más correcto hablar de condición de continuación.
 do { [Cuerpo_del_bucle] } while ( [Condición] );
COMPLETAR LECCIÓN CON LA LECTURA DEL
CAPÍTULO 4 DEL LIBRO.
Excepciones

Cuando programamos, podemos distinguir dos tipos
de errores.


Errores de compilación: El compilador no puede resolver
algún conflicto y no puede crear el archivo ejecutable (en
caso de java, el .class).
 Avisos (Warnings): El compilador nos informa de un posible
error, pero que en principio puede salvarlo y compilar, pero
que es muy posible que el funcionamiento no sea el
esperado.
Errores de ejecución: son errores que se producen durante
la ejecución del programa, bien debido a fallos en la
programación, o bien debido a problemas de otros
dispositivos periféricos.
Excepciones



Los
segundos
son
realmente
los
problemáticos, pues no suelen estar
previstos, o, aunque lo estén, nos cortan la
ejecución de la aplicación.
En java, existe un método para gestionar
este tipo de errores, con el fin de que su
aparición no ocasiones la ruptura total del
programa.
Este es el sistema de captura y tratamiento
de Excepciones.
Excepciones


Una excepción es un error de ejecución.
Cuando se produce una excepción, la
máquina virtual nos aborta la ejecución de
nuestro programa, con la consecuente
pérdida de la información no almacenada,
además del posible perjuicio de que nuestro
programa no ha cumplido con su cometido.
Excepciones

Ejemplos de códigos donde saltaría una excepción
Excepciones


Cuando se produce una excepción en una aplicación java, la
máquina virtual recoge todos los parámetros necesarios para
identificarla (proceso, número de línea, mensaje…), y crea un
objeto de una clase llamada Exception, del paquete
java.lang.
La excepción aborta la ejecución del procedimiento, y se
propaga sucesivamente a lo largo de toda la secuencia de
procedimientos que se han ido llamando. A esta secuencia de
métodos se le llama pila de procedimientos de la excepción.
Pila de procesos
main
1. esPar
calculaPares
esPar
excepcion
2. calculaPares
3. main
Excepciones

Para controlar las excepciones en java existe una estructura
de control que es el bloque try-catch.







try{ [cuerpo_try] } catch (Exception ex) { [tratamiento_ex] }
Dentro del bloque try se ejecutan una serie de instrucciones.
Si en alguna de esas instrucciones salta una excepción, se
aborta la ejecución del bloque try, y se salta al bloque catch.
En el bloque catch, la excepción se convierte en un objeto de la
clase Exception, y se le asigna el nombre ex.
Dentro del bloque catch, se lleva a cabo el tratamiento de la
excepción.
Además, existe una estructura adicional que se puede agregar al
bloque try-catch, que es el bloque finally.
En el bloque finally se ejecutan una serie de instrucciones
siempre, independientemente de si ha saltado una excepción o
no.
Excepciones





Para poder diferenciar el tipo de excepción que se ha producido,
disponemos de la herencia y el polimorfismo.
Podemos crear clases que hereden de la clase java.lang.Exception,
que nos servirá para identificar distintos tipos de excepciones.
En el bloque catch, ahora podemos poner un tipo más concreto que
el Exception, para identificar un tipo de error concreto, y
desentendernos de los demás.
Se pueden añadir todos los bloques catch que sean necesarios,
para poder establecer un tratamiento adecuado a cada excepción.
Si en el bloque catch ponemos un supertipo, el tratamiento servirá
para todas las excepciones que hereden de ella, a menos que exista
un tratamiento específico para la misma.
Excepciones
try{
[cuerpo de instrucciones del bloque try]
} catch (TipoExcepcion1 ex1) {
[cuerpo de instrucciones del bloque catch]
} catch (TipoExcepcion2 ex2) {
[cuerpo de instrucciones del bloque catch]
…
} catch (TipoExcepcionn exn) {
[cuerpo de instrucciones del bloque catch]
} finally {
[cuerpo de instrucciones del bloque finally]
}
Excepciones

Lanzamiento de excepciones.





Cuando programamos nuestro código, podemos prever
funcionamientos erróneos y, en vez de devolver valores
incoherentes o tener que codificar muchísimas líneas de más
para prevenir, podemos lanzar una excepción, que se comportará
como una excepción de la propia máquina virtual.
Para lanzar una excepción, disponemos de la sentencia throw.
En cualquier parte de nuestro código, podemos lanzar una nueva
excepción de manera tan simple como crear un objeto, siempre
teniendo en cuenta que el nuevo objeto debe ser de una
clase que herede de Exception.
throw new TipoException();
throw new TipoException(“mensaje”);
Excepciones

Lanzamiento de excepciones.



Si añadimos una sentencia de lanzamiento de excepción en
nuestro código, es estrictamente necesario especificar que el
procedimiento lanza una excepción.
Esto se hace con la sentencia throws, que se añade a la
cabecera del procedimiento.
Una vez que uno de los procedimientos lanza una excepción,
todos los procedimientos que invocan ese procedimiento deben
tratar la excepción, bien “envolviendo” el código con un bloque
try-catch, o bien “desentendiéndose” del tratamiento y
lanzándola hacia el método llamador, añadiendo a su declaración
la directiva throws.
Excepciones
public metodoLlamador (parametros)
{
…
try{
metodo(parametros);
}catch(TipoExcepcion ex){
…
}
…
}
public metodoLlamador
TipoExcepcion
{
…
metodo(parametros);
…
}
public metodo (parametros) throws TipoExcepcion
{
…
throw new TipoExcepcion(“mensaje”);
…
}
(parametros)
throws
Clases y objetos
Para completar lección,
leer el capítulo 9 del libro.
Bibliografía

Manual Imprescindible Java SE6


F. Javier Moldes Teo, Editorial Anaya.
Wikipedia

es.wikipedia.org