You are on page 1of 49

Programacin III

UAA

M.I. Jos de Jess Palos Garca

Primera Unidad: Introduccin a Java 1. Programacin Orientada a Objetos.


La programacin orientada a objetos modela el mundo real, cualquier cosa del mundo puede ser modelada como un objeto. As una circunferencia es un objeto, un automvil es un objeto, una ventana es un objeto, un libro es un objeto e incluso un prstamo o una tarjeta de crdito son objetos. Un programa Java se denomina orientado a objetos debido a que la programacin en Java se centra en la creacin, manipulacin y construccin de objetos. Un objeto tiene propiedades (un estado) y un comportamiento. Las propiedades o el estado se detienen utilizando datos y el comportamiento se define utilizando mtodos. Los objetos se definen utilizando clases en Java. Una clase es similar a una plantilla para construir objetos. Con la excepcin de los tipos de datos primitivos, todo en Java es un objeto. En Java, al contrario de lo que sucede en C++, no hay funciones globales: todas las funciones se invocan a travs de un objeto. Por ejemplo, se puede definir un objeto cuadrado mediante una clase cuadrado (Fig. l.2), con un lado (propiedad) y calcularSuperficie como el mtodo que encuentre o calcule la superficie del cuadrado Un objeto es una realizacin concreta de una descripcin de una clase. El proceso de creacin de objetos se denomina instanciacin (crear instancias) de una clase. AI instanciar una clase, se crean objetos. As, es posible crear un objeto cuadrado instanciando la clase con un lado determinado, por ejemplo se puede crear un cuadrado de lado 10 y otro cuadrado de lado 25. Se puede encontrar el rea de los respectivos cuadrados usando el mtodo calcularSuperficie. Un programa consta de una o ms clases que se disponen en una jerarqua en modo rbol, de modo que una clase hija puede heredar propiedades y comportamientos de su clase padre (ascendente). Java con un conjunto de clases predefinidas, agrupadas en paquetes que se pueden utilizar en los programas. La programacin orientada a objetos proporciona mayor flexibilidad, modularidad y reusabilidad. En la actualidad est ya muy implantado este tipo de programacin y Java se es ahora uno de los lenguajes ms usados de propsito general. El paradigma orientado a objetos se enfoca a las caractersticas de comportamiento y estructura de las entidades como unidades completas, lo que nos permite disear software de manera modular y con un alto manejo de estructuras de datos complejas. El paradigma orientado a objetos se apoya en los siguientes conceptos: La Abstraccin (de datos) involucra la formulacin de un concepto (clase) poniendo atencin en las similitudes y diferencias entre las entidades de un conjunto, para extraer las caractersticas esenciales que lo distingan y evitar las caractersticas no relevantes. Y as, se establece una sola representacin del concepto que tenga esas caractersticas pertinentes. Es la capacidad de crear tipos de datos definidos por el usuario extrayendo las propiedades esenciales de un concepto, sin preocuparse de los detalles exactos de la 1

Programacin III

UAA

M.I. Jos de Jess Palos Garca

implementacin. Algunos simplemente lo definen como la capacidad de enfocarse en lo esencial. La Encapsulacin asegura que los usuarios de un objeto no alteren de manera inesperada el estado interno de un objeto; solo sus mtodos internos estn autorizados para acceder a ellos. Cada objeto expone una interfaz pblica que especifica como otros objetos podran interactuar con l. La abstraccin y la encapsulacin estn representadas por la clase. La clase es una abstraccin, porque define los atributos y mtodos de un determinado conjunto de objetos con caractersticas comunes, y es una encapsulacin por que constituye una caja negra que encierra tanto los datos que almacena como los mtodos que permiten manipularlos. La Herencia Es la capacidad de definir una nueva clase a partir de otra clase. De esta forma, la reutilizacin del cdigo est garantizada. Las clases estn clasificadas en una jerarqua estricta, donde la clase padre es conocida como superclase y la clase hijo como clase derivada. Esto significa que la clase derivada dispone de todos los atributos y mtodos de su superclase. El Polimorfismo es la propiedad que permite a una operacin tener diferente comportamiento en diferentes objetos. Es decir, diferentes objetos reaccionan de manera diferente al mismo mensaje (de modo que un mismo mtodo pueda tener mltiples implementaciones).

Estos conceptos son los pilares de la POO que permiten facilitar la comunicacin, incrementar la productividad y la consistencia, facilitar la modificacin de los programas y reducir la complejidad en esfuerzos de resolucin de problemas.

2. Orgenes de Java
Java no fue creado originalmente para la red internet. Sun Microsystems comenz a desarrollarlo con el objetivo de crear un lenguaje, independiente de la plataforma y del sistema operativo, para el desarrollo de electrnica de consumo (dispositivos electrnicos inteligentes, como televisores, vdeos, equipos de msica, etc.). El proyecto original, denominado Green comenz apoyndose en C++, pero a medida que se progresaba en su desarrollo el equipo creador de <<Green>> comenz a encontrarse con dificultades, especialmente de portabilidad. Para evitar estas dificultades, decidieron desarrollar su propio lenguaje y en agosto de 1991 naci un nuevo lenguaje orientado a objetos. Este lenguaje fue bautizado con el nombre de Oak. En 1993, el proyecto Green se volvi a renombrar y pas a llamarse First Penon Juc. Sun invirti un gran presupuesto y esfuerzo humano para intentar vender esta tecnologa, hardware y software, sin gran xito. A mitad de 1993, se lanz Mosaic, el primer navegador para la Web y comenz a crecer el inters por Internet (y en particular por la World Wide Web). Entonces, se redise el lenguaje para desarrollar aplicaciones para internet y, en enero de 1995, Oak se convirti en Java. Sun lanz el entorno JDK 1.0 en 1996, primera versin del kit de desarrollo de dominio pblico, que 2

Programacin III

UAA

M.I. Jos de Jess Palos Garca

se convirti en la primera especificacin formal de la plataforma Java. Desde entonces se han lanzado diferentes versiones, aunque la primera comercial se denomin JDK 1.1 y se lanz a principios de 1997. En diciembre de 1998 Sun lanz la plataforma Java 2 (que se conoci como JDK 1.2 durante su fase de pruebas beta). Esta versin de Java ya represent la madurez de la plataforma Java. Sun renombr Java 1.2 como Java 2. Los programas Java se pueden incluir (<<embeber>> o <<empotrar>>) en pginas HTML y descargarse por navegadores Web para llevar animaciones e interacciones a los clientes Web. Sin embargo, la potencia de Java no se limita a aplicaciones Web, Java es un lenguaje de programacin de propsito general que posee caractersticas completas para programacin de aplicaciones independientes o autnomas. Java, como lenguaje, es fundamentalmente orientado a objetos. Se dise desde sus orgenes como verdadero lenguaje orientado a objetos, al contrario que otros lenguajes, como C++ y Ada, que tienen propiedades de lenguajes procedimentales. La programacin orientada a objetos (POO) es tambin, actualmente, un enfoque de programacin muy popular que est reemplazando poco a poco a las tcnicas tradicionales de programacin procedimental o estructurada. Tarea Investigar versiones de Java ms recientes www.sun.com Java SE, Java EE y su evolucin.

3. El entorno de desarrollo de Java 3.1.El compilador de Java


El significado de Java tal y como se le conoce en la actualidad es el de un lenguaje de programacin y un entorno para ejecucin de programas escritos en el lenguaje Java. AI contrario que los compiladores tradicionales, que convierten el cdigo fuente en instrucciones a nivel de mquina, el compilador Java traduce el cdigo fuente Java en instrucciones que son interpretadas por la Mquina Virtual Java (JVM, Java Virtual Machine). A diferencia de los lenguajes C y C++ en los que est inspirado, Java es un lenguaje interpretado. Aunque hoy en da Java es por excelencia el lenguaje de programacin para Internet, Java no comenz como proyecto Internet y por esta circunstancia es idneo para tareas de programacin de propsito general y, de hecho, muchas de las herramientas Java estn escritas en Java. Java como lenguaje de Internet Java es un lenguaje para programar en Internet que trata de resolver dos problemas claves con el contenido de Internet: 1. En la actualidad, el contenido de la WWW es pasivo y esttico. 2. La entrega (Deliverry) del contenido WWW es dependiente de la configuracin de cada navegador Web de usuario. En el mundo de la Web, Java es una tecnologa facilitadora que permite a los desarrolladores crear pginas Web que se entregarn de modo consistente a todos los usuarios con un navegador habilitado para Java y con independencia de la plataforma hardware y el sistema operativo que se est utilizando. Dado que el cdigo fuente se 3

Programacin III

UAA

M.I. Jos de Jess Palos Garca

interpreta, si existe un intrprete Java para una plataforma especfica hardware o sistema operativo, se pueden escribir programas con el conocimiento de que sern tiles en esa plataforma.

La Figura anterior muestra cmo el cdigo fuente Java se transfiere en Internet. En la computadora servidor (host) se almacena el cdigo fuente. Cuando un usuario de una computadora local se conecta con el servidor a travs de Internet mediante un navegador habilitado para Java, el cdigo fuente se transfiere de la computadora servidor a la computadora local. Java como lenguaje de propsito general A medida que Java se populariza en desarrollos de Internet, gana tambin como lenguaje de propsito general. Java es totalmente portable a gran variedad de plataformas hardware y sistemas operativos. Java tiene muchos conceptos de sintaxis de C y C++, especialmente de C++, del que es un lenguaje derivado. Aade a C++ propiedades de gestin automtica de memoria y soporte a nivel de lenguaje para aplicaciones multihilo. Por otra parte, Java, en principio a nivel medio, es ms fcil de aprender y ms fcil de utilizar que C++ ya que las caractersticas ms complejas de C++ han sido eliminadas de Java: herencia mltiple, punteros (apuntadores) y sentencia goto entre otras. Las implementaciones de la Mquina Virtual Java pueden ser muy eficaces y eso hace posible que los programas Java se ejecuten tan rpidamente como los programas C++. Esta caracterstica clave de Java, unida a sus fortalezas como lenguaje de Internet, lo hacen muy adecuado para desarrollos en sistemas cliente/servidor, soporte masivo de los sistemas informticos de la mayora de las empresas y organizaciones. Las propiedades que se vern ms adelante hacen a Java doblemente idneo para desarrollos cliente/servidor y para desarrollos de Internet. Java ha conseguido una enorme popularidad. Su rpida difusin e implantacin en el mundo de la programacin en Internet y fuera de lnea (offline) ha sido posible gracias a sus importantes caractersticas. Los creadores de Java escribieron un artculo, ya clsico, en el que definan al lenguaje como sencillo, orientado a objetos, distribuido, interpretado, robusto, seguro, arquitectura neutra, alto rendimiento, multihilo y dinmico

Programacin III

UAA

M.I. Jos de Jess Palos Garca

3.2.Arquitectura de la tecnologa Java (JRE, JVM, GC)


La tecnologa de java se sustenta en 3 mecanismos principales que le permiten adquirir todos los beneficios de un sistema multiplataforma, estos son: JRE El ambiente en tiempo de ejecucin, es el software responsable de permitir al usuario final ejecutar las aplicaciones java, posee una coleccin o librera estndar de clases que son indispensables para el funcionamiento de los programas java, adems de incluir una maquina virtual para el lenguaje java. JVM La maquina virtual de java (Java VM) provee una especificacin de plataforma la cual le permite ejecutar cualquier programa compilado en java (bytecode). De esta forma el compilador de java toma cualquier cdigo hecho en java y genera un archivo precompilado llamado bytecode que es un conjunto de instrucciones que puede ser interpretado por cualquier maquina virtual de java.

Garbage Collector Muchos lenguajes de programacin permiten alojar memoria de manera dinmica en tiempo de ejecucin. El proceso para alojar memoria vara de acuerdo a las caractersticas del lenguaje y en ciertas ocasiones los bloques de memoria reservados nunca son liberados, principalmente porque esta tarea se deja a cargo del programador (como en C/C++). Java provee un mecanismo de recoleccin de bloques de memoria intiles y los remueve de manera automtica. Durante la ejecucin de los programas en la maquina virtual, el recolector de basura comienza a verificar si existen bloques de memoria (objetos) que han dejado de ser usados o referenciados de tal manera que los marca para que en el prximo ciclo de verificacin sean eliminados y se recupere espacio de memoria.

Programacin III

UAA

M.I. Jos de Jess Palos Garca

A continuacin se muestra el esquema en tiempo de ejecucin de la tecnologa java:

