Fundamentos de Programación FPRG Tema 4. Tipos Básicos y Expresiones Simples Miguel A. de Miguel [email protected] Temario n Tema 3. Tipos básicos n Datos n n n n Tipos, valores y variables Enteros: int, long, short y byte Reales: double y float Expresiones aritméticas n n n Lógicos: boolean Operaciones lógicas n n n n n n Unicode Tipos simples Conversión de tipos n n Operadores relacionales Caracteres: char, String n n Precedencia y paréntesis promoción Conversiones implícitas Conversiones explícitas Campos Arrays Fundamentos de Programación 2 Tipos de datos primitivos n n n Las clases nos permiten crear nuevos tipos de datos Podemos crear nuevas clases a partir de otras clases (composición-agregación) Pero … Cuales son los datos simples a partir de los que creamos las clases mas sencillas? Los tipos primitivos de datos son tipos básicos con operaciones asociadas n Datos con tipo primitivo no son objetos n Fundamentos de Programación 3 Tipos, valores y variables n n n n Cada tipo primitivo tiene asociado un rango de valores: enteros, reales, {true, false}, caracteres Y un conjunto de operadores (+,-,&,|, …) Java permite representar valores mediante literales (1, ‘a’, 2.0, true), variables o expresiones Las variables son una forma de almacenar información n n n n Tienen asociado un tipo (primitivo o de clase) Variables de campo, variables locales y parámetros Podemos cambiar su valor tantas veces queramos Solo podemos acceder (modificar o consultar) a ellas en su ámbito n n n Campo: dentro de la clase (métodos e inicialización de campos) Variables locales: método o bloque en donde se declaran Parámetros: método Fundamentos de Programación 4 Enteros n n Hay cuatro tipos primitivos para representar enteros: int, long, short y byte Los literales son los mismos para todos ellos: … -3, -2, -1, 0, 1, 2, 3 … n Terminando en L decimos explícitamente que es long Entero Bits int 32 short long byte Mínimo Máximo Integer.MIN_VALUE Integer.MAX_VALUE -231 (- 2147483658) 231-1 (2147483657) 16 Short.MIN_VALUE Short.MAX_VALUE 64 Long.MIN_VALUE Long.MAX_VALUE 8 -215 (-32768) -263 (-9223372036854775808) Byte.MIN_VALUE -27 (-128) Fundamentos de Programación 215-1 (32767) 263-1 (9223372036854775807) Byte.MAX_VALUE 27-1 (127) 5 Enteros n n Los literales pueden ser en decimal, octal (0 a la izquierda 065), y hexadecimal (0x a la izquierda 0xBABA14) Una expresión la creamos aplicando operadores a literales, variables y valores que devuelven métodos. n n Un literal o una variables son las expresiones mas simples Los operadores de los enteros son: n Unarios aritméticos (preceden a la expresión): n n Binarios aritméticos (operan sobre sus expresiones a izquierda y derecha): n n n n n n - invierte signo del entero +, - Suma y resta * Multiplicación / división que devuelve enteros 6 / 7 == 0, 13 / 2 == 6 % módulo (el resto cuando los números son positivos) x % y == x - (x / y) * y ++, -- pre/post incremento/decremento Binarios relacionales (comparan valores de las expresiones a izquierda y derecha): n n >, >=, <, <= Menor, menor o igual, mayor, mayor o igual ==, != igual, distinto Fundamentos de Programación 6 Reales n n Número reales en coma flotante (mantisa y exponente): double, float Los literales: …-2.0, -1.0, 0.0, 1.0, 2.0, … ó 26.77e3 n n Terminando en D o F decimos explícitamente si es float o double Número limitado de cifras significativas y de exponente Real Bits Mínimo Menor Constante Representable Máximo Mayor Constante Representable float 32 Float.MIN_VALUE Float.MAX_VALUE double 64 Double.MIN_VALUE Double.MAX_VALUE Fundamentos de Programación 7 Reales n Los operadores son los mismos que los enteros pero admiten/devuelven reales n n n Unarios aritméticos: Binarios aritméticos: +, -, *, / Binarios relacionales: >, >=, <, <=, ==, != n 0.0 == 0.0 es true, pero en general == y != nos puede dar resultados no esperados Fundamentos de Programación 8 Lógicos n n n Valores lógicos: boolean Los literales: true, false Los operadores operan sobre booleanos (por ejemplo resultado de operadores relacionales): n n Unarios: ! negación Binarios: n x && y: para que sea true, x e y deben ser true n n x || y: será true si cualquiera de las dos (x o y) es true n n Si x es false y no se evalúa Si x es true y no se evalúa x ^ y: o bien x o bien y es true, pero no los dos Fundamentos de Programación 9 Caracteres n char representa un único carácter mediante estándar Unicode 2.0 (16 bits) n n Literales: n n n ASCII ‘a’ ‘j’ ‘\n’ ‘\t’ ‘\r’ ‘\\’ 0u0020 Operadores: n Binarios relacionales: >, >=, <, <=, ==, != n Los caracteres están ordenados según Unicode: n n ‘0’, ‘1’, …, ‘9’, … ‘a’, ‘b’ … ‘z’, ‘A’, ‘B’, … ‘Z’ Clase Character Fundamentos de Programación 10 Caracteres n n String es una clase para representar cadenas de caracteres Literales n n "a", "Hola que tal“ Un literal puede ser tratado como una instancia de la clase String: n n n pero debemos cuidar de modificarlas Caracteres de escape Operadores: n Clase String Fundamentos de Programación 11 Expresiones y precedencia operadores n Una expresión permite realizar múltiples operaciones simples o complejas n n Un operando puede ser: n n n n n (9.0/5.0) * g + 32.0 Literal Variable (campo, parámetro, variable local) Resultado de una llamada a método que devuelve un resultado compatible con los operandos del operador El resultado de una expresión Operadores de los tipos primitivos y de String Fundamentos de Programación 12 Expresiones y precedencia operadores n Una expresión con varios operadores se ejecutan con el siguiente orden: n n n n n n Operadores unarios y llamadas a método, de izquierda a derecha Operadores multiplicación y división de izquierda a derecha Operadores de suma y resta de izquierda a derecha Operadores de relación Operadores de asignación Para fijar nuestro orden deseado (o para evitar problemas) usaremos paréntesis n -1 + 2 * (2 - 4 + 3) / 2 Fundamentos de Programación 13 Tipos simples vs. Tipos compuestos n int,short,long,byte,double,float, char,boolean son tipos primitivos n n n n Las variables de esos tipo sólo almacenan un valor simple Se representan con 8..64 bits Se encuentran siempre contenidos dentro de un objeto, o están entre los parámetros y variables locales de un método activo El resto de los tipos (compuestos) son clases: n Las variables de tipo compuesto referencian objetos n n n Para inicializarlas hay que usar new, o copiar otra referencia Los datos de un objeto son campos de tipos primitivos o referencias a otros objetos Un objeto es una estructura compleja. Incluye bastante información (además de los datos): referencia a la clase, identificador de objeto, monitor … Fundamentos de Programación 14 Conversiones de Tipos n Todos los operandos y parámetros tienen un tipo que debemos respetar n n n Los operadores primitivos tienen tipos para los operandos y devuelven un resultado de un cierto tipo La invocación de métodos debe respetar el tipo de los parámetros, y devuelve un valor con un determinado tipo Algunas veces queremos usar como dato un operador que no es del tipo correcto (por ejemplo sumar enteros y reales) Fundamentos de Programación 15 Conversiones automáticas n Si un operando de un operador, un parámetro o un valor de asignación tienen tipo diferente del esperado, java puede hace una conversión automática n Hace la conversión si el valor seguro que es representable con un valor del tipo primitivo esperado n n n n n enteros, char y boolean con reales char y boolean con enteros int en long, short en int, byte en short Por ejemplo 3.0 / 2 -> 1.5 convierte 2 a 2.0 Se puede perder información al convertir de entero a real Fundamentos de Programación 16 Conversiones explícitas n Decimos de forma explícita como hacer la conversión: n n n n (nuevoTipo) expresion por ejemplo (char) 33 -> ’!’ Podemos perder información Podemos forzar operador que queremos usar: n ((double) 3) / 2 n n n n convierte explícitamente 3 a 3.0 usa un operador / de real convierte automáticamente 2 a 2.0 Hay muchas conversiones mediante métodos en Integer, Byte,Short,Long,Double,Float, Char,String n Representación de Fundamentos númerosdecon string Programación 17 Temario n Tema 3. Tipos básicos n n Datos Campos n n n n n n Identificadores Declaración Asignación Inicialización Constantes Tipos envoltorio n n n Integer Double Boolean Fundamentos de Programación 18 Campos n n n Definen los datos primitivos y referencias que nos permiten definir la información asociada a los objetos de una clase Se declaran en cualquier punto dentro de una clase y fuera de un método Sintaxis: Tipo nombre; Tipo nombre1,nombre2,… nombreN; n n n n int i; Punto origen, destino; String nombre; Persona propietario, conyugeDelPropietario; Fundamentos de Programación 19 Identificadores n Cadena de letras Unicode, dígitos, $ y _ que no comienzan por dígito n n n n n n Un identificador determina el campo, parámetro, variable local, método, clase o paquete al que nos estamos refiriendo Ejemplos no validos: n n n n Mayúsculas != Minúsculas Número ilimitado de caracteres No pueden incluir blancos No se pueden usar palabras reservadas día del año (blancos) 1a class Debemos hacer un esfuerzo por elegir nombres fácilmente comprensibles que permitan comprender qué 20 Fundamentos de Programación representan Asignación n n n n Permite actualizar el valor de la variable Sintaxis variable = expresion; Primero se evalúa la expresión (con el valor antiguo de la variable) y después se actualiza la variable La variable debe estar declarada: n n n Un campo debe aparecer declarado en algún punto de la clase Una variable local debe aparecer declarada en contexto de la asignación y previamente Asignación a un parámetro dentro de un método Fundamentos de Programación 21 Inicialización n Podemos fijar el valor inicial cuando hacemos la declaración n n Si no lo hacemos tomará el valor por defecto: n n n n n Tipo variable = expresión; Enteros y reales 0 y 0.0 Booleanos false Char 0u0000 referencias null Debemos cuidar lo que escribimos en una expresión de inicialización Los valores necesarios deben ser conocibles: int i=metodoQueUsaj(); int j=20*i; public int metodoQueUsaj() { return j;} Fundamentos de Programación n 22 Constantes n Algunas veces identificamos campos cuyo valor inicial es conocido y su valor será siempre el mismo. Ejemplos: n Valores que son siempre los mismos: n n Valores iniciales por defecto (para evitar argumentos en los constructores): n n posición de origen Se declaran: n n n n n tamaño por defecto Valores de uso típicos: n n mayoría de edad incluyen final antes del tipo deben incluir inicialización suelen ser static (lo veremos en el tema 6) Convenio: usar mayúsculas Ejemplo: n final int MAYORIA_EDAD = 18; Fundamentos de Programación 23 Envoltorios n Integer, Long, Short, Byte, Float, Double, Boolean, Character son clases de java.lang que permiten representar primitivos con clases. Incluyen: n Operadores no predefinidos: n n Operadores de conversión n n longValue() Operadores para formatear impresiones n n compare(Double anotherDouble) toString() Constantes típicas de los primitivos n SIZE Fundamentos de Programación 24 Vectores y arrays n Vectores (álgebra) n un vector de N reales n v0, v1, v2, ..., vn-1 n n acceso al término késimo n una matriz de MxN reales n arrays (java) n v00, v01, ..., v0n-1 v10, v11, ..., v1n-1 una matriz de MxN reales double[][] v = new double[M][N] ... vm-1,0, vm-1,1, ..., vm-1,n-1 n acceso al término k-ésimo v[k] Matrices (álgebra) n un array de N reales double[] v = new double[N]; vk n arrays (java) acceso al término x, y n acceso al término x, y v[x][y] vxy Programación DIT-UPM 25 Arrays: Declaración n Ejemplos de estructuras de datos representables con array: n n n Los puntos de una pantalla El conjunto de números de teléfono de una agenda Los arrays nos permiten representar muchos valores primitivos u objetos de un mismo tipo Nos referimos a todos ellos en conjunto, con el mismo nombre n Podemos referirnos a cada uno de ellos de forma individual Tipo[] nombreVariable ; Tipo nombreVariable[]; n Programación DIT-UPM 26 Arrays: Creación n Los array son tipos de objetos, y antes de usarlos hay que crearlos: nombreVariable = new Tipo[Expresion int]; n Al crear el array fijamos el número de elementos que queremos almacenar en él n Cada uno de los elementos del array se crea y se inicializa con su valor por defecto n n n Si el tipo base del array es un tipo primitivo, se inicializa con su valor por defecto (0 int, false boolean, \u0000 char, 0.0 reales) Si el tipo base es una clase, todos los valores del array son null Existen los literales de array: son un conjunto de expresiones del mismo tipo, separadas por comas y encerradas entre llaves int[] arrayDeInt = {2,4,6,8,10}; int[][] matriz= {{ 1, 2, 3 }, { 4, 5, 6 }}; Programación DIT-UPM 27 Arrays: Acceso n n n El nombre de la variable de tipo array nos referencia todo el grupo en conjunto El array es un tipo de objeto (con algunas peculiaridades) Dos variables array pueden referenciar el mismo grupo Tipo[] var1, var2; … var1=var2 n var1 y var2 referencian el mismo conjunto (no son dos copias) metodo(Tipo[] par) { …} … obj.metodo(var1) n par nos hará referencia al conjunto que referencia var1 n El campo length de una variable array devuelve el número de elementos que tiene el array Programación DIT-UPM 28 Arrays: Acceso II n Para referenciar un elemento en concreto debemos identificar su posición (índice), el primero es el 0 nombreVariable[Expresion int] n Nos devuelve un valor del tipo base del array n Podemos usar esa posición como cualquier otra variable nombreVariable[Expresion int]=Expresion del Tipo Base n Por ejemplo: variableArrayInt[i]=11; variableArrayInt[i]=variableArrayInt[i]+(variableArrayInt[j]+1); variableArrayObj[i].metodo(); n Cuando el índice que empleamos tiene un valor mayor o igual que length, o el número es menor de 0: n Se levanta una excepción: ArrayIndexOutOfBoundException Programación DIT-UPM 29 Arrays Multidimensionales n En algunos casos nos interesa tener arrays con varios índices: n n Los puntos de una pantalla los podemos representar mediante un array de dos dimensiones Por cada dimensión que queramos tener, incluimos un índice ([]), y en el constructor definimos el tamaño cada una de las dimensión Color pantalla[][]=new Color[1024][2048] n Para acceder a un elemento base debemos incluir tantos índices como dimensiones tenga el array pantalla[i][j] n n Un array multidimensional es un array de arrays Con un solo índice (pantalla[i]) obtenemos referencia un array que representa todos los elementos de esa dimensión (una fila de la pantalla pantalla[i][0], pantalla[i][1], … pantalla[i][pantalla[i].length-1]) Programación DIT-UPM 30 Arrays Multidimensionales II n n pantalla.length devuelve el número de elementos de la primera dimensión, pantalla[i].length devuelve el número de elementos de la dimensión i Podemos ir creando las diferentes dimensiones dinámicamente, pero una vez creadas, su tamaño no cambia Programación DIT-UPM 31