

































































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Programación I, Profesor: , Carrera: Ingeniero Técnico en Informática de Gestión, Universidad: UPM
Tipo: Apuntes
1 / 73
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!


































































Gustavo Guillermo Pérez www.compunauta.com [email protected] *Hasta que esta leyenda no desaparezca el libro no ha sido terminado, revisar: http://compunauta.com/forums/linux/programacion/java/ebook.html para las actualizaciones diarias o semanales y para descargar el código de los ejemplos. ESTE LIBRO ES LIBRE Y GRATUITO, CONSIDERA HACER UNA PEQUEÑA DONACIÓN EN LA WEB INDICADA ARRIBA. *Para navegar el Índice con Adobe Acrobat Reader, abrir favoritos o bookmarks Ultima actualización, lunes 11 de febrero de 2008
Este libro se hizo con la idea de proveer a mis alumnos y cursos un material didáctico con qué trabajar (también es útil para profesores y otros cursos) y al mismo tiempo dar una idea concisa de lo que significan los objetos en Java. La programación orientada a objetos en Java no es tratada y enfocada en muchos textos tutoriales, manuales o libros sobre el tema y considero que es la etapa inicial del aprendizaje donde se falla en muchos cursos respecto a Java. Por otro lado los estudiantes que recién se inician en la programación, no podrán ir muy lejos si no se les inculca los conceptos básicos, entonces este material no avanzara de lleno sobre la programación orientada a objetos, sino hasta que los conceptos de programación básicos, como tomas de decisión, bucles, variables etc, estén fijados lo suficiente. Java es un lenguaje muy útil debido a la opción multiplataforma que provee (desde PC, Linux, Windows, hasta MAC, teléfonos, pocket PCs, etc.) y veremos en el transcurso de este texto como se puede optimizar la ejecución de una aplicación Java para que se aproxime a la ejecución de un binario nativo como los que se compilan con gcc. Por lo tanto suponer que el alumno posee conocimientos avanzados de programación orientada a objetos o de otros lenguajes de programación no siempre suele ser la mejor opción, en este libro dejaremos en claro que el lenguaje de programación Java tiene sus operadores matemáticos básicos y tipos de datos básicos sin importar que estos mismos existan o no en otros lenguajes de programación. Este libro se distribuye bajo la licencia GNU GPL v2, con la excepción que está prohibido hacer impresiones modificadas del texto, si alguien tiene una sugerencia o una modificación para sugerir, puede enviar al correo electrónico indicado la información, para una futura actualización o corrección. Las sugerencias son bienvenidas.
La máquina virtual de Java se denomina al procesador o entorno virtual que se utiliza para interpretar los bytecodes de los binarios de Java, ya que como sabemos Java se hizo para correr en cualquier plataforma sin recompilar los binarios. De esta manera este entorno virtual se puede obtener para nuestra arquitectura y sistema operativo sin modificaciones a nuestro programa original (esto no es cierto si utilizamos una mala dinámica de programación). Podemos entonces generar un binario y este podrá Correr en Linux, MAC OSX, FreeBSD, Solaris, o Windows, y para las arquitecturas disponibles en las que podamos obtener la JVM, como ser AMD64, SPARC, PIV, etc. etc. La máquina virtual de Java ha tenido la característica de ser un entorno de ejecución pesado en términos de recursos del procesador y memoria, que por medio de una administración rigurosa del sistema operativo estos podrían llegar a ser insuficientes y las aplicaciones ejecutarse de manera muy lenta. Esto no es cierto en la actualidad, existen alternativas a la JVM provista por Sun Microsystems que permiten una velocidad comparable a una aplicación compilada en C++ nativa en la arquitectura, un ejemplo de esto es Kaffe, Kaffe (www.kaffe.org) es una máquina de Java OpenSource que puede compilarse sin mayores modificaciones en nuestra arquitectura necesaria y correrá increíblemente más rápida que la distribución estándar de JVM de Sun Microsystems y consumirá muchos menos recursos.
El Kit de desarrollo conocido como JDK (Java Development Kit) provee de un compilador, un mecanismo para comprimir un proyecto en un solo archivo de tipo JAR (que es compatible con ZIP) y un entorno de ejecución para nuestros binarios. Cuando nuestro proyecto terminado se prepara para distribuir, no es necesario tener el compilador y la mayoría de las herramientas que se proveen en el JDK, entonces podemos prescindir de dicho JDK y utilizar el entorno de ejecución que es más pequeño en cuestiones sólo de espacio en disco. Este JRE (Java Runtime Environment) también puede redistribuirse sin problemas de licencias. En las plataformas basadas en Linux, existen mejores herramientas de desarrollo y por supuesto en casi todas las distribuciones de Linux, se encuentra disponible Kit de desarrollo o JDK. Así como recomendamos Kaffe como JVM para proyectos avanzados o de alto rendimiento, recomendamos Jikes como compilador de ByteCodes para Java, Jikes no es interpretado como el compilador proporcionado en el JDK de Sun Microsystems.
Comando Descripción java Inicia el entorno de ejecución recibiendo como argumento el nombre del binario ejecutable en formato ByteCodes sin la extensión de archivo .class que identifica de manera visual un binario java. Este comando es parte de JDK y JRE javac Inicia el compilador Java recibiendo como argumento todos los archivos de código fuente cuya terminación es .java incluida dicha extensión. Este comando no es parte de JRE. jar Por medio de este comando iniciamos el empaquetador de clases y archivos de Java que nos permiten fabricar un único archivo contenedor de nuestras aplicaciones, multimedia y gráficos. Este comando es parte sólo de JDK.
Usando Kaffe y Jikes gus@gusgus ~ $ java -version java full version "kaffe-1.4.2" kaffe VM "1.1.6" Copyright (c) 1996-2005 Kaffe.org project contributors (please see the source code for a full list of contributors). All rights reserved. Portions Copyright (c) 1996-2002 Transvirtual Technologies, Inc. The Kaffe virtual machine is free software, licensed under the terms of the GNU General Public License. Kaffe.org is a an independent, free software community project, not directly affiliated with Transvirtual Technologies, Inc. Kaffe is a Trademark of Transvirtual Technologies, Inc. Kaffe comes with ABSOLUTELY NO WARRANTY. Engine: Just-in-time v3 Version: 1.1.6 Java Version: 1. Heap defaults: minimum size: 5 MB, maximum size: unlimited Stack default size: 256 KB gus@gusgus ~ $ javac Usage: javac
gus@gusgus ~ $ jar Sintaxis: jar {ctxu}[vfm0Mi] [archivo-jar] [archivo-manifest] [-C dir] archivos ... Opciones: -c crear nuevo contenedor -t mostrar contenido de contenedor -x extraer archivos nombrados (o todos) del contenedor -u actualizar contenedor existente -v generar salida detallada en salida estándar -f especificar nombre de archivo contenedor -m incluir información de manifest del archivo manifest especificado -0 solo almacenar; no utilizar compresión ZIP -M no crear un archivo manifest para las entradas -i generar información de índice para los archivos jar especificados -C cambiar al directorio especificado e incluir el archivo siguiente Si alguno de los archivos es un directorio, se procesará de forma recursiva. Se deben especificar los nombres del archivo manifest y del archivo contenedor en el mismo orden en que se especifiquen los indicadores 'm' y 'f'. Ejemplo 1: para archivar dos archivos de clase en un contenedor llamado classes.jar: jar cvf classes.jar Foo.class Bar.class Ejemplo 2: utilizar un archivo manifest existente, 'mymanifest', y archivar todos los archivos del directorio foo/ en 'classes.jar': jar cvfm classes.jar mymanifest -C foo/. gus@gusgus ~ $
Nota: Java provee una documentación completa en inglés de toda la biblioteca incluida en la versión de JRE o JDK, una buena práctica es no utilizar las más avanzadas y complejas funciones de la API (Application Programing Interface) ya que al querer iniciar nuestro programa en una versión anterior que no tenga una biblioteca actualizada, se pueden producir problemas de métodos faltantes.
Java no soporta herencia múltiple, es decir no podemos fabricar un objeto más complejo con dos diferentes más simples, sino que sólo podremos heredar objetos nuevos de un sólo objeto padre, que proveerá los métodos y propiedades básicas que serán extendidas y/o ampliadas por el nuevo objeto. Es decir no podríamos tener un objeto Lámpara Reloj que derive del objeto Lámpara y del objeto Reloj, sino que tendríamos que usar otros mecanismos para proporcionar esa funcionalidad, interfaces y alojamiento de objetos. Esto podría comprenderse como:
En todos los lenguajes de programación existen tipos de datos básicos con los que se realizarán las operaciones matemáticas básicas y las operaciones booleanas de verdadero o falso. Tipo de Datos Alcance o Rango int de -2147483648 a 2147483647 (4bytes ) byte de -128 a 127 (1Byete) short de -32768 a 32767 (2Bytes) long de -9223372036854775808 a 9223372036854775807 (8Bytes) char de '\u0000' a '\uffff', ambos incluidos que es lo mismo que de 0 a 65535, 1 letra boolean 0 o 1 (1bit) float 4Bytes, punto flotante double 8Bytes, punto flotante String No es un tipo de datos básico, es un objeto básico, con propiedades y métodos, pero el lenguaje Java permite definir un nuevo objeto con el delimitador (“), por lo que podemos concatenar (unir) texto utilizando el operador (+) con los nombres de los objetos de tipo String y los trozos de texto delimitados con (“). Tabla 1 : Tipos de datos básicos
Operador Datos Acción
String Une texto (concatenador). número Suma.
número^ Desplaza los bits hacia la derecha la cantidad de la derecha.
número Desplaza bits hacia la derecha pero no conserva el signo. == Cualquier El operador condicional de igualdad, devuelve verdadero si derecha e izquierda es lo mismo. < Básicos^ Menor que, devuelve verdadero si izquierda es menor que derecha. <= Básicos^ Menor o igual que, devuelve verdadero si izquierda es menor o igual que derecha. Básicos^ Mayor que, devuelve verdadero si izquierda es mayor que derecha. = Básicos Mayor o igual que, devuelve verdadero si izquierda es mayor o igual que derecha. = Cualquier Asigna al elemento de la izquierda, el de la derecha. (op)= Básicos Hace la operación op [+,-,,/.etc..] entre los dos operandos y el resultado lo guarda en el de la izquierda. var++ Básicos^ Incrementa en uno la variable var. var-- Básicos Decrementa en uno la variable var. . objetos^ Separa los nombres de los objetos o propiedades o métodos o nombres y jerarquía de clases. (int) tipo de datos Convierte un tipo de datos a entero, si reemplazamos int por una clase de objetos, podemos siempre y cuando sea correcto convertir al tipo de datos indicado entre paréntesis. ; Cualquier^ Termina una línea de orden. , Cualquier^ Separa argumentos de un método o función. // Cualquier Empieza una línea de comentario. / / Cualquier^ Delimitan un trozo de texto como comentario. /* */ Cualquier^ Delimitan un trozo de texto como documentación para JavaDoc
Nota: En este capítulo veremos como codificar y compilar el primer programa, a continuación emplearemos los operadores y tipos de datos básicos y por último veremos las estructuras de datos básicas soportadas por Java.
Suponemos que nuestro sistema operativo ya tiene instalado el kit de desarrollo (JDK) y procedemos a abrir un editor de texto de nuestro gusto. En KDE, podemos abrir kwrite en otros sistemas busquemos block de notas u otro editor como EditPlus , de todas maneras cualquier editor estará bien. Dentro del editor de textos escribiremos lo siguiente: public class HolaMundo { public static void main(String[] args) { System.out.println("Hola, mi primer programa"); } } El archivo debe guardarse como HolaMundo.java respetando las mayúsculas y minúsculas, necesitamos compilar el programa para obtener el binario con extensión class, entonces procedemos a llamar al compilador con una consola de comandos para poder después usar la JVM (comando java) para correr el programa, pero para trabajar mejor haremos una carpeta donde guardaremos los ejemplos, para los que usen Windows háganla en la unidad c:\ y nómbrenla ejemplos, para los que usamos un sistema mejor, en nuestra carpeta de usuario y la llamamos ejemplos también sólo que en minúsculas. gus@gusgus ~ $ cd ejemplos gus@gusgus ~/ejemplos $ javac HolaMundo.java gus@gusgus ~/ejemplos $ java HolaMundo Hola, mi primer programa gus@gusgus ~/ejemplos $ Nota: Más adelante veremos como utilizar un editor basado en Java para practicar este curso, antes de explicar línea por línea del programa, es necesario introducir un tema que será utilizado con mucha frecuencia, estos son los paquetes, los cuales darán el concepto de Clase Pública.
En el ejemplo anterior hemos omitido una parte esencial de la programación en el lenguaje Java, estos son los Paquetes , se utilizan para diferenciar una clase respecto de otras con el mismo nombre, si nos ponemos a pensar sobre la cantidad de nombres diferentes de clases que podemos poner a los tipos de objetos en nuestros programas es infinita, pero dos programadores diferentes pueden llegar a usar dos veces el mismo nombre para una misma clase, de esta manera podemos hacer que sólo las clases de objetos que haremos visibles a otros programadores o que ejecutarán el componente principal del programa (el método estático main) sean públicas. Las clases de objetos que no queramos hacer visibles a otros componentes de nuestro proyecto, entonces se podrán declarar como privadas, de esa manera sólo una clase de objetos que pertenezca al grupo de clases podrá acceder a las demás privadas. Los paquetes suelen tener un nombre especial referente al de la organización que realiza el
proyecto, esto es una sugerencia, en realidad se puede utilizar casi cualquier nombre, así que por ejemplo si nuestra empresa es compunauta, y el nombre de dominio de los servicios que se proporcionan en Internet es compunauta.com , entonces nuestro paquete podría llamarse com.compunauta y a su vez si tenemos un subproyecto, este podríamos nombrarlo como com.compunauta.aprendiendojava , sólo tengamos en cuenta que es el orden inverso de como aparecería en Internet. Usamos puntos para separar los nombres y tenemos cuidado respecto de las mayúsculas y minúsculas. Nota: El lenguaje Java es sensible a las mayúsculas y minúsculas, es decir si tenemos el nombre del paquete com.compunauta.aprendiendojava no será lo mismo si lo escribimos como com.compunauta.AprendiendoJava. De la misma manera no es lo mismo HolaMundo que holamundo.
Las palabras clave o reservadas son aquellas que definen o se combinan con una definición de datos de una variable o propiedad, clase de objetos o métodos, por ejemplo c lass es una palabra clave y nos indica que a continuación pondremos el nombre a la clase de objeto que vamos a crear, si queremos que dicha clase pueda ser accedida desde dentro o fuera de nuestro paquete de clases de objetos, entonces la definiremos como public (pública), donde esta es otra palabra clave. A veces las palabras claves son palabras reservadas, por ejemplo goto es una palabra clave reservada en Java, ya que no tenemos permitido saltar a una línea en particular de nuestro programa, tenemos que trabajar con llamadas a funciones y otras maneras de codificación. Tipos de datos Definen tipos de datos que devolverán los métodos o los tipos de datos que definirán una propiedad básica. Estos ya los habíamos visto anteriormente pero ahora los describiremos por el espacio que ocupan en memoria. Palabra Clave Significado boolean Valores Booleanos (1bit*) byte 1Byte, número entero (8bits) short (^) 2Bytes, número entero int (^) 4Bytes, número entero long (^) 8Bytes, número entero char 2Bytes, (short) 1Caracter float 4Bytes, punto flotante. double (^) 8Bytes, punto flotante, doble precisión void (^) Cuando no hay nada que devolver null (^) Tipo de datos Nulo, vacío, cualquier operación sobre null produce un error. Tabla 3 : Palabras claves - Tipos de datos Permisos y declaración de clases, propiedades o métodos. Definen los permisos a un método o clase de objetos, haciendo visible u oculto un método propiedad o clase a otras clases de objetos u otros objetos que quieran accederlas.
Reservadas Palabra clave Significado goto Palabra reservada en el lenguaje de programación Java, no puede utilizarse pero el compilador en ciertas ocasiones es capaz de generar un comportamiento similar en las optimizaciones, de tal manera que los binarios si podrían estar utilizando este tipo de salto a una etiqueta. const Palabra reservada que no es utilizada por el momento en Java. Tabla 6 : Palabras clave – Reservadas Excepciones, control de errores En casi todos los lenguajes de programación existen mecanismos para actuar según sucedan errores de cualquier tipo, desde accesos al disco hasta división por cero, los cuales de no ser manipulados por nuestro programa tendrán el comportamiento por defecto de la máquina virtual de java, que es reportarlos como excepciones y terminar el programa. Palabra clave Significado throws Indica que tipo de excepciones lanzará este método en caso de errores, es útil para que los métodos que llaman a este que lanzará una excepción en caso de errores, se vean obligados a tratar esa situación. throw Transfiere el control de errores al manejador de excepciones. try { ... } catch(tipo excepcion){ ... } finally { ... } Esta es la estructura de un manejador de excepciones o control de errores, try inicia el bloque de código que será manejado en caso de errores, la sentencia catch indica el tipo de excepción que se capturará, esta última puede repetirse para hacer cosas diferentes de acuerdo por ejemplo si el problema fue una división por cero o un error de acceso de disco. La sentencia finally se ejecutará de todas maneras al salir del código. Si una excepción no es capturada por el listado de cláusulas catch, entonces es probable que la JVM inicie el reporte y la salida de la instancia completa de la JVM, interrumpiendo todos los hilos de ejecución. Tabla 7 : Palabras clave - Control de errores
Las secuencias de escape son aquellas combinaciones de caracteres que nos permiten insertar un caracter especial que no es posible tipear con el teclado estándar o que no es posible utilizar porque denota un trozo de texto, por ejemplo las comillas dobles en el ejemplo hola mundo que están dentro de la función println. System.out.println("Hola, mi primer programa"); Si quisiéramos incluir las comillas dobles en la ejecución deberíamos incluirlas con una secuencia de escape, para ello se utiliza la barra invertida \ seguida de las comillas dobles \”. System.out.println("\”Hola, mi primer programa\”"); De esa manera el compilador entiende que el trozo de texto contendrá las comillas dobles, pero que pasaría si quisiéramos escribir el caracter \ que en algún sistema operativo distinto de Linux podría significar división de directorios o carpetas, bueno para esto usaríamos una \ seguida de otra , es decir \ para insertar el caracter . System.out.println("Hola, mi primer programa, está en c:\");
Aquí hay una lista de las secuencias de escape más usadas y una breve explicación de su utilidad, ya que Java soporta Unicode, una representación extensa de lo que es un caracter que permite inclusión de varios idiomas. Secuencia Significado \b Retroceder un espacio (backspace) \t Tabulador Horizontal, sirve para alinear texto en la salida estándar de datos cuando es una terminal o consola de comandos. \n Salto de línea, es el caracter usado incluso en las viejas impresoras que necesitaban avanzar de línea para escribir en el próximo renglón. \r Retorno de carro, es el caracter que devuelve el cursor o el cabezal de la imprezora al inicio del renglón, Linux, usa \n para un nuevo renglón en los archivos de texto, Windows utiliza una combinación \n\r. \” Insertan las comillas dobles ' Insertan la coma simple. \ Insertan la misma barra invertida que usamos como escape. \DDD Las tres D son dígitos y representan un caracter en su versión octal. \uDDDD Las cuatro D son dígitos y representan un caracter unicode en hexadecimal.
La concatenación de texto se denomina a la unión de trozos o fragmentos de textos y comúnmente se utiliza la conversión de números o de objetos a su representación en texto, Java convierte automáticamente los tipos de datos básicos a texto antes de unirlos y llama por cada objeto al método especial toString() para realizar la conversión de objetos nuestros o de la biblioteca de la JVM. Veamos un ejemplo:
El objeto out es del tipo o clase Printstream que tiene las siguientes propiedades y métodos importantes, no listaremos todos: Resumen de Métodos boolean (^) checkError () Envía todo el buffer y devuelve verdadero si hay error o falso. void close () Cierra el flujo de datos void flush () Envía todo el buffer. void print (boolean b) Imprime una variable booleana void (^) print (char c) Imprime un caracter. void (^) print (char[] s) Imprime un arreglo de caracteres. void (^) print (double d) Imprime un numero de tipo double. void (^) print (float f) Imprime un número de punto flotante. void (^) print (int i) Imprime un entero. void (^) print (long l) Imprime un entero largo. void (^) print (Object obj) Imprime un objeto, invocando su función toString() void print (String s) Imprime un objeto de tipo String void println () Imprime una separador de nueva línea. void println (boolean x) Imprime un valor booleano y termina la línea. void (^) println (char x) Imprime un caracter y termina la línea. void (^) println (char[] x) Imprime un arreglo de caracteres y termina la línea. void (^) println (double x) Imprime un número de precisión doble y termina la línea. void (^) println (float x) Imprime un número de punto flotante y termina la línea. void (^) println (int x) Imprime un entero y termina la línea.
void (^) println (long x) Imprime un entero largo y termina la línea. void (^) println (Object x) Imprime un objeto invocando su método toString() y termina la línea. void (^) println (String x) Imprime un trozo de texto y termina la línea. Tabla 8 : Resumen de métodos importantes para out.
El objeto in que es una propiedad de System es de la clase o tipo InputStream , que también es parte de la biblioteca de Java. Aquí vemos los métodos que nos interesan. Resumen de Métodos int available () Devuelve la cantidad de bytes que se pueden leer (o pasar por alto) desde esta entrada sin bloquear la próxima llamada a lectura. void (^) close () Cierra esta entrada de datos y libera todos los recursos asociados. abstract int read () Lee el próximo byte de datos desde la entrada, espera por los datos. int (^) read (byte[] b) Lee de la entrada los bytes que llenan el arreglo b, devuelve la cantidad de bytes que se almacenaron. int read (byte[] b, int off, int len) Lee hasta len bytes de datos adentro del arreglo de bytes b empezando en off. long skip (long n) Salta y destrulle los n caracteres de datos. Tabla 9 : Resumen de métodos importantes del tipo de objetos in.
Este objeto es del mismo tipo que out (Printstream) y tiene las mismas propiedades, en los sistemas operativos derivados de Unix como ser Linux, existe mucho la diferencia entre salida estándar de datos (System.out) y la salida estándar de errores (System.err), por ejemplo al imprimir todos los carteles de errores en un tipo de salida no afectaríamos a los resultados, un ejemplo sería el siguiente: public class SumaSimple3 { public static void main(String[] args) { int a=1; System.err.println("el valor de a="+a); System.out.println(a); a=a+10; System.err.println("ahora sumándole 10 es a="+a); System.out.println(a); } }