El cdigo fuente (Ejemplo.java) es compilado y se genera un archivo convertido a bytecode (Ejemplo.class), ste es el archivo que ser cargado y ejecutado en alguna maquina objeto. Al tiempo de ejecucin, el cdigo en bytecode es ledo, verificado y puesto para su ejecucin en el intrprete. El interprete tiene dos funciones ejecutar bytecodes y hacer las llamadas apropiadas al hardware. En algunos ambientes de ejecucin una porcin de la verificacin de bytecode es compilada en cdigo nativo de mquina y ejecutado directamente en la plataforma de hardware, por lo que la velocidad de interpretacin-ejecucin se acelera. El lenguaje de programacin java requiere de una infraestructura necesaria para su desarrollo y ejecucin, inicialmente veremos como estn constituidas sus plataformas de ejecucin y desarrollo, posteriormente mencionaremos algunas aplicaciones que se pueden emplear como ambiente ambientes de desarrollo para facilitar la programacin de aplicaciones. JRE y JSDK
JRE

Es un paquete que contiene todo el software necesario para correr una aplicacin desarrollada en Java, dentro del paquete esta contenida la librera de clases, que son programas generados en java (bytecode) y que estn expresamente construidos para servir de apoyo para la construccin de aplicaciones por parte del usuario, adems se cuenta con: Libreras de integracin que permiten construir aplicaciones de comunicacin externa. Libreras de interfase grafica de usuario AWT/Swing. Libreras para el manejo de multimedia. Una maquina virtual de java adecuada a la plataforma que permite ejecutar las aplicaciones JSDK Es el conjunto de herramientas para el desarrollo de aplicaciones en Java, esta compuesto por las siguientes herramientas de programacin: javac Compilador de java que se encarga de convertir cdigo fuente a bytecode de java. jar Programa que se encarga de manipular libreras de clases ya compiladas y empaquetadas. 6

Programacin III

UAA

M.I. Jos de Jess Palos Garca

javadoc Programa que se encarga de extraer documentacin automticamente partiendo de los comentarios en el cdigo fuente. jdb Depurador de programas. Adems de las herramientas adicionales para desarrolladores, se agrega el paquete JRE que contiene todas las libreras de clase y la maquina virtual en la que se producirn y ejecutaran las aplicaciones. Las herramientas de desarrollo estn disponibles en 3 posibles versiones: Edicin Micro: Se emplea en ambientes con recursos limitados. Edicin Estndar: Es la edicin comnmente empleada por la mayora de los programadores. Edicin Empresarial: Es una edicin que posee una coleccin muy amplia de recursos adicionales para transacciones en Internet, seguridad y acceso a recursos remotos.

3.3.Ambientes de desarrollo
Los ambientes de desarrollo son aplicaciones que nos permiten escribir en un lenguaje de programacin de manera sencilla, ya que se puede verificar gradualmente el producto que estemos desarrollando. De esta forma el ambiente de desarrollo se encuentra totalmente independiente de la plataforma de Java que se emplee, es decir que se puede emplear cualquier versin del kit de desarrollo de software (JSDK) de Sun. Existen varios ambientes de desarrollo en el mercado, los hay desde los libres que no tienen algn costo, hasta las herramientas ms sofisticadas y caras del mercado. El lenguaje Java (plataforma Java) y el ambiente de desarrollo integral no son una sola aplicacin, en tal caso debern ser instaladas de manera independiente. Se recomienda inicialmente instalar la plataforma de Java (JSDK) y posteriormente el ambiente de desarrollo que ms se ajuste a sus necesidades. En la red existen disponibles varios ambientes para el desarrollo de software como: NetBeans: una herramienta creada por una filial de Sun Microsystems, es una buena herramienta de diseo aunque algo lenta si se cuenta con poca memoria principal. Permite el diseo RAID (diseo rpido de interfase) Gel: una herramienta de distribucin libre bastante flexible en uso de recursos y fcil de emplear debido a su poca complejidad, permite la opcin de auto-completar texto. JCreator: es una herramienta amigable y fcil de emplear, cuenta con una versin libre bastante austera y una distribucin comercial bastante competitiva. Es importante recordar que en el mercado se encuentran disponibles varias distribuciones libres para ambientes de desarrollo integral en Java, as que se deja al criterio del alumno el uso de cualquiera de ellas. Tambin se encuentra disponible una plataforma de diseo integral para Java, conocida como Eclipse, desarrollada por IBM. Eclipse es algo ms que un simple ambiente de desarrollo integral (JDT), ya que cuenta con su propio kit de desarrollo para compilacin (ECJ). Desde un principio se considero a Eclipse como una distribucin libre para Java, por lo que su popularidad no se ha disminuido ante su mas claro competidor Sun Microsystems. Desafortunadamente por cuestiones de licencias Eclipse requiere la instalacin de JRE para mantener la portabilidad.

Programacin III

UAA

M.I. Jos de Jess Palos Garca

4. Nomenclatura en Java
Los nombres de Java son sensibles a las letras maysculas y minsculas. Por ejemplo, las variables masa, Masa y MASA son consideradas variables diferentes. Las reglas del lenguaje respecto a los nombres de variables son muy amplias y permiten mucha libertad al programador.

4.1.Convenciones de escritura en Java


A continuacin se muestran solo algunas convenciones de escritura (codificacin) del lenguaje java: Package.- Los paquetes son colecciones de clases distribuidas (organizadas) en directorios y por lo general se encuentran relacionadas entre s. El nombre de los paquetes se escriben en minsculas.
package proyecto.objetos

Clases.- Los nombres de las clases deben ser sustantivos (desde un punto de vista meramente didctico se le define como el tipo de palabra que significa persona, animal o cosa concreta o abstracta), en algunos casos mezclados, con la primera letra de cada palabra en mayscula.
class EjemploUno

Mtodo.- Los nombres de los mtodos deben ser verbos, con palabras mezcladas, con la primera letra en minscula. En caso de emplear mas palabras se le recomienda hacer la primera letra mayscula.
calculaPromedio()

Variables.- Todas las variables pueden ser mezclas de palabras procurando emplear la letra minscula para la primera y empleando las letras maysculas para separar al resto de las palabras.
apellidoPaterno

Procure limitar el empleo de variables simples (a, b, , x) para el manejo de bucles de control. Constantes.- se recomienda el uso de las constantes con letras maysculas, separando las palabras con guin inferior.
TOPE_MAXIMO

Programacin III

UAA

M.I. Jos de Jess Palos Garca

4.2.Palabras reservadas
Las palabras reservadas son palabras con un significado especial dentro de un lenguaje. En especial, estas palabras son empleadas por el lenguaje Java, y el programador no puede utilizarlas como identificadores. Algunas de estas palabras le resultarn familiares al programador del lenguaje C/C++. Las palabras reservadas sealadas con un asterisco (*) no se utilizan en las ltimas versiones de Java.

Las palabras reservadas se pueden clasificar en las siguientes categoras: Tipos de datos: boolean, float, double, int, char Sentencias condicionales: if, else, switch Sentencias iterativas: for, do, while, continue Tratamiento de las excepciones: try, catch, finally, throw Estructura de datos: class, interface, implements, extends Modificadores y control de acceso: public, private, protected, transient Otras: super, null, this.

4.3.Tipos de datos (primitivos, arreglos, referenciados)


El lenguaje de programacin Java cuenta con varios tipos de datos. Estos caen en dos grandes categoras: los tipos clase y los tipos primitivos. Los tipos primitivos son valores simples, no son objetos. Los tipos clase son usados para tipos de datos ms complejos, incluyendo todos los tipos que el programador desarrollara. Datos primitivos El lenguaje Java define ocho tipos primitivos, los cuales pueden ser considerados en cuatro categoras: Lgicos boolean Texto char Enteros byte, short, int y long Punto flotante float y double

Programacin III

UAA

M.I. Jos de Jess Palos Garca

Lgicos Los valores lgicos son representados usando los tipos bolanos, los cuales toman uno de dos posibles valores literales: true (verdadero) false (falso). A continuacin se muestra un cdigo de ejemplo que declara e inicializa una variable de tipo boolean. boolean verdad = true; No existe ajuste (cast) entre valores de tipo entero y bolanos, como ocurre en otros lenguajes de programacin como C/C++. Solo pueden usarse cualquiera de las dos literales definidas. Texto El tipo de datos char de Java se utiliza para representar un carcter, ste tipo emplea 16 bits para el almacenamiento de un carcter y lo efecta en formato Unicode. Unicode presenta dos ventajas: 1. permite a Java trabajar con los caracteres de todos los idiomas. 2. sus primeros 127 caracteres coinciden con los del cdigo ASCII. Ahora mostramos un ejemplo de declaracin e inicializacin de una variable tipo carcter. char ch = A; Un literal carcter representa un carcter o una secuencia de escape encerrada entre comillas simples. Por ejemplo, c , D . Una cadena de caracteres (string), es un conjunto de cero o ms caracteres (incluyendo las secuencias de escape) encerrados entre dobles comillas. Los caracteres Java utilizan Unicode, que es un esquema universal para codificacin de caracteres en 16 bits establecido por el consorcio Unicode para soportar el intercambio, proceso y presentacin de los textos escritos en los diferentes idiomas del mundo (vase el sitio Web de Unicode en www . Unicode. org). Unicode toma dos bytes, expresados en cuatro nmeros hexadecimales que corren de ' \u0000' a'\uFFFF'. La mayora de las computadoras utilizan el cdigo ASCII (Unicode incluye los cdigos ASCII de '\u0000' a '\u00FF'). En Java se utiliza el cdigo ASCII, as como Unicode y las secuencias de escape como caracteres especiales. Precaucin: Una cadena debe encerrarse entre dobles comillas. Un carcter es un nico carcter encerrado entre simples comillas. Un carcter Unicode se debe representar mediante el cdigo ' \uXXXX ' . 10

Programacin III Enteros

UAA

M.I. Jos de Jess Palos Garca

Existen cuatro tipos enteros en Java. Cada tipo es declarado usando una de sus palabras claves, byte, short, int long. Se pueden crear literales de tipos enteros usando la forma decimal, octal hexadecimal. 2 077 0xBAAC Forma decimal del numero 2 0 indica un nmero octal 0x indica un nmero hexadecimal

Todas las literales enteras son de tipo int a no ser que se especifique lo contrario, es decir se puede agregar al final de la literal numrica la letra L, que indica que el valor ser entero largo.
Punto flotante

Los tipos flotantes pueden declararse como float o double. A continuacin veremos algunos ejemplos de nmero flotantes. Las literales flotantes pueden incluir el punto decimal o el termino exponente (E), adems de las letras F para float y D para double. 3.14 6.02E23 2.718F 123.4E+306D valor simple flotante (double) valor de punto flotante largo valor de punto flotante simple valor doble flotante

Arreglos unidimensionales Los arreglos son estructuras de datos que agrupan elementos del mismo tipo (homogneo). Los arreglos nos permiten referirnos a grupos de objetos por un nombre comn. Los arreglos unidimensionales, son aquellos arreglos que cuentan nicamente con una fila y con una serie de columnas que determinan la dimensin del arreglo. En Java es posible crear arreglos de cualquier tipo, ya sea datos primitivos o clases (tipos compuestos). Declaracin de arreglos La sintaxis es la siguiente:
<tipo> [ ] <nombre-arreglo>;

Cuando queremos que una variable sea un arreglo nicamente anteponemos los corchetes, esto le indica al compilador que la variable de la derecha ser una referencia de arreglo. En el lenguaje Java un arreglo es un objeto an cuando el arreglo sea de tipos de datos primitivos, adems como el resto de los objetos, la declaracin no crea el objeto por s mismo. En su lugar la declaracin de un arreglo crea una referencia que puede ser empleada para un arreglo. El espacio en memoria usado para los elementos del arreglo, es dinmico, por lo que es necesario emplear el operador new para crear el espacio para los elementos del arreglo.

11

Programacin III Creacin de referencias para arreglos

UAA

M.I. Jos de Jess Palos Garca

Se deben crear arreglos como objetos, empleando el operador new, por ejemplo, suponga la creacin de un arreglo de caracteres (primitivo).
char[] s; s = new char[26]; for ( int i=0; i<26; i++ ) { s[i] = (char) ('A' + i); }

