Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
1 Apéndice III Guía de sintaxis del lenguaje Java v1* Fuente: Programación en C/C++, Java y UML, 2ª ed. Joyanes- Zahonero, 2014 EL LENGUAJE DE PROGRAMACIÓN JAVA Java es un lenguaje de programación con una gran cantidad de características técnicas notables. Ya que Java no fue diseñado específicamente para estudiantes, no es un lenguaje fácil de aprender, en primera instancia, ya que requiere una cierta cantidad de maquinaria técnica para escribir programas en Java, incluso los más simples. Sin embargo, las ventajas que tienen los profesionales terminan a la larga convirtiéndose también en ventajas para los estudiantes a medida que estos van superando esas dificultades y terminan convirtiendo a los estudiantes con experiencia en magníficos programadores. Las características de Java han sido definidas por diversos autores en un artículo educativo (“White Paper”) [Joyanes-Zahonero, Programación en C/C++, Java y UML, 2ª ed. 2014, p. 598] ya muy famoso y donde se describen las 11 propiedades sobresalientes (buzzwords) de Java: • Sencillo (simple). • Orientado a objetos. • Capacidad de trabajo en red (Network-Savvy). • Robusto. • Seguro. • Neutro (independiente) de la arquitectura. • Portable. • Interpretado. • Altas prestaciones. • Multihilo (Multithread) • Dinámico * Fuente: Programación en C/C++, Java y UML, 2ª ed. Joyanes-Zahonero, 2014 Sitio web de referencia Portal oficial de Java de Oracle www.oracle.com/technetwork/java/index.htm Página “Java y tú”: Descargar hoy (Oracle) www.java.com/es http://www.oracle.com/technetwork/java/index.htm http://www.java.com/es 2 Un programa sencillo en Java Un programa Java es realmente una definición de una clase con un método main. La aplicación Java se ejecuta cuando se utiliza la orden java que lanza la Máquina Virtual Java (JVM, Java, Java Virtual Machine). La siguiente figura muestra el código fuente del clásico programa “¡ Hola, mundo ¡” Tipos de datos Java es un lenguaje fuertemente tipeado. Esto significa que cada variable debe tener un tipo declarado. Hay ocho tipos primitivos en Java y cada uno de ellos es una palabra reservada. Cuatro son tipos enteros, dos son tipos coma flotante; uno es el tipo carácter, char, utilizado para caracteres individuales (código ASCCI y Unicode) y un último dato es un tipo boolean para representar los tipos de dato lógicos. Variables, constantes y asignaciones 21.2 Tipos primitivos* Tipo Requisito de almacenamiento Rango int 4 bytes −2.147.483.648 a 2.147.483.647 short 2 bytes −32.768 a 32.767 long 8 bytes −9.223.372.036.85 4.775.808 a 9.223.372.036.854. 775.807 byte 1 byte −128 a 127 float 4 bytes 3.4 e−45 a 3.4 e+45 (6-7 cifras decimales significativas) double 8 bytes 1.7 e−308 a 1.7 e+3085 (15 cifras decimales significativas) char 2 bytes carácter Unicode \u0000 a \uFFFF p.e. \n \u000a \r \u000d * Todos los tipos de datos tienen signo, excepto char que no tiene signo. Sintaxis Tipo variable1, variable2, ... Método main Nombre de clase (programa) Código public class PrimerPrograma { public static void main(String[ ] args) { // visualizar un mensaje de saludo System.out.println("¡ Hola, Mundo !"); } // fin del método main } // fin de la clase PrimerPrograma Salida ¡ Hola, Mundo ! 3 Inicialización de variables Después de declarar una variable se debe inicializar explícitamente mediante una sentencia de asignación. Inicialización de una variable en una declaración Se puede combinar la declaración de una variable como una sentencia de asignación que proporciona el valor de una variable. Asignación múltiple; combinación de asignación con operadores aritméticos Se pueden realizar asignaciones múltiples con el operador = y variables del mismo tipo. El formato es : variable1 = variable2 = variable3 = ... = expresión; Ejemplo: int x, y, z; x = y = z = 25; Constantes En numerosos programas se necesitan constantes numéricas, pero es una buena idea usar nombres sim- bólicos para todos los valores, incluso para los que parecen evidentes. En Java, las constantes se identifi- can con la palabra clave final. Una variable etiquetada como final nunca puede modificar su valor ya que se ha convertido en una constante. Ejemplo final double VALOR_DESCUENTO = 14.50; final double IVA = 16; final double EURO = 166.67; Ejemplo public class MercadoValores { // métodos ... // constantes public static final double PESO = 0.55; public static final double EURO = 1.55; } Operadores y expresiones Sintaxis variable = expresión; Sintaxis Tipo variable_1 = expresión_1, variable_2 = expresión_2, ... ; Regla Utilizar constantes con nombres para hacer sus programas más fáciles de leer y mantener. 4 Como en la mayoría de los lenguajes, Java permite formar expresiones utilizando variables, constantes y operadores aritméticos. Estas expresiones se pueden utilizar en cualquier lugar. int x = 5; int y = x + 5; int z = x * y; Operadores aritméticos Cinco operadores se utilizan para operaciones básicas en Java: + − * / y % (módulo). El operador / repre- senta la división entera si ambos argumentos son enteros y división en coma flotante, en caso contrario. 15/2 es igual a 7 15%2 es igual a 1 15.0/2 es igual a 7.5 Operadores relacionales y lógicos Java tiene diferentes operaciones para realizar comparaciones entre variables, variables y literales, y otros tipos de información de un programa. Estos operadores se utilizan en expresiones que devuelven valores boolean de true o false Operador Significado Ejemplo == Igual x == 5 != No igual x != 5 < Menor que x < 5 > Mayor que x > 5 <= Menor o igual que x <= 5 >= Mayor o igual que x >= 5 Operadores de manipulación de bits Cuando se trabaja con tipos enteros, existen operadores que pueden trabajar directamente con los bits que forman los enteros. Esto significa que se pueden utilizar técnicas de enmascaramiento para obtener bits individuales de un número. Los operadores de manipulación de bits son: & ("and") | ("or") ^ ("xor") ∼ ("not") estos operadores trabajan sobre patrones de bits. Precedencia de operadores En general, el orden de evaluación de primero a último es: • Operadores de incremento y decremento. • Operadores aritméticos. • Comparaciones. • Operadores lógicos. • Expresiones de asignación. Funciones matemáticas La clase Math contiene una colección de funciones matemáticas que se pueden necesitar, dependiendo del tipo de programación que desee realizar. Por ejemplo, para calcular xn Math.pow(x,n) Sin embargo, para calcular x2 puede ser más eficiente calcular x*x. Para extraer la raíz cuadrada de un número se puede utilizar el método sqrt: 5 double x = 9.0; double y = Math.sqrt(x); System.out.println("y = " + y); // se visualiza 3 Ejemplo Calcular el valor de (−b + √(b2 − 4ac))/2a (−b + Math.sqrt(b*b −4*a*c))/(2*a) Métodos matemáticos. Función Devuelve Math.sqrt(x) raíz cuadrada de x (x ≥ 0) Math.pow(x,y) xy Math.exp(x) ex Math.log(x) logaritmo natural (ln(x), x > 0) Math.round(x) entero más próximo a x (long) Math.ceil(x) entero más pequeño ≥ x (double) Math.floor(x) entero más próximo ≤ x (double) Math.abs(x) valor absoluto de x Math.max(x,y) valor mayor de x e y Math.min(x,y) valor menor de x e y Math.sin(x) seno de x (x en radianes) Math.cos(x) coseno de x (x en radianes) Math.tan(x) tangente de x (x en radianes) Math.asin(x) arco seno de x Math.acos(x) arco coseno de x Math.atan(x) arco tangente de x Math.atan2(y,x) arco cuya tangente es y/x Math.toRadianes(x) convierte x grados a radianes Math.toDegrees(x) convierte x radianes a grados Cadenas Las cadenas en Java son secuencias de caracteres Unicode. Java no tiene un tipo cadena incorporado.Sin embargo, existe en la biblioteca estándar de Java, una clase denominada String que está disponible cuando se programa en Java. Objetos de tipo String son cadenas de caracteres que se escriben dentro de dobles comillas. Cada cadena entrecomillada es una instancia de la clase String. String a = ""; // cadena vacía String saludo = "Hola"; Se puede declarar una variable de tipo cadena. String ciudad; ciudad = "Cazorla" Se pueden juntar declaración y asignación. String ciudad = "Cazorla" ; Se puede visualizar el objeto representado por la variable cadena, mediante System.out.println(ciudad); 6 Concatenación de cadenas Java, al igual que la mayoría de los lenguajes de programación, permite usar el operador + para unir (concatenar) dos cadenas. Ejemplo String nombre = "Sierra de Magina"; String frase; frase = nombre + " es muy bella"; System.out.println(frase); Se visualiza la frase Sierra de Magina es muy bella Las cadenas son inmutables En Java, un objeto de tipo String es un objeto inmutable lo que significa que los caracteres del objeto de String no se pueden cambiar. No existe ningún método que cambie el valor de un objeto, como "Palo- ma" y en caso de desear cambiarla deberá recurrir a concatenar la subcadena que desea reemplazar. String pueblo = "Lupiana"; pueblo = "Pueblo de " + pueblo: La sentencia de asignación ha cambiado la variable pueblo a Pueblo de Lupiana Subcadenas de la clase String El método substring extrae una subcadena de una cadena. Las sentencias String saludo = "Hola Mackoy"; String cad = saludo.substring(0,4); primera primera posición posición de copia de no copia crean la subcadena, de la posición 0, carácter más a la izquierda, a la posición 3 inclusive; es decir la cadena cad = "Hola". La figura 21.2 muestra los números de posición de la subcadena. H o l a M a c k o y posición 0 1 2 3 4 ... Posiciones de la cadena. Longitud y comparación de cadenas El método length ( ) devuelve el número de caracteres de un objeto String como un valor de tipo int. Ejemplo String saludo = "hola Mortimer"; System.out.println("La longitud es " + saludo.length ( )); Después de la ejecución de las sentencias anteriores se visualiza La longitud es 13. El método length se utiliza para encontrar el número de caracteres de una cadena; se puede utilizar en cualquier parte que se pueda utilizar un valor de tipo int, como se ha hecho en el ejemplo anterior. 7 Otra operación muy usual cuando se trabaja con cadenas, es comparar dos cadenas para ver si son iguales o distintas. El método equals devuelve true si son iguales y false en caso contrario Métodos de la clase String La clase String tiene un número de métodos muy útiles que se pueden utilizar para aplicaciones de pro- cesamiento de cadenas. Además, existen cientos de clases en las bibliotecas estándar, con muchos más métodos. Por consiguiente, es esencial que se familiarice con la documentación API en línea que le per- mite examinar todas las clases y métodos de la biblioteca estándar. La documentación API es parte del JDK, está en formato HTML en la dirección http://java.sun.com/javase/reference/api.jsp se encuentra la especificación API Java Platform, Standards Edition 6 API Specification La clase String de Java contiene más de 50 métodos. La clase java.lang.String pertenece al paquete java.lang. A continuación, se muestra una lista de métodos significativos. char charAt (posicion) Devuelve el carácter del objeto cadena que se encuentra en posicion. Las posiciones se cuentan 0, 1, 2, etcétera. Ejemplo String saludo = "¡Hola Mackoy!"; saludo.charAt(0) devuelve ¡ saludo.charAt(1) devuelve H Códigos de caracteres ASCII y Unicode El código de caracteres por excelencia siempre ha sido el código ASCII (apéndice B). El conjunto de caracteres ASCII es una lista de todos los caracteres utilizados normalmente en los teclados de las computadoras (inglés, español, francés, catalán, etc.), más unos pocos caracteres especiales. En esta lista a cada carácter se le asigna un número de modo que los caracteres se pueden almacenar en función del correspondiente número o código. Java y muchos otros lenguajes de programación utilizan el conjunto de caracteres Unicode. El código de caracteres Unicode incluye el conjunto de caracteres ASCII más muchos otros caracteres utilizados en lenguajes con alfabetos diferentes al inglés, español, etcétera. Entrada y salida La clase Scanner definida en el paquete java.util es muy adecuada para entrada por consola. Salida a la consola Java utiliza paquetes y sentencias de importación (import). Los paquetes son biblioteca de clases Java. Las sentencias de importación ponen disponibles las clases del paquete en los programas. Existen dos formas de producir salidas a la pantalla: 1) System.out.println y 2) System.out.printf. Sintaxis System.out.println(elemento_1+elemento_2+ ... + elemento_n) Salida formateada con printf 8 En la versión 5.0, Java incluyó un método denominado printf, inspirado en la función clásica de la biblioteca C, que se puede utilizar para producir la salida en un formato específico. La sentencia System out.printf tiene un primer argumento cadena, conocida como especificador de formato y el segundo argumento es el valor de salida en el formato establecido. System.out.printf("%8.3f"", x); imprime x con una anchura de campo de 8 caracteres y una precisión de 3 caracteres. Entrada En la versión 5.0, Java incluyó una clase para simplificar la entrada de datos por el teclado. Esta clase se llama Scanner y se conecta a System.in. Para leer la entrada de la consola, se debe construir primero un objeto de Scanner, pasando simple mente el objeto System.in al constructor Scanner Scanner entrada = new Scanner(System.in); A continuación, se pueden utilizar diferentes métodos de la clase Scanner para leer la entrada: nextInt o nextDouble leen el siguiente entero y valor de coma flotante. System.out.print("Introduzca cantidad: "); int cantidad; cantidad = entrada.nextInt( ); System.out.print("Introduzca precio: "); double precio = entrada.nextDouble( ); Sintaxis de entrada de teclado utilizando Scanner • Hacer disponible la clase Scanner para utilizarla en su código. Incluir la siguiente línea al comienzo del archivo que contiene su programa. import java.util.Scanner; • Antes de introducir algo por teclado se debe crear un objeto de la clase Scanner. • Scanner nombreObjeto = new Scanner(System.in); nombreObjeto es cualquier identificador Java (no palabra reservada). Scanner teclado = new Scanner(System.in); • Los métodos nextInt, nextDouble y next leen un valor de tipo int, un valor de tipo double y una palabra, respectivamente. Flujo de control (sentencias de control) Bloques de sentencias Un bloque o una sentencia compuesta es cualquier número de sentencias simples que están delimitadas por una pareja de paréntesis, tipo llave. Los bloques definen el ámbito de sus variables. Los bloques pue- den estar anidados dentro de otro bloque. Sintaxis de bloque de sentencias { sentencia1 sentencia2 ... } Un ejemplo dentro del método main. public static void main(String [ ] args) 9 { int m; ... { int n; ... } // n está definido en este bloque } Sentencias condicionales Las sentencias condicionales en Java son: if, if-else y switch Sintaxis sentencia if-else if (condición) sentencia1 else sentencia2 +Sentencias if-else multicamino Sentencia switch Java tiene una sentencia switch idéntica a las sentencias switch de C y C++ Sintaxis switch (condicion) { case etiqueta_1 sentencia_ 1 ... break; case etiqueta_2 sentencia_2 ... break; . . . case etiqueta_n 10 sentencia_n ... break; defaullt:sentencias ... } Ejemplo int nivel ... switch (nivel) { case 1: nivelProfesional = "Amateur"; break; case 2: nivelProfesional = "Intermedio"; break; case 3: nivelProfesional = "Profesional"; break; default: nivelProfesional = "Desconocido"; } Bucles (lazos) Los mecanismos de bucles o sentencias repetitivas o iterativas son similares a sus equivalentes de otros lenguajes de programación. Las tres sentencias Java de bucles son: while, do-while y for. Como ya se ha comentado anteriormente, a partir de Java 5 se incorpora una variante del bucle for, que es una extensión o mejora del bucle for, y denominada “for each”. Sentencia while La sentencia while, recordemos, ejecuta una sentencia (o un bloque de sentencias) mientras una condición es verdadera. Sintaxis 1. while (condicion) sentencia 2. while (condicion) { sentencia_1 sentencia_2 … sentencia_n } Sentencia do-while Sintaxis do { sentencia_1 sentencia_2 . . . sentencia_n } while (condición) Sentencia for 11 Sintaxis for (inicialización; condición; actualización) sentencia; Ejemplo int siguiente, suma = 0; for (siguiente = 0; siguiente <= 10; siguiente++) { suma = suma + siguiente; System.out.println("suma " + siguiente + " es " + suma); } Sentencias break y continue Si se desea alterar el flujo de control de los bucles for, while y do-while existen dos métodos. Estos dos métodos consisten en insertar una sentencia break o una sentencia continue. La sentencia break termina el bucle. La sentencia continue termina la iteración en curso del cuerpo del bucle. Las sentencias anteriores se pueden utilizar con cualquiera de las sentencias del bucle de Java. Sintaxis break; break etiqueta; continue; Ejemplo de break while (mes <= 100) { saldo = saldo + cuota; double interes = saldo * tasaInteres/100; saldo += interes; if (saldo >= objetivo) break; mes++; } Ejemplo de continue Scanner teclado = new Scanner(System.in); for (int contador = 1; contador <= 500; contador++) { System.out.print("Introduzca un número positivo"); int n; n = teclado.nextInt( ); if (n < 0) continue; suma += n; // no se ejecuta si n < 0 } Método exit( ) La sentencia break termina un bucle o la sentencia switch, pero no termina el programa; en caso de desear terminar el programa, Java tiene el método exit definido en la clase System (clase predefinida que se incorpora automáticamente) que termina un programa tan pronto se invoca. Ejemplo System.out.println("Introduzca un número negativo"); int numNegativo = teclado.nextInt( ); if (numNegativo >= 0) 12 { System.out.println(numNegativo + "no es negativo"); System.out.println("programa abortado"); System.exit(0); } Bucle "for each" A partir de Java 5.0 se ha introducido una construcción de bucles muy potente que permite al programa- dor iterar a través de cada elemento de un array o arreglo, así como otras colecciones de elementos sin tener que preocuparse por los valores de los índices del bucle. El bucle for each establece una variable dada a cada elemento de la colección y a continuación ejecuta las sentencias del bloque. Sintaxis mejorada del bucle for for (variable : colección) sentencia; La expresión colección debe ser un arreglo (array) o un objeto de una clase que implemente la interfaz Iterable, como lista de arreglos, ArrayList, etc. Ejemplo Visualizar cada elemento de un arreglo en una lista independiente. int [ ] m = new int[100]; // array ... for (int elemento : m) System.out.println(elemento); Nota • El "for each" se puede interpretar como “por cada valor de ... hacer las siguientes acciones”. • La variable del bucle "for each" recorre los elementos de la colección o el arreglo (array) y no los valores de los índices. Arreglos (arrays) Un arreglo (array) es una estructura de datos que almacena una colección de valores del mismo tipo. En esencia, un arreglo es una colección de variables del mismo tipo. Se accede a través de un índice entero. double[ ] puntos; int [ ] a; En Java, la sentencia anterior solo declara la variable a o la variable puntos. Se debe utilizar el ope- rador new para crear el arreglo. int [ ] m = new int[50]; // arreglo de 50 elementos de tipo entero double [ ] puntos = new double[10]; // arreglo de 10 elementos Regla Las variables de tipo arreglo se pueden definir con dos formatos diferentes: 1. int a [ ]; 2. int [ ] a; Sintaxis Se declara un nombre de un arreglo y se crea un arreglo de un modo similar a la creación y proceso de dar nombre a objetos de clases. tipo_base [ ] nombre_arreglo = new tipo_base[longitud]; 13 Ejemplos char [ ] linea = new char[80]; double [ ] calificaciones = new double[400]; Alumno [ ] listas = new Alumno[120]; Los arreglos linea y calificaciones son de tipo char y double, mientras que listas es una arreglo de tipo Alumno (Alumno es una clase). La longitud de un arreglo (array) o número de elementos del mismo se calcula utilizando la sentencia arreglo.length. Regla • Una vez que se ha creado un arreglo no se puede cambiar su tamaño, aunque sí, lógicamente, sus elementos individuales. • Si se necesita expandir el tamaño de un arreglo mientras se ejecuta un programa, se debe utilizar una estructura de datos diferentes que en Java 5 y versiones posteriores se denomina lista de arreglos. Acceso a los elementos de un arreglo El acceso a los elementos de un arreglo se realiza de igual modo que en otros lenguajes de programación. arreglo[índice] Ejemplo nombres[3]; lista[5]; a[a.length − 1]; Arreglos y objetos En Java un arreglo (array) es considerado un objeto. Esto significa que se pueden considerar los tipos arreglos como clases. Sin embargo, aunque un arreglo de tipo double[ ] es una clase, la sintaxis para crear un objeto arreglo es un poco diferente. Para crear un arreglo, se utiliza la sintaxis: double [ ] m = new double[10]; Inicialización de arreglos y arreglos anónimos Java tiene un formato especial abreviado para crear un objeto arreglo e inicializar el mismo, sin recurrir a la llamada a new. La sintaxis es: int [ ] numPrimos = {1,3,5,7,11,13,17,19}; En Java, existe la posibilidad de crear objetos y clases anónimas, y en particular arreglos anónimos. Cuando una expresión como: new DemoClase("Paloma",19); no se asigna a una variable se conoce como un objeto anónimo. La expresión crea una referencia a un objeto de la clase. Se denomina anónimo debido a que el objeto no se asigna a una variable para ser referenciada por su nombre. Es el caso de un arreglo, se puede inicializar un arreglo anónimo con la siguiente declaración new int[ ] {1,3,5,7,9}; Esta expresión asigna un arreglo nuevo y lo rellena con los valores internos a las llaves. Cuenta el número de valores iniciales y establece el tamaño correspondiente del arreglo. 14 Arreglos (arrays) multidimensionales Los arreglos multidimensionales, como conoce el lector, utilizan más de un índice para acceder a los elementos de dicho arreglo. La declaración de un arreglo de dos dimensiones en Java es muy sencilla: char [ ][ ]pagina = new char[50][80]; o su equivalente, no abreviado: char [ ][ ]pagina; pagina = new char[50][80]; Sintaxis La declaración y creación de un arreglo multidimensional es: tipo_base [ ]..[ ] nombre_arreglo = new tipo_base[lon_1]..[lon_n]; donde lon_1, lon_2, .. son las longitudes de cada dimensión. Arreglos irregulares o triangulares En Java es relativamente fácil crear arreglos irregulares, de modo que filas diferentes puedan tener distintos números de columnas, al contrario de los arreglos regulares en los que cada fila tiene igual número de columnas.Así, por ejemplo, se pueden crear del siguiente modelo del binomio de Newton. Ejemplo Crear un arreglo regular num de 3 filas y 5 columnas. Su sintaxis es double [ ][ ] num = new double[3][5]; Listas de arreglos (ArrayList) Los arreglos son una construcción básica. En esta sección se explica la clase ArrayList que le permite reunir (coleccionar) objetos como si fueran tipos de datos básicos. La lista de arreglos ofrece dos ventajas: • La lista de arreglos puede crecer y reducirse a medida que se necesita. • La clase ArrayList proporciona métodos para muchas tareas comunes, como inserción y eliminar elementos. La clase ArrayList es una clase genérica: ArraaList<T> reúne objetos de tipo genérico T. Ejemplo 1. Cantidad [ ] numeros = {5.0,4.5,7.5,14.0}; ArrayList<Cantidad> listaArticulos = new ArraList<Cantidad>( ); Creación, e inicialización de una lista de arreglos Cantidad. PROGRAMACIÓN ORIENTADA A OBJETOS Declaración de una clase Formato class NombreClase { lista_de_miembros } 15 NombreClase Nombre definido por el usuario que identifica a la clase (puede incluir letras, números y subrayados como cualquier identificador válido). Lista_de_miembros métodos y datos miembros de la clase. Definición de una clase llamada Punto que contiene las coordenadas x y y de un punto en un plano. class Punto { private int x; // coordenada x private int y; // coordenada y public Punto(int x_,int y_) // constructor { x = x_; y = y_; } public Punto( ) // constructor sin argumentos { x = y = 0; } public int leerX( ) // devuelve el valor de x { return x; } public int leerY( ) // devuelve el valor de y { return y; } void fijarX(int valorX) // establece el valor de x { x = valorX; } void fijarY(int valorY) // establece el valor de y { y = valorY; } } Objetos Una vez que una clase ha sido definida, un programa puede contener una instancia de la clase, denominada un objeto de la clase. Un objeto se crea con el operador new aplicado a un constructor de la clase. Un objeto de la clase Punto inicializado a las coordenadas (2,1): new Punto(2,1); El operador new crea el objeto y devuelve una referencia al objeto creado. Esta referencia se asigna a una variable del tipo de la clase. El objeto permanecerá vivo siempre que esté referenciado por una variable de la clase que es instancia. Formato para definir una referencia NombreClase varReferencia; Formato para crear un objeto 16 varReferencia = new NombreClase(argmntos_constructor); Toda clase tiene uno o más métodos, denominados constructores. Para inicializar el objeto cuando es creado, tienen el mismo nombre que el de la clase, no tienen tipo de retorno y pueden estar sobrecarga- dos. En la clase Edad del ejemplo 22.2 el constructor no tiene argumentos, se puede crear un objeto: Edad f = new Edad( ); El operador de acceso a un miembro (.) selecciona un miembro individual de un objeto de la clase. Por ejemplo: Punto p; p = new Punto( ); P.fijarX (100); System.out.println (" Coordenada x es " + P.leerX( ) ); Visibilidad de los miembros de la clase Un principio fundamental en programación orientada a objetos es la ocultación de la información, que significa que no se puede acceder a determinados datos del interior de una clase por métodos externos a la clase. El mecanismo principal para ocultar datos es ponerlos en una clase y hacerlos privados. A los datos o métodos privados solo se puede acceder desde dentro de la clase. Por el contrario, los datos o métodos públicos son accesibles desde el exterior de la clase. Para controlar el acceso a los miembros de la clase se utilizan tres diferentes especificadores de acceso: public, private y protected. Cada miembro de la clase está precedido del especificador de acceso que le corresponde. Formato y secciones pública y privada de una clase class NombreClase { private declaración miembro privado; // miembros privados protected declaración miembro protegido; // miembros protegidos declaración miembro público; // miembros públicos } No accesible desde el exterior de la clase (acceso denegado) Accesible desde el exterior de la clase Métodos de una clase Los métodos en Java siempre son miembros de clases, no hay métodos o funciones fuera de las clases. La implementación de los métodos se incluye dentro del cuerpo de la clase. La figura siguiente muestra la declaración completa de una clase. métodos métodos 17 Implementación de las clases El código fuente de la definición de una clase, con todos sus métodos y variables instancia se almacenan en archivos de texto con extensión.java y el nombre de la clase, por ejemplo Racional.java. Normalmente, se sitúa la implementación de cada clase en un archivo independiente. Las clases pueden proceder de diferentes fuentes: • Se pueden declarar e implementar sus propias clases. El código fuente siempre estará disponible; pueden estar organizadas por paquetes. • Se pueden utilizar clases que hayan sido escritas por otras personas o incluso que se han comprado. En este caso, se puede disponer del código fuente o estar limitado a utilizar el bytecode de la implementación. Será necesario disponer del paquete donde se encuentran. • Se puede utilizar clases de los diversos packages que acompañan a su software de desarrollo Java. Clases públicas La declaración de una clase puede incluir el modificador public como prefijo en la cabecera de la clase. El especificador public es el único que se puede especificar en la cabecera de una clase. Por ejemplo: public class Examen { // miembros de la clase } Paquetes Los paquetes es la forma que tiene Java de organizar los archivos con las clases necesarias para construir las aplicaciones. Java incorpora varios paquetes, por ejemplo, java.lang, java.io, o java.util con las clases básicas para construir programas: System, String, Integer, Scanner ... ¿Cómo se puede definir un paquete?, la sentencia package se utiliza para este cometido. En primer lugar, se debe incluir la sentencia package como primera línea del archivo fuente de cada una de las clases del paquete. Por ejemplo, si las clases Lapiz, Boligrafo y Folio se van a organizar formando el paquete escritorio, el esquema a seguir es el siguiente: // archivo fuente Lapiz.java package escritorio; public class Lapiz { // miembros de clase Lapiz } // archivo fuente Boligrafo.java } public Producto(int n,char [ ] nom,char [ ] des,double p,int nu) { } public void verProducto ( ) {...} public double obtenerPrecio ( ){...} public void actualizarProd(int b) {...} métodos nombre de la clase acceso para almacenamiento de datos declaraciones para almacenamiento de datos class Producto { private int numProd; private String nomProd; private String descripProd; private double precioProd; private int numUnidades; public Producto ( ) {...} 18 package escritorio; public class Boligrafo { // miembros de clase Boligrafo } // archivo fuente Folio.java package escritorio; public class Folio { // miembros de clase Folio } Formato package NombrePaquete; Import Las clases que se encuentran en los paquetes se identifican utilizando el nombre del paquete, el selector punto (.) y a continuación el nombre de la clase. Por ejemplo, la declaración de la clase Arte con atributos de la clase PrintStream (paquete java.io) y Lapiz (paquete escritorio): public class Arte { private java.io.PrintStream salida; private escritorio.Lapiz p; } La sentencia import facilita la selección de una clase, permite escribir únicamente su nombre, evitando el nombre del paquete. La declaración anterior se puede abreviar: import java.io.PrintStream; import escritorio.*; public class Arte { private PrintStreamsalida; private Lapiz p; } La sentencia import debe aparecer antes de la declaración de las clases, a continuación de la sentencia package. Tiene dos formatos: Formato import identificadorpaquete.nombreClase; import identificadorpaquete.*; Constructores Un constructor es un método que se ejecuta automáticamente cuando se crea un objeto de una clase. Sirve para inicializar los miembros de la clase. El constructor tiene el mismo nombre que clase. Cuando se define no se puede especificar un valor de retorno, nunca devuelve un valor. Sin embargo, puede tomar cualquier número de argumentos public class Rectangulo { private int izdo; 19 private int superior; private int dcha; private int inferior; // constructor public Rectangulo(int iz, int sr, int d, int inf) { izdo = iz; superior = sr; dcha = d; inferior = inf; } // definiciones de otros métodos miembro } Al crear un objeto se pasan los valores de los argumentos al constructor, con la misma sintaxis que la de llamada a un método. Por ejemplo: Rectangulo Rect = new Rectangulo(25, 25, 75, 75); Constructor por defecto Un constructor que no tiene parámetros se llama constructor por defecto. Un constructor por defecto normalmente inicializa los miembros dato de la clase con valores en forma predeterminada. Constructores sobrecargados Al igual que se puede sobrecargar un método de una clase, también se puede sobrecargar el constructor de una clase. De hecho los constructores sobrecargados son bastante frecuentes, proporcionan diferentes alternativas de inicializar objetos. Clase Object Object es la superclase base de todas las clases de Java; toda clase definida en Java hereda de la clase Object y en consecuencia toda variable referencia a una clase se convierte, automáticamente, al tipo Object. Por ejemplo: Object g; String cd = new String("Barranco la Parra"); Integer y = new Integer(72); // objeto inicializado a 72 g = cd; // g referencia al mismo objeto que cd g = y; // g ahora referencia a un objeto Integer La clase Object tiene dos métodos importantes: equals( ) y toString( ). Generalmente, se rede- finen en las clases para especializarlos. HERENCIA Y POLIMORFISMO Clases derivadas La herencia o relación es-un, es la relación que existe entre dos clases, una es la clase denominada derivada que se crea a partir de otra ya existente, denomina- da clase base. La nueva clase hereda de la clase ya existente. Por ejemplo, si existe una clase Figura y se desea crear una clase Triángulo, esta clase puede derivarse de Figura ya que tendrá en común con ella un estado y un comportamiento, aun- que luego tendrá sus características propias. Triángulo es-un tipo de Figura. Otro ejemplo, puede ser Programador que es-un tipo de Empleado. La declaración de derivación de clases debe incluir la palabra reservada extends y a continuación el nombre de la clase base de la que se deriva. El formato de la declaración es: class nombre_clase extends nombre_clase_base 20 Declaración de las clases Programador y Triangulo 1. class Programador extends Empleado { public miembro público // miembros públicos private miembro privado // miembros privados } 2. class Triangulo extends Figura { public // miembros públicos protected // miembros protegidos … } Clase derivada Director y clase base Empleado class Director extends Empleado { public nuevo método ... private nuevo miembro ... } Declaración de una clase derivada La sintaxis para la declaración de una clase derivada es la siguiente: } Sobrecarga de métodos en la clase derivada La sobrecarga de métodos se produce cuando al definir un método en una clase tiene el mismo nombre que otro de la misma clase pero distinto número o tipo de argumentos. En la sobrecarga no interviene el tipo de retorno. La siguiente clase tiene métodos sobrecargados: class Ventana { public void copiar(Ventana w) {...} public void copiar(String p, int x, int y) {...} ] Herencia pública En una clase existen secciones públicas, privadas, protegidas y la visibilidad por defecto que se denomina amigable. Java considera que la herencia es siempre pública. Herencia pública significa que una clase derivada tiene acceso a los elementos públicos y protegidos de su clase base, los elementos con visibilidad amigable son accesibles desde cualquier clase del mismo paquete, no son visibles en clases derivadas de otros paquetes. 21 Una clase derivada no puede acceder a variables y métodos privados de su clase base. Una clase base utiliza elementos protegidos para de esa manera ocultar los detalles de la clase respecto a clases no derivadas de otros paquetes (véase tabla 23.1). Las clases para ser visibles desde otro paquete se declara con el modificador public, en caso contra- rio la clase está restringida al paquete donde se declara. Constructores en herencia Un objeto de una clase derivada consta de la porción correspondiente de su clase base y de los miembros propios. En consecuencia, al construir un objeto de clase derivada primero se construye la parte de su clase base, llamando a su constructor, y a continuación se inicializan los miembros propios de la clase derivada. Polimorfismo En POO, el polimorfismo permite que diferentes objetos respondan de modo distinto al mismo mensaje. El polimorfismo adquiere su máxima potencia cuando se utiliza en unión de herencia. El polimorfismo se establece con la ligadura dinámica de métodos. Con la ligadura dinámica no es preciso decidir el tipo de objeto hasta el momento de la ejecución El polimorfismo se puede representar con un array de elementos que se refieren a objetos de diferentes tipos (clases). Uso del polimorfismo La forma de usar el polimorfismo es a través de referencias a la clase base. Si, por ejemplo, se dispone de una colección de objetos Archivo en un arreglo, este almacena referencias a objetos Archivo que apuntan a cualquier tipo de archivo. Cuando se actúa sobre estos archivos, simplemente basta con recorrer el arreglo e invocar al método apropiado mediante la referencia a la instancia. Naturalmente, para realizar esta tarea los métodos de la clase base deben ser declarados como abstractos en la clase Archivo, que es la clase base, y redefinirse en las clases derivadas (ASCII, Grafico…). Para poder utilizar polimorfismo en Java se deben seguir estas reglas: 1. Crear una jerarquía de clases con las operaciones importantes definidas por los métodos miembro declarados como abstractos en la clase base. 2. Las implementaciones específicas de los métodos abstractos se deben hacer en las clases derivadas. Cada clase derivada puede tener su propia versión del método. Por ejemplo, la implementación del método annadir ( ) varía de un tipo de archivo a otro. 3. Las instancias de estas clases se manejan a través de una referencia a la clase base. Este mecanismo es la ligadura dinámica y es la esencia de polimorfismo en Java. Realmente no es necesario declarar los métodos en la clase base abstractos si después se redefinen (misma signatura) en la clase derivada
Compartir