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