El operador new crea un arreglo con 26 caracteres que sern inicializados cada uno de sus elementos a carcter vaci (\u0000). De esta forma el arreglo est listo para ser manipulado. Recuerde que el lmite de los arreglos va de 0 a N-1. Tambin es posible crear arreglos de referencias, como arreglos de objetos, por ejemplo, un arreglo de Strings.
import java.io.*; import java.util.Scanner; public class ArrayString { public static void main( String args[] ) { Scanner s = new Scanner(System.in); int dim; String [] arreglo; System.out.print("tamao del arreglo "); dim = s.nextInt(); arreglo = new String[dim]; for (int i=0; i<arreglo.length; i++) { System.out.print("ingresa la cadena "); arreglo[i] = s.next(); } s.close(); System.out.println(" Contenido "); for (int i=0; i<arreglo.length; i++) System.out.println( arreglo[i] ); System.exit(0); } }

Inicializacin de arreglos Cuando se crea un arreglo, cada elemento es inicializado. Para el caso del arreglo de caracteres vimos que cada carcter es inicializado por defecto a (\u0000). En los arreglos de objetos como el caso del String, cada elemento del arreglo es inicializado a null, lo que indica que an no ha sido ingresado ningn dato dentro de la casilla. Adems es posible crear inicializaciones de manera corta como la siguiente:
String [ ] nombres = { Daniela, Almudena, Simn};

12

Programacin III O de manera equivalente:


String [ ] nombres; nombres = new String[ 3 ]; nombres[0] = Daniela; nombres[1] = Almudena; nombres[2] = Simn;

UAA

M.I. Jos de Jess Palos Garca

Arreglos multidimensionales Java provee un mecanismo muy eficiente y sencillo para la construccin de arreglos multidimensionales, solo es necesario indicar el numero de dimensiones con las que se desea trabajar, es decir, as como con los vectores solo es necesario agregar una dimensin con los corchetes. Podemos crear arreglos multidimensionales de la siguiente manera:
int [ ][ ] dosDim = new int [2][ ]; dosDim[0] = new int [5]; dosDim[1] = new int [5];

El objeto que es creado en la primera llamada con new es un arreglo que contiene dos elementos. Cada elemento es una referencia nula (null) a un elemento de tipo array of int, y debe ser inicializada cada elemento de manera separada, de manera que cada elemento apunta a su arreglo. Debido a esto es posible crear matrices no-rectangulares. En algunos casos esta inicializacin podra parecer tediosa, pues es ms comn emplear matrices rectangulares, a continuacin vemos como sera la declaracin e inicializacin de una matriz de enteros:
int [ ][ ] dosDim = new int [4][5]; Veamos un ejemplo de una matriz a al que se le asignan valores de manera aleatoria: import java.io.*; import java.util.Scanner; import java.util.Random; public class Matriz { public static void main( String args[] ) { Scanner s = new Scanner(System.in); int f,c; System.out.print("numero de filas "); f = s.nextInt(); System.out.print("numero de columnas "); c = s.nextInt(); s.close(); Random rand = new Random(); int m[][] = new int [f][c]; for (int i=0; i < m.length; i++) {

13

Programacin III

UAA

M.I. Jos de Jess Palos Garca

for (int j=0; j < m[i].length; j++) m[i][j]= rand.nextInt(f*c*10); } for (int i=0; i < m.length; i++) { for (int j=0; j < m[i].length; j++) System.out.print(" "+i+","+j+"-> "+ m[i][j]); System.out.println(); } System.exit(0); } }

Como ya se menciono los arreglos en java son objetos, por lo que el nmero de elementos que pueden ser almacenados forma parte de sus atributos. Un acceso a un lmite fuera de su longitud produce un error en tiempo de ejecucin. Emplee el atributo length para iterar dentro de un arreglo.
public int sumatoria(int [] lista) { int total = 0; for( int i = 0; i < lista.length; i++ ) total += lista[i]; return total; }

Iterar sobre un arreglo es una tarea comn, Java en la versin 5.0 incorpora un mecanismo para iterar elementos como una coleccin de datos, lo que hace un poco ms sencilla la declaracin.
public int sumatoria(int [] lista) { int total = 0; for( int elemento : list ) total += elemento; return total; } Esta versin del ciclo for puede ser leda como para cada elemento en la lista haz.

Redimensin de arreglos Despus de que ha sido creado un arreglo, no puede ser redimensionado su tamao. Sin embargo puede ser empleada la misma referencia a la variable para declarar una nueva referencia del arreglo por completo.
int [] arreglo = new int [6]; arreglo = new int[10];

En este caso, el primer arreglo pierde la referencia a todos sus componentes, a no ser que sean almacenados en algn lugar.

14

Programacin III Datos referenciados

UAA

M.I. Jos de Jess Palos Garca

Existen, adems de los datos primitivos ya vistos, datos referenciados (datos tipo clase) que son objetos ms complejos o compuestos que permiten realizar ms operaciones, debido a que fueron diseados a partir de clases, entre ellos existe una clase u objetos referenciado de uso muy comn llamado String, que es el tipo de dato en el que nos concentraremos en este momento. La clase string es una de tantas clases incluidas en la librera de clases de Java. La clase string provee la habilidad de almacenar secuencias de caracteres y manipularlas de forma sencilla para almacenar literales. Los objetos strings pueden ser declarados de dos maneras:
String nombre = new String(Juan Prez);

String nombre = Juan Prez;

La clase string es la nica que permite construir objetos de ese tipo sin emplear el operador new, que es el empleado para crear cualquier objeto en Java.

4.4.Variables 4.4.1. Nombres de variables 4.4.2. Inicializacin de variables


Variables, declaracin y asignacin Las variables son los identificadores construidos para asignar valores que sern manipulados a lo largo del programa. Las declaraciones de variables deben seguir la siguiente sintaxis:
<tipo de dato> identificador [ = valor ] ;

Las asignaciones siempre deben de corresponder al tipo de datos que se est manejando, existen errores comunes de asignacin, como son:
int y = 3.1415926; double w = 175,000; boolean sw = 1; float z = 3.14156;

Los identificadores comienzan con letra, guin bajo signo de dlar, y el resto de los caracteres pueden ser dgitos. Recuerde que los identificadores son case-sensitive. Debido a que pueden emplearse caracteres no ASCII, tenga presente lo siguiente: UNICODE puede soportar diferentes caracteres que lucen igual. Los nombres de clase deben ser nicamente caracteres ASCII, debido a que la mayora de sistemas no soportan UNICODE. Un identificador no puede ser una palabra clave, pero puede estar compuesta como parte del nombre.

15

Programacin III

UAA

M.I. Jos de Jess Palos Garca

4.4.3. Visibilidad y vida de las variables


mbito. Es importante el lugar donde se efecta la declaracin de las variables, pues ste determina su mbito. En Java es posible agrupar sentencias simples, encerrndolas entre una pareja de llaves para formar bloques o sentencias compuestas y efectuar declaraciones de variables dentro de dichos bloques, al principio de los mtodos o fuera de ellos. Una sentencia compuesta nula es aquella que no contiene ninguna sentencia entre las llaves { }. Ejemplo:
int i=25; double j=Math.sqrt (20); i++; j+=5; System.out.println(i+" "+j); //A continuacin comienza un bloque { int aux = i; i=(int)(j) ; j= aux; } //Fin del bloque System.out.println(i+" "+j);//aux aqu no est definida

Es decir, en Java es posible declarar variables en el punto de utilizacin de las mismas dentro del programa, pero habr de tener en cuenta que su mbito ser el bloque en el que han sido declaradas. Como ya se ha indicado, un bloque de sentencias se delimita entre dos llaves y las variables declaradas dentro de un bloque slo son vlidas en dicho bloque. Si un bloque tuviera otros anidados, en los interiores a l. No se pueden declarar variables en bloques interiores con el nombre de otras de mbito exterior. Las variables declaradas dentro del cuerpo de un mtodo son variables locales, y slo existirn y se podr hacer referencia a ellas dentro del cuerpo del mtodo. Las variables que se declaran fuera del cuerpo de un mtodo son variables de instancia y cada instancia de la clase tendr una copia de dichas variables. Las variables declaradas fuera del cuerpo de los mtodos y en cuya declaracin se especifique la palabra static son variables de clase, esto quiere decir que no se har una copia de ellas para cada uno de los objetos de la clase y, por tanto, su valor ser compartido por todas las instancias de la misma.

4.5.Constantes
Java emplea la palabra clave final para indicarle al compilador de que las variables declaradas bajo esta etiqueta debern comportarse como si fueran constantes. Esto indica que su valor no puede ser modificado una vez que se haya declarado e inicializado. Las constantes se declaran de la siguiente manera:
final double PI = 3.14159; final char VALOR = S; final String MENSAJE = Error;

Si se intenta cambiar el valor de las variables tipo final desde una aplicacin, se genera un error de compilacin. Es importante recordar, como medida de diseo, que los nombres de las constantes deben escribirse con letras maysculas para facilitar su ubicacin dentro del cdigo. Tambin los las funciones miembro (mtodos) pueden ser de tipo final, en cuyo caso no podrn ser sobrecargados

16

Programacin III

UAA

M.I. Jos de Jess Palos Garca

4.6.Operadores 4.6.1. Operadores aritmticos, de asignacin, unarios, instanceof, incrementales, relacionales, de intercambio (shift), lgicos, concatenacin, condicional.
Los operadores de Java son muy parecidos en estilo y funcionamiento a los de C, estos se detallan a continuacin: Operadores Aritmticos: Los habituales que son: Operador Operacin + suma Resta * multiplicacin / Divisin % Residuo Ejemplo suma=n1+n2; resultado=num1-num2; area=pi*r*r; prom=(cal1+cal2+cal3)/3; resultado=num%den;

Operadores de Asignacin: El principal es '=' pero hay ms operadores de asignacin con distintas funciones que explicamos brevemente ahora. Operador = += -= *= /= %= Operacin Asignacin Asignacin de suma Asignacin de resta Asignacin de multiplicacin Asignacin de divisin Asignacin de residuo Ejemplo op1 += op2 op1 -= op2 op1 *= op2 op1 /= op2 op1 %= op2 Equivalencia op1 = op1 + op2 op1 = op1 - op2 op1 = op1 * op2 op1 = op1 / op2 op1 = op1 % op2

Operadores Unarios: El mas (+) y el menos (-). Para cambiar el signo del operando. Operador Instanceof: Nos permite saber si un objeto pertenece a una clase o no. NombreObjeto instanceof NombreClase Operadores Incrementales: Son los operadores que nos permiten incrementar las variables en una unidad. Se pueden usar delante y detrs de la variable dependiendo de lo que queramos, es decir, si queremos que incremente o viceversa antes de utilizar o lo contrario. ++ -incremento de 1 decremento de 1 a++; o ++a; numero--; o --numero;

17

Programacin III

UAA

M.I. Jos de Jess Palos Garca de

Operadores Relacionales: Permiten comparar variables segn relacin igualdad/desigualdad o relacin mayor/menor. Devuelven siempre un valor boolean. Operador > < == != >= <= Operacin Mayor que Menor que Iguales Distintos Mayor o igual que Menor o igual que Ejemplo if(a>b) for(i=0;i<10;i++) while(salir==false)

Operadores Lgicos: Nos permiten construir expresiones lgicas. Operador && || ! & | ? Operacin Ejemplo Y lgico, opcionalmente compara la segunda expresin expresin1 && expresin2 O lgico, opcionalmente compara la segunda expresin expresin1 || expresin2 Negacin !operacin 1 Y lgico, siempre compara ambas expresiones expresin1 & expresin2 O lgico, siempre compara ambas expresiones expresin1 | expresin2 versin reducida del if-else expresin ? : operacin 1 : operacin 2

Operador de concatenacin con cadena de caracteres '+': Por Ejemplo: System.out.println("El total es"+ result +"unidades"); Operadores que actan a nivel de bits: Son mucho menos utilizados por eso los explicamos mas por encima. Operadores de desplazamiento Operador << >> >>> Operacin Desplaza los bits de n a la izquierda k veces Desplaza los bits de n a la derecha k veces Desplaza los bits de n a la derecha k veces (sin signo) Ejemplo n<<k n>>k n>>>k

Operadores de lgica de bits Operador & | ^ ~ Operacin Operador and a nivel de bit Operador or a nivel de bit Operador de or exclusivo Operador de complemento Ejemplo n1 & n2 n1 | n2 n1 ^ n2 ~n1

18

Programacin III

UAA

M.I. Jos de Jess Palos Garca

4.6.2. Precedencia de operadores


