Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UNIVERSIDAD AUTONOMA DE SINALOA FACULTAD DE INFORMÁTICA DE MAZATLAN PROGRAMACIÓN I (Lenguaje JAVA) TITULAR DE LA MATERIA: DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ INTRODUCCION AL LENGUAJE JAVA. Conceptos Básicos. El lenguaje Java nace en 1991 en Sun Microsystems Inc. Es un lenguaje derivado de C y C++. Fue creado por James Gosling, Patrick Naughton, Chris Warth, Ed Frank y Mike Sheridan. Originalmente se llamó “Oak”, en 1995 cambió su nombre a Java. La intención era crear un lenguaje de programación para desarrollar software para diversos dispositivos electrónicos como hornos de microondas y controles remotos, se buscaba un lenguaje de programación que fuera independiente de la plataforma y que se pudiese ejecutar en distintos tipos de CPUs bajo diferentes entornos. Actualmente, una de las principales aplicaciones de Java es en Internet, ya que un programa en java puede “correrse”, independientemente del sistema operativo o del navegador. La primera versión comercial de Java se lanzó en 1997 y se denominó JDK 1.1. En diciembre de 1998 Sun lanzó la plataforma Java 2, la cual se conoció originalmente como JDK 1.2. La principal característica de Java es el byte-code (o código de bytes), esto significa que el código fuente Java se "compila" a un código de bytes de alto nivel independiente de la máquina. Este código, llamado bytecode, está diseñado para ser interpretado y ejecutarse en una máquina hipotética, llamada Máquina Virtual de Java o JVM (Java Virtual Machine). Para desarrollar programas en Java, es necesario contar con un entorno de desarrollo, el más común es el Java Development Kit (JDK). Computadora Sistema Operativo Máquina Virtual Java Programa en Java Las características principales que nos ofrece Java con respecto a cualquier otro lenguaje de programación, son: a) Sencillo. b) Orientado a objetos. c) Distribuido. d) Robusto. e) Arquitectura neutra. f) Seguro. g) Portable. h) Multihilo. i) Interpretado. j) Dinamico El entorno de desarrollo JAVA. El entorno habitual para desarrollar programas en Java consiste en un navegador que pueda ejecutar applets, un compilador que convierta el código fuente Java a bytecode y el intérprete Java para ejecutar los programas. También se necesita un editor para escribir el código fuente, y aunque no son estrictamente necesarias otras herramientas como el debugger, un entorno visual, la documentación o un visualizador de jerarquía de clases, es conveniente contar con todas o algunas de ellas cuando se trata de desarrollar proyectos de aplicaciones. Actualmente hay entornos completos de desarrollo integrados para Java diferentes del JDK, que hasta el momento es el entorno básico de Java que proporciona Sun. Está formado por herramientas en modo texto, que son: java, intérprete que ejecuta programas en bytecode. javac, compilador de Java que convierte el código fuente en bytecode. javah, crea archivos de cabecera para implementar métodos para cualquier clase. javap, es un descompilador de bytecode a código fuente Java. javadoc, es un generador automático de documentos HTML a partir del código fuente Java. Para más información, o descargar una versión actualizada de Java, puede hacerlo en la siguiente dirección: http://www.oracle.com/technetwork/java/javase/downl oads/ index.html jGRASP Debido al nivel básico de programación que trabajaremos (aplicaciones), nosotros utilizaremos el el jGRASP, entorno de programación Java desarrollado por la Universidad de Auburn, de licencia libre y que permite el desarrollo de aplicaciones (programas) y applets. Permite el desarrollo de aplicaciones en C, C++, Java y ADA, pero cuenta con más opciones. En la parte inferior tiene una ventana que muestra durante el proceso de compilación, los errores encontrados durante la misma (ceja: Compile Messages), si es que los hay. Al momento de “correr” el programa, la misma ventana permite mostrar la ejecución de programa y en la cual se capturan los datos y se muestran los resultados, ceja: (Run I/O). En la parte superior cuenta con un menú de opciones que nos permite abrir, cerrar, imprimir y guardar archivos; editar, copiar y pegar texto; compilar y correr aplicaciones o applets, etcétera. Del lado izquierdo, tiene una ventana que muestra el directorio de trabajo y cuenta con opciones para depurar el programa. Esta versión puede obtenerse en la siguiente dirección: http://www.jgrasp.org/ Aplicaciones y applets . Los programas en Java se dividen en dos tipos o categorías: aplicaciones y applets. Las aplicaciones son programas hechos en lenguajes de alto nivel y que funcionan en una computadora bajo un sistema operativo. Un programa en Java requiere de la Máquina Virtual de Java para ser ejecutado. Las aplicaciones se usan para resolver diversos problemas y pueden agruparse para formar sistemas, así, existen sistemas para inventarios, nómina, control escolar, etcétera. Un applet , es un programa diseñado para ser transmitido por Internet y ejecutado en un navegador Web compatible con Java. Los applets tienen algunas limitaciones ya que necesitan de ciertas condiciones de seguridad para evitar daños en el sistema en el que está funcionando el navegador. Creación de programas en Java. Java es un lenguaje de alto nivel que permite realizar programas transportables o portátiles. La transportabilidad o portabilidad significa que es posible adaptar el software escrito para un tipo de computadora en otra, por ejemplo, si un programa escrito para una Apple Macintosh se puede llevar sin cambio a una IBM PC, entonces el programa es transportable. Como todos los programas, los programas en Java casi siempre pasan a través de las siguientes fases para su ejecución: a) Editar. b) Compilar. c) Enlazar. d) Cargar. e) Ejecutar. Un programa compilado con éxito, puede ejecutarse por un intérprete tantas veces como se desee sin necesidad de compilarse de nuevo. Un ejemplo típico de un programa en Java es el siguiente: /* Hola.java */ class Hola { public static void main (String args[ ]) { System.out.println ("Hola!... Este es mi primer programa en Java"); } } Para entender la estructura del programa, primero debemos conocer lo conceptos de la programación orientada a objetos (POO), lo cual veremos a continuación. PROGRAMACIÓN ORIENTADA A OBJETOS. Conceptos Básicos. La programación orientada a objetos (POO) es un estilo de programación. El elemento principal es el objeto. Objeto. Es un conjunto complejo de datos y programas que poseen estructura y forman parte de una organización . También podemos definirlo como una encapsulación de un conjunto de datos y los métodos para manipularlos . Los mecanismos básicos de la programación orientada a objetos son: a) Los objetos . Un objeto es una encapsulación genérica de datos y de los procedimientos para manipularlos. En tanto que los programas tradicionales (estructurados y modulares) se componen de procedimientos y de datos. Los programas orientados a objetos se componen exclusivamente de objetos. Un objeto contiene operaciones (métodos) que definen su comportamiento y variables (datos), manipuladas por esas operaciones, las cuales definen el estado del objeto. b) Los mensajes . Los objetos reciben, interpretan y responden a mensajes de otros objetos. El paso de mensajes entre objetos sustituye al flujo de control tradicional, ya que los mensajes originan cambios en el estado del objeto. Cuando un objeto recibe un mensaje, debe conocer perfectamente lo que tiene que hacer, y cuando un objeto envía un mensaje, no necesita conocer cómo se desarrolla, sino simplemente que se está desarrollando. c) Los métodos. Un método es un conjunto de instrucciones y equivalen a las funciones o procedimientos de la programación estructurada y modular. Los métodos se implementan dentro de una clase y determinan cómo debe actuar el objeto cuando recibe un mensaje. Dentro de los métodos se pueden declarar y usar variables que se conocen como variables asociadas o atributos, las cuales permiten almacenar informaciónpara dicho objeto. Un método también puede enviar mensajes a otros objetos solicitando una acción o información. La estructura más interna de un objeto está oculta para otros usuarios (esto se conoce como encapsulamiento) y la única conexión que tiene con el exterior son los mensajes. Los atributos (datos) que oculta un objeto, solamente pueden ser manipulados por los métodos asociados al propio objeto. d) Las clases . Una clase puede ser considerada como un formato o plantilla para crear objetos, los cuales serán de esa clase o tipo. Una clase describe los métodos y atributos que definen las características comunes a todos los objetos de esa clase. De esta manera, la clave de la programación orientada a objetos, consiste en abstraer (o visualizar de forma muy general) los métodos y atributos comunes a un conjunto de objetos y encapsularlos en una clase. e) Las subclases . Las subclases, son clases derivadas de una clase en particular. objeto mensajes métodos atributos CARACTERÍSTICAS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS. Las características fundamentales de la programación orientada a objetos (POO) son: 1) Abstracción . Abstraer significa: “separar mentalmente”. En programación, la abstracción consiste en la generalización conceptual de los atributos y propiedades de un determinado conjunto de objetos. De esta manera, la clave de la programación orientada a objetos está en abstraer los métodos y los datos comunes a un conjunto de objetos y almacenarlos en una clase. 2) Encapsulamiento . Se refiere a la práctica de incluir dentro de un objeto todo lo que necesita, de forma que ningún otro objeto pueda conocer nunca su estructura interna. 3) Herencia . La herencia es el mecanismo mediante el cual se comparten y derivan, métodos y atributos entre clases y subclases. Clase: Mobiliario Alta Baja Consulta Modificación Costo Dimensiones Peso Localización Color Objeto: silla Alta Baja Consulta Modificación Costo Dimensiones Peso Localización Color Objeto: sillón Alta Baja Consulta Modificación Costo Dimensiones Peso Localización Color Los objetos heredan todos los atributos y operaciones de la clase. 4) Polimorfismo . Polimorfismo significa: “muchas formas”. En la programación orientada a objetos, esta característica permite implementar múltiples formas de un mismo método, dependiendo cada una de ellas, de la clase sobre la que se realice la implementación. De esta manera se puede acceder a una variedad de métodos distintos (todos con el mismo nombre) utilizando exactamente el mismo medio de acceso. objeto mensajes métodos atributos objeto mensajes métodos atributos objeto mensajes métodos atributos Estructura de un programa en Java. <sentencia(s) import > Declaración para importar clases de paquetes. [protección ] class NombreClase { <Variables miembro de la clase (atributos)> < [modificador ] tipo_devuelto método1 ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } • • • Definición de métodos (operaciones) dentro de la clase. [modificador ] tipo_devuelto métodoN ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } > < public static void main ( String args [ ] ) Método principal. { Declaración de variables locales Sentencias ejecutables } > } 1. Sentencias import . Las clases en Java se agrupan en paquetes. Los paquetes se encuentran en directorios de disco que tienen el mismo nombre que el paquete. Para importar una clase de un paquete desde un programa se utiliza la sentencia import . En un programa en Java, pueden aparecer cualquier número de sentencias import , las cuales deben escribirse antes de cualquier definición de clase. La sintaxis general de la sentencia import es la siguiente: import nombrePaquete .nombreClase ; Ejemplo: Importa las clases que puedan ocuparse para operaciones de entrada/salida del paquete java.io. import java.io.*; Importa la clase System del paquete java.lang.import java.lang.System; 2. Declaración de clases y nombre del programa. Todo programa en Java está conformado por clases. Un programa debe contener al menos una clase, la cual puede ser considerada como la clase principal, puede contener el método main() e incluso otros métodos y variables. Una clase es un tipo definido por el usuario que describe los atributos y los métodos de los objetos que se crearán a partir de la misma. La declaración de una clase puede empezar con una palabra clave que es un modificador de protección que generalmente indica el acceso y es opcional; a continuación sigue el indicador de clase, la palabra reservada class ; después sigue el nombre de la clase y los miembros de la clase: variables y métodos; el convenio general entre los programadores para dar nombre a las clases, es comenzar el nombre de la clase con una letra mayúscula. El archivo en el cual se guarda el código debe tener exactamente el mismo nombre de la clase, respetando mayúsculas y minúsculas. Cada definición de una clase Java deberá estar en un archivo. Protección de una clase . La protección de una clase determina la relación que tiene con otras clases de otros paquetes. Existen dos niveles de protección: de paquete y público. Una clase con nivel de protección de paquete sólo puede ser utilizada por las clases de su paquete. Esto se logra definiendo el tipo de acceso que puede ser privado (private ) o protegido (protected ). Un miembro declarado private es accesible solamente por los métodos de su propia clase. Esto significa que no puede ser accedido por los métodos de cualquier clase, incluidas las subclases. Un miembro declarado protected se comporta exactamente igual que uno privado para los métodos de cualquier otra clase, excepto para los métodos de las clases del mismo paquete o de sus subclases, independientemente del paquete al que pertenezcan, para las que se comporta como un miembro público. Por otra parte, una clase pública puede ser utilizada por cualquier otra clase de otro paquete. Así, un miembro declarado public está accesible para cualquier otra clase o subclase que necesite utilizarlo. Por omisión, una clase tiene el nivel de protección de paquete, cuando se desee que una clase tenga protección pública, hay que calificarla como tal utilizando la palabra reservada public . Así mismo, los atributos static de la clase generalmente son declarados públicos. 3. Variables miembro de la clase (atributos). Los miembros dato de una clase se definen como variables de instancia. Estas variables pueden ser de cualquier tipo primitivo (int, char, byte, float, double, etc.), arreglos, cadenas, etcétera. Toda variable debe ser definida antes de ser utilizada. La definición de una variable, declara la variable y además le asigna memoria. La sintaxis es la siguiente: acceso nombreTipo nombreVariableInstancia ; Los métodos de la clase y los de las clases del mismo paquete pueden acceder a la variable. por omisión Sólo los métodos de la clase pueden acceder a la variable.private Los métodos de la clase, los métodos de las clases del mismo paquete pueden acceder a la variable y también los métodos de las clases derivadas. protected Se puede acceder a la variable desde cualquier método.public Puede ser public, protected, private; o bien, el acceso por defecto o por omisión. acceso 4. Definición de métodos (operaciones). [ método1, método2, ..., métodoN ] Un método es un conjunto de sentencias que ejecutan una tarea específica. En Java, un método siempre pertenece a una clase y su definición nunca puede contener la definición de otro método, esto significa que no se pueden tener métodos anidados. Todos los métodos tienen nombre y una lista de datos o valores que reciben, llamados parámetros o argumentos. La definición de un método consta de dos partes: la cabecera y cuerpo del método. La sintaxis para definir un método es la siguiente: [modificador ] tipo_devuelto método ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables returnexpresión; // No se escribe si el método es de tipo void . } modificador Es una palabra clave que especifica desde donde puede ser llamado el método. Existen cuatro niveles de acceso: public, protected, private o por omisión, que son los mismos definidos en la declaración de variables. tipo_devuelto Especifica el tipo de dato devuelto por el método. Éste puede ser cualquier tipo primitivo o referenciado. Para indicar que un método no devuelve nada se utiliza la palabra reservada void , en este caso se omite la sentencia return o se escribe sola, sin ninguna expresión. método El nombre de un método puede ser cualquier identificador válido, pero no puede ser una palabra reservada Java. Entre los programadores se tiene el convenio de que la primera letra del nombre del método se escribe con minúsculas. Un método puede tener palabras reservadas asociadas como: static, abstract y final. Lista de parámetros La lista de parámetros de un método son las variables que reciben los valores de los argumentos especificados cuando se llama o invoca. Estos pueden ser: cero, uno o más identificadores con sus tipos, separados por comas. Aunque los identificadores sean del mismo tipo, cada uno debe ser antecedido por su tipo. 5. Método main( ). Todos los programas de aplicación de Java inician su ejecución llamando al método main() . Esto significa que main() es el punto de entrada a la aplicación, y también su punto de salida. Cada programa de aplicación en Java tiene un método main() y solo uno, si tiene más de un main() se produce un error, aunque estén en diferentes clases. Las clases de Java no necesariamente deben tener un método main() , a menos que esa clase sea el punto de comienzo del programa. El método main() se define de la siguiente manera: public static void main ( String args [ ] ) { Declaración de variables locales Sentencias ejecutables } Identificadores. Un identificador es una secuencia de caracteres, letras, dígitos, el guión bajo o subrayado y el símbolo $. El primer carácter debe ser una letra, un símbolo de subrayado o el símbolo $. Los caracteres siguientes pueden ser letras, números o símbolos de subrayado y no deben contener espacios en blanco o caracteres especiales. En un identificador, las letras minúsculas y las mayúsculas son consideradas como diferentes, El nombre de un identificador no debe ser igual que una palabra reservada. Como recomendación para escribir identificadores tenemos: 1. Escribir identificadores de variables en letras minúsculas. 2. Nombres de constantes en mayúsculas. 3. Los nombres de métodos con tipo de letra mixto: mayúscula/minúscula. 4. Los identificadores de clases con el primer carácter en mayúsculas. Palabras reservadas. Una palabra reservada no puede ser usada como nombre de identificador, clase, objeto o método. Todas las palabras reservadas están en minúsculas y deben escribirse tal como se indican. A continuación se presenta la lista de palabras reservadas: else interface super double do default continue const class char catch cast case byvalue byte break boolean abstract int instanceof inner import implements if goto generic future for float finally final false extends strictfp static short rest return public protected private package outer operator null new native long widefp while volatile void var try true transient throws throw this synchronized switch Líneas de programa. En Java se utiliza el carácter de punto y coma (;) para indicar el fin de una sentencia. Se pueden colocar varias sentencias en una línea siempre y cuando se separen con puntos y comas. Así mismo, un bloque es un conjunto de sentencias con un punto y coma después de cada una de ellas y van encerradas entre llaves { } . Comentarios. Un comentario es un texto que explica una instrucción o una función, se sitúa en cualquier parte del programa y es ignorado por el compilador. Estos comentarios pueden ser tan largos como se desee y son una parte importante de la documentación de un programa, ya que ayudan al programador y a otras personas a la comprensión del mismo. Formato: Comentario tradicional, para más de una línea /* comentario */ Comentario de una sola línea // comentario TIPOS DE DATOS. Todos los datos tienen un tipo asociado con ellos. El tipo de un dato determina el conjunto de valores que puede tomar una variable tomando en cuenta la representación interna de los números o el espacio de memoria ocupado por una variable de un tipo dado. La unidad de medida de la capacidad de memoria es el byte (octeto); un byte se compone de ocho dígitos binarios (bits) que pueden tomar cada uno el valor 0 ó 1. Clasificación de los tipos de datos: En Java, los tipos de datos básicos o primitivos son: A) Enteros. B) Reales. C) Caracteres. D) Lógicos o Booleanos. A) Tipos Enteros. Los tipos enteros de datos son: a) byte. (octeto - 1 byte). El tipo byte es utilizado para almacenar valores enteros en el rango de -128 a +127. Ejemplos: byte a, i, j; b) short. (entero formato corto - 2 bytes). El tipo short , se define como un dato de 16 bits de longitud, independientemente de la plataforma en la que resida el bytecode de java. Proporciona números enteros en el rango de valores: short -32,768 .. +32,767 Ejemplos: short i, j; short a = -500; c) int. (entero - 4 bytes). Un valor int se define como un dato de 32 bits de longitud, independientemente de la plataforma en la que resida el bytecode de java. El rango de valores es de: int -2,147’483,648 .. +2,147’483,647 Ejemplos: int n, x; int a = 2000; d) long. (entero formato largo - 8 bytes). Son números sin punto decimal en formato largo. Un valor long se define como un dato de 64 bits de longitud, independientemente de la plataforma en la que resida el bytecode de java. Están comprendidos en el rango de: long -9’223,372’036,854’775,808 .. +9’223,372’036,854’775,807 Ejemplos: long n, m; long a = 2500000; B) Tipos Reales. Los tipos de datos reales son aquellos que representan al conjunto de los números reales. Los números reales se pueden representar en dos formas: 1. Notación científica o de punto (coma) flotante. El área ocupada por un número real se divide en dos zonas: mantisa y exponente. mantisa: número fraccionario (negativos o positivos) exponente: Potencia de 10 número real = mantisa x 10 exponente Esta notación se utiliza para representar números muy grandes o muy pequeños. En notación decimal los números se escriben en notación exponencial e (e de exponente y significa elevar 10 a la potencia que le sigue). n e ± dd n número decimal (con o sin signo + o -) dd exponente entero (positivo, negativo o cero) Ejemplo: 2.83 x 105 (2.83e+5) 2. Notación en punto fijo. Expresa el número real con un punto decimal. Ejemplo: 3.1416 a) float. (reales en simple precisión - 4 bytes). Estos números son los más comúnmente usados en un lenguaje de programación. Un real en simple precisión es un número que puede tener un punto decimal y que puede estar comprendido en el rango de: -3.402823E+38 .. -3.402823E-38 para números negativos 3.402823E-38 .. 3.402823E+38 para números positivos El tipo float se utiliza para declarar un dato real de 32 bits en el formato IEEE 754 (1 bit para el signo, 8 bits para el exponente y 23 para la mantisa). Un número real en simple precisión tiene 7 dígitos significativos. Ejemplos: float x; float a = 3.14159F; float b = 2.2e-5F; b) double. (reales en doble precisión - 8 bytes). Un número real en doble precisión es un número que puede tener un punto decimal y que puede estar comprendido en el rango de: -1.79769E+308 .. -1.79769E-308 para números negativos 1.79769E-308 .. 1.79769E+308 para números positivos El tipo double se utiliza para declarar un dato real de 64 bits en el formato IEEE 754 (1 bit para el signo, 11 bits para el exponente y 52 para la mantisa). Un número real en doble precisión tiene hasta 16 dígitos significativos, lo cual permite cálculos más precisos que con los reales de simple precisión.Ejemplos: double x; double a = 3.1415926; double b = 2.2e-18; C) Tipos Carácter. (caracteres o enteros – 2 bytes). El tipo carácter o char se utiliza para declarar datos enteros en el rango de \u0000 a \uFFFF en Unicode (0 a 65535). Los valores de 0 a 127 (\u0000 a \u00FF) corresponden con los caracteres del código ASCII, los cuales conforman una parte muy pequeña del juego de caracteres Unicode. También acepta los caracteres del código ASCII ampliado (127 a 255). Debido a que Java fue diseñado con el objeto de poder ser utilizado en cualquier país, independientemente del tipo de alfabeto, para representar los caracteres en Java se utilizó el estándar Unicode, que maneja más de 30,000 caracteres distintos de la mayoría de los idiomas escritos conocidos en todo el mundo. El código Unicode, es un código de 16 bits (esto significa que cada carácter ocupa 2 bytes) creado con el único fin de internacionalizar el lenguaje. Internamente, los caracteres se almacenan como números. La letra ‘A’, se almacena como el número 65 y la ‘a’ como el 97. Por este motivo, se pueden realizar operaciones aritméticas con datos de tipo char . Ejemplos: char c; char car = ‘a’; char car = 97; D) Tipos Lógicos o Booleanos. El tipo 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 de una expresión booleana son true y false , verdadero y falso, respectivamente. Las palabras true y false son palabras reservadas en Java. A una variable boolean se le puede asignar el resultado de una expresión condicional, las cuales dan como resultado verdadero o falso. El valor de una variable booleana no se puede convertir a otros tipos, pero si se puede convertir a una cadena de caracteres y si es necesario, se puede visualizar. Ejemplos: boolean bandera; boolean encontrado = true ; boolean intercambio = false ; CONSTANTES. Una constante es un valor que no puede cambiar durante la ejecución del programa. Las constantes pueden ser un número (entero o real), un carácter o una cadena de caracteres. En Java existen dos tipos de constantes: A. Constantes literales . B. Constantes declaradas . A. Constantes literales . Las constantes literales o constantes son las más utilizadas, se llaman así porque toman un valor directo o literal y así se escriben directamente en el programa; se clasifican en cuatro grupos: a) Constantes enteras . b) Constantes reales . c) Constantes carácter . d) Constantes de cadena . a) Constantes enteras . El lenguaje Java permite especificar un entero en base: 10 (decimal), 8 (octal) y 16 (hexadecimal). Si la constante es positiva, el signo más (+) es opcional. Si es negativa, lleva el signo menos (-). El tipo de una constante está determinado por su valor. También se puede añadir un sufijo (en mayúsculas o minúsculas). Si el sufijo es L, su tipo es long. Ejemplo: 1000L constante entera de tipo long Una constante decimal puede tener uno o más dígitos, con valores de 0 a 9, de los cuales el primero de ellos es distinto de cero. No se deben utilizar nunca comas ni otros signos de puntuación en números enteros. Ejemplo: 4326 Una constante octal puede tener uno o más dígitos, con valores de 0 a 7, precedidos por 0 (cero). Ejemplo: 0400 Una constante hexadecimal puede tener uno o más caracteres, con valores de 0 a 9 y de A a F (mayúsculas o minúsculas), precedidos por 0x o 0X (cero más x). Ejemplo: 0x100 b) Constantes reales . Una constante real está formada por una parte entera , seguida por un punto decimal y una parte fraccionaria . También se permite la notación científica, en cuyo caso se añade al valor una e o E, seguida por un exponente positivo o negativo. ParteEntera.ParteFraccionaria[{e/E}{[+]/-}dígitos] Donde dígitos representa cero o más dígitos del 0 al 9 y E o e es el símbolo de exponente de la base 10 que puede ser positivo o negativo (2E-5 = 2x10-5). Si la constante real es positiva no se necesita especificar el signo, pero si es negativa debe llevar el signo menos. Ejemplo: -17.24 17.244283 .008e3 27E-3 Existen dos tipos de constantes reales: float 4 bytes double 8 bytes Una constante real tiene siempre por defecto el tipo double, a no ser que se añada a la misma el sufijo f o F, en cuyo caso será de tipo float. Ejemplo: 17.24F constante real de tipo float En Java existen dos expresiones definidas como constantes las cuales se utilizan cuando se presentan errores con valores numéricos, estas expresiones son: Infinity (infinito) y NaN (Not a Number). Infinity (positivo o negativo), es una constate real que se muestra como resultado de ciertas funciones matemáticas, por ejemplo el logaritmo de cero, cuyo valor es ∞ (infinito). Ejemplo: System.out.println("Log(0) = " + Math.log(0.0)); Muestra: Log(0) = -Infinity Cuando una función o una operación matemática no esta definida para ciertos valores, se dice que esta expresión no es numérica o no es un número (Not a Number o NaN). Ejemplo: System.out.println("Log(-1) = " + Math.log(-1)); Muestra: Log(-1) = NaN c) Constantes carácter . Este tipo de constantes está formado por un único carácter encerrado entre comillas simples (apóstrofes). Estos caracteres forman parte del conjunto universal de caracteres denominado Unicode. Además de los caracteres ASCII, las constantes carácter manejan las secuencias de escape, llamados también caracteres de barra invertida. Ejemplos: ' ' espacio en blanco 'x' letra minúscula x '\n' nueva línea (salto de línea) ‘\r’ retorno de carro '\x001B' carácter ASCII Esc d) Constantes de cadena . Una constante de cadena de caracteres o simplemente de cadena, es un conjunto de caracteres encerrados entre comillas dobles . En Java las cadenas son objetos sin nombre. Ejemplos: "Esto es una constante de caracteres" "3.1415926" "Facultad de Informática de Mazatlán" En el siguiente ejemplo, el carácter \n fuerza a que la cadena: "O pulsar Enter" se escriba en una nueva línea. "Escribir un número entre 1 y 5 \nO pulsar Enter" Cuando una cadena de caracteres es demasiado larga puede utilizarse el carácter "+" como carácter de continuación o de concatenación. "Esta cadena de ”+”caracteres esta “+”concatenada." Esta cadena de caracteres esta concatenada. B. Constantes declaradas . Al igual que otros lenguajes de programación, Java permite la declaración de constantes simbólicas, las constantes se declaran anteponiendo el calificador final . A un objeto declarado como constante no se le puede modificar el valor durante la ejecución del programa, por lo que al declararse debe ser inicializado. El formato general para crear una constante puede ser cualquiera de los dos siguientes: final tipo NombreConstante = ValorConstante; final static tipo NombreConstante = ValorConstante; Cuando una constante se califica con final y static , sólo existirá una copia de la constante para todos los objetos que se declaren de esa clase. Si no se califica con static , cada objeto incluirá su propia copia de la constante. En los métodos, las constantes locales no pueden ser declaradas static . La forma más común de declarar una constante es utilizando únicamente el calificador final , los nombres de constantes declaradas se acostumbra escribirlos con mayúsculas. Ejemplo: final int MAX = 100; final double PI = 3.141592; VARIABLES. Las variables son posiciones de memoria con nombre cuyo valor puede cambiar durante la ejecución del programa, el cambio se produce mediante sentencias ejecutables. El nombre de la posición es un identificador válido y se llama nombre de la variable y el valor almacenado en la posición se llama valor de la variable. Todas las variables de un programa en Java deben ser declaradas antes de ser utilizadas. La declaración consiste en enunciar el nombre de la variable y asociarle un tipo. El tipo determina los valores que puede tomar la variable así como las operaciones que con ella pueden realizarse. La declaración de una variable en Java puede situarse en cualquier parte del programa: a) En una clase, como miembrode la clase. b) Al principio de un método o bloque de código. c) En el lugar en que será utilizada. La sintaxis correspondiente a la declaración de una variable es la siguiente: Formato: tipo Nombre [, Nombre2, Nombre3...]; tipo Determina el tipo de la variable (char , int , float , double , ...). Nombre Indica el nombre de la variable (o variables separadas por comas si son más de una). Ejemplo: int cont, i, posición; char c; float x, y; Las variables miembro de una clase siempre son inicializadas por defecto por el compilador Java para cada objeto que se declare de la misma: las variables numéricas a 0, los caracteres a ‘\0’, las lógicas a false y las referencias a cadenas de caracteres y otros objetos a null . Sin embargo, una variable puede ser inicializada cuando se declara. Ejemplo: char car = '\0'; /* car es igual al carácter nulo */ int i = 1; /* inicializa i a 1 */ float a = 0.0F; /* inicializa a a 0 */ a) Declaración de una variable en una clase, como miembro de la clase. La variable se declara como un miembro de la clase, al mismo nivel que los métodos de la clase. Estas variables están disponibles para todos los métodos de la clase y para todas las clases declaradas en el mismo programa, por lo que puede decirse que una variable de clase es global para esa clase, sus subclases y los programas que definen y utilizan objetos de esa clase. A estas variables se les asigna memoria cuando se crea un objeto de la clase y permanece, hasta que el objeto es liberado automáticamente o termina la ejecución del programa. Se les llama también variables de instancia. Formato: Modificador tipo Nombre; Ejemplo: private int cont, i, posición; Declarada privada. protected char c; Declarada protected . float x, y; Declarada por omisión (sin modificador). Los métodos de la clase y los de las clases del mismo paquete pueden acceder a la variable.por omisión (sin modificador) Sólo los métodos de la clase pueden acceder a la variable.private Los métodos de la clase, los métodos de las clases del mismo paquete pueden acceder a la variable y también los métodos de las clases derivadas. protected Se puede acceder a la variable desde cualquier método.public b) Declaración de una variable al principio de un método o bloque de código. Las variables también se pueden declarar en un método o en un bloque dentro de un método, por ejemplo un ciclo. Las variables que se declaran al interior de un método se consideran variables locales. Las variables locales son aquellas definidas en el interior de un método y son visibles sólo en ese método en particular. No pueden ser modificadas por ninguna sentencia externa al método. Dos o más métodos pueden definir variables con el mismo nombre (por ejemplo: contadores y acumuladores). Las variables locales de los métodos no existen en memoria hasta que se ejecuta el método; por esta razón, a estas variables locales se les denomina también automáticas o auto, ya que se crean automáticamente en la entrada al método y se liberan automáticamente cuando se termina la ejecución del método. Ejemplo: long factorial (int n) { int i = 1; long a = 1; • • • } c) Declaración de una variable en el lugar en que será utilizada. El lenguaje Java tiene una gran flexibilidad ya que permite declarar una variable en el punto donde se vaya a utilizar. Esta propiedad se utiliza principalmente en diseño de ciclos, ya que es posible declarar la variable en el momento de su utilización. Ejemplo: for ( int i = 0; i < 10; i++) { • • • } CONVERSIÓN ENTRE TIPOS DE DATOS. Cuando Java tiene que evaluar una expresión en la que intervienen operandos de diferentes tipos, primero convierte, sólo para realizar las operaciones solicitadas, los valores de los operandos al tipo del operando cuya precisión sea más alta. Cuando se trata de una asignación, convierte el valor de la derecha al tipo de la variable de la izquierda siempre que no haya pérdida de información. En caso contrario, Java exige que la conversión se realice explícitamente, en tal caso marca un error indicando posible pérdida de precisión. Las conversiones se dan de la siguiente manera: byte , short y char se convierten a int . Si entonces un operando es long , toda la expresión se convierte a long . Si un operando es de tipo float , la expresión entera se convierte a float . Y finalmente si cualquier operando es double , el resultado es double . byte short char int long float double Moldes. Las conversiones de tipo solo se aplican a los valores que sean operados cuando la expresión es evaluada, fuera de la expresión, la variable es del tipo que fue definida. Sin embargo, Java permite una conversión explícita (conversión forzada) del tipo de una expresión mediante una construcción denominada cast (molde) y tiene la siguiente forma: (tipo ) expresión Cualquier valor de un tipo entero o real puede ser convertido a o desde cualquier tipo numérico. No se pueden realizar conversiones entre los tipos enteros o reales y el tipo boolean . Ejemplo: int a = 5, b = 2, c; double d; c = a / b; // El resultado es: 2 d = (double ) a / b; // El resultado es: 2.5 EXPRESIONES Y OPERACIONES ARITMETICAS. Los programas Java constan de datos, sentencias de programa y expresiones. Una expresión es una combinación de operadores y operandos (que pueden ser constantes, variables o una combinación de ambas), y a veces pueden contener métodos. Las expresiones de Java siguen las reglas del álgebra. Operadores. Los operadores son símbolos que indican como son manipulados los datos. El lenguaje Java define muchos más operadores que la mayoría de los otros lenguajes de programación: a) Operadores Aritméticos. b) Operadores de Relación. c) Operadores Lógicos. d) Operadores Unitarios. e) Operadores de Asignación. f) Operadores Lógicos para el Manejo de Bits. g) Otros Operadores. a) Operadores Aritméticos. Las operaciones aritméticas básicas en Java son: suma, resta, multiplicación, división y módulo. Los símbolos usados para indicar operaciones aritméticas son: Operación Símbolo Usado en Java. Símbolo Usado en Matemáticas. Suma + + Resta - - Multiplicación * x • División / / ÷ Módulo (residuo de la división entera) % \ 1. Los operadores aritméticos ( +, -, * ) pueden ser utilizados con tipos enteros o reales. 2. El operador (/) puede ser utilizado con tipos enteros o reales. Si ambos operandos son enteros el resultado es entero (int ). En el resto de los casos el resultado es real (double ). 3. El operador % se utiliza con números enteros y reales. El operador % calcula el resto de la división de dos números enteros (int ) o reales (double ). Formato: operando1 % operando2 operando1 y operando2 Operadores enteros o reales. Ejemplos: int a = 10, b = 3, c; float x = 2.0F, y; 1. y = x + a; /* el resultado es 12.0 de tipo float */ 2. c = a / b; /* el resultado es 3 de tipo int */ 3. c = a % b; /* el resultado es 1 de tipo int */ 4. y = a / b; /* el resultado es 3 de tipo int. Se convierte a float para asignarlo a y */ Orden de importancia de las operaciones aritméticas básica s (jerarquía). Una expresión aritmética es: una constante, una variable o una combinación de constantes y/o variables unidas por operadores aritméticos. Cuando una operación aritmética se evalúa, el resultado siempre es un número. Cuando en una expresión aparecen dos o más operadores, las operaciones siguen un orden de ejecución de acuerdo a las siguientes reglas de prioridad o jerarquía (las operaciones de igual prioridad, se leen y se ejecutan de izquierda a derecha): Símbolo Expresión Prioridad (Precedencia) ( ) Agrupamiento 1 * Multiplicación 2 / División 2 % Módulo 2 + Suma 3 - Resta 3 Escritura de fórmulas matemáticas en Java. En Java, las fórmulas matemáticas se deben escribir en forma lineal. Por este motivo, en ocasiones es necesario usar paréntesis que indiquen el orden correcto de evaluación de los operadores. Las siguientes expresiones representan fórmulas matemáticas convertidas a lenguajeJava. Fórmulas matemáticas. Expresión Java. a = bc a = b * c; x = b2 - 4ac x = b * b - 4 * a * c; y2 - y1 m = m = ( y2 - y1 ) / ( x2 - x1 ); x2 - x1 x + y 5 a = + a = ( x + y ) / ( z + w ) + 5 / ( 1 + x * x ); z + w 1 + x2 b) Operadores de Relación. Los operadores de relación (también llamados de comparación) se utilizan para relacionar o comparar dos expresiones u operandos, los operadores de relación son: Significado Símbolo Usado en Java. Símbolo Usado en Matemáticas. Mayor que > > Mayor o igual que >= ≥ Igual a (igualdad) == = Diferente de o Distinto a != ≠ Menor o igual que <= ≤ Menor que < < Decimos que la condición es verdadera (true ), cuando la expresión que evaluamos se cumple. La condición es falsa (false ), cuando la expresión evaluada no se cumple. c) Operadores Lógicos. Los operadores lógicos se usan junto con los operadores de relación para evaluar expresiones, la expresión evaluada puede proporcionarnos un resultado verdadero (true ) o falso (false ). Los operadores lógicos son: && (y), || (o), ! (no ) y ^ (o excluyente ) (en inglés and , or, not y xor ). La notación utilizada es la siguiente: [ operando 1 ] operador_lógico operando 2 Los operandos 1 y 2 son las expresiones que se van a evaluar y se recomienda encerrarlas entre paréntesis para evitar errores. En algunas expresiones, dependiendo del operador lógico que se utilice, el operando 1 no existe. La forma de evaluar estos operadores se muestra a continuación utilizando las tablas de verdad: a) Operador && (y). <&> Solo cuando ambas condiciones son true (se cumplen), el resultado es true . Esto es, AND da como resultado el valor lógico true si ambos operandos son true . Si uno de ellos es false , el resultado es el valor lógico false . Si el primer operando es false , el segundo operando no es evaluado. operando 1 operando 2 operando 1 && operando 2 true true true true false false false true false false false false b) Operador || (o). <|> Cuando alguna de las condiciones es true (se cumple), el resultado es true . Con el operador OR (símbolo ASCII 124), el resultado es false si ambos operandos son false . Si uno de los operandos tiene un valor distinto de false , el resultado es true . Si el primer operando es true , el segundo operando no es evaluado. operando 1 operando 2 operando 1 || operando 2 true true true true false true false true true false false false c) Operador ! (no ). El operador NOT, devuelve un resultado de false si el operando tiene un valor true , y devuelve true en caso contrario. operando ! operando true false false true d) Operador ^ (xor). Cuando alguna de las condiciones es true (se cumple) y la otra false , el resultado es true . En caso contrario, si ambas son true o false , la expresión es false . operando 1 operando 2 operando 1 ^ operando 2 true true false true false true false true true false false false El orden de evaluación de los operadores lógicos es el siguiente: Operador Prioridad Símbolo Usado en Java. Símbolo Usado en Matemáticas. No 1 ! ∼ (negación) XOR 2 ^ (o excluyente) Y 3 && ∧ (conjunción) O 4 || ∨ (disyunción) El resultado es de tipo boolean . Los operandos pueden ser enteros o reales. d) Operadores Unitarios (unarios o monarios). Operador Operación - Cambia el signo al operando (complemento a dos). El operando puede ser entero o real. ~ Complemento a 1. El operando tiene que ser entero (carácter ASCII 126). ++ Incremento. -- Decremento. ! Negación. e) Operadores de Asignación. Operador Operación ++ Incremento. -- Decremento. = Asignación simple. *= Multiplicación más asignación. /= División más asignación. %= Módulo más asignación. += Suma más asignación. -= Resta más asignación. <<= Desplazamiento a la izquierda mas asignación. >>= Desplazamiento a la derecha más asignación con extensión de signo. >>>= Desplazamiento a la derecha más asignación rellenando con ceros. &= Operación AND sobre bits más asignación. |= Operación OR sobre bits más asignación. ^= Operación XOR sobre bits más asignación. f) Operadores Lógicos para el Manejo de Bits. Operador Operación & Operación AND a nivel de bits. | Operación OR a nivel de bits (ASCII 124). ^ Operación XOR a nivel de bits. << Desplazamiento a la izquierda. >> Desplazamiento a la derecha con extensión de signo. >>> Desplazamiento a la derecha rellenando con ceros. Los operadores Y, O y XOR producen un resultado basado en la comparación de los bits correspondientes de cada operando. El operador Y activa un bit si los dos bits que se comparan son 1. El operador O activa un bit si uno de los bits que se comparan es 1. El operador XOR (O excluyente) activa un bit si uno de los dos bits comparados es 1, pero no si los dos son 1 o 0. El operador complemento a uno (~) es un operador unario que invierte el estado de cada bit de un entero o carácter. De forma que los 1 se ponen a 0 y los 0 a 1. Los operadores de desplazamiento >>, >>> y <<, mueven todos los bits de una variable a la derecha o a la izquierda, según se especifique. A medida que se desplazan los bits hacia un extremo se va rellenando con ceros (>>) o por el valor del bit más significativo (>>>) por el extremo opuesto. Los bits que salen se pierden. Un desplazamiento a la derecha de un número negativo introduce unos. La forma general de desplazamiento a la derecha es: variable >> número de posiciones de bits variable >>> número de posiciones de bits La forma general de desplazamiento a la izquierda es: variable << número de posiciones de bits Un desplazamiento a la izquierda equivale a una multiplicación por 2 y un desplazamiento a la derecha a una división entre 2. g) Otros Operadores. a) Operador condicional. Java tiene un operador condicional, llamado también operador ternario ( ? : ), que se utiliza en expresiones condicionales y tienen la forma: operando1 ? operando2 : operando3 ; La expresión operando1 debe ser una expresión booleana . La evaluación se realiza de la siguiente manera: * Si el resultado de la evaluación de operando1 es true , el resultado de la expresión condicional es operando2. * Si el resultado de la evaluación de operando1 es false , el resultado de la expresión condicional es operando3. Ejemplo: mayor = ( a > b ) ? a : b; /* el mayor de a y b */ El ejemplo dice que si a > b entonces mayor = a, de lo contrario, mayor = b. b) Operador coma ( , ). El operador coma permite combinar dos o más expresiones separadas por comas en una sola línea. Se evalúa primero la expresión de la izquierda antes de evaluar la expresión de la derecha, a continuación el valor de la expresión de la izquierda es descartado, se continúa evaluando las expresiones de izquierda a derecha. El tipo y el valor del resultado son el tipo y el valor del operando de la derecha. El operador coma tiene la menos prioridad de todos los operadores Java y se asocia de izquierda a derecha. Expresión1, expresión2, expresión3, …, expresiónN c) Molde o Cast. ( tipo ) Java permite una conversión explícita (conversión forzada) del tipo de una expresión mediante una construcción denominada cast (molde) y tiene la siguiente forma: (tipo ) expresión Cualquier valor de un tipo entero o real puede ser convertido a o desde cualquier tipo numérico. No se pueden realizar conversiones entre los tipos enteros o reales y el tipo boolean . d) Operador instanceof . Java trabaja con objetos que son instancias de clases. El operador instanceof es un operador relación cuya evaluación da como resultado un valor de tipo boolean y utiliza dos operandos, el primero debe ser un objeto y el segundo un tipo de datos, una clase. Evalúa la expresión a verdadero si el primer operando es una instancia del segundo. Operando1 instanceof Operando2 e) Operador new . El operador new es un operador que reserva memoria dinámicamente para un objeto, esto es, se usa para crear un objeto. Su forma general es: variable = new nombre_de_clase(); variable Es una variable del mismo tipo dela clase creada. nombre_de_clase Es el nombre de la clase que está siendo instanciada. Orden de prioridad de los operadores y orden de eva luación (jerarquía). Jerarquía Operadores Asociatividad Tipo 1 ( ) [ ] . izquierda a derecha Paréntesis, punto 2 - ! ~ ++ -- derecha a izquierda Unarios 3 new (tipo) expresión derecha a izquierda Crear Obj., molde 4 * / % izquierda a derecha Multip., división 5 + - izquierda a derecha Aditivo 6 << >> >>> izquierda a derecha Desplazamiento 7 < <= > >= instanceof izquierda a derecha Relacional 8 == != izquierda a derecha Igualdad 9 & izquierda a derecha AND (niv. bits) 10 ^ izquierda a derecha XOR (niv. bits) 11 | izquierda a derecha OR (niv. bits) 12 && izquierda a derecha AND lógico 13 || izquierda a derecha OR lógico 14 ? : derecha a izquierda Condicional 15 = += -= *= /= %= <<= >>= >>>= &= |= ^= derecha a izquierda Asignación UNIVERSIDAD AUTONOMA DE SINALOA FACULTAD DE INFORMÁTICA DE MAZATLAN PROGRAMACIÓN I Instrucciones Fundamentales TITULAR DE LA MATERIA: DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ INSTRUCCIONES FUNDAMENTALES. Un programa de aplicación escrito en Java está compuesto de objetos, y un objeto es la concreción o instancia de una clase, a su vez, la clase es la generalización de un tipo de objetos. La estructura básica general de un programa en Java es la siguiente: <sentencia(s) import > Declaración para importar clases de paquetes. [protección ] class NombreClase { <Variables miembro de la clase (atributos)> < [modificador ] tipo_devuelto método1 ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } [modificador ] tipo_devuelto método2 ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } • • • Definición de métodos (operaciones) dentro de la clase. [modificador ] tipo_devuelto métodoN ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } > < public static void main ( String args [ ] ) Método principal. { Declaración de variables locales Sentencias ejecutables } > } También puede crearse una clase y grabarse en un archivo que debe tener exactamente el mismo nombre que la clase y la extensión .java. Por su parte, el programa principal puede almacenarse en un archivo independiente, el cual llamará a la clase o clases definidas en otros archivos al momento de definir sus objetos o instancias de clase. <Archivo 1> Debe llamarse igual que la clase. <sentencia(s) import > Declaración para importar clases de paquetes. [protección ] class NombreClase { <Variables miembro de la clase (atributos)> [modificador ] tipo_devuelto método1 ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } [modificador ] tipo_devuelto método2 ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } • • • Definición de métodos (operaciones) dentro de la clase. [modificador ] tipo_devuelto métodoN ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } } <Archivo 2> Debe llamarse igual que la clase. <sentencia(s) import > Declaración para importar clases de paquetes. [protección ] class NombreClase { public static void main ( String args [ ] ) Método principal. { Declaración de variables locales Creación de objetos o instancias de clase Sentencias ejecutables } } 1. Sentencias import . Un paquete es un conjunto de clases relacionadas entre sí. Los paquetes se encuentran en directorios de disco que tienen el mismo nombre que el paquete. Para importar una clase de un paquete desde un programa se utiliza la sentencia import . Pueden aparecer cualquier número de sentencias import , las cuales deben escribirse antes de cualquier definición de clase. La sintaxis general de la sentencia import es la siguiente: import Paquete1 .[Paquete2. ]nombreClase ; Ejemplo: import java.lang.System; Importa la clase System del paquete java.lang. import java.io.*; Importa las clases que puedan ocuparse para operaciones de entrada/salida del paquete java.io. Así mismo, un programador puede definir sus propios paquetes para agrupar clases; los paquetes se deben ubicar en subdirectorios con el mismo nombre que el paquete. Para incorporar las clases contenidas en ese paquete, se utilizan las declaraciones import de la misma manera que con los paquetes predefinidos. Los principales paquetes de Java son: Paquete Explicación java.applet Este paquete contiene la clase Applet, la cual proporciona todo lo necesario para programar applets. java.awt En este paquete se encuentran todas las herramientas gráficas AWT (Abstract Window Toolkit) que proporcionan el soporte gráfico para los applets. Esto es, los métodos y clases que permiten crear y manejar ventanas, gráficos y texto. java.beans Java Beans es un componente de software que se ha diseñado para ser utilizado en entornos diferentes y desarrollar complejos sistemas de software reutilizables. java.io El paquete java.io contiene el sistema básico de Entrada/Salida de Java, incluyendo la E/S con archivos. java.lang Las clases, interfaces y métodos básicos, necesarios para desarrollar un programa en Java se encuentran en este paquete. Las clases de este paquete son importadas de forma automática por lo que no es necesaria una sentencia import que importe este paquete. java.math Este paquete contiene clases para realizar operaciones con números enteros de diferente precisión y aritmética de punto flotante. java.net El paquete java.net proporciona el soporte para el trabajo en red y las conexiones del protocolo TCP/IP. java.rmi Contiene las clases e interfaces que permiten invocar a un método remoto (RMI, Remote Method Invocation). Esto es, un objeto Java que se ejecuta en una máquina, invoca a otro objeto Java que se ejecuta en otra máquina. Paquete Explicación java.security Este paquete contiene clases e interfaces que implementan sistemas de autentificación y control de acceso. Soporta el envío y recepción de mensajes encriptados y firmas digitales. java.sql Contiene las clases e interfaces que permiten desarrollar programas que ejecuten instrucciones en lenguaje estándar de acceso a Bases de Datos SQL (Structured Query Language o Lenguaje Estructurado de Consultas) a través de JDBC (Java DataBase Connectivity). java.text El paquete java.text da soporte al manejo de textos en aplicaciones Java, proporcionando clases e interfaces que trabajan con cadenas de texto, dan formato, realizan búsquedas y buscan texto. java.util Este es uno de los paquetes más usados. Contiene un conjunto de clases e interfaces de utilerías para diversas aplicaciones como son: la generación de números pseudoaleatorios, manejo de fecha y hora, observación de eventos, manipulación de conjuntos de bits y operaciones con cadenas. javax.net Este paquete define clases e interfaces para dar soporte a sockets cliente – servidor que sean de tipo diferente a los que se establecen por defecto. javax.swing Swing es un conjunto de clases que proporcionan componentes más potentes y flexibles que los que ofrece AWT. Contiene métodos y clases que permiten crear y manejar ventanas, gráficos y texto. javax.xml Este paquete proporciona una API (interfaz de programación de aplicaciones) para el análisis y transformación de documentos XML. 2. Declaración de clases y nombre del programa. Una clase es un tipo definido por el usuario que define las variables y los métodos comunes a todos los objetos que se crearán a partir de la misma. La declaración de una clase puede empezar con una palabra clave que es un modificador de protección que generalmente indica el acceso y es opcional; a continuación sigue el indicador de clase, la palabra reservada class ; después sigue el nombre de la clase y los miembros de la clase: variables y métodos. El convenio general entre los programadores para dar nombre a una clase, es comenzar el nombre de la clase con una letra mayúscula. Otra observación importante es que el archivo en el cualse guarda el código, debe tener exactamente el mismo nombre de la clase (NombreClase = NombreClase.java ), respetando mayúsculas y minúsculas. En el caso de los programas, deberá ser el nombre de la clase principal, que es la clase que contiene el método main() . En ambos casos, la extensión del archivo será .java. Por ejemplo: NombreClase.java . Cada definición de una clase Java deberá estar en un archivo. La forma general de una clase es la siguiente: <sentencia(s) import > Declaración para importar clases de paquetes. [protección ] class NombreClase { tipo Variable_miembro_de_la_clase_1 tipo Variable_miembro_de_la_clase_2 • • • tipo Variable_miembro_de_la_clase_N [modificador ] tipo_devuelto método1 ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } • • • Definición de métodos (operaciones) dentro de la clase. [modificador ] tipo_devuelto métodoN ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables } } Una clase puede contener diferentes miembros. Los más importantes son: * Constructores. Crean un objeto de una clase determinada y se utilizan para inicializar el estado del objeto. * Variables de instancia. Almacenan información acerca del estado del objeto. * Métodos. Realizan alguna operación sobre un objeto. * Variables estáticas. Almacenan información que se relaciona con la clase completa en lugar de con un objeto específico. * Métodos estáticos. Realizan alguna operación que se relaciona con la clase completa en lugar de con un objeto específico. Una clase Java se debe compilar antes de que cualquier programa la mande llamar. El código compilado de la clase (denominado bytecode), se almacena en un archivo con el mismo nombre pero con la extensión .class en vez de .java. Así, si se compila el archivo Clase.java, se creará un archivo Clase.class, posteriormente se puede combinar esta clase con un método main() que utilice esa clase. Creación y utilización de un objeto. Normalmente, un programa crea muchos objetos a partir de una variedad de clases. Un objeto es una instancia de una clase y se pueden crear muchas instancias de una clase. Estos objetos interactúan con otros objetos enviándose mensajes entre sí. Mediante estas interacciones entre objetos, un programa Java puede implementar una Interfaz Gráfica de Usuario (GIU), mover una animación o enviar y recibir información en una red. Una vez que un objeto ha completado el trabajo para el que fue creado, el espacio de memoria ocupado se libera, lo cual se conoce como recolección de basura, y sus recursos (de memoria) se reciclan para ser usados por otros objetos. El ciclo de vida de un objeto consta de tres etapas: 1. Creación . 2. Uso . 3. Destrucción . 1. Creación de un objeto . Para declarar un objeto se debe utilizar una variable para representar ese objeto (esto es similar a la declaración de una variable de un tipo de dato primitivo). La sintaxis para declarar una variable objeto es: NombreClase nombreObjeto; La creación de un objeto de una clase se denomina crear una instancia de clase. Un objeto es similar a una variable pero definida de tipo clase, la declaración de un objeto simplemente asocia a la variable con la clase. Sin embargo, la declaración no crea el objeto, sino que crea la variable que posteriormente va a referenciar a un objeto de esa clase. Para crear realmente un objeto y poder acceder a él con una variable, se necesita utilizar el operador new , con el fin de asignar espacio de memoria para el mismo y asociarlo a la variable. La sintaxis es: nombreObjeto = new NombreClase(); Normalmente se combinan la declaración e instanciación juntas en una sola sentencia utilizando la siguiente sintaxis: NombreClase nombreObjeto = new NombreClase(); Las variables de objetos que permiten acceder a los objetos creados (instanciados) se denominan referencias al objeto. Siempre debe utilizarse el operador new para crear un objeto antes del manejo de ese objeto. El manejo o manipulación de un objeto que no ha sido creado producirá un error en tiempo de ejecución. 2. Uso de un objeto . Una vez que se ha creado un objeto se debe utilizar para llevar a cabo algún proceso o acción. Se puede necesitar información del objeto, cambiar su estado o realizar alguna otra acción. Para hacer esto, existen dos formas: a) Manejando sus variables. Para referirse a las variables de un objeto, se añade el nombre de la variable a una referencia de un objeto utilizando el operador punto (.). referenciaObjeto.variable b) Llamar o invocar a sus métodos. La llamada a los métodos de un objeto también utiliza el operador punto. Existen dos formas de invocar al método: utilizando argumentos o con paréntesis vacíos, cuando no se tiene ningún argumento. referenciaObjeto.nombreMétodo(lista de argumentos) referenciaObjeto.nombreMétodo( ) 3. Destrucción de un objeto . Java gestiona automáticamente la liberación de la memoria lo cual se conoce como recolección de basura y consiste en lo siguiente: cuando no existen referencias a un objeto, se supone que no se va a necesitar ya, y la memoria ocupada por dicho objeto puede ser recuperada. La recolección de basura sólo se produce esporádicamente, si es necesario, durante la ejecución del programa. Los diferentes intérpretes de Java siguen distintos procedimientos de recolección de basura, eso es algo que maneja internamente Java y no hay necesidad de preocuparse por ello al hacer un programa. 3. Variables miembro de la clase (atributos). Los miembros dato de una clase se definen como variables de instancia. Estas variables pueden ser de cualquier tipo primitivo (int, char, byte, float, double, etc.), arreglos, cadenas, etcétera. Toda variable debe ser definida antes de ser utilizada. La definición de una variable, declara la variable y además le asigna memoria. La sintaxis es la siguiente: acceso tipo nombreVariableInstancia ; La accesibilidad (acceso ) de las variables de una clase puede ser: 1. private , sólo es accesible dentro de la clase. 2. default (sin modificador), accesible por cualquier clase del paquete. 3. protected , accesible en todo el paquete y en clases derivadas de otros paquetes. 4. public , accesible desde cualquier clase. Violar estas normas de acceso da un error al compilar el programa. Además, una variable puede ser inicializada en la propia definición. Ejemplos: int lado = 5; float area = 2.5F; 4. Definición de métodos (operaciones). [ método1, método2, ..., métodoN ] Un método es un conjunto de sentencias que ejecutan una tarea específica. En Java, un método siempre pertenece a una clase y su definición nunca puede contener la definición de otro método, esto significa que no se pueden tener métodos anidados. Todos los métodos tienen nombre y una lista de datos o valores que reciben, llamados parámetros o argumentos. La definición de un método consta de dos partes: la cabecera y cuerpo del método. La sintaxis para definir un método es la siguiente: [modificador ] tipo_devuelto método ( Lista de parámetros ) { Declaración de variables locales Sentencias ejecutables return expresión; // No se escribe si el método es de tipo void . } Constructores. Los constructores son métodos no estáticos que tienen el mismo nombre de la clase, no devuelven ningún valor y se llaman automáticamente cuando se crea una clase. La función del constructor es inicializar un nuevo objeto (los datos del objeto). Para una clase, se pueden especificar tantos constructores como sea necesario, diferenciándose uno de otro por el número o tipo de parámetros. Los valores que inicializan a las variables de instancia se pasan a través de la lista de argumentos de los constructores. Si la clase no tiene ningún constructor, se utiliza un constructor por defecto que no inicializará los datos de sus objetos. Si no se utilizan constructores, todos sus objetos serán inicialmente iguales. class Cubo { double lado; // Constructor para el objeto Cubo. Cubo (double l) { lado = l; } • • • // Definición de métodos. }5. Método main( ). Todos los programas de aplicación de Java inician su ejecución llamando al método main() . Esto significa que main() es el programa principal o punto de inicio de la aplicación, y también su punto de salida. Cada programa de aplicación en Java tiene un método main() y solo uno, si tiene más de un main() se produce un error, aunque estén en diferentes clases. Las clases de Java no necesariamente deben tener un método main() , a menos que esa clase tenga el programa principal El método main() se define de cualquiera de la siguientes maneras: public static void main ( String args[ ] ) { Declaración de variables locales Sentencias ejecutables } public static void main ( String[ ] args ) { Declaración de variables locales Sentencias ejecutables } ASIGNACION. La Sentencia de Asignación. La sentencia de asignación se utiliza para guardar o almacenar valores o variables. La asignación es una operación que coloca o sitúa un valor determinado en una posición de memoria. En Java la sentencia de asignación simple utiliza el signo igual '=' y debe terminar con punto y coma (;). La sentencia de asignación es asimétrica, esto quiere decir que la expresión de la derecha es evaluada y el resultado es asignado a la variable indicada a la izquierda. En una operación de asignación, el valor de la derecha es convertido al tipo del valor de la izquierda. Formato: Variable operador expresión ; Variable = expresión; /* ejemplo de sentencia de asignación simple */ Variable Identificador válido declarado en la sección de declaraciones. Operador Operador de asignación. expresión Variable, constante, expresión aritmética o fórmula. Operadores de Asignación. Operador Operación (expr) ++ Incremento (prefijo). (expr) -- Decremento (prefijo). ++ (expr) Incremento (postfijo). -- (expr) Decremento (postfijo). = Asignación simple. *= Multiplicación más asignación. /= División más asignación. %= Módulo más asignación. += Suma más asignación. -= Resta más asignación. <<= Desplazamiento a la izquierda mas asignación. >>= Desplazamiento a la derecha más asignación con extensión de signo. >>>= Desplazamiento a la derecha más asignación rellenando con ceros. &= Operación AND sobre bits más asignación. |= Operación OR sobre bits más asignación. ^= Operación XOR sobre bits más asignación. OPERACIONES DE ENTRADA/SALIDA: Los datos se pueden almacenar en memoria de tres formas diferentes: asociados con constantes, asignados a una variable con una sentencia de asignación o con una sentencia de lectura. La sentencia de lectura es el método más adecuado si se desea manipular diferentes datos cada vez que se ejecuta el programa. Además la lectura de datos permite asignar valores en memoria desde dispositivos o archivos externos (Por ejemplo: un teclado o una unidad de disco). A esta operación se le denomina: operación de entrada o lectura. Conforme se realizan cálculos en un programa, se necesitan visualizar los resultados. Esta operación se conoce como operación de salida o de escritura. En los algoritmos y en pseudocódigo, las instrucciones de entrada/salida son: leer (listas de variables entrada) leer x, y, z o leer ( x, y, z ) escribir (listas de variables salida) escribir x, y, z o escribir ( x, y, z ) En Java, la entrada y salida se lee y se escribe a través de flujos (streams). Java 2 define dos tipos de flujos: de bytes y de caracteres. Un flujo es un objeto que hace de intermediario entre el programa y el origen o destino de la información. Esto significa que el programa leerá o escribirá en el flujo sin importarle desde dónde viene la información o adonde va, ni el tipo de datos que se leen o escriben. Básicamente, la fuente de entrada de datos es el teclado y la fuente de salida de resultados es la pantalla. Debido a que todas las clases relacionadas con flujos pertenecen al paquete java.io de la biblioteca estándar de Java, un programa que utilice flujos de Entrada/Salida (E/S), tendrá que importar este paquete: import java.io.*; Las clases del paquete java.io están divididas en dos grupos distintos. Uno ha sido diseñado para trabajar con datos de tipo byte y el otro con datos de tipo char . Así mismo, la biblioteca de Java proporciona tres flujos estándar manejados por la clase System del paquete java.lang . Estos flujos predefinidos son automáticamente abiertos cuando se inicia un programa, y cerrados cuando finaliza: System.in . Referencia a la entrada estándar del sistema, que normalmente es el teclado. Se utiliza para leer datos introducidos por el usuario. System.out . Referencia a la salida estándar del sistema, que normalmente es la pantalla. Se utiliza para mostrar los datos al usuario. System.err . Referencia a la salida estándar de error del sistema, que normalmente es el monitor. Se utiliza para mostrar mensajes de error al usuario. La clase System define dos referencias a objetos static para la entrada por teclado y salida por monitor: System.in para entrada por teclado. System.out para salida por pantalla. El primero es una referencia a un objeto de la clase BufferedInputStream en la cual hay diversos métodos para poder leer los caracteres tecleados. El segundo es una referencia a un objeto de la clase PrintStream con métodos como print() o println(), para salida por pantalla. A continuación veremos como utilizar estas clases y métodos. 1. SALIDA (ESCRITURA DE RESULTADOS). Un programa debe proporcionar información de salida (resultados). La salida toma información de la memoria y la presenta en pantalla, o bien, la puede guardar en un dispositivo de almacenamiento (disco duro o flexible) o en un puerto de Entrada/Salida. Flujos de salida. OutputStream . La clase OutputStream es una clase abstracta que es una superclase de todas las clases que representan un flujo en el que un origen escribe bytes en un destino. El método más importante de esta clase es write . Este método se presenta de tres formas: public void write ( int b) throws IOException public void write ( byte[ ] b) throws IOException public void write ( byte[ ] b, int off, int len) throws IOException La primera versión de write simplemente escribe el byte especificado en un flujo de salida. Puesto que el parámetro es de tipo int , lo que se escribe es el valor correspondiente a los 8 bits menos significativos, el resto son ignorados. La segunda versión del método write escribe los bytes almacenados en el arreglo b en un flujo de salida. La tercera versión del método write escribe un máximo de len bytes de un arreglo b a partir de su posición off, en un flujo de salida. Cada uno de estos métodos ha sido escrito para que bloquee la ejecución del programa que los manda llamar hasta que toda la salida solicitada haya sido escrita. Por su parte, la clase Writer es una clase abstracta que es superclase de todas las clases que representan un flujo para escribir caracteres a un destino. Sus métodos son similares a los de la clase OutputStream, con la diferencia de que utilizan parámetros de tipo char en lugar de tipo byte . System.out El objeto out definido en la clase System está asociado con el flujo de salida que dirige los datos y permite visualizarlos en el monitor. Con estos métodos se puede imprimir cualquier cadena (String ) o tipo de dato primitivo o referenciado: Object, char[ ], int, short, long, double y bolean . El método se encarga de convertir a cadena esos tipos básicos y mostrarlos en pantalla. Así mismo, se pueden concatenar cadenas con caracteres, enteros, etcétera, para lo cual se utiliza el operador +, que internamente realiza la conversión. También existe una versión de println que no tiene argumentos y lo que hace es avanzar a la línea siguiente. System.out es una referencia a un objeto de la clase PrintStream, el cual es un flujo de salida derivado de OutputStream, y tiene métodos que permiten fácilmente la salida por pantalla. Estos métodos son: print ( ) Escribe una cadena de caracteres en el buffer de la pantalla. println ( ) Escribe una cadena decaracteres en el buffer de la pantalla y añade el carácter de salto de línea al final de su salida. flush ( ) Limpia el buffer con las cadenas almacenadas enviándolas a la pantalla. Java también hace uso de las secuencias de escape o constantes especiales de carácter con barra invertida. La lista y significado de estas constantes se muestran en la siguiente tabla. Código Significado ‘\b’ Retroceso (backspace). ‘\n’ Salto de línea (line feed). ‘\r’ Retorno de carro (return). ‘\t’ Tabulación horizontal. ‘\f’ Salto de página (form feed). ‘\"’ Imprime comillas dobles. ‘\'’ Imprime una comilla simple. ‘\0’ Carácter nulo. ‘\\’ Imprime una barra invertida. ‘\000’ Número octal. ‘\uhhhh’ Número hexadecimal. PrintWriter . En la mayor parte de las aplicaciones reales de Java, no se utilizan programas cuya salida basada en texto, sea a través del monitor, sino que serán aplicaciones gráficas que basen su interacción con el usuario en un conjunto de herramientas gráficas denominado AWT (Abstract Window Toolkit). Sin embargo, se recomienda el uso de la clase PrintWriter en programas reales y aplicaciones de software con salidas basadas en texto. PrintWriter es una clase que se basa en caracteres y, por esta razón, resulta más fácil para la utilización internacional de un programa. PrintWriter define varios constructores, el más recomendado es el siguiente: PrintWriter (OutputStream flujosalida, bolean flushOnNuevalínea) Donde flujosalida es un objeto del tipo OutputStream, y flushOnNuevalínea, una variable booleana que controla si Java limpia el flujo de salida cada vez que se llama al método println() . Si la variable flushOnNuevalínea es true , el flujo de salida se limpia automáticamente. En caso de que sea false , esta limpieza no es automática. La clase PrintWriter soporta los métodos print() y println() para todos los tipos, incluyendo Object . Por lo tanto se pueden utilizar estos métodos de la misma manera que se utilizan con System.out. Si un argumento no es de un tipo sencillo, los métodos de PrintWriter llaman al método toString() del objeto, y entonces se imprime el resultado. Para escribir en la pantalla utilizando la clase PrintWriter, hay que especificar el System.out para el flujo de salida y limpiar el flujo después de cada nueva línea. El siguiente ejemplo crea un objeto PrintWriter que está conectado a la salida por el monitor: PrintWriter pw = new PrintWriter (System.out , true); Visualizar datos con formato. Los resultados producidos por las aplicaciones pueden tener algún tipo de formato, ya que es posible que en alguna ocasión necesitemos expresar una cantidad: • Incluyendo el punto de los decimales y la coma de los miles. • Con un determinado número de dígitos enteros, completando con ceros por la izquierda si fuera necesario. • Con un número determinado de decimales y ajustada a la derecha. • O con una serie de cantidades decimales, una debajo de otra, ajustadas por el punto decimal. Si en lugar de cantidades hablamos de fechas, también podemos requerir de diferentes modos de presentación. Para controlar los distintos formatos, Java proporciona un conjunto de clases en el paquete java.text . La clase Format es una clase abstracta para dar formato a números, fechas/hora y mensajes. De esta clase se derivan tres subclases especializadas en cada una de las tareas mencionadas: NumberFormat , DateFormat y MessageFormat . La clase NumberFormat es la clase base abstracta para todos los formatos numéricos. La clase DateFormat es también una clase abstracta para los formatos de fechas y horas. Pero las clases que son particularmente útiles y que nos interesa conocer son: DecimalFormat , SimpleDateFormat y MessageFormat . a) Dar formato a números. Para dar formato a un número, primero hay que crear un objeto formateador basado en un formato específico, y luego utilizar su método format para convertir el número en una cadena construida a partir del formato elegido. Los símbolos que se pueden utilizar para especificar un determinado formato son: Símbolo Significado 0 Representa un dígito cualquiera, incluyendo los ceros no significativos. # Representa un dígito cualquiera, excepto los ceros no significativos. . Representa el separador decimal. , Representa el separador de los miles. E Formato de notación científica. E, separa la mantisa y el exponente. ; Actúa como separador cuando se especifican varios formatos. - Signo negativo de forma predeterminada. % Multiplicar por 100 y mostrar el símbolo %. $ Representa el símbolo monetario. carácter Cualquier carácter puede ser utilizado como prefijo o como sufijo. Por ejemplo: $ o ‘\u0024’. El siguiente ejemplo crea un objeto llamado formato que permitirá obtener números formateados con dos decimales, si los hay, con la coma de los miles. DecimalFormat formato = new DecimalFormat (“###,###.##”); String salida = formato.format (dato); Si el número de dígitos correspondiente a la parte entera excede el número de posiciones especificado para la misma, el formato se extiende en lo necesario. Si el número de dígitos decimales excede el número de posiciones especificado para los mismos, la parte decimal se trunca redondeando el resultado. Se puede utilizar también un objeto formateador basado en la localidad actual. Por ejemplo, las siguientes líneas de código darán lugar a números formateados así: $123,456.00. NumberFormat formato = NumberFormat.getCurrencyInstance(); String salida = formato.format (dato); El método getCurrencyInstance devuelve el formato monetario de la localidad actual cuando no se especifica una, o el de la especificada. Por ejemplo: Locale es_MX = new Locale ("es","MX"); NumberFormat formato = NumberFormat.getCurrencyInstance(es_MX); String salida = formato.format (dato); Donde (“es”, “MX”) significa español de México. Otros ejemplos de localidades son: (“en”, “US”), significa inglés de Estados Unidos, (“en”, “GB”), significa inglés de Gran Bretaña; (“es”, “ES”), significa español de España, (“fr”, “FR”), significa francés de Francia; (“de”, “DE”), significa alemán de Alemania; etc. Sin embargo, una localidad no es un idioma, ya que un mismo idioma se puede hablar en varios países. Cuando se escriba un programa internacional se tendrá que definir la localidad actual y el conjunto de localidades que soportará el programa. Las localidades son definidas en Java por la clase Locale incluida en el paquete java.util . Un objeto de la clase Locale es simplemente un identificador para una localidad específica. Por ejemplo, el siguiente código crea dos objetos: país[0] y país[1], uno para el español de México y otro para el inglés de Estados Unidos. Locale [ ] país = { new Locale (“es”, “MX”); new Locale (“en”, “US”); }; Aplicando todos los métodos, se puede obtener el formato predeterminado para cualquiera de éstos dos países. Por ejemplo: DecimalFormat df = (DecimalFormat ) DecimalFormat.getNumberInstance (país[i]); Cuando escribimos valores numéricos con o sin formato, quedan alineados automáticamente a la izquierda. Para alinear a la derecha una serie de valores numéricos formateados, además del objeto formateador, hay que crear un objeto de la clase FieldPosition basado en la posición utilizada para realizar la alineación. Ésta puede ser: INTEGER_FIELD Alineación por el último dígito entero (por el punto decimal). FRACTION_FIELD Alineación por el último dígito decimal. INTEGER_FIELD y FRACTION_FIELD son dos constantes pertenecientes a la clase Numberformat . Para utilizar el objeto FieldPosition definido, el método format invocado a través del objeto formateador debe tener tres parámetros: el valor numérico a formatear, un objeto StringBuffer donde se almacenará el número formateado y el objeto FieldPosition . Para realizar la alineación se deberán añadir al principio del objeto StringBuffer un número de espacios en blanco igual al espacio de impresión deseado menos el total de dígitos a imprimir. String patrón = new String (“###,###,##0.00”); DecimalFormat formato = new DecimalFormat
Compartir