Apunte JAVA + SVN Emi Höss Instalando Eclipse y Java VM Eclipse es la IDE que utilizaremos para programar los TP’s de la materia. Puede descargarse de la siguiente página: https://www.eclipse.org/downloads/index.php Además puede ser necesario descargar la VM de Java para poder ejecutar lo que compilemos: https://www.java.com/en/download/ Al ejecutar Eclipse por primera vez nos pedirá que seleccionemos una carpeta para usar como Workspace, esto es el lugar donde se almacenara el código que programemos. Se puede modificar más adelante si desean cambiar el Workspace en el que trabajar. SVN Tipos de datos Los tipos en Java se pueden dividir en Tipos primitivos Se llaman primitivos porque están integrados al sistema y no son objetos. Hay ocho tipos para clasificar números (tanto reales como enteros) y booleanos. 1. 2. 3. 4. 5. byte: datos enteros comprendidos entre -128 y +127. short: datos enteros comprendidos entre -32678 y +32367. int: datos enteros comprendidos entre -2147483648 y +2147483647. long: datos enteros comprendidos entre -9223372036854775808 y 9223372036854775807. char: se utiliza para declarar datos enteros en el rango \u0000 .. \uFFFF en Unicode (0 a 65535). Los valores de 0 a 127 se corresponden con los caracteres ASCII del mismo código. 6. float: datos en coma flotante de 32 bits. Para especificar que una constante es de tipo float hay que añadir al final de su valor la letra ’f’ o ’F’. 7. double: datos en coma flotante de 64 bits. Una constante real es de tipo double a no ser que se especifique lo contrario. 8. boolean: se utiliza para indicar si el resultado de la evaluación de una expresión booleana es verdadero o falso. Los dos posibles valores son true y false Tipos referenciados Se pueden clasificar en: Clases, Interfaces y Arrays (para lo que abarca la materia únicamente hace falta reconocer las Clases y los Arrays) Variables Una variable en Java se declara primero por su tipo y luego por su nombre: Tipo nombre; Por ejemplo para declarar un entero de 32 bits hacemos: int a; Sin embargo para utilizarlo antes debemos inicializarlo (asignarle algún valor inicial), para evitar posibles error se aconseja declarar e inicializar cualquier variable en la misma línea de la siguiente manera: int a = 0; Estructuras de Control Condicionales IF Permite ejecutar un bloque de código u otro dependiendo de una condición, se escribe como: if (condition) statement1; else statement2; Si existe más de una sentencia por cada parte del condicional es necesario generar un bloque con ellas de la siguiente manera: if(condition) { statement1; statement2; }else { statement3; statement4; } Si no existe la segunda condición está puede no escribirse, como: if(condition) statement1; SWITCH Permite diferenciar distintos posibles valores para una expresión con sus bloques de código a ejecutar en cada caso switch (expresión) { case expresión-constante 1: sentencia 1; case expresión-constante 2: sentencia 2; default: sentencia n; } Iterativos While Se utiliza para repetir un bloque de código mientras se cumpla una condición: while (condition) { statement1; } Do-While Es igual al anterior pero en este caso primero ejecuta el bloque de código y luego verifica la condición: do { statement1; } while(condition) Terminación Return Cuando se ejecuta la sentancia return la función termina, en caso de que la función devuelva algo de algún tipo entonces se deberá escribir una instancia de ese tipo seguida del return y separada con un espacio. Veamos algunos ejemplos: void unaFuncionVoid() { return; //No debe escribirse nada más, incluso puede no ponerse el return. } int unaFuncionQueDevuelveUnEntero() { return 0; //Pongo un entero luego del return, este será el valor que devuelva la función. } int otraFuncionQueDevuelveUnEntero() { int val = 3; return val; //Pongo una variable de tipo entero. } int unaUltimaFuncionQueDevuelveUnEntero() { return unaFuncionQueDevuelveUnEntero; //Pongo una función que devuelve algo del mismo tipo que esta. } Clases y Objetos Una clase puede verse como un constructor (o molde) de objetos en donde se describen los atributos y métodos que estos objetos (también conocidos como instancias de la clase) tendrán una vez que sean creados. Una clase de por si también puede tener métodos y atributos que no formarán parte de los objetos que creen. Java es un lenguaje orientado a objetos (aunque no es algo que se puede decir en voz alta en el vecindario de Smalltalk), por ende, todo código debe existir dentro de una clase. La manera de definir una clase es la siguiente: class name { //Cosas que va a tener la clase } Veamos un ejemplo sencillo: class Persona { int static cantidadDeCabezas = 1; int DNI; string Nombre; public Persona() { DNI = 0; Nombre = “"; } public Persona(int aDNI, string aName) { DNI = aDNI; Nombre = aName; } } En Java todo código tiene que pertenecer a alguna clase, a su vez, toda clase pertenece a un único archivo .java que tiene el mismo nombre que la clase que está definida en el. Al compilar se generan archivos .class en lenguaje bytecode por cada .java que tenemos en nuestro proyecto, que luego serán interpretados por la maquina virtual de Java. Métodos y atributos Un método y un atributo se llama mediante el punto ‘.’ Ya sea si se trata de un atributo/método de clase o de instancia de clase. Cuando un atributo es de clase (posee el campo ‘static’ en su declaración) Significa que para todas las instancias de esa clase ese atributo o método es único. Lo que significa que puede se llamado directamente desde la clase. Por otro lado si el atributo/método no es ‘static’ por defecto es de instancia. Por ejemplo en la clase Persona, el método ‘cantidadDeCabezas’ es estatico, se comparte para toda instancia de la clase persona, el resto de sus atributos y métodos son de instancia. Persona juan = new Persona(3, “juan”); Luego de ejecutar esta línea de código, creamos una instancia de la clase persona, luego podemos hacer. int val = Persona.cantidadDeCabezas; En donde val será igual a 1; Pero no podemos hacer int val = Persona.DNI; Dado que DNI es un atributo de instancia por lo que solo le podemos preguntar su DNI a una instancia de la clase persona. int val = juan.DNI; En ese caso val tendrá el valor de 3. Para que una clase se defina como ‘ejecutable’ debe tener la definición de la función main: public static void main(String[] args) { //Únicamente el código que este en esta función será ejecutado cuando compilemos //la clase a la que pertenece esta función main. } Arrays Un array es una lista de cosas, que tiene nombre, tamaño y tipo fijado al momento de inicializarlo. 1. int a[] = null; (es un array no inicializado de ints) 2. a = new int[8]; (inicializo el array anterior con una longitud fija de 8 ints) 3. int b = new int[8]; (igual a lo anterior pero en una sola linea) 4. int c = {1, 2, 3, 4, 5, 6, 7, 8}; (además de fijar la longitud tambien inicializamos sus elementos con valores Notar que solamente en el último ejemplo el arreglo creado tiene sus elementos inicializados, es aconsejable antes de comenzar a utilizar el arreglo iniciar todos sus elementos en algún valor. Matriz Una matriz en Java no es más que un array de arrays. Para generarla hacemos lo siguiente: int [][] matriz = new int[10][11]; Esto genera una matriz de 10 filas y 11 columnas. Manipular una matriz. Para leer o escribir de la matriz se hace de maneras muy similares: int val = matriz[2][3]; Esta línea de código obtiene el valor de la posición (2, 3) de la matriz (o sea, fila 2, columna 3) Para escribir es similar matriz[2][3] = 3; Esta línea de código escribe en la posición (2, 3) el valor 3. Listas En Java existen varios tipos de listas, ArrayList es uno de ellos y que pueden utilizar para el TP. Para generar una instancia de este tipo puede hacer: ArrayList<int> instancia = new ArrayList<int>(); Luego pueden ver todos los métodos exportados por ArrayList directamente desde Eclipse escribiendo: instancia. (ctrl + space) También pueden buscar la documentación de Java donde se explica en detalle cada función. Packages Un Package en Java es el equivalente a una librería, sirve para organizar las clases que vamos creando de acuerdo a algún contexto que quiera ofrecerse. Por ejemplo si tenemos muchas clases que ofrecen soluciones a problemas matemáticos pueden incluirse todas en un Package llamado Math o similar. Cuando deseemos utilizar alguna de esas clases desde otra, simplemente tenemos que imporar el package y todas las clases que pertenecen a este estarán accesibles desde la clase donde estamos programando. Cuando generen una clase les pedirá Eclipse que indiquen a que Package pertenecerá la clase, pueden poner alguno nuevo o pueden dejarlo vacio, en este caso se agregarán las clases al package ‘Default’ Compilar y Debugear Para compilar o debugear se debe selección la clase que se desea compilar simplemente haciendo un click sobre la misma en el Package Explorer. Recordar que la clase debe contener una función main como se mencionó anteriormente. Para que el ‘debuger’ pare en alguna posición de código que vayamos a ejecutar necesitamos ingresar un breakpoint, para hacerlo simplemente hay que hacer dobleclick en la columna a la izquierda del código, al hacerlo aparecerá un punto que indica que hay un breakpoint en esa línea. Finalmente si deseamos correr o debugear debemos selección la opción Run o Debug desde el menú superior en Eclipse.