Cuando en una sentencia aparecen varios operadores el compilador deber de elegir en qu orden aplica los operadores. A esto se le llama precedencia. Los operadores con mayor precedencia son evaluados antes que los operadores con una precedencia relativa menor. Cuando en una sentencia aparecen operadores con la misma precedencia: Los operadores de asignacin son evaluados de derecha a izquierda. Los operadores binarios, (menos los de asignacin) son evaluados de izquierda a derecha. Se puede indicar explcitamente al compilador de Java cmo se desea que se evale la expresin con parntesis balanceados ( ). Para hacer que el cdigo sea ms fcil de leer y mantener, es preferible ser explcito e indicar con parntesis que operadores deben ser evaluados primero. La siguiente tabla muestra la precedencia asignada a los operadores de Java. Los operadores de la tabla estn listados en orden de precedencia: cuanto ms arriba aparezca un operador, mayor es su precedencia. Los operadores en la misma lnea tienen la misma precedencia: Tipo de operadores Operadores posfijos Operadores unarios Creacin o conversin Multiplicacin Suma Desplazamiento Comparacin Igualdad AND a nivel de bit OR a nivel de bit XOR a nivel de bit AND lgico OR lgico Condicional Asignacin Operadores de este tipo [ ] . (parmetros) expr++ expr-++expr --expr +expr -expr ~ ! new (tipo) expr */% +<< < <= = instanceof == != & ^ | && || ?: = += -= *= /= %= &= ^= |= <<= = =

19

Programacin III

UAA

M.I. Jos de Jess Palos Garca

4.6.3. Promocin y casting


Ajuste de datos primitivos El ajuste primitivo o cast, significa asignar el valor de un tipo de variable a una de otro tipo. Si dos tipos son compatibles, Java realiza el ajuste automticamente. Por ejemplo un valor tipo int puede ser asignado sin ningn problema a una variable tipo long. En los casos donde la informacin se pueda perder en la asignacin, el compilador requiere que se le confirme la asignacin a travs del operador cast. Por ejemplo:
long big = 99l; int medium = big // asignacin invalida int medium = (int) big // cast aplicado

Es necesario que el tipo de dato destino sea encerrado entre parntesis y usado de manera prefija indicando que la expresin debe ser modificada. Las variables pueden ser promocionadas automticamente a tipos ms grandes (como de int a long)
double x = 12.414F; // 12.414F es flotante, correcto float y = 12.414; // 12.414 es doble, incorrecto

Cuando se realizan operaciones como la suma y los dos operandos son de tipo de dato primitivo, el tipo de dato resultante es determinado por el operando de tipo ms grande, por lo que en algunos casos podra ser un problema de sobre flujo, por ejemplo:
short a, c; int b; a = 1; b = 2; c = a + b;

Causa un error debido a los tipos short, a no ser que la variable c sea declarada como int, para subsanar este problema se sugiere realizar un cast en la operacin que permita el ajuste.
c = (short) (a + b);

20

Programacin III Etapas para crear un programa

UAA

M.I. Jos de Jess Palos Garca

La creacin de un programa debe comenzar con la escritura del cdigo fuente correspondiente a la aplicacin. Cada programa Java debe tener al menos una clase. Un ejemplo de una aplicacin Java sencilla que sirva de modelo es el popular <<Hola mundo>>.
//Esta aplicacin visualiza: Hola! Bienvenido a Java public class Bienvenido { public static void main (String[] argc) { System.out.println("Hola! Bienvenido a Java"); } }

Las etapas que preparan un programa para su ejecucin son: 1. Crear una carpeta de proyecto en la que se recojan todos los archivos significativos, incluyendo clases que se desean incluir. 2. Utilizar un programa editor que introduzca cada lnea del programa fuente en memoria y lo guarde en la carpeta proyecto como un archivo fuente. 3. Utilizar el programa compilador para traducir el programa fuente en bytecode (cdigo en bytes). Si existen errores de sintaxis (un error gramatical de una lnea en un programa Java), el compilador visualiza esos errores en una ventana. 4. Utilizar el programa editor para corregir esos errores, modificando y volviendo a guardar el programa fuente. Cuando el programa fuente est libre de errores, el compilador guarda su traduccin en bytecode como un archivo. 5. El intrprete Java (JVM) traduce y ejecuta cada instruccin en bytecode. 6. Si el cdigo no funciona correctamente se puede utilizar el depurador para ejecutar el programa paso a paso y examinar el efecto de las instrucciones individuales.

21

Programacin III

UAA

M.I. Jos de Jess Palos Garca

Segunda Unidad: Estructuras de programacin 1. Estructuras de Programacin 1.1.Introduccin


En la estructura de un programa java destacan algunos elementos, como son: Comentarios, Palabras reservadas, Sentencias, Bloques, Clases, Mtodos, el mtodo main, entre otras que se detallan a continuacin. Comentarios Los comentarios sirven para documentar los programas y en ellos se escriben anotaciones sobre cmo funciona el programa o sobre cmo se ha construido. Los comentarios ayudan a los programadores actuales y futuros o a los usuarios de los mismos a comprender el programa. En Java, como en todos los lenguajes de programacin, los comentarios no son sentencias de programacin y son, por consiguiente, ignorados por el compilador. En Java, los comentarios que constan de una nica lnea estn precedidos por dos barras inclinadas (//), si se extienden sobre varias lneas estn encerrados entre /* y */. Ejemplos de comentarios:
// Esto es un comentario relativo /* Comentario escrito en 2 lneas */

Existen tambin otra clase de comentarios, denominados comentarios de documentacin, que pueden ser extrados a archivos HTML utilizando javadoc. Es necesario introducirlos entre los smbolos /** . . . */. Palabras reservadas Las palabras reservadas o palabras clave (Keywords) son palabras que tienen un determinado significado para el compilador y no pueden ser utilizadas para otros fines. Por ejemplo, la palabra while significa que se habr de evaluar la expresin que viene a continuacin y, en funcin del valor de la misma, se ejecutarn o no se ejecutarn las sentencias siguientes. Otras palabras reservadas son public, static y private, que representan modificadores. Otro ejemplo es class, una palabra reservada muy utilizada, que significa que la palabra que viene a continuacin es el nombre de la estructura clase. Sentencias Una sentencia representa una accin o una secuencia de acciones. Cada sentencia termina con un punto y coma (;). Algunos ejemplos de sentencias son:
z = 15; z = z+100; println("Bienvenido Sr."); //esta sentencia asigna 15 a la //variable z //esta sentencia aade 100 //al valor de z //sentencia de visualizacin

22

Programacin III Bloques

UAA

M.I. Jos de Jess Palos Garca

Un bloque es una estructura que agrupa sentencias. Los bloques comienzan con una llave de apertura ( { ) y terminan con una llave se cierre ( } ). Un bloque puede estar dentro de otro bloque y se dice que el bloque interior est anidado dentro del exterior o que ambos bloques estn anidados:
z = 15; z = 2+100; if (z > 225) { z = 2-5; }

Clases La clase es la construccin fundamental de Java y constituye una plantilla o modelo para fabricar objetos. Un programa consta de una o ms clases y cada una de ellas puede contener declaraciones de datos y mtodos. Mtodos Un mtodo es una coleccin de sentencias que realizan una serie de operaciones determinadas. Por ejemplo:
System.out.println("Bienvenido a Java");

es un mtodo que visualiza un mensaje en el monitor o consola. Mtodo main () Cada aplicacin Java debe tener un mtodo main declarado por el programador que define dnde comienza el flujo del programa. El mtodo main tendr siempre una sintaxis similar a sta:
public static void main (Strinq[] args) { //sentencias }

1.2.Estructuras de Decisin 1.2.1. Sentencia if-else simple y compuesta


La sintaxis de la sentencia if-else es:
if ( condicin ) Bloque de cdigo a ejecutar si la condicin es cierta else Bloque de cdigo a ejecutar si la condicin es falsa

23

Programacin III

UAA

M.I. Jos de Jess Palos Garca

Ejemplo:
// La respuesta es Aceptar o Cancelar if (respuesta == Aceptar) { // cdigo para realizar la accin Aceptar System.out.println( "Su peticin est siendo atendida" ); } else { // cdigo para realizar la accin Cancelar System.out.println( "Cancelando accin" ); }

Utilizacin de else-if:
int valor; char clasificacion; if (valor > 90) { clasificacion='A'; }else if (valor > 80) { clasificacion='B'; }else if (valor > 70) { clasificacion='C'; }else { clasificacion='F'; }

1.2.2. Sentencia switch


Mediante la sentencia switch se puede seleccionar entre varias sentencias segn el valor de cierta expresin. La forma general de switch es la siguiente:
switch ( expresionMultivalor ) { case valor1 : conjuntoDeSentencias; break; case valor2 : conjuntoDeSentencias; break; case valor3: conjuntoDeSentencias; break; default: conjuntoDeSentencias; break; }

Un ejemplo sencillo:
int meses; switch ( meses ){ case 1: System.out.println( "Enero" ); break; case 2: System.out.println( "Febrero" ); break; case 3: System.out.println( "Marzo" ); break; //Demas meses // . . . case 12: System.out.println( "Diciembre" ); break; default: System.out.println( "Mes no valido" ); break; }

24

Programacin III

UAA

M.I. Jos de Jess Palos Garca

1.3.Estructuras de Repeticin 1.3.1. Iteraciones con for, while, do while


El bucle while.- es el bucle bsico de iteracin. Sirve para realizar una accin sucesivamente mientras se cumpla una determinada condicin. La forma general del bucle while es la siguiente:
while ( expresinBooleana ) { sentencias; }

Por ejemplo, multiplicar un nmero por 2 hasta que sea mayor que 100:
int i = 1; while ( i <= 100 ) { i = i * 2; }

El bucle do-while.- es similar al bucle while, pero en el bucle while la expresin se evala al principio del bucle y en el bucle do-while la evaluacin se realiza al final. La forma general del bucle do-while es la siguiente:
do { sentencias; } while ( expresinBooleana );

La sentencia do-while es el constructor de bucles menos utilizado en la programacin, pero tiene sus usos, cuando el bucle deba ser ejecutado por lo menos una vez. Por ejemplo, cuando se lee informacin de un archivo, se sabe que siempre se debe leer por lo menos un carcter:
int c; do { c = System.in.read( ); // Sentencias para tratar el carcter c } while ( c != -1 ); // No se puede leer ms (Fin archivo)

El bucle for.- Mediante la sentencia for se resume un bucle do-while con una iniciacin previa. Es muy comn que en los bucles while y do-while se inicien las variables de control de nmero de pasadas por el bucle, inmediatamente antes de comenzar los bucles. Por eso el bucle for est tan extendido. Sintaxis:
for ( iniciacin ; terminacin ; incremento ) sentencias;

25

Programacin III Ejemplo:

UAA

M.I. Jos de Jess Palos Garca

for ( i = 0 ; i < 10 ; i++ )

Algunos (o todos) estos componentes pueden omitirse, pero los puntos y coma siempre deben aparecer (aunque sea sin nada entre s). Ejemplo comn de uso: // cad es una cadena (String) for (int i = 0; i < cad.length() ; i++){ // hacer algo con el elemento i-simo de cad }

1.3.2. Sentencias break, continue, return


Sentencia break La sentencia break provoca que el flujo de control salte a la sentencia inmediatamente posterior al bloque en curso. Ya se ha visto anteriormente la sentencia break dentro de la sentencia switch. El uso de la sentencia break con sentencias etiquetadas es una alternativa al uso de la sentencia goto, que no es soportada por el lenguaje Java. Se puede etiquetar una sentencia poniendo una identificador Java vlido seguido por dos puntos antes de la sentencia:
nombreSentencia: sentenciaEtiquetada

La sentencia break se utiliza para salir de una sentencia etiquetada, llevando el flujo del programa al final de la sentencia de programa que indique:
break nombreSentencia2;

Un ejemplo de esto sera el programa:


void gotoBreak() { System.out.println("Ejemplo de break como 'goto' "); a: for( int i=1; i<10; i++ ){ System.out.print(" i="+i); for( int j=1; j<10; j++ ){ if ( j==5 ) break a; //Sale de los dos bucles!!! System.out.print(" j="+j); } System.out.print("No llega aqu"); } }

Al interpretar break a, no solo se rompe la ejecucin del bucle interior (el de j), sino que se salta al final del bucle i, obtenindose: i=1 j=1 j=2 j=3 26

Programacin III Sentencia continue

UAA

M.I. Jos de Jess Palos Garca

Del mismo modo que en un bucle se puede desear romper la iteracin, tambin se puede desear continuar con el bucle, pero dejando pasar una determinada iteracin. Se puede usar la sentencia continue dentro de los bucles para saltar a otra sentencia, aunque no puede ser llamada fuera de un bucle. Tras la invocacin a una sentencia continue se transfiere el control a la condicin de terminacin del bucle, que vuelve a ser evaluada en ese momento, y el bucle contina o no dependiendo del resultado de la evaluacin. En los bucles for adems en ese momento se ejecuta la clusula de incremento (antes de la evaluacin). Por ejemplo el siguiente fragmento de cdigo imprime los nmeros del 0 al 9 no divisibles por 3:
for ( int i = 0 ; i < 10 ; i++ ) { if ( ( i % 3 ) == 0 ) continue; System.out.print( " " + i ); }

Ejemplo utilizando etiquetas:


void gotoContinue( ) { f: for ( int i=1; i<5; i++ ) { for ( int j=1; j<5; j++ ) { if ( j>i ) { System.out.println(" "); continue f; } System.out.print( " " + (i*j) ); } } }

En este cdigo la sentencia continue termina el bucle de j y continua el flujo en la siguiente iteracin de i. Ese mtodo imprimira: 1 24 369 4 8 12 16 Sentencia return Se puede usar para salir del mtodo en curso y retornar a la sentencia dentro de la cual se realiz la llamada. Para devolver un valor, simplemente se debe poner el valor (o una expresin que calcule el valor) a continuacin de la palabra return. El valor devuelto por return debe coincidir con el tipo declarado como valor de retorno del mtodo. Cuando un mtodo se declara como void se debe usar la forma de return sin indicarle ningn valor. Esto se hace para no ejecutar todo el cdigo del programa:

27

Programacin III

UAA

M.I. Jos de Jess Palos Garca

int contador; boolean condicion; int devuelveContadorIncrementado(){ return ++contador; } void metodoReturn(){ //Sentencias if ( condicion == true ) return; //Ms sentencias a ejecutar si condicin no vale true }

1.3.3. Bloques try, catch, finally


Las excepciones son otra forma ms avanzada de controlar el flujo de un programa. Con ellas se podrn realizar acciones especiales si se dan determinadas condiciones, justo en el momento en que esas condiciones se den. Esas condiciones se conocen como excepciones que ayudan a la construccin de cdigo robusto. Cuando ocurre un error en un programa, el cdigo que encuentra el error lanza una excepcin, que se puede capturar y recuperarse de ella. Java proporciona muchas excepciones predefinidas. Sintaxis:
try { sentencias; } catch( Exception ) { sentencias; }

El manejo de excepciones se analizar con ms detalle en la sptima unidad.

28

Programacin III

UAA

M.I. Jos de Jess Palos Garca

2. Funciones de entrada/salida estndar 2.1.Introduccin


En Java la E/S de informacin se realiza mediante flujos; es decir, secuencias de datos que provienen de una fuente. Estos flujos son objetos que actan de intermediarios entre el programa y el origen o destino de la informacin, de forma que ste lee o escribe en el flujo y puede hacer abstraccin sobre la naturaleza de la fuente. Como las clases relacionadas con flujos pertenecen a un paquete denominado java.io, los programas que utilizan flujos necesitan la inclusin en los mismos de la instruccin:
import java.io.*;

2.2.Salida de texto y variables por pantalla


System.out La salida bsica por pantalla se lleva a cabo mediante los mtodos print y println, pertenecientes a la clase PrintStream. A estos mtodos se les puede llamar mediante System.out, que hace referencia a la salida estndar. El mecanismo bsico para salida con formato utiliza el tipo String. En la salida, el signo + combina dos valores de tipo String y si el segundo argumento no es un valor de tipo String, pero es un tipo primitivo, se crea un valor temporal para l de tipo String. Estas conversiones al tipo String se pueden definir tambin para objetos. Sintaxis: print(a): Imprime a en la salida, donde a puede ser cualquier tipo bsico Java ya que Java hace su conversin automtica a cadena. println(a): Es idntico a print(a) salvo que con println() se imprime un salto de lnea al final de la impresin de a.

2.3.Lectura desde teclado


System.in Este objeto implementa la entrada estndar (normalmente el teclado). Los mtodos que nos proporciona para controlar la entrada son: read(): Devuelve el carcter que se ha introducido por el teclado leyndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea ledo el siguiente carcter. Si no se ha introducido ningn carcter por el teclado devuelve el valor -1. skip(n): Ignora los n caracteres siguientes de la entrada.

29

Programacin III Ejemplo:

UAA

M.I. Jos de Jess Palos Garca

/* Ejemplo 1 sobre operaciones bsicas de entrada y salida. Ejecute el siguiente programa y analice los resultados */ import java.io.*; public class EntradaSalida1 { public static void main (String[] args) { int i; char c; try{ System.out.println ("Escriba un nmero natural con " +"un nico dgito y pulse RETURN"); i=System.in.read(); System.in.skip(2) ; //Evitamos los caracteres \r\n //System.in.skip(System.in.available()); System.out.println(i); System.out.println ("Escriba un nmero natural con " +"un nico dgito y pulse RETURN"); c=(char)System.in.read(); System.out.println(c); }catch ( IOException e){ System.out.println ("Error"); } } }

StringBuffer Podemos utilizar un StringBuffer para almacenar una cadena de caracteres, ejemplo:
import java.io.*; public class EntradaSalida2 { public static void main(String[] args) { String cadena; System.out.print("Escribe un texto: "); // Almacenamos el texto en buffer StringBuffer buffer = new StringBuffer(); char c; try { //Mientras no presione enter while ( (c = (char) System.in.read() )!='\n' ) buffer.append(c); } catch(IOException ex){ } //Quitamos los espacios antes y despues de... //cadena = buffer.toString().trim(); cadena=buffer.toString(); System.out.println("la cadena es: " + cadena); } }

30

Programacin III

UAA

M.I. Jos de Jess Palos Garca

readLine() No obstante, la entrada bsica en Java suele realizarse mediante el mtodo


readLine() de la clase BufferedReader, que lee una secuencia de caracteres de un flujo

de entrada y devuelve una cadena. Para efectuar este tipo de entrada debe construirse un objeto de la clase BufferedReader sobre otro de la clase InputStreamReader asociado a System.in, que se encarga de convertir en caracteres los bytes ledos desde teclado. Segn este planteamiento, la lectura de valores numricos con llevara dos fases: 1. lectura de una cadena 2. conversin de la cadena en nmero. a. Valores tipo entero (int o long) Mtodos Integer.parseInt e Integer.parseLong b. Valores de tipo real (Float o Double) Mtodos floatValue o doubleValue Los tipos de datos Integer, Long, Float y Doble son clases pertenecientes al paquete java.lang que representan como objetos los tipos simples de su mismo nombre. Ejemplo:
import java.io.* ; public class EntradaSalida3 { public static void main (String[] args) { InputStreamReader isr = new InputStreamReader (System.in); BufferedReader br = new BufferedReader(isr); String cadena; try{ System.out .println ("Escribe tu nombre y presiona ENTER"); cadena=br.readLine(); System.out.println("Hola " +cadena+", escribe un nmero entero y presiona ENTER") ; int entero=Integer.parseInt(br.readLine()); System.out.println("El nmero introducido fue el" +entero); System.out.println(cadena+", introduce ahora un real y presiona ENTER") ; System.out.println("(utilice el punto como separador ej 3.45)"); cadena=br.readLine(); Double d=new Double (cadena); double real=d.doubleValue(); System.out.println("El real es "+real) ; }catch (IOException e){ System.out .println ("Error"); } } }

31

Programacin III Scanner()

UAA

M.I. Jos de Jess Palos Garca

Otro recurso para leer informacin del teclado es la utilizacin de Scanner.


import java.io.*; import java.util.Scanner; public class EntradaSalida4 { public static void main(String [] arg) { Scanner s = new Scanner(System.in); System.out.println("ingresa un texto "); String cadena = s.next(); System.out.println("el texto es "+ cadena); System.out.println("ingresa un numero real"); float valor = s.nextFloat(); System.out.println("el numero es "+ valor); //Otra forma de utilizar Scanner System.out.println(); System.out.println("Otra forma de utilizar Scanner"); System.out.println("ingresa una secuencia de 5 nmeros separadas por ,"); String texto = s.next(); //s.close(); //String texto = "1, 2, 3, 4, 5, 6"; s = new Scanner(texto).useDelimiter("\\s*,\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.nextInt()); s.close(); } }

32

Programacin III

UAA

M.I. Jos de Jess Palos Garca

Tercera Unidad: Clases y mtodos en java 1. Jerarqua de clases de Java (API)


Durante la generacin de cdigo en Java, es recomendable y casi necesario tener siempre a la vista la documentacin on-line del API de Java. En dicha documentacin es posible ver tanto la jerarqua de clases, es decir la relacin de herencia entre clases, como la informacin de los distintos packages que componen las libreras base de Java. Es importante distinguir entre lo que significa herencia y package. Un package es una agrupacin arbitraria de clases, una forma de organizar las clases. La herencia sin embargo consiste en crear nuevas clases en base a otras ya existentes. Las clases incluidas en un package no derivan por lo general de una nica clase. En la documentacin on-line se presentan ambas visiones: Package Index y Class Hierarchy, en las diferentes versiones de Java, con pequeas variantes. La primera presenta la estructura del API de Java agrupada por packages, mientras que en la segunda aparece la jerarqua de clases. Hay que resaltar el hecho de que todas las clases en Java son derivadas de la clase java.lang.Object, por lo que heredan todos los mtodos y variables de sta. Si se selecciona una clase en particular, la documentacin muestra una descripcin detallada de todos los mtodos y variables de la clase. A su vez muestra su herencia completa (partiendo de la clase java.lang.Object). Algunas de las clases ya definidas y utilizables en Java son: stas vienen en las bibliotecas estndar: java.lang.- clases esenciales, nmeros, strings, objetos, compilador, runtime, seguridad y threads (es el nico paquete que se incluye automticamente en todo programa Java) java.io.- clases que manejan entradas y salidas. java.util.- clases tiles, como estructuras genricas, manejo de fecha, hora y strings, nmeroaleatorios, etc. java.net.- clases para soportar redes: URL, TCP, UDP, IP, etc. java.awt.- clases para manejo de interface grfica, ventanas, etc. java.awt.image.- clases para manejo de imgenes java.awt.peer.- clases que conectan la interface grfica a implementaciones dependientes de la plataforma (motif, windows) java.applet.- clases para la creacin de applets y recursos para reproduccin de audio. Para darnos una idea, los nmeros enteros, por ejemplo, son "instancias" de una clase no redefinible, Integer, que desciende de la clase Number,
java.lang.Object java.lang.Number

java.lang.Integer esta clase implementa los siguientes atributos y mtodos:

http://java.sun.com/reference/api/

33

Programacin III

UAA

M.I. Jos de Jess Palos Garca

public final class java.lang.Integer extends java.lang.Number { // Atributos public final static int MAX_VALUE; public final static int MIN_VALUE; // Mtodos Constructores public Integer(int value); public Integer(String s); // Ms Mtodos public double doubleValue(); public boolean equals(Object obj); public float floatValue(); public static Integer getInteger(String nm); public static Integer getInteger(String nm, int val); public static Integer getInteger(String nm, Integer val); public int hashCode(); public int intValue(); public long longValue(); public static int parseInt(String s); public static int parseInt(String s, int radix); public static String toBinaryString(int i); public static String toHexString(int i); public static String toOctalString(int i); public String toString(); public static String toString(int i); public static String toString(int i, int radix); public static Integer valueOf(String s); public static Integer valueOf(String s, int radix); }

Puntos que debemos considerar: La estructura de una clase. Mtodos repetidos. (como parseInt por ejemplo), al llamarse al mtodo el compilador decide cul de las implementaciones del mismo usar basndose en la cantidad y tipo de parmetros que le pasamos. Por ejemplo, parseInt("134") y parseInt("134",16), al compilarse, generarn llamados a dos mtodos distintos.

2. Conceptos bsicos 2.1.Concepto de clase


Una clase es una agrupacin de datos (variables o campos) y de funciones (mtodos) que operan sobre esos datos. La definicin de una clase se realiza en la siguiente forma:
[public] class Classname { // definicin de variables y mtodos ... }

donde la palabra public es opcional: si no se pone, la clase tiene la visibilidad por defecto, esto es, slo es visible para las dems clases del package. Todos los mtodos y variables deben ser definidos dentro del bloque {...} de la clase. Un objeto (en ingls, instance) es un ejemplar concreto de una clase. Las clases son como tipos de variables, mientras que los objetos son como variables concretas de un tipo determinado.

34

Programacin III NombreDeClase objeto1; NombreDeClase objeto2;

UAA

M.I. Jos de Jess Palos Garca

A continuacin se enumeran algunas caractersticas importantes de las clases: 1. En Java no existen variables o funciones globales, ya que, todas las variables y funciones deben pertenecer a una clase. 2. Una clase que deriva de otra (extends), hereda todas sus variables y mtodos. 3. Una clase slo puede heredar de una nica clase (en Java no hay herencia mltiple). Si al definir una clase no se especifica de qu clase deriva, por defecto la clase deriva de java.lang.Object, que es la base de toda la jerarqua de clases de Java. 4. En un archivo es posible definir varias clases, pero en nicamente puede existir una clase public, el archivo debe de llamarse como la clase public con extensin *.java. En caso de existir, una clase en un archivo que no es public, no es necesario que compartan el mismo nombre. 5. Los mtodos de una clase pueden referirse de modo global al objeto de esa clase al que se aplican por medio de la referencia this. 6. Las clases se pueden agrupar en paquetes (packages) que est relacionada con la jerarqua de directorios y archivos en la que se guardan las clases. Ejemplo: package packageName

2.2.Concepto de interface
Una interface es un conjunto de declaraciones de funciones. Si una clase implementa (implements) una interface, debe definir todas las funciones especificadas por la interface. Las interfaces pueden definir tambin variables finales (constantes). Una clase puede implementar ms de una interface, representando una alternativa a la herencia mltiple. En algunos aspectos los nombres de las interfaces pueden utilizarse en lugar de las clases. Por ejemplo, las interfaces sirven para definir referencias a cualquier objeto de cualquiera de las clases que implementan esa interface. Con ese nombre o referencia, sin embargo, slo se pueden utilizar los mtodos de la interface. ste es un aspecto importante del polimorfismo. Una interface puede derivar de otra o incluso de varias interfaces, en cuyo caso incorpora las declaraciones de todos los mtodos de las interfaces de las que deriva (a diferencia de las clases, las interfaces de Java s tienen herencia mltiple).

3. Definicin de una clase


A continuacin se reproduce como ejemplo la clase Circulo:
//Circulo.java public class Circulo extends Geometria { static int numCirculos = 0; public static final double PI=3.14159265358979323846; public double x, y, r; public Circulo(double x, double y, double r) { this.x=x; this.y=y; this.r=r;

35

Programacin III
numCirculos++; } public Circulo(double r) { this(0.0, 0.0, r); } public Circulo(Circulo c) { this(c.x, c.y, c.r); } public Circulo() { this(0.0, 0.0, 1.0); } public double perimetro() { return 2.0 * PI * r; } public double area() { return PI * r * r; }

UAA

M.I. Jos de Jess Palos Garca

// mtodo de objeto para comparar crculos public Circulo elMayor(Circulo c) { if (this.r>=c.r) return this; else return c; } // mtodo de clase para comparar crculos public static Circulo elMayor(Circulo c, Circulo d) { if (c.r>=d.r) return c; else return d; } } // fin de la clase Circulo

En este ejemplo se ve cmo se definen las variables miembro y los mtodos dentro de la clase. Dichas variables y mtodos pueden ser de objeto o de clase (static). Se puede ver tambin cmo el nombre del archivo coincide con el de la clase public con la extensin *.java.

4. Variables miembro
A diferencia de la programacin algortmica clsica, que estaba centrada en las funciones, la programacin orientada a objetos est centrada en los datos. Una clase est constituida por unos datos y unos mtodos que operan sobre esos datos.

4.1.Variables miembro de objeto


Cada objeto, es decir cada ejemplar concreto de la clase, tiene su propia copia de las variables miembro. Las variables miembro de una clase (tambin llamadas campos) pueden ser de tipos primitivos (boolean, int, long, double, ) o referencias a objetos de otra clase (composicin). Un aspecto muy importante del correcto funcionamiento de los programas es que no haya datos sin inicializar. Por eso las variables miembro de tipos primitivos se inicializan siempre de modo automtico, incluso antes de llamar al constructor (false para boolean, el carcter nulo 36

Programacin III

UAA

M.I. Jos de Jess Palos Garca

para char y cero para los tipos numricos). De todas formas, lo ms adecuado es inicializarlas tambin en el constructor. Las variables miembro pueden tambin inicializarse explcitamente en la declaracin, como las variables locales, por medio de constantes o llamadas a mtodos (esta inicializacin no est permitida en C++). Por ejemplo, long nDatos = 100; Las variables miembro se inicializan en el mismo orden en que aparecen en el cdigo de la clase. Esto es importante porque unas variables pueden apoyarse en otras previamente definidas. Cada objeto que se crea de una clase tiene su propia copia de las variables miembro. Por ejemplo, cada objeto de la clase Circulo tiene sus propias coordenadas del centro x e y, y su propio valor del radio r. Los mtodos de objeto se aplican a un objeto concreto poniendo el nombre del objeto y luego el nombre del mtodo, separados por un punto. A este objeto se le llama argumento implcito. Por ejemplo, para calcular el rea de un objeto de la clase Circulo llamado c1 se escribir: c1.area();. Las variables miembro del argumento implcito se acceden directamente o precedidas por la palabra this y el operador punto. Las variables miembro pueden ir precedidas en su declaracin por uno de los modificadores de acceso: public, private, protected y package (que es el valor por defecto y puede omitirse). Junto con los modificadores de acceso de la clase (public y package), determinan qu clases y mtodos van a tener permiso para utilizar la clase y sus mtodos y variables miembro. En el Apartado 3.11, en la pgina 58, se especifican con detalle las consecuencias de estos modificadores de acceso. Existen otros dos modificadores (no de acceso) para las variables miembro: 1. transient: indica que esta variable miembro no forma parte de la persistencia (capacidad de los objetos de mantener su valor cuando termina la ejecucin de un programa) de un objeto y por tanto no debe ser serializada (convertida en flujo de caracteres para poder ser almacenada en disco o en una base de datos) con el resto del objeto. 2. volatile: indica que esta variable puede ser utilizada por distintas threads sincronizadas (ver Apartado 6.3, en la pgina 123) y que el compilador no debe realizar optimizaciones con esta variable. Al nivel de estos apuntes, los modificadores transient y volatile no sern utilizados

4.2.Variables miembro de clase (static)


Una clase puede tener variables propias de la clase y no de cada objeto. A estas variables se les llama variables de clase o variables static. Las variables static se suelen utilizar para definir constantes comunes para todos los objetos de la clase (por ejemplo PI en la clase Circulo) o variables que slo tienen sentido para toda la clase (por ejemplo, un contador de objetos creados como numCirculos en la clase Circulo). Las variables de clase son lo ms parecido que Java tiene a las variables globales de C/C++. 37

Programacin III

UAA

M.I. Jos de Jess Palos Garca

Las variables de clase se crean anteponiendo la palabra static a su declaracin. Para llamarlas se suele utilizar el nombre de la clase (no es imprescindible, pues se puede utilizar tambin el nombre de cualquier objeto), porque de esta forma su sentido queda ms claro. Por ejemplo, Circulo.numCirculos es una variable de clase que cuenta el nmero de crculos creados. Si no se les da valor en la declaracin, las variables miembro static se inicializan con los valores por defecto para los tipos primitivos (false para boolean, el carcter nulo para char y cero para los tipos numricos), y con null si es una referencia. Las variables miembro static se crean en el momento en que pueden ser necesarias: cuando se va a crear el primer objeto de la clase, en cuanto se llama a un mtodo static o en cuanto se utiliza una variable static de dicha clase. Lo importante es que las variables miembro static se inicializan siempre antes que cualquier objeto de la clase.

4.3.Variables Finales
Una variable de un tipo primitivo declarada como final no puede cambiar su valor a lo largo de la ejecucin del programa. Puede ser considerada como una constante, y equivale a la palabra const de C/C++. Java permite separar la definicin de la inicializacin de una variable final. La inicializacin puede hacerse ms tarde, en tiempo de ejecucin, llamando a mtodos o en funcin de otros datos. La variable final as definida es constante (no puede cambiar), pero no tiene por qu tener el mismo valor en todas las ejecuciones del programa, pues depende de cmo haya sido inicializada. Adems de las variables miembro, tambin las variables locales y los propios argumentos de un mtodo pueden ser declarados final. Declarar como final un objeto miembro de una clase hace constante la referencia, pero no el propio objeto, que puede ser modificado a travs de otra referencia. En Java no es posible hacer que un objeto sea constante.

5. Mtodos (funciones miembro) 5.1.Mtodos de objeto


Los mtodos son funciones definidas dentro de una clase. Salvo los mtodos static o de clase, se aplican siempre a un objeto de la clase por medio del operador punto (.). Dicho objeto es su argumento implcito. Los mtodos pueden adems tener otros argumentos explcitos que van entre parntesis, a continuacin del nombre del mtodo. La primera lnea de la definicin de un mtodo se llama declaracin o header; el cdigo comprendido entre las llaves {} es el cuerpo o body del mtodo. Considrese el siguiente mtodo tomado de la clase Circulo:
public Circulo elMayor(Circulo c) { // header y comienzo del mtodo if (this.r>=c.r) // body return this; // body else // body return c; // body } // final del mtodo

El header consta del cualificador de acceso (public, en este caso), del tipo del valor de retorno (Circulo en este ejemplo, void si no tiene), del nombre de la funcin y de una lista de

38

Programacin III

UAA

M.I. Jos de Jess Palos Garca

argumentos explcitos entre parntesis, separados por comas. Si no hay argumentos explcitos se dejan los parntesis vacos. Los mtodos tienen visibilidad directa de las variables miembro del objeto que es su argumento implcito, es decir, pueden acceder a ellas sin cualificarlas con un nombre de objeto y el operador punto (.). De todas formas, tambin se puede acceder a ellas mediante la referencia this, de modo discrecional (como en el ejemplo anterior con this.r) o si alguna variable local o argumento las oculta. El valor de retorno puede ser un valor de un tipo primitivo o una referencia. En cualquier caso no puede haber ms que un nico valor de retorno (que puede ser un objeto o un array). Se puede devolver tambin una referencia a un objeto por medio de un nombre de interface. El objeto devuelto debe pertenecer a una clase que implemente esa interface.

Se puede devolver como valor de retorno un objeto de la misma clase que el mtodo o de una subclase, pero nunca de una super-clase. Los mtodos pueden definir variables locales. Su visibilidad llega desde la definicin al final del bloque en el que han sido definidas. No hace falta inicializar las variables locales en el punto en que se definen, pero el compilador no permite utilizarlas sin haberles dado un valor. A diferencia de las variables miembro, las variables locales no se inicializan por defecto. Si en el header del mtodo se incluye la palabra native (Ej: public native void miMetodo();) no hay que incluir el cdigo o implementacin del mtodo. Este cdigo deber estar en una librera dinmica (Dynamic Link Library o DLL). Estas libreras son archivos de funciones compiladas normalmente en lenguajes distintos de Java (C, C++, Fortran, etc.). Es la forma de poder utilizar conjuntamente funciones realizadas en otros lenguajes desde cdigo escrito en Java. Este tema queda fuera del carcter fundamentalmente introductorio de este manual. Un mtodo tambin puede declararse como synchronized (Ej: public synchronized doubl miMetodoSynch(){...}). Estos mtodos tienen la particularidad de que sobre un objeto no pueden ejecutarse simultneamente dos mtodos que estn sincronizados (vase Apartado 6.3, en la pgina 123).

5.2.Mtodos sobrecargados (overloading)


Al igual que C++, Java permite mtodos sobrecargados (overloaded), es decir, mtodos distintos que tienen el mismo nombre, pero que se diferencian por el nmero y/o tipo de los argumentos. El ejemplo de la clase Circulo del Apartado 3.2 presenta dos casos de mtodos sobrecargados: los cuatro constructores y los dos mtodos llamados elMayor(). A la hora de llamar a un mtodo sobrecargado, Java sigue unas reglas para determinar el mtodo concreto que debe llamar: 1. Si existe el mtodo cuyos argumentos se ajustan exactamente al tipo de los argumentos de la llamada (argumentos actuales), se llama ese mtodo. 2. Si no existe un mtodo que se ajuste exactamente, se intenta promover los argumentos actuales al tipo inmediatamente superior (por ejemplo char a int, int a long, float a double, etc.) y se llama el mtodo correspondiente.

39

Programacin III

UAA

M.I. Jos de Jess Palos Garca

3. Si slo existen mtodos con argumentos de un tipo ms restringido (por ejemplo, int en vez de long), el programador debe hacer un cast explcito en la llamada, responsabilizndose de esta manera de lo que pueda ocurrir. 4. El valor de retorno no influye en la eleccin del mtodo sobrecargado. En realidad es imposible saber desde el propio mtodo lo que se va a hacer con l. No es posible crear dos mtodos sobrecargados, es decir con el mismo nombre, que slo difieran en el valor de retorno. Diferente de la sobrecarga de mtodos es la redefinicin. Una clase puede redefinir (override) un mtodo heredado de una superclase. Redefinir un mtodo es dar una nueva definicin. En este caso el mtodo debe tener exactamente los mismos argumentos en tipo y nmero que el mtodo redefinido. Este tema se ver de nuevo al hablar de la herencia.

5.3.Paso de parmetros y retorno de variables


En Java los argumentos de los tipos primitivos se pasan siempre por valor. El mtodo recibe una copia del argumento actual; si se modifica esta copia, el argumento original que se incluy en la llamada no queda modificado. La forma de modificar dentro de un mtodo una variable de un tipo primitivo es incluirla como variable miembro en una clase y pasar como argumento una referencia a un objeto de dicha clase. Las referencias se pasan tambin por valor, pero a travs de ellas se pueden modificar los objetos referenciados. En Java no se pueden pasar mtodos como argumentos a otros mtodos (en C/C++ se pueden pasar punteros a funcin como argumentos). Lo que se puede hacer en Java es pasar una referencia a un objeto y dentro de la funcin utilizar los mtodos de ese objeto. Dentro de un mtodo se pueden crear variables locales de los tipos primitivos o referencias. Estas variables locales dejan de existir al terminar la ejecucin del mtodo1. Los argumentos formales de un mtodo (las variables que aparecen en el header del mtodo para recibir el valor de los argumentos actuales) tienen categora de variables locales del mtodo. Si un mtodo devuelve this (es decir, un objeto de la clase) o una referencia a otro objeto, ese objeto puede encadenarse con otra llamada a otro mtodo de la misma o de diferente clase y as sucesivamente. En este caso aparecern varios mtodos en la misma sentencia unidos por el operador punto (.), por ejemplo,
String numeroComoString = 8.978; float p = Float.valueOf(numeroComoString).floatValue();

donde el mtodo valueOf(String) de la clase java.lang.Float devuelve un objeto de la clase Float sobre el que se aplica el mtodo floatValue(), que finalmente devuelve una variable primitiva de tipo float. El ejemplo anterior se poda desdoblar en las siguientes sentencias:
String numeroComoString = 8.978; Float f = Float.valueOf(numeroComoString); float p = f.floatValue();

Obsrvese que se pueden encadenar varias llamadas a mtodos por medio del operador punto (.) que, como todos los operadores de Java excepto los de asignacin, se ejecuta de izquierda a derecha (ver Apartado 2.2.11, en la pgina 28).

40

Programacin III

UAA

M.I. Jos de Jess Palos Garca

5.4.Mtodos de clase (static)


Anlogamente, puede tambin haber mtodos que no acten sobre objetos concretos a travs del operador punto. A estos mtodos se les llama mtodos de clase o static. Los mtodos de clase pueden recibir objetos de su clase como argumentos explcitos, pero no tienen argumento implcito ni pueden utilizar la referencia this. Un ejemplo tpico de mtodos static son los mtodos matemticos de la clase java.lang.Math (sin(), cos(), exp(), pow(), etc.). De ordinario el argumento de estos mtodos ser de un tipo primitivo y se le pasar como argumento explcito. Estos mtodos no tienen sentido como mtodos de objeto. Los mtodos y variables de clase se crean anteponiendo la palabra static. Para llamarlos se suele utilizar el nombre de la clase, en vez del nombre de un objeto de la clase (por ejemplo, Math.sin(ang), para calcular el seno de un ngulo). Los mtodos y las variables de clase son lo ms parecido que Java tiene a las funciones y variables globales de C/C++ o Visual Basic.

5.5.Construccin de clases 5.5.1. Constructores


Un punto clave de la Programacin Orientada Objetos es el evitar informacin incorrecta por no haber sido correctamente inicializadas las variables. Java no permite que haya variables miembro que no estn inicializadas2. Ya se ha dicho que Java inicializa siempre con valores por defecto las variables miembro de clases y objetos. El segundo paso en la inicializacin correcta de objetos es el uso de constructores. Un constructor es un mtodo que se llama automticamente cada vez que se crea un objeto de una clase. La principal misin del constructor es reservar memoria e inicializar las variables miembro de la clase. Los constructores no tienen valor de retorno (ni siquiera void) y su nombre es el mismo que el de la clase. Su argumento implcito es el objeto que se est creando. De ordinario una clase tiene varios constructores, que se diferencian por el tipo y nmero de sus argumentos (son un ejemplo tpico de mtodos sobrecargados). Se llama constructor por defecto al constructor que no tiene argumentos. El programador debe proporcionar en el cdigo valores iniciales adecuados para todas las variables miembro. Un constructor de una clase puede llamar a otro constructor previamente definido en la misma clase por medio de la palabra this. En este contexto, la palabra this slo puede aparecer en la primera sentencia de un constructor. El constructor de una sub-clase puede llamar al constructor de su super-clase por medio de la palabra super, seguida de los argumentos apropiados entre parntesis. De esta forma, un constructor slo tiene que inicializar por s mismo las variables no heredadas. El constructor es tan importante que, si el programador no prepara ningn constructor para una clase, el compilador crea un constructor por defecto, inicializando las variables de los

41

Programacin III

UAA

M.I. Jos de Jess Palos Garca

tipos primitivos a su valor por defecto, y los Strings y las dems referencias a objetos a null. Si hace falta, se llama al constructor de la super-clase para que inicialice las variables heredadas. Al igual que los dems mtodos de una clase, los constructores pueden tener tambin los modificadores de acceso public, private, protected y package. Si un constructor es private, ninguna otra clase puede crear un objeto de esa clase. En este caso, puede haber mtodos public y static (factory methods) que llamen al constructor y devuelvan un objeto de esa clase. Dentro de una clase, los constructores slo pueden ser llamados por otros constructores o por mtodos static. No pueden ser llamados por los mtodos de objeto de la clase.

6. Paquetes (package)
Qu es un package? Un package es una agrupacin de clases. En la API de Java 1.1 haba 22 packages; en Java 1.2 hay 59 packages, lo que da una idea del crecimiento experimentado por el lenguaje. Adems, el usuario puede crear sus propios packages. Para que una clase pase a formar parte de un package llamado pkgName, hay que introducir en ella la sentencia:
package pkgName;

que debe ser la primera sentencia del archivo sin contar comentarios y lneas en blanco. Los nombres de los packages se suelen escribir con minsculas, para distinguirlos de las clases, que empiezan por mayscula. El nombre de un package puede constar de varios nombres unidos por puntos (los propios packages de Java siguen esta norma, como por ejemplo java.awt.event). Todas las clases que forman parte de un package deben estar en el mismo directorio. Los nombres compuestos de los packages estn relacionados con la jerarqua de directorios en que se guardan las clases. Es recomendable que los nombres de las clases de Java sean nicos en Internet. Es el nombre del package lo que permite obtener esta caracterstica. Una forma de conseguirlo es incluir el nombre del dominio (quitando quizs el pas), como por ejemplo en el package siguiente:
es.ceit.jgjalon.infor2.ordenar

Las clases de un package se almacenan en un directorio con el mismo nombre largo (path) que el package. Por ejemplo, la clase,
es.ceit.jgjalon.infor2.ordenar.QuickSort.class

debera estar en el directorio,


CLASSPATH\es\ceit\jgjalon\infor2\ordenar\QuickSort.class

42

Programacin III

UAA

M.I. Jos de Jess Palos Garca

donde CLASSPATH es una variable de entorno del PC que establece la posicin absoluta de los directorios en los que hay clases de Java (clases del sistema o de usuario), en este caso la posicin del directorio es en los discos locales del ordenador. Los packages se utilizan con las finalidades siguientes: 1. Para agrupar clases relacionadas. 2. Para evitar conflictos de nombres (se recuerda que el dominio de nombres de Java es la Internet). En caso de conflicto de nombres entre clases importadas, el compilador obliga a cualificar en el cdigo los nombres de dichas clases con el nombre del package. 3. Para ayudar en el control de la accesibilidad de clases y miembros.

Cmo funcionan los packages


Con la sentencia import packname; se puede evitar tener que utilizar nombres muy largos, al mismo tiempo que se evitan los conflictos entre nombres. Si a pesar de todo hay conflicto entre nombres de clases, Java da un error y obliga a utilizar los nombres de las clases cualificados con el nombre del package. El importar un package no hace que se carguen todas las clases del package: slo se cargarn las clases public que se vayan a utilizar. Al importar un package no se importan los sub-packages. stos deben ser importados explcitamente, pues en realidad son packages distintos. Por ejemplo, al importar java.awt no se importa java.awt.event. Es posible guardar en jerarquas de directorios diferentes los archivos *.class y *.java, con objeto por ejemplo de no mostrar la situacin del cdigo fuente. Los packages hacen referencia a los archivos compilados *.class. En un programa de Java, una clase puede ser referida con su nombre completo (el nombre del package ms el de la clase, separados por un punto). Tambin se pueden referir con el nombre completo las variables y los mtodos de las clases. Esto se puede hacer siempre de modo opcional, pero es incmodo y hace ms difcil el reutilizar el cdigo y portarlo a otras mquinas. La sentencia import permite abreviar los nombres de las clases, variables y mtodos, evitando el tener que escribir continuamente el nombre del package importado. Se importan por defecto el package java.lang y el package actual o por defecto (las clases del directorio actual). Existen dos formas de utilizar import: para una clase y para todo un package:
import es.ceit.jgjalon.infor2.ordenar.QuickSort.class; import es.ceit.jgjalon.infor2.ordenar.*;

que deberan estar en el directorio:


classpath\es\ceit\jgjalon\infor2\ordenar

El cmo afectan los packages a los permisos de acceso de una clase se estudiara con ms detalle en las siguientes secciones.

43

Programacin III

UAA

M.I. Jos de Jess Palos Garca

7. Clases internas
Una clase interna es una clase definida dentro de otra clase, llamada clase contenedora, en alguna variante de la siguiente forma general:
class ClaseContenedora { ... class ClaseInterna { ... } ... }

Las clases internas fueron introducidas en la versin Java 1.1. Adems de su utilidad en s, las clases internas se utilizan mucho en el nuevo modelo de eventos que se introdujo en dicha versin de Java. Hay cuatro tipos de clases internas: 1. 2. 3. 4. Clases internas static (clases anidadas). Clases internas miembro. Clases internas locales. Clases annimas.

Una clase que contiene a una clase interna es llamada clase contenedora o clase global. JVM no sabe de la existencia de clases internas, ya que el compilador convierte estas clases en clases globales, contenidas en archivos *.class cuyo nombre es ClaseContenedora$ClaseInterna.class. Esta conversin inserta variables ocultas, mtodos y argumentos en los constructores.

Clases e interfaces internas static


Las clases e interfaces internas static slo pueden ser creadas dentro de otra clase al mximo nivel, es decir directamente en el bloque de definicin de la clase contenedora y no en un bloque ms interno. Es posible definir clases e interfaces internas static dentro de una interface contenedora. Este tipo de clases internas se definen utilizando la palabra static. Todas las interfaces internas son implcitamente static. Para utilizar su nombre desde fuera de la clase contenedora hay que precederlo por el nombre de la clase contenedora y el operador punto (.) Este tipo de relacin entre clases se puede utilizar para agrupar varias clases dentro de una clase ms general. Lo mismo puede decirse de las interfaces internas. Las clases internas static pueden ver y utilizar los miembros static de la clase contenedora. No se necesitan objetos de la clase contenedora para crear objetos de la clase interna static. Los mtodos de la clase interna static no pueden acceder directamente a los objetos de la clase contenedora, en caso de que los haya: deben disponer de una referencia a dichos objetos, como cualquier otra clase. 44

Programacin III

UAA

M.I. Jos de Jess Palos Garca

La sentencia import puede utilizarse para importar una clase interna static, en la misma forma que si se tratara de importar una clase de un package (con el punto (.)). Por ejemplo, si la interface Linkable es interna a la clase List, para implementar dicha interface hay que escribir,
... implements List.Linkable

y para importarla hay que usar,


import List.*; // o bien import List.Linkable;

Otras caractersticas importantes son las siguientes: 1. Pueden definirse clases e interfaces internas dentro de interface y clases contenedoras, con las cuatro combinaciones posibles. 2. Puede haber varios niveles, esto es una clase interna static puede ser clase contenedora de otra clase interna static, y as sucesivamente. 3. Las clases e interfaces internas static pertenecen al package de la clase contenedora. 4. Pueden utilizarse los calificadores final, public, private y protected. sta es una forma ms de controlar el acceso a ciertas clases. A continuacin se presenta un ejemplo de clase interna static:
//archivo ClasesIntStatic.java class A { int i=1; // variable miembro de objeto static int is=-1; // variable miembro de clase public A(int i) {this.i=i;} // constructor // a los mtodos de la clase contenedora hay que pasarles referencias a los objetos de la clase interna static public void printA(Bs unBs) { System.out.println("i="+i+" unBs.j="+unBs.j); } // definicin de una clase interna static static class Bs { int j=2; public Bs(int j) {this.j=j;} // constructor // los mtodos de la clase interna static no pueden acceder a la i pues es una variable de objeto. S pueden acceder a is public void printBs() { System.out.println(" j=" + j + " is=" + is); } } // fin clase Bs } // fin clase contenedora A class ClasesIntStatic { public static void main(String [] arg) { A a1 = new A(11), a2 = new A(12); println("a1.i=" + a1.i + " a2.i=" + a2.i); // dos formas de crear objetos de la clase interna static A.Bs b1 = new A.Bs(-10); // necesario poner A.Bs A.Bs b2 = a1.new Bs(-11); // b2 es independiente de a1 // referencia directa a los objetos b1 y b2 println("b1.j=" + b1.j + " b2.j=" + b2.j);

45

Programacin III

UAA

M.I. Jos de Jess Palos Garca

// los mtodos de la clase interna acceden directamente a las variables de la clase contenedora slo si son static b1.printBs(); // escribe: j=-10 is=-1 b2.printBs(); // escribe: j=-20 is=-1 // a los mtodos de la clase contenedora hay que pasarles referencias // a los objetos de la clase interna, pera que puedan identificarlos a1.printA(b1); // escribe: i=11 unBs.j=-10 a1.printA(b2); // escribe: i=11 unBs.j=-11 } // fin de main() public static void println(String str) {System.out.println(str);} } // fin clase ClasesIntStatic

Clases internas miembro (no static)


Las clases internas miembro o simplemente clases internas, son clases definidas al mximo nivel de la clase contenedora (directamente en el bloque de diminucin de dicha clase), sin la palabra static. Se suelen llamar clases internas miembro o simplemente clases internas. No existen interfaces internas de este tipo. Las clases internas no pueden tener variables miembro static. Tienen una nueva sintaxis para las palabras this, new y super, que se ver un poco ms adelante. La caracterstica principal de estas clases internas e que cada objeto de la clase interna existe siempre dentro de un y slo un objeto de la clase contenedora. Un objeto de la clase contenedora puede estar relacionado con uno o ms objetos de la clase interna. Tener esto presente es muy importante para entender las caractersticas que se explican a continuacin. Relacin entre las clases interna y contenedora respecto al acceso a las variables miembro: 1. Debido a la relacin uno a uno, los mtodos de la clase interna ven directamente a las variables miembro del objeto de la clase contenedora, sin necesidad de cualificarlos. 2. Sin embargo, los mtodos de la clase contenedora no ven directamente las variables miembro de los objetos de la clase interna: necesitan cualificarlos con una referencia a los correspondientes objetos. Esto es consecuencia de la relacin uno a varios que existe entre los objetos de la clase contenedora y los de la clase interna. 3. Otras clases diferentes de las clases contenedora e interna pueden utilizar directamente los objetos de la clase interna, sin cualificarlos con el objeto o el nombre de la clase contenedora. De hecho, se puede seguir accediendo a los objetos de la clase interna aunque se pierda la referencia al objeto de la clase contenedora con el que estn asociados. Respecto a los permisos de acceso: 1. Las clases internas pueden tambin ser private y protected (las clases normales slo pueden ser public y package). Esto permite nuevas posibilidades de encapsulacin. 2. Los mtodos de las clases internas acceden directamente a todos los miembros, incluso private, de la clase contenedora. 3. Tambin la clase contenedora puede acceder si dispone de una referencia- a todas las variables miembro (incluso private) de sus clases internas. 4. Una clase interna puede acceder tambin a los miembros (incluso private) de otras clases internas definidas en la misma clase contenedora. Otras caractersticas de las clases internas son las siguientes:

46

Programacin III

UAA

M.I. Jos de Jess Palos Garca

1. Una clase interna miembro puede contener otra clase interna miembro, hasta el nivel que se desee (aunque no se considera buena tcnica de programacin utilizar muchos niveles). 2. En la clase interna, la palabra this se refiere al objeto de la propia clase interna. Para acceder al objeto de la clase contenedora se utiliza ClaseContenedora.this. 3. Para crear un nuevo objeto de la clase interna se puede utilizar new, precedido por la referencia al objeto de la clase contenedora que contendr el nuevo objeto: unObjCC.new(). El tipo del objeto es el nombre de la clase contenedora seguido del nombre de la clase interna, como por ejemplo:
ClaseCont.ClaseInt unObjClInt = unObjClaCont.new ClaseInt(...);

4. Supngase como ejemplo adicional que B es una clase interna de A y que C es una clase interna de B. La creacin de objetos de las tres clases se puede hacer del siguiente modo:
A a = new A(); // se crea un objeto de la clase A A.B b = a.new B(); // b es un objeto de la clase interna B dentro de a A.B.C c = b.new C(); // c es un objeto de la clase interna C dentro de b

5. Nunca se puede crear un objeto de la clase interna sin una referencia a un objeto de la clase contenedora. Los constructores de la clase interna tienen como argumento oculto una referencia al objeto de la clase contenedora. 6. El nuevo significado de la palabra super es un poco complicado: Si una clase deriva de una clase interna, su constructor no puede llamar a super() directamente. Ello hace que el compilador no pueda crear un constructor por defecto. Al constructor hay que pasarle una referencia a la clase contenedora de la clase interna super-clase, y con esa referencia ref llamar a ref.super(). Las clases internas pueden derivar de otras clases diferentes de la clase contenedora. En este caso, conviene tener en cuenta las siguientes reglas: 1. Las clases internas constituyen como una segunda jerarqua de clases en Java: por una parte estn en la clases contenedora y ven sus variables; por otra parte pueden derivar de otra clase que no tenga nada que ver con la clase contenedora. Es muy importante evitar conflictos con los nombres. En caso de conflicto entre un nombre heredado y un nombre en la clase contenedora, el nombre heredado debe tener prioridad. 2. En caso de conflicto de nombres, Java obliga a utilizar la referencia this con un nuevo significado: para referirse a la variable o mtodo miembro heredado se utiliza this.name, mientras que se utiliza NombreClaseCont.this.name para el miembro de la clase contenedora.. 3. Si una clase contenedora deriva de una super-clase que tiene una clase interna, la clase interna de la sub-clase puede a su vez derivar de la clase interna de la super-clase y redefinir todos los mtodos que necesite. La casustica se puede complicar todo lo que se desee, pero siempre hay que recomendar hacer las cosas lo ms sencillas que sea posible. El uso de las clases internas miembro tiene las siguientes restricciones: 1. Las clases internas no pueden tener el mismo nombre que la clase contenedora o package. 2. Tampoco pueden tener miembros static: variables, mtodos o clases. A continuacin se presenta un ejemplo completo de utilizacin de clases internas miembro: 47

Programacin III

UAA

M.I. Jos de Jess Palos Garca

// archivo ClasesInternas.java // clase contenedora class A { int i=1; // variable miembro public A(int i) {this.i=i;} // constructor // los mtoodos de la clase contenedora necesitan una // referencia a los objetos de la clase interna public void printA(B unB) { System.out.println("i="+i+" unB.j="+unB.j); // s acepta unB.j } // la clase interna puede tener cualquier visibilidad. Con private da error // porque main() no puede acceder a la clase interna protected class B { int j=2; public B(int j) {this.j=j;} // constructor public void printB() { System.out.println("i=" + i + " j=" + j); // s sabe qu es j } } // fin clase B } // fin clase contenedora A class ClasesInternas { public static void main(String [] arg) { A a1 = new A(11); A a2 = new A(12); println("a1.i=" + a1.i + " a2.i=" + a2.i); // forma de crear objetos de la clase interna // asociados a un objeto de la clase contenedora A.B b1 = a1.new B(-10), b2 = a1.new B(-20); // referencia directa a los objetos b1 y b2 (sin cualificar). println("b1.j=" + b1.j + " b2.j=" + b2.j); // los mtodos de la clase interna pueden acceder directamente a // las variables miembro del objeto de la clase contenedora b1.printB(); // escribe: i=11 j=-10 b2.printB(); // escribe: i=11 j=-20 // los mtodos de la clase contenedora deben recibir referencias // a los objetos de la clase interna, pera que puedan identificarlos a1.printA(b1); a1.printA(b2); A a3 = new A(13); A.B b3 = a3.new B(-30); println("b3.j=" + b3.j); a3 = null; // se destruye la referencia al objeto de la clase contenedora b3.printB(); // escribe: i=13 j=-30 a3 = new A(14); // se crea un nuevo objeto asociado a la referencia a3 // b3 sigue asociado an anterior objeto de la clase contenedora b3.printB(); // escribe: i=13 j=-30 } // fin de main() public static void println(String str) {System.out.println(str);} } // fin clase ClasesInternas

Clases internas locales Las clases internas locales o simplemente clases locales no se declaran dentro de otra clase al mximo nivel, sino dentro de un bloque de cdigo, normalmente en un mtodo, aunque tambin se pueden crear en un inicializador static o de objeto. Las principales caractersticas de las clases locales so las siguientes: 1. Como las variables locales, las clases locales slo son visibles y utilizables en el bloque de cdigo en el que estn definidas. Los objetos de la clase local deben ser creados en el mismo bloque en que dicha clase ha sido definida. De esta forma se puede acercar la definicin al uso de la clase. 2. Las clases internas locales tienen acceso a todas las variables miembro y mtodos de la clase contenedora. Pueden ver tambin los miembros heredados, tanto por la clase interna local como por la clase contenedora. 48

Programacin III

UAA

M.I. Jos de Jess Palos Garca

3. Las clases locales pueden utilizar las variables locales y argumentos de mtodos visibles en ese bloque de cdigo, pero slo si son final5 (en realidad la clase local trabaja con sus copias de las variables locales y por eso se exige que sean final y no puedan cambiar). 4. Un objeto de una clase interna local slo puede existir en relacin con un objeto de la clase contenedora, que debe existir previamente. 5. La palabra this se puede utilizar en la misma forma que en las clases internas miembro, pero no las palabras new y super. Restricciones en el uso de las clases internas locales: 1. No pueden tener el mismo nombre que ninguna de sus clases contenedoras. 2. No pueden definir variables, mtodos y clases static. 3. No pueden ser declaradas public, protected, private o package, pues su visibilidad es siempre la de las variables locales, es decir, la del bloque en que han sido definidas. Las clases internas locales se utilizan para definir clases Adapter en el AWT. A continuacin se presenta un ejemplo de definicin de clases internas locales:
// archivo ClasesIntLocales.java // Este archivo demuestra cmo se crean clases locales class A { int i=-1; // variable miembro // constructor public A(int i) {this.i=i;} // definicin de un mtodo de la clase A public void getAi(final long k) { // argumento final final double f=3.14; // variable local final // definicin de una clase interna local class BL { int j=2; public BL(int j) {this.j=j;} // constructor public void printBL() { System.out.println(" j="+j+" i="+i+" f="+f+" k="+k); } } // fin clase BL // se crea un objeto de BL BL bl = new BL(2*i); // se imprimen los datos de ese objeto bl.printBL(); } // fin getAi } // fin clase contenedora A class ClasesIntLocales { public static void main(String [] arg) { // se crea dos objetos de la clase contenedora A a1 = new A(-10); A a2 = new A(-11); // se llama al mtodo getAi() a1.getAi(1000); // se crea y accede a un objeto de la clase local a2.getAi(2000); } // fin de main() public static void println(String str) {System.out.println(str);} } // fin clase ClasesIntLocales

49

You might also like