You are on page 1of 65

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

JAVA BASICO
Crear Objetos en Java En Java, se crea un objeto mediante la creacin de un objeto de una clase o, en otras palabras, ejemplarizando una clase. Hasta entonces, los ejemplos contenidos aqu crean objetos a apartir de clases que ya existen en el entorno Java. Frecuentemente, se ver la creacin de un objeto Java con un sentencia como esta. Date hoy = new Date(); Esta sentencia crea un objeto Date (Date es una clase del paquete java,util). Esta sentencia realmente realiza tres acciones: declaracin, ejemplarizacin e inicializacin. Date hoy es una declaracin de variable que slo le dice al compilador que el nombre hoy se va a utilizar para referirse a un objeto cuyo tipo es Date, el operador new ejemplariza la clase Date (creando un nuevo objeto Date), y Date() inicializa el objeto. Declarar un Objeto Ya que la declaracin de un objeto es una parte innecesaria de la creacin de un objeto, las declaraciones aparecen frecuentemente en la misma lnea que la creacin del objeto. Como cualquier otra declaracin de variable, las declaraciones de objetos pueden aparecer solitarias como esta. Date hoy; De la misma forma, declarar una variable para contener un objeto es exactamente igual que declarar una variable que va a contener un tipo primitivo. tipo nombre donde tipo es el tipo de dato del objeto y nombre es el nombre que va a utilizar el objeto. En Java, las clases e interfaces son como tipos de datos. Entonces tipo puede ser el nombre de una clase o de un interface. Las declaraciones notifican al compilador que se va a utilizar nombre para referirse a una variable cuyo tipo es tipo. Las declaraciones no crean nuevos objetos. Date hoy no crea un objeto Date, slo crea un nombre de variable para contener un objeto Date. Para ejemplarizar la clase Date, o cualquier otra clase, se utiliza el operador new. Ejemplarizar una Clase El operador new ejemplariza una clase mediante la asignacin de memoria para el objeto nuevo de ese tipo. new necesita un slo argumento: una llamada al mtodo constructor. Los mtodos constructores son mtodos especiales proporcionados por
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

cada clase Java que son reponsables de la inicializacin de los nuevos objetos de ese tipo. El operador new crea el objeto, el constructor lo inicializa. Aqu tienes un ejemplo del uso del operador new para crear un objeto Rectangle (Rectangle es una clase del paquete java.awt). new Rectangle(0, 0, 100, 200); En el ejemplo, Rectangle(0, 0, 100, 200) es una llamada al constructor de la clase Rectangle. El operador new devuelve una referencia al objeto recien creado. Esta referencia puede ser asignada a una variable del tipo apropiado. Rectangle rect = new Rectangle(0, 0, 100, 200); (Recuerda que una clase esencialmente define un tipo de dato de referencia. Por eso, Rectangle puede utilizarse como un tipo de dato en los programas Java. El valor de cualquier variable cuyo tipo sea un tipo de referencia, es una referencia (un puntero) al valor real o conjunto de valores representado por la variable. Inicializar un Objeto Como mencion anteriormente, las clases porporcionan mtodos constructores para incializar los nuevos objetos de ese tipo. Una clase podra proporcionar mltiples constructores para realizar diferentes tipos de inicializacin en los nuevos objetos. Cuando veas la implementacin de una clase, reconocers los constructores porque tienen el mismo nombre que la clase y no tienen tipo de retorno. Recuerda la creacin del objeto Date en el seccin inicial. El constructor utilizado no tena ningn argumento. Date() Un constructor que no tiene ningn argumento, como el mostrado arriba, es conocido como constructor por defecto. Al igual que Date, la mayora de las clases tienen al menos un constructor, el constructor por defecto. Si una clase tiene varios constructores, todos ellos tienen el mismo nombre pero se deben diferenciar en el nmero o el tipo de sus argumentos. Cada constructor inicializa el nuevo objeto de una forma diferente. Junto al constructor por defecto, la clase Date proporciona otro constructor que inicializa el nuevo objeto con un nuevo ao, mes y da. Date cumpleaos = new Date(1963, 8, 30); El compilador puede diferenciar los constructores a travs del tipo y del nmero de sus argumentos. Usar Objetos Java

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Una vez que se ha creado un objeto, probablemente querrs hacer algo con l. Supn, por ejemplo, que despus de crear un nuevo rectngulo, quieres moverlo a una posicin diferente (es decir, el rectngulo es un objeto en un programa de dibujo y el usuario quiere moverlo a otra posicin de la pgina). La clase Rectangle proporciona dos formas equivalentes de mover el rectngulo. 1. Manipular directamente las variables x e y del objeto. 2. Llamar el mtodo move(). La opcin 2 se considera "ms orientada a objetos" y ms segura porque se manipulan las variables del objeto indirectamente a travs de una capa protectora de mtodos, en vez de manejarlas directamente. Manipular directamente las variables de un objeto se considera propenso a errores; se podra colocar el objeto en un estado de inconsistencia. Sin embargo, una clase no podra (y no debera) hacer que sus variables estuvieran disponibles para la manipulacin directa por otros objetos, si fuera posible que esas manipulaciones situaran el objeto en un estado de inconsistencia. Java proporciona un mecanismo mediante el que las clases pueden restringir o permitir el acceso a sus variables y mtodos a otros objetos de otros tipos. Esta seccin explica la llamada a mtodos y la manipulacin de variables que se han hecho accesibles a otras clases. Para aprender ms sobre el control de acceso a miembros puedes ir Controlar el Acceso a Miembros de una Clase. Las variables x e y de Rectangle son accesibles desde otras clases. Por eso podemos asumir que la manipulacin directa de estas variables es segura. Referenciar Variables de un Objeto Primero, enfoquemos cmo inspeccionar y modificar la posicin del rectngulo mediante la manipulacin directa de las variables x e y. La siguiente seccin mostrar como mover el rectngulo llamando al mtodo move(). Para acceder a las variables de un objeto, slo se tiene que aadir el nombre de la variable al del objeto referenciado introduciendo un punto en el medio ('.'). objetoReferenciado.variable Supn que tienes un rectngulo llamado rect en tu programa. puedes acceder a las variables x e y con rect.x y rect.y, respectivamente. Ahora que ya tienes un nombre para las variables de rect, puedes utilizar ese nombre en sentencias y expresiones Java como si fueran nombres de variables "normales". As, para mover el rectngulo a una nueva posicin podras escribir. rect.x = 15; rect.y = 37; // cambia la posicin x // cambia la posicin y

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

La clase Rectangle tiene otras dos variables--width y height--que son accesibles para objetos fuera de Rectangle. Se puede utilizar la misma notacin con ellas: rect.width y rect.height. Entonces se puede calcular el rea del rectngulo utilizando esta sentencia. area = rect.height * rect.width; Cuando se accede a una variable a travs de un objeto, se est refiriendo a las variables de un objeto particular. Si cubo fuera tambin un rectngulo con una altura y anchura diferentes de rect, esta instruccin. area = cubo.height * cubo.width; calcula el rea de un rectngulo llamado cubo y dar un resultado diferente que la instruccin anterior (que calculaba el rea de un rectngulo llamado rect). Observa que la primera parte del nombre de una variable de un objeto (el objetoReferenciado en objetoReferenciado.variable) debe ser una referencia a un objeto. Como se puede utilizar un nombre de variable aqu, tambin se puede utilizar en cualquier expresin que devuelva una referencia a un objeto. Recuerda que el operador new devuelve una referencia a un objeto. Por eso, se puede utilizar el valor devuelto por new para acceder a las variables del nuevo objeto. height = new Rectangle().height; Llamar a Mtodos de un Objeto Llamar a un mtodo de un objeto es similar a obtener una variable del objeto. Para llamar a un mtodo del objeto, simplemente se aade al nombre del objeto referenciado el nombre del mtodo, separados por un punto ('.'), y se proporcionan los argumentos del mtodo entre parntesis. Si el mtodo no necesita argumentos, se utilizan los parntesis vacios. objetoReferenciado.nombreMtodo(listaArgumentos); o objetoReferenciado.nombreMtodo(); Veamos que significa esto en trminos de movimiento del rectngulo. Para mover rect a una nueva posicin utilizando el mtodo move() escribe esto. rect.move(15, 37); Esta sentencia Java llama al mtodo move() de rect con dos parmetros enteros, 15 y 37. Esta sentencia tiene el efecto de mover el objeto rect igual que se hizo en las sentencias anteriores en las que se moficaban directamente los valores x e y del objeto. rect.x = 15; rect.y = 37;

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Si se quiere mover un rectngulo diferente, uno llamado cubo, la nueva posicin se podra escribir. cubo.move(244, 47); Como se ha visto en estos ejemplos, las llamadas a mtodos se hacen directamente a un objeto especfico; el objeto especificado en la llamada al mtodo es el que responde a la instruccin. Las llamadas a mtodos tambin se conocen como mensajes. Como en la vida real, los mensajes se deben dirigir a un receptor particular. Se pueden obtener distintos resultados dependiendo del receptor de su mensaje. En el ejemplo anterior, se ha enviado el mensaje move() al objeto llamado rect para que ste mueva su posicin. Cuando se enva el mensaje move() al objeto llamado cubo, el que se mueve es cubo. Son resultados muy distintos. Una llamada a un mtodo es una expresin (puedes ver Expresiones para ms informacin) y evala a algn valor. El valor de una llamada a un mtodo es su valor de retorno, si tiene alguno. Normalmente se asignar el valor de retorno de un mtodo a una variable o se utilizar la llamada al mtodo dentro del mbito de otra expresin o sentencia. El mtodo move() no devuelve ningn valor (est declarado como void). Sin embargo, el mtodo inside() de Rectangle si lo hace. Este mtodo toma dos coordendas x e y, y devuelte true si este punto est dentro del rectngulo. Se puede utilizar el mtodo inside() para hacer algo especial en algn punto, como decir la posicin del ratn cuando est dentro del rectangulo. if (rect.inside(mouse.x, mouse.y)) { ... // ratn dentro del rectngulo ... } else { ... // ratn fuera del rectngulo ... } Recuerda que una llamada a un mtodo es un mensaje al objeto nombrado. En este caso, el objeto nombrado es rect. Entonces. rect.inside(mouse.x, mouse.y)

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

le pregunta a rect si la posicin del cursor del ratn se encuentra entre las coordenadas mouse.x y mouse.y. Se podra obtener una respuesta diferente si enva el mismo mensaje a cubo. Como se explic anteriormente, el objetoReferenciado en la llamada al mtodo objetoReferenciado.metodo() debe ser una referencia a un objeto. Como se puede utilizar un nombre de variable aqu, tambin se puede utilizar en cualquier expresin que devuelva una referencia a un objeto. Recuerda que el operador new devuelve una referencia a un objeto. Por eso, se puede utilizar el valor devuelto por new para acceder a las variables del nuevo objeto. new Rectangle(0, 0, 100, 50).equals(anotherRect) La expresin new Rectangle(0, 0, 100, 50) evala a una referencia a un objeto que se refiere a un objeto Rectangle. Entonces, como vers, se puede utilizar la notacin de punto ('.') para llamar al mtodo equals() del nuevo objeto Rectangle para determinar si el rectanglo nuevo es igual al especificado en la lista de argumentos de equals(). TutorJava Nivel Bsico Autor: Traductor: Juan Antonio Palos (Ozito)

Sun

Eliminar Objetos Java o Recolector de Basura o Finalizacin

Eliminar Objetos Java Muchos otros lenguajes orientados a objetos necesitan que se siga la pista de los objetos que se han creado y luego se destruyan cuando no se necesiten. Escribir cdigo para manejar la memoria de esta es forma es aburrido y propenso a errores. Java permite ahorrarse esto, permitindo crear tantos objetos como se quiera (slo limitados por los que el sistema pueda manejar) pero nunca tienen que ser destruidos. El entorno de ejecucin Java borra los objetos cuando determina que no se van autilizar ms. Este proceso es conocido como recoleccin de basura. Un objeto es elegible para la recoleccin de basura cuando no existen ms referencias a ese objeto. Las referencias que se mantienen en una variable desaparecen de forma natural cuando la variable sale de su mbito. O cuando se borra explcitamente un objeto referencia mediante la seleccin de un valor cuyo tipo de dato es una referencia a null. Recolector de Basura El entorno de ejecucin de Java tiene un recolector de basura que peridicamente libera la memoria ocupada por los objetos que no se van a necesitar ms.
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

El recolector de basura de Java es un barredor de marcas que escanea dinmicamente la memoria de Java buscando objetos, marcando aquellos que han sido referenciados. Despus de investigar todos los posibles paths de los objetos, los que no estn marcados (esto es, no han sido referenciados) se les conoce como basura y son eliminados. El colector de basura funciona en un thread (hilo) de baja prioridad y funciona tanto sncrona como asncronamente dependiendo de la situacin y del sistema en el que se est ejecutando el entorno Java. El recolector de basura se ejecuta sncronamente cuando el sistema funciona fuera de memoria o en respuesta a una peticin de un programa Java. Un programa Java le puede pedir al recolector de basura que se ejecute en cualquier momento mediante una llamada a System.gc(). Nota: Pedir que se ejecute el recolector de basura no garantiza que los objetos sean recolectados. En sistemas que permiten que el entorno de ejecucin Java note cuando un thread a empezado a interrumpir a otro thread (como Windows 95/NT), el recolector de basura de Java funciona asncromamente cuando el sistema est ocupado. Tan pronto como otro thread se vuelva activo, se pedira al recolector de basura que obtenga un estado consistente y termine. Finalizacin Antes de que un objeto sea recolectado, el recolector de basura le da una oportunidad para limpiarse l mismo mediante la llamada al mtodo finalize() del propio objeto. Este proceso es conocido como finalizacin. Durante la finalizacin de un objeto se podran liberar los recursos del sistema como son los ficheros, etc. y liberar referencias en otros objetos para hacerse elegible por la recoleccin de basura. El mtodo finalize() es un miembro de la clase java.lang.Object. Una clase debe sobreescribir el mtodo finalize() para realizar cualquier finalizacin necesaria para los objetos de ese tipo. TutorJava Nivel Bsico Autor: Sun Microsystem. Traductor: Juan Antonio Palos (Ozito)

Declarar Clases Java o La Declaracin de la Clase o Declarar la Superclase de la Clase o Listar los Interfaces Implementados por la Clase o Clases Public, Abstract, y Final o Sumario de la Daclaracin de una Clase

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Declarar Clases Java Ahora que ya sabemos como crear, utilizar y destruir objetos, es hora de aprender cmo escribir clases de las que crear esos objetos. Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. La implementacin de una clase comprende dos componentes: la declaracin y el cuerpo de la clase. DeclaracinDeLaClase { CuerpoDeLaClase } La Declaracin de la Clase Como mnimo, la declaracin de una clase debe contener la palabra clave class y el nombre de la clase que est definiendo. As la declaracin ms sencilla de una clase se parecera a esto. class NombredeClase { ... } Por ejemplo, esta clase declara una nueva clase llamada NumeroImaginario. class NumeroImaginario { ... } Los nombres de las clases deben ser un identificador legal de Java y, por convencin, deben empezar por una letra mayscula. Muchas veces, todo lo que se necesitar ser una declaracin mnima. Sin embargo, la declaracin de una clase puede decir ms cosas sobre la clase. Ms especificamente, dentro de la declaracin de la clase se puede.

declarar cual es la superclase de la clase. listar los interfaces implementados por la clase declarar si la clase es pblica, abstracta o final

Declarar la Superclase de la Clase En Java, todas las clases tienen una superclase. Si no se especifica una superclase para una clase, se asume que es la clase Object (declarada en java.lang). Entonces la superclase de NumeroImaginario es Object porque la declaracin no explicit ninguna otra clase. Para obtener ms informacin sobre la clase Object, puede ver La clase Object. Para especificar explcitamente la superclase de una clase, se debe poner la palabra clave extends ms el nombre de la superclase entre el nombre de la clase que se ha creado y la llave abierta que abre el cuerpo de la clase, as.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

class NombredeClase extends NombredeSuperClase { ... } Por ejemplo, supon que quieres que la superclase de NumeroImaginario sea la clase Number en vez de la clase Object. Se podra escribir esto. class NumeroImaginario extends Number { ... } Esto declara explcitamente que la clase Number es la superclase de NumeroImaginario. (La clase Number es parte del paquete java.lang y es la base para los enteros, los nmeros en coma flotante y otros nmeros). Declarar que Number es la superclase de NumeroImaginario declara implcitamente que NumeroImaginario es una subclase de Number. Una subclase hereda las variables y los mtodos de su superclase. Crear una subclase puede ser tan sencillo como incluir la clausula extends en su declaracin de clase. Sin embargo, se tendrn que hacer otras provisiones en su cdigo cuando se crea una subclase, como sobreescribir mtodos. Para obtener ms informacin sobre la creacin de subclases, puede ver Subclases, Superclases, y Herencia. Listar los Interfaces Implementados por la Clase Cuando se declara una clase, se puede especificar que interface, si lo hay, est implementado por la clase. Pero, Qu es un interface? Un interface declara un conjunto de mtodos y constantes sin especificar su implementacin para ningn mtodo. Cuando una clase exige la implementacin de un interface, debe proporcionar la implementacin para todos los mtodos declarados en el interface. Para declarar que una clase implementa uno o ms interfaces, se debe utilizar la palabra clave implements seguida por una lista de los interfaces implementados por la clase delimitados por comas. Por ejemplo, imagina un interface llamado Aritmetico que define los mtodos llamados suma(), resta(), etc... La clase NumeroImaginario puede declarar que implementa el interface Aritmetico de esta forma. class NumeroImaginario extends Number implements Aritmetico { ... } se debe garantizar que propociona la implementacin para los mtodos suma(), resta() y dems mtodos declarados en el interface Aritmetico. Si en NumeroImaginario falta alguna implementacin de los mtodos definidos en Aritmetico, el compilador mostrar un mensaje de error y no compilar el programa. nothing.java:5: class NumeroImaginario must be declared abstract. It does not define java.lang.Number add(java.lang.Number, java.lang.Number) from interface Aritmetico. class NumeroImaginario extends Number implements Aritmetico {
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

^ Por convencin, la clausula implements sigue a la clausula extends si sta existe. Observa que las firmas de los mtodos declarados en el interface Aritmetico deben corresponder con las firmas de los mtodos implementados en la clase NumeroImaginario. Tienes ms informacin sobre cmo crear y utilizar interfaces en Crear y Utilizar Interfaces. Clases Public, Abstract, y Final Se puede utilizar uno de estos tres modificadores en una declaracin de clase para declarar que esa clase es pblica, abstracta o final. Los modificadores van delante de la palabra clave class y son opcionales. El modificador public declara que la clase puede ser utilizada por objetos que estn fuera del paquete actual. Por defecto, una clase slo puede ser utilizada por otras clases del mismo paquete en el que estn declaradas. public class NumeroImaginario extends Number implements Aritmetico { ... } Por convencin, cuando se utiliza la palabra public en una declaracin de clase debemos asegurarnos de que es el primer item de la declaracin. El modificador abstract declara que la clase es una clase abstracta. Una clase abstracta podra contener mtodos abstractos (mtodos sin implementacin). Una clase abstracta est diseada para ser una superclase y no puede ejemplarizarse. Para una discusin sobre las clases abstractas y cmo escribirlas puedes ver Escribir Clases y Mtodos Abstractos. Utilizando el modificador final se puede declarar que una clase es final, que no puede tener subclases. Existen (al menos) dos razones por las que se podra querer hacer esto: razones de seguridad y razones de diseo. Para una mejor explicacin sobre las clases finales puedes ver Escribir Clases y Mtodos Finales. Observa que no tiene sentido para una clase ser abstracta y final. En otras palabras, una clase que contenga mtodos no implementados no puede ser final. Intentar declarar una clase como final y abstracta resultar en un error en tiempo de compilacin. Sumario de la Daclaracin de una Clase En suma, una declaracin de clase se parecera a esto. [ modificadores ] class NombredeClase [ extends NombredeSuperclase ] [ implements NombredeInterface ] { ... }

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Los puntos entre [ y ] son opcionales. Una declaracin de clase define los siguientes aspectos de una clase.

modificadores declaran si la clase es abstracta, pblica o final. NombredeClase selecciona el nombre de la clase que est declarando NombredeSuperClase es el nombre de la superclase de NombredeClase NombredeInterface es una lista delimitada por comas de los interfaces implementados por NombredeClase

De todos estos items, slo la palabra clave class y el nombre de la clase son necesarios. Los otros son opcionales. Si no se realiza ninguna declaracin explcita para los items opcionales, el compilador Java asume ciertos valores por defecto (una subclase de Object no final, no pblica, no obstracta y que no implementa interfaces).

El Cuerpo de una Clase Java Anteriormente se vi una descripcin general de la implementacin de una clase. DeclaraciondeClase { CuerpodeClase } La pgina anterior describe todos los componentes de la declaracin de una clase. Esta pgina describe la estructura general y la organizacin del cuerpo de la clase. El cuerpo de la clase compone la implementacin de la propia clase y contiene dos secciones diferentes: la declaracin de varibles y la de mtodos. Una variable miembro de la clase representa un estado de la clase y sus mtodos implemetan el comportamiendo de la clase. Dentro del cuerpo de la clase se definen todas las variables miembro y los mtodos soportados por la clase. Tpicamente, primero se declaran las variables miembro de la clase y luego se porporcionan las declaraciones e implementanciones de los mtodos, aunque este orden no es necesario. DeclaracindeClase { DeclaracionesdeVariablesMiembros DeclaracionesdeMtodos } Aqu tienes una pequea clase que declara tres variables miembro y un mtodo. class Ticket { Float precio; String destino; Date fechaSalida; void firma(Float forPrecio, String forDestino, Date forFecha) { precio = forPrecio; destino = forDestino;
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

fechaSalida = forFecha; } } Para ms informacin sobre cmo declarar variables miembro, puedes ver Declarar Variables Miembro. Y para obtener ms informacin sobre cmo implementar mtodos, puedes ver Implementar Mtodos. Adems de las variables miembro y los mtodos que se declaran explcitamente dentro del cuerpo de la clase, una clase puede heredar algo de su superclase. Por ejemplo, todas las clases del entorno Java son una descendencia (directa o indirecta) de la clase Object. La clase Object define el estado bsico y el comportamieto que todos los objetos deben tener como habilidad para comparar unos objetos con otros, para convertir una cadena, para esperar una condicin variable, para notificar a otros objetos que una condicin variable ha cambiado, etc... As, como descendentes de esta clase, todos los objetos del entorno Java heredan sus comportamientos de la clase Object.

TutorJava Nivel Bsico Autor: Traductor: Juan Antonio Palos (Ozito)

Sun

Declarar Variables Java o Declarar Constantes o Declarar Variables Transitorias o Declarar Variables Volatiles

Declarar Variables Java Como mnimo, una declaracin de variable miembro tiene dos componentes: el tipo de dato y el nombre de la variable. tipo nombreVariable; // Declaracin mnima de una variable miembro

Una declaracin mnima de variable miembro es como la declaracin de variables que se escribe en cualquier otro lugar de un programa Java, como las variables locales o los parmetros de los mtodos. El siguiente cdigo declara una variable miembro entera llamada unEntero dentro de la clase ClaseEnteros. class ClaseEnteros { int unEntero; ... // define los mtodos aqu ... }

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Observa que la declaracin de variables miembro aparece dentro de la implementacin del cuerpo de la clase pero no dentro de un mtodo. Este posicionamiento dentro del cuerpo de la clase determina que una variable es una variable miembro. Al igual que otras variables en Java, las variables miembro deben tener un tipo. Un tipo de variable determina los valores que pueden ser asignados a las variables y las operaciones que se pueden realizar con ellas. Ya deberas estar familiarizado con los tipos de datos en Java mediante la lectura de la leccin anterior: Variables y Tipos de Datos. Un nombre de una variable miembro puede ser cualquier identificador legal de Java y por convencin empieza con una letra minscula (los nombres de clase tpicamente empiezan con una letra mayscula). No se puede declarar ms de una variable con el mismo nombre en la misma clase. Por ejemplo, el siguiente cdigo es legal. class ClaseEnteros { int unEntero; int unEntero() { // un mtodo con el mismo nombre que una variable ... } } Junto con el nombre y el tipo, se pueden especificar varios atributos para las variables miembro cuando se las declara: incluyendo si los objetos pueden acceder a la variable, si la variable es una variable de clase o una variable de ejemplar, y si la variable es una constante. Una declaracin de variable se podra parecer a esto. [especificadordeAcceso] [static] [final] [transient] [volatile] tipo nombredeVaraible Los puntos entre [ y ] son opcionales. Los items en negrita se deben reemplazar por palabras clave o por nombres. Una declaracin de variable miembro define los siguientes aspectos de la variable.

especificadordeAcceso define si otras clases tienen acceso a la variable. Se puede controlar el acceso a los mtodos utilizando los mismos especificadores, por eso Controlar el Acceso a Variables Miembro de una Clase cubre cmo se puede controlar el acceso a las variables miembro o los mtodos. static indica que la variable es una variable miembro de la clase en oposicin a una variable miembro del ejemplar. Se puede utilizar static para declarar mtodos de clase. Miembros de Clase y de Ejemplar explica la declaracin de variables de clase y de ejemplar y escribir mtodos de ejemplar o de clase. final indica que la variable es una constante transient la variable no es una parte persistente del estado del objeto volatile significa que la variable es modificada de forma asncrona.

La explicacin de las variables final, transient, y volatile viene ahora. Declarar Constantes
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Para crear una variable miembro constante en Java se debe utilizar la palabra clave final en su declaracin de variable. La siguiente declaracin define una constante llamada AVOGADRO cuyo valor es el nmero de Avogadro (6.023 x 10^23) y no puede ser cambiado. class Avo { final double AVOGADRO = 6.023e23; } Por convencin, los nombres de los valores constantes se escriben completamene en maysculas. Si un programa intenta cambiar una variable, el compilador muestra un mensaje de error similar al siguiente, y rehusa a compilar su programa. AvogadroTest.java:5: Can't assign a value to a final variable: AVOGADRO Declarar Variables Transitorias Por defecto, las variables miembro son una parte persistente del estado de un objeto, Las variables que forman parte persistente del estado del objeto deben guardarse cuando el objeto se archiva. Se puede utilizar la palabra clave transient para indicar a la mquina virtual Java que la variable indicada no es una parte persistente del objeto. Al igual que otros modificadors de variables en el sistema Java, se puede utilizar transient en una clase o declaracin de variable de ejemplar como esta. class TransientExample { transient int hobo; ... } Este ejemplo declara una variable entera llamada hobo que no es una parte persistente del estado de la claseTransientExample. Declarar Variables Volatiles Si una clase contiene una variable miembro que es modificada de forma asncrona, mediante la ejecucin de threads concurrentes, se puede utilizar la palabra clave volatile de Java para notificar esto al sistema Java. La siguiente declaracin de variable es un ejemplo de como declarar que una variable va a ser modificada de forma asncrona por threads concurrentes. class VolatileExample { volatile int contador; ... } TutorJava Nivel Bsico Autor: Traductor: Juan Antonio Palos (Ozito)

Sun

Implementar Mtodos Java

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

o o o o

La Declaracin de Mtodo Devolver un Valor desde un Mtodo Un Nombre de Mtodo Caractersticas Avanzadas de la Declaracin de Mtodos

Implementar Mtodos Java Similarmente a la implementacin de una clase, la implementacin de un mtodo consiste en dos partes, la declaracin y el cuerpo del mtodo. declaracindeMtodo { cuerpodeMtodo } La Declaracin de Mtodo Una declaracin de mtodo proporciona mucha informacin sobre el mtodo al compilador, al sistema en tiempo de ejecucin y a otras clases y objetos. Junto con el nombre del mtodo, la declaracin lleva informacin como el tipo de retorno del mtodo, el nmero y el tipo de los argumentos necesarios, y qu otras clases y objetos pueden llamar al mtodo. Los nicos elementos necesarios para una declaracin de mtodo son el nombre y el tipo de retorno del mtodo. Por ejemplo, el cdigo siguiente declara un mtodo llamado estaVacio() en la clase Pila que devuelve un valor booleano (true o false). class Pila { ... boolean estaVacio() { ... } } Devolver un Valor desde un Mtodo Java necesita que un mtodo declare el tipo de dato del valor que devuelve. Si un mtodo no devuelve ningn valor, debe ser declarado para devolver void (nulo). Los mtodos pueden devolver tipos de datos primitivos o tipos de datos de referencia. El mtodo estaVacio() de la clase Pila devuelve un tipo de dato primitivo, un valor booleano. class Pila { static final int PILA_VACIA = -1; Object[] stackelements; int topelement = PILA_VACIA; ... boolean estaVacio() {
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

if (topelement == PILA_VACIA) return true; else return false; } } Sin embargo, el mtodo pop de la clase PILA devuelve un tipo de dato de referencia: un objeto. class Pila { static final int PILA_VACIA = -1; Object[] stackelements; int topelement = PILA_VACIA; ... Object pop() { if (topelement == PILA_VACIA) return null; else { return stackelements[topelement--]; } } } Los mtodos utilizan el operador return para devolver un valor. Todo mtodo que no sea declarado como void debe contener una sentencia return. El tipo de dato del valor devuelto por la sentencia return debe corresponder con el tipo de dato que el mtodo tiene que devolver; no se puede devolver un objeto desde un mtodo que fue declarado para devolver un entero. Cuando se devuelva un objeto, el tipo de dato del objeto devuelto debe ser una subclase o la clase exacta indicada. Cuando se devuelva un tipo interface, el objeto retornado debe implementar el interface especificado. Un Nombre de Mtodo Un nombre de mtodo puede ser cualquier indentificador legal en Java. Existen tres casos especiales a tener en cuenta con los nombres de mtodos. 1. Java soporta la sobrecarga de mtodos, por eso varios mtodos pueden compartir el mismo nombre. Por ejemplo, supon que se ha escrito una clase que puede proporcionar varios tipos de datos (cadenas, enteros, etc...) en un rea de dibujo. Se podra escribir un mtodo que supiera como tratar a cada tipo de dato. En otros lenguajes, se tendra que pensar un nombre distinto para cada uno de los mtodos. dibujaCadena(), dibujaEntero, etc... En Java, se puede utilizar el mismo nombre para todos los mtodos pasndole un tipo de parmetro diferente a cada uno de los mtodos. Entonces en la clase de dibujo, se podrn declarar tres mtodos llamados draw() y que cada uno aceptara un tipo de parmetro diferente. 2. class DibujodeDatos { 3. void draw(String s) {
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

4. 5. 6. 7. 8. 9. 10. 11. 12.

... } void draw(int i) { ... } void draw(float f) { ... } } Nota: La informacin que hay dentro de los parntesis de la declaracin son los argumentos del mtodo. Los argumentos se cubren en la siguiente pgina: Pasar Informacin a un Mtodo. Los mtodos son diferenciados por el compilador basndose en el nmero y tipo de sus argumentos. As draw(String s)y draw(int i) son mtodos distintos y nicos. No se puede declarar un mtodo con la misma firma: draw(String s)y draw(String t) son idnticos y darn un error del compilador. Habrs observado que los mtodos sobrecargados deben devolver el mismo tipo de dato, por eso void draw(String s) e int draw(String t) declarados en la misma clase producirn un error en tiempo de compilacin.

13. Todo mtodo cuyo nombre sea igual que el de su clase es un constructor y tiene una tarea especial que realizar. Los constructores se utilizan para inicializar un objeto nuevo del tipo de la clase. Los constructores slo pueden ser llamados con el operador new. Para aprender cmo escribir un constructor, puedes ver Escribir un Mtodo Constructor. 14. Una clase puede sobreescribir un mtodo de sus superclases. El mtodo que sobreescribe debe tener el mismo, nombre, tipo de retorno y lista de parmetros que el mtodo al que ha sobreescrito. Sobreescribir Mtodos te ensear como sobreescribir los mtodos de una superclase. Caractersticas Avanzadas de la Declaracin de Mtodos Junto con los dos elementos necesarios, una declaracin de mtodo puede contener otros elementos. Estos elementos declaran los argumentos aceptados por el mtodo, si el mtodo es un mtodo de clase, etc... Juntndolo todo, una declaracin de mtodo se parecera a esto. [especificadordeAcceso] [static] [abstract] [final] [native] [synchronized] ([listadeparmetros]) tipodeRetorno nombredelMtodo listadeExcepciones]

[throws

Cada uno de estos elementos de una declaracin se cubre en alguna parte de este tutorial. TutorJava Nivel Bsico Autor: Traductor: Juan Antonio Palos (Ozito)

Sun

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Pasar Informacin a un Mtodo o Tipos de Argumentos o Nombres de Argumentos o Paso por Valor

Pasar Informacin a un Mtodo Cuando se escribe un mtodo, se declara el nmero y tipo de los argumentos requeridos por ese mtodo. Esto se hace en la firma del mtodo. Por ejemplo, el siguiente mtodo calcula el pago mensual de una hipoteca basndose en la cantidad prestada, el inters, la duracin de la hipoteca (nmero de meses) y el valor futuro de la hipoteca (presumiblemente el valor futuro sea cero, porque al final de la hipoteca, ya la habrs pagado). double hipoteca(double cantidad, double interes, double valorFinal, int numPeriodos) { double I, parcial1, denominador, respuesta; I = interes / 100.0; parcial1 = Math.pow((1 + I), (0.0 - numPeriodos)); denominador = (1 - parcial1) / I; respuestar = ((-1 * cantidad) / denominador) - ((valorFinal * parcial1) / denominador); return respuesta; } Este mtodo toma cuatro argumentos: la cantidad prestada, el inters, el valor futuro y el nmero de meses. Los tres primeros son nmeros de coma flotante de doble precisin y el cuarto es un entero. Al igual que este mtodo, el conjunto de argumentos de cualquier mtodo es una lista de declaraciones de varibales delimitadas por comas donde cada declaracin de variable es un par tipo/nombre. tipo nombre Como has podido ver en el ejemplo anterior, slo tienes que utilizar el nombre del argumento para referirte al valor del argumento. Tipos de Argumentos En Java, se puede pasar como argumento a un mtodo cualquier tipo de dato vlido en Java. Esto incluye tipos primitivos, como enteros, dobles, etc.. y tipos de referencia como arrays, objetos, etc... Aqu tienes un ejemplo de un constructor que acepta un array como argumento. En este ejemplo el constructor inicializa un objeto Polygon a partir de una lista de puntos (Point es una clase del paquete java.awt que representa una coordenada xy). Polygon polygonFrom(Point[] listadePuntos) { ...
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

} Al contrario que en otros lenguajes, no se puede pasar un mtodo a un mtodo Java. Pero si se podra pasar un objeto a un mtodo y luego llamar a los mtodos del objeto. Nombres de Argumentos Cuando se declara un argumento para un mtodo Java, se proporciona el nombre para ese argumento. Este nombre es utilizado dento del cuerpo del mtodo para referirse al valor del argumento. Un argumento de un mtodo puede tener el mismo nombre que una variable de la clase. En este caso, se dice que el argumento oculta a la variable miembro. Normalmente los argumentos que ocultan una variable miembro se utilizan en los constructores para inicializar una clase. Por ejemplo, observa la clase Circle y su constructor. class Circle { int x, y, radius; public Circle(int x, int y, int radius) { ... } } La clase Circle tiene tres variables miembro x, y y radius. Adems, el constructor de la clase Circle acepta tres argumentos cada uno de los cuales comparte el nombre con la variable miembro para la que el argumento proporciona un valor inicial. Los nombres de argumentos ocultan los nombres de las variables miembro. Por eso utilizar x, y o radius dentro del cuerpo de la funcin, se refiere a los argumentos, no a las variables miembro. Para acceder a las variables miembro, se las debe referenciar a travs de this--el objeto actual. class Circle { int x, y, radius; public Circle(int x, int y, int radius) { this.x = x; this.y = y; this.radius = radius; } } Los nombres de los argumentos de un mtodo no pueden ser el mismo que el de otros argumentos del mismo mtodo, el nombre de cualquier variable local del mtodo o el nombre de cualquier parmetro a una clausula catch() dentro del mismo mtodo. Paso por Valor En los mtodos Java, los argumentos son pasados por valor. Cuando se le llama, el mtodo recibe el valor de la variable pasada. Cuando el argumento es de un tipo primitivo, pasar por valor significa que el mtodo no puede cambiar el valor. Cuando el
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

argumento es del tipo de referencia, pasar por valor significa que el mtodo no puede cambiar el objeto referenciado, pero si puede invocar a los mtodos del objeto y puede modificar las variables accesibles dentro del objeto. Consideremos esta serie de sentencias Java que intentan recuperar el color actual de un objeto Pen en una aplicacin grfica. ... int r = -1, g = -1, b = -1; pen.getRGBColor(r, g, b); System.out.println("red = " + r + ", green = " + g + ", blue = " + b); ... En el momento que se llama al mtodo getRGBColor(), las variables r, g, y b tienen un valor de -1. El llamador espera que el mtodo getRGBColor() le devuelva los valores de rojo, verde y azul para el color actual en las variables r, g, y b. Sin embargo, el sistema Java pasa los valores de las variables(-1) al mtodo getRGBColor(); no una referencia a las variables r, g, y b. Con esto se podra visualizar la llamada a getRGBColor() de esta forma. getRGBColor(-1, -1, -1) Cuando el control pasa dentro del mtodo getRGBColor(), los argumentos entran dentro del mbito (se les asigna espacio) y son inicializados a los valores pasados al mtodo. class Pen { int valorRojo, valorVerde, valorAzul; void getRGBColor(int rojo, int verde, int azul) { // rojo, verde y azul han sido creados y sus valores son -1 ... } } Con esto getRGBColor() obtiene acceso a los valores de r, g, y b del llamador a tavs de sus argumentos rojo, verde, y azul, respectivamente. El mtodo obtiene su propia copia de los valores para utilizarlos dentro del mbito del mtodo. Cualquier cambio realizado en estas copias locales no sera reflejado en las variables originales del llamador. Ahora veremos la implementacin de getRGBColor() dentro de la clase Pen que implicaba la firma de mtodo anterior. class Pen { int valorRojo, valorVerde, valorAzul; ... // Este mtodo no trabaja como se espera void getRGBColor(int rojo, int verde, int azul) {
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

rojo = valorRojo; verde=valorVerde; azul=valorAzul; } } Este mtodo no trabajar como se espera. Cuando el control llega a la sentencia println() en el siguiente fragmento de cdigo, los argumentos rojo, verde y azul de getRGBColor() ya no existen. Por lo tanto las asignaciones realizadas dentro del mtodo no tendrn efecto; r, g, y b seguiran siendo igual a -1. ... int r = -1, g = -1, b = -1; pen.getRGBColor(r, g, b); System.out.println("rojo = " + r + ", verde = " + g + ", azul = " + b); ... El paso de las varibales por valor le ofrece alguna seguridad a los programadores: los mtodos no puede modificar de forma no intencionada una variable que est fuera de su mbito. Sin embargo, alguna vez se querr que un mtodo modifique alguno de sus argumentos. El metodo getRGBColor() es un caso apropiado. El llamador quiere que el mtodo devuelva tres valores a travs de sus argumentos. Sin embargo, el mtodo no puede modificar sus argumentos, y, adems, un mtodo slo puede devolver un valor a travs de su valor de retorno. Entonces, cmo puede un mtodo devolver ms de un valor, o tener algn efecto (modificar algn valor) fuera de su mbito? Para que un mtodo modifique un argumento, debe ser un tipo de referencia como un objeto o un array. Los objetos y arrays tambin son pasados por valor, pero el valor de un objeto es una referencia. Entonces el efecto es que los argumentos de tipos de referencia son pasados por referencia. De aqu el nombre. Una referencia a un objeto es la direccin del objeto en la memoria. Ahora, el argumento en el mtodo se refiere a la misma posicin de memoria que el llamador. Reescribamos el mtodo getRGBColor() para que haga lo que queremos. Primero introduzcamos un nuevo objeto RGBColor, que puede contener los valores de rojo, verde y azul de un color en formato RGB. class RGBColor { public int rojo, verde, azul;; } Ahora podemos reescribir getRGBColor() para que acepte un objeto RGBColor como argumento. El mtodo getRGBColor() devuelve el color actual de lpiz, en los valores de las variables miembro rojo, verde y azul de su argumento RGBColor. class Pen { int valorRojo, valorVerde, valorAzul; void getRGBColor(RGBColor unColor) { unColor.rojo = valorRojo; unColor.verde = valorVerde;
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

unColor.azul = valorAzul; } } Y finalmente, reescribimos la secuencia de llamada. ... RGBColor penColor = new RGBColor(); pen.getRGBColor(penColor); System.out.println("ojo = " + penColor.rojo + ", verde = " + penColor.verde + ", azul = " + penColor.azul); ... Las modificaciones realizadas al objeto RGBColor dentro del mtodo getRGBColor() afectan al objeto creado en la secuencia de llamada porque los nombres penColor (en la secuencia de llamada) y unColor (en el mtodo getRGBColor()) se refieren al mismo objeto.

TutorJava Nivel Bsico Autor: Traductor: Juan Antonio Palos (Ozito)

Sun

El Cuerpo de un Mtodo o this o super o Variables Locales

El Cuerpo de un Mtodo En el siguiente ejemplo, el cuerpo de mtodo para los mtodos estaVacio() y poner() estn en negrita. class Stack { static final int PILA_VACIA = -1; Object[] elementosPila; int elementoSuperior = PILA_VACIA; ... boolean estaVacio() { if (elementoSuperior == PILA_VACIA) return true; else return false; } Object poner() { if (elementoSuperior == PILA_VACIA) return null; else { return elementosPila[elementoSuperior--]; }
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

} } Junto a los elementos normales del lenguaje Java, se puede utilizar this en el cuerpo del mtodo para referirse a los miembros del objeto actual. El objeto actual es el objeto del que uno de cuyos miembros est siendo llamado. Tambin se puede utilizar super para referirse a los miembros de la superclase que el objeto actual haya ocultado mediante la sobreescritura. Un cuerpo de mtodo tambin puede contener declaraciones de variables que son locales de ese mtodo. this Normalmente, dentro del cuerpo de un mtodo de un objeto se puede referir directamente a las variables miembros del objeto. Sin embargo, algunas veces no se querr tener ambigedad sobre el nombre de la variable miembro y uno de los argumentos del mtodo que tengan el mismo nombre. Por ejemplo, el siguiente constructor de la clase HSBColor inicializa alguna variable miembro de un objeto de acuerdo a los argumentos pasados al constructor. Cada argumento del constructor tiene el mismo nombre que la variable del objeto cuyo valor contiene el argumento. class HSBColor { int hue, saturacion, brillo; HSBColor (int luminosidad, int saturacion, int brillo) { this.luminosidad = luminosidad; this.saturacion = saturacion; this.brillo = brillo; } } Se debe utilizar this en este constructor para evitar la ambigedad entre el argumento luminosidad y la variable miembro luminosidad (y as con el resto de los argumentos). Escribir luminosidad = luminosidad; no tendra sentido. Los nombres de argumentos tienen mayor precedencia y ocultan a los nombres de las variables miembro con el mismo nombre. Para referirise a la variable miembro se debe hacer explicitamente a travs del objeto actual--this. Tambin se puede utilizar this para llamar a uno de los mtodos del objeto actual. Esto slo es necesario si existe alguna ambigedad con el nombre del mtodo y se utiliza para intentar hacer el cdigo ms claro. super Si el mtodo oculta una de las variables miembro de la superclase, se puede referir a la variable oculta utilizando super. De igual forma, si el mtodo sobreescribe uno de los mtodos de la superclase, se puede llamar al mtodo sobreescrito a travs de super. Consideremos esta clase.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

class MiClase { boolean unaVariable; void unMetodo() { unaVariable = true; } } y una subclase que oculta unaVariable y sobreescribe unMetodo(). class OtraClase extends MiClase { boolean unaVariable; void unMetodo() { unaVariable = false; super.unMetodo(); System.out.println(unaVariable); System.out.println(super.unaVariable); } } Primero unMetodo() selecciona unaVariable (una declarada en OtraClase que oculta a la declarada en MiClase) a false. Luego unMetodo() llama a su mtodo sobreescrito con esta sentencia. super.unMetodo(); Esto selecciona la versin oculta de unaVariable (la declarada en MiClase) a true. Luego unMetodo muestra las dos versiones de unaVariable con diferentes valores. false true Variables Locales Dentro del cuerpo de un mtodo se puede declarar ms variables para usarlas dentro del mtodo. Estas variables son variables locales y viven slo mientras el control permanezca dentro del mtodo. Este mtodo declara un variable local i y la utiliza para operar sobre los elementos del array. Object encontrarObjetoEnArray(Object o, Object[] arrayDeObjetos) { int i; // variable local for (i = 0; i < arrayDeObjetos.length; i++) { if (arrayDeObjetos[i] == o) return o; } return null; } Despus de que este mtodo retorne, i ya no existir ms. TutorJava Nivel Bsico
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Autor: Traductor: Juan Antonio Palos (Ozito)

Sun

Miembros de la Clase y del Ejemplar

Miembros de la Clase y del Ejemplar Cuando se declara una variable miembro como unFloat en MiClase. class MiClase { float unFloat; } declara una variable de ejemplar. Cada vez que se crea un ejemplar de la clase, el sistema crea una copia de todas las variables de ejemplar de la clase. Se puede acceder a una variable del ejemplar del objeto desde un objeto como se describe en Utilizar Objetos. Las variables de ejemplar estn en constraste con las variables de clase (que se declaran utilizando el modificador static). El sistema asigna espacio para las variables de clase una vez por clase, sin importar el nmero de ejemplares creados de la clase. Todos los objetos creados de esta clase comparten la misma copia de las variables de clase de la clase, se puede acceder a las variables de clase a travs de un ejemplar o a travs de la propia clase. Los mtodos son similares: una clase puede tener mtodos de ejemplar y mtodos de clase. Los mtodos de ejemplar operan sobre las variables de ejemplar del objeto actual pero tambin pueden acceder a las variables de clase. Por otro lado, los mtodos de clase no pueden acceder a las variables del ejemplar declarados dentro de la clase (a menos que se cree un objeto nuevo y acceda a ellos a travs del objeto). Los mtodos de clase tambin pueden ser invocados desde la clase, no se necesita un ejemplar para llamar a los mtodos de la clase. Por defecto, a menos que se especifique de otra forma, un miembro declarado dentro de una clase es un miembro del ejemplar. La clase definida abajo tiene una variable de ejemplar -- un entero llamado x -- y dos mtodos de ejemplar -- x() y setX() -- que permite que otros objetos pregunten por el valor de x. class UnEnteroLlamadoX { int x; public int x() { return x; } public void setX(int newX) { x = newX; } }

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Cada vez que se ejemplariza un objeto nuevo desde una clase, se obtiene una copia de cada una de las variables de ejemplar de la clase. Estas copias estn asociadas con el objeto nuevo. Por eso, cada vez que se ejemplariza un nuevo objeto UnEnteroLlamadoX de la clase, se obtiene una copia de x que est asociada con el nuevo objeto UnEnteroLlamadoX. Todos los ejemplares de una clase comparten la misma implementacin de un mtodo de ejemplar; todos los ejemplares de UnEnteroLlamadoX comparten la misma implementacin de x() y setX(). Observa que estos mtodos se refieren a la variable de ejemplar del objeto x por su nombre. "Pero, si todos los ejemplares de UnEnteroLlamadoX comparten la misma implementacin de x() y setX() esto no es ambigo?" La respuesta es no. Dentro de un mtodo de ejemplar, el nombre de una variable de ejemplar se refiere a la variable de ejemplar del objeto actual (asumiendo que la variable de ejemplar no est ocultada por un parmetro del mtodo). Ya que, dentro de x() y setX(), x es equivalente a this.x. Los objetos externos a UnEnteroLlamadoX que deseen acceder a x deben hacerlo a travs de un ejemplar particular de UnEnteroLlamadoX. Supongamos que este cdigo estuviera en otro mtodo del objeto. Crea dos objetos diferentes del tipo UnEnteroLlamadoX, y selecciona sus valores de x a diferente valores y luego lo muestra: ... UnEnteroLlamadoX miX = new UnEnteroLlamadoX(); UnEnteroLlamadoX otroX = new UnEnteroLlamadoX(); miX.setX(1); otroX.x = 2; System.out.println("miX.x = " + miX.x()); System.out.println("otroX.x = " + otroX.x()); ... Observa que el cdigo utilizado en setX() para seleccionar el valor de x para miX pero slo asignando el valor otroX.x directamente. De otra forma, el cdigo manipula dos copias diferentes de x: una contenida en el objeto miX y la otra en el objeto otroX. La salida producida por este cdigo es. miX.x = 1 otroX.x = 2 mostrando que cada ejemplar de la clase UnEnteroLlamadoX tiene su propia copia de la variable de ejemplar x y que cada x tiene un valor diferente. Cuando se declara una variable miembro se puede especificar que la variable es una variable de clase en vez de una variable de ejemplar. Similarmente, se puede especificar que un mtodo es un mtodo de clase en vez de un mtodo de ejemplar. El sistema crea una sola copia de una variable de clase la primera vez que encuentra la clase en la que est definida la variable. Todos los ejemplares de esta clase comparten la misma copia de las variables de clase. Los mtodos de clase slo pueden operar con variables de clase -- no pueden acceder a variables de ejemplar definidas en la clase.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Para especificar que una variable miembro es una variable de clase, se utiliza la palabra clave static. Por ejemplo, cambiemos la clase UnEnteroLlamadoX para que su variable x sea ahora una variable de clase. class UnEnteroLlamadoX { static int x; public int x() { return x; } public void setX(int newX) { x = newX; } } Ahora veamos el mismo cdigo mostrado anteriormente que crea dos ejemplares de UnEnteroLlamadoX, selecciona sus valores de x, y muestra esta salida diferente. miX.x = 2 otroX.x = 2 La salida es diferente porque x ahora es una variable de clase por lo que slo hay una copia de la variable y es compartida por todos los ejemplares de UnEnteroLlamadoX incluyendo miX y otroX. Cuando se llama a setX() en cualquier ejemplar, cambia el valor de x para todos los ejemplares de UnEnteroLlamadoX. Las variables de clase se utilizan para aquellos puntos en los que se necesite una sola copia que debe estar accesible para todos los objetos heredados por la clase en la que la variable fue declarada. Por ejemplo, las variables de clase se utilizan frecuentemente con final para definir constantes (esto es ms eficiente en el consumo de memoria, ya que las constantes no pueden cambiar y slo se necesita una copia). Similarmente, cuando se declare un mtodo, se puede especificar que el mtodo es un mtodo de clase en vez de un mtodo de ejemplar. Los mtodos de clase slo pueden operar con variables de clase y no pueden acceder a las variables de ejemplar definidas en la clase. Para especificar que un mtodo es un mtodo de clase, se utiliza la palabra clave static en la declaracin de mtodo. Cambiemos la clase UnEnteroLlamadoX para que su variable miembro x sea de nuevo una variable de ejemplar, y sus dos mtodos sean ahora mtodos de clase. class UnEnteroLlamadoX { private int x; static public int x() { return x; } static public void setX(int newX) { x = newX; } }
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Cuando se intente compilar esta versin de UnEnteroLlamadoX, se obtendrn errores de compilacin. UnEnteroLlamadoX.java:4: Can't make a static reference to nonstatic variable x in class UnEnteroLlamadoX. return x; ^ UnEnteroLlamadoX.java:7: Can't make a static reference to nonstatic variable x in class UnEnteroLlamadoX. x = newX; ^ 2 errors Esto es porque los mtodos de la clase no pueden acceder a variables de ejemplar a menos que el mtodo haya creado un ejemplar de UnEnteroLlamadoX primero y luego acceda a la variable a travs de l. Construyamos de nuevo UnEnteroLlamadoX para hacer que su variable x sea una variable de clase. class UnEnteroLlamadoX { static private int x; static public int x() { return x; } static public void setX(int newX) { x = newX; } } Ahora la clase se compilar y el cdigo anterior que crea dos ejemplares de UnEnteroLlamadoX, selecciona sus valores x, y muestra en su salida los valores de x. miX.x = 2 otroX.x = 2 De nuevo, cambiar x a travs de miX tambin lo cambia para los otros ejemplares de UnEnteroLlamadoX. Otra diferencia entre miembros del ejemplar y de la clase es que los miembros de la clase son accesibles desde la propia clase. No se necesita ejemplarizar la clase para acceder a los miembros de clase. Reescribamos el cdigo anterior para acceder a x() y setX() directamente desde la clase UnEnteroLlamadoX. ... UnEnteroLlamadoX.setX(1); System.out.println("UnEnteroLlamadoX.x = " + UnEnteroLlamadoX.x()); ...

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Observa que ya no se tendr que crear miX u otroX. Se puede seleccionar x y recuperarlo directamente desde la clase UnEnteroLlamadoX. No se puede hacer esto con miembros del ejemplar. Solo se puede invocar mtodos de ejemplar a travs de un objeto y slo puede acceder a las variables de ejemplar desde un objeto. Se puede acceder a las variables y mtodos de clase desde un ejemplar de la clase o desde la clase misma. Tutoriales TutorJava Nivel Bsico Autor: Traductor: Juan Antonio Palos (Ozito)

Sun

Controlar el Acceso a los Miembros de la Clase o Private o Protected o Public o Acceso de Paquete

Controlar el Acceso a los Miembros de la Clase Uno de los beneficos de las clases es que pueden proteger sus variables y mtodos miembros frente al acceso de otros objetos. Por qu es esto importante? Bien, consideremos esto. Se ha escrito una clase que representa una peticin a una base de datos que contiene toda clase de informacin secreta, es decir, registros de empleados o proyectos secretos de la compaia. Ciertas informaciones y peticiones contenidas en la clase, las soportadas por los mtodos y variables accesibles pblicamente en su objeto son correctas para el consumo de cualquier otro objeto del sistema. Otras peticiones contenidas en la clase son slo para el uso personal de la clase. Estas otras soportadas por la operacin de la clase no deberan ser utilizadas por objetos de otros tipos. Se querra proteger esas variables y mtodos personales a nivel del lenguaje y prohibir el acceso desde objetos de otros tipos. En Java se pueden utilizar los especificadores de acceso para proteger tanto las variables como los mtodos de la clase cuando se declaran. El lenguaje Java soporta cuatro niveles de acceso para las variables y mtodos miembros: private, protected, public, y, todava no especificado, acceso de paquete. La siguiente tabla le muestra los niveles de acceso pemitidos por cada especificador. Especificador private protected public package clase X X X X subclase X* X paquete X X X mundo

La primera columna indica si la propia clase tiene acceso al miembro definido por el
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

especificador de acceso. La segunda columna indica si las subclases de la clase (sin importar dentro de que paquete se encuentren estas) tienen acceso a los miembros. La tercera columna indica si las clases del mismo paquete que la clase (sin importar su parentesco) tienen acceso a los miembros. La cuarta columna indica si todas las clases tienen acceso a los miembros. Observa que la interseccin entre protected y subclase tiene un '*' - este caso de acceso particular tiene una explicacin en ms detalle ms adelante. Echemos un vistazo a cada uno de los niveles de acceso ms detalladamente. Private El nivel de acceso ms restringido es private. Un miembro privado es accesible slo para la clase en la que est definido. Se utiliza este acceso para declarar miembros que slo deben ser utilizados por la clase. Esto incluye las variables que contienen informacin que si se accede a ella desde el exterior podra colocar al objeto en un estado de inconsistencia, o los mtodos que llamados desde el exterior pueden poner en peligro el estado del objeto o del programa donde se est ejecutando. Los miembros privados son como secretos, nunca deben contarsele a nadie. Para declarar un miembro privado se utiliza la palabra clave private en su declaracin. La clase siguiente contiene una variable miembro y un mtodo privados. class Alpha { private int soyPrivado; private void metodoPrivado() { System.out.println("metodoPrivado"); } } Los objetos del tipo Alpha pueden inspeccionar y modificar la variable soyPrivado y pueden invocar el mtodo metodoPrivado(), pero los objetos de otros tipos no pueden acceder. Por ejemplo, la clase Beta definida aqu. class Beta { void metodoAccesor() { Alpha a = new Alpha(); a.soyPrivado = 10; // ilegal a.metodoPrivado(); // ilegal } } no puede acceder a la variable soyPrivado ni al mtodo metodoPrivado() de un objeto del tipo Alpha porque Beta no es del tipo Alpha. Si una clase est intentando acceder a una variable miembro a la que no tiene acceso-el compilador mostrar un mensaje de error similar a este y no compilar su programa. Beta.java:9: Variable iamprivate in class Alpha not accessible from class Beta. a.iamprivate = 10; // ilegal
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

^ 1 error Y si un programa intenta acceder a un mtodo al que no tiene acceso, generar un error de compilacin parecido a este. Beta.java:12: No method matching privateMethod() found in class Alpha. a.privateMethod(); // ilegal 1 error Protected El siguiente especificador de nivel de acceso es 'protected' que permite a la propia clase, las subclases (con la excepcin a la que nos referimos anteriormente), y todas las clases dentro del mismo paquete que accedan a los miembros. Este nivel de acceso se utiliza cuando es apropiado para una subclase de la clase tener acceso a los miembros, pero no las clases no relacionadas. Los miembros protegidos son como secretos familiares - no importa que toda la familia lo sepa, incluso algunos amigos allegados pero no se quiere que los extraos lo sepan. Para declarar un miembro protegido, se utiliza la palabra clave protected. Primero echemos un vistazo a cmo afecta este especificador de acceso a las clases del mismo paquete. Consideremos esta versin de la clase Alpha que ahora se declara para estar incluida en el paquete Griego y que tiene una variable y un mtodo que son miembros protegidos. package Griego; class Alpha { protected int estoyProtegido; protected void metodoProtegido() { System.out.println("metodoProtegido"); } } Ahora, supongamos que la clase Gamma, tambin est declarada como miembro del paquete Griego (y no es una subclase de Alpha). La Clase Gamma puede acceder legalmente al miembro estoyProtegido del objeto Alpha y puede llamar legalmente a su mtodo metodoProtegido(). package Griego; class Gamma { void metodoAccesor() { Alpha a = new Alpha(); a.estoyProtegido = 10; // legal a.metodoProtegido(); // legal } }
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Esto es muy sencillo. Ahora, investiguemos cmo afecta el especificador protected a una subclase de Alpha. Introduzcamos una nueva clase, Delta, que desciende de la clase Alpha pero reside en un paquete diferente - Latin. La clase Delta puede acceder tanto a estoyProtegido como a metodoProtegido(), pero solo en objetos del tipo Delta o sus subclases. La clase Delta no puede acceder a estoyProtegido o metodoProtegido() en objetos del tipo Alpha. metodoAccesor() en el siguiente ejemplo intenta acceder a la variable miembro estoyProtegido de un objeto del tipo Alpha, que es ilegal, y en un objeto del tipo Delta que es legal. Similarmente, metodoAccesor() intenta invocar a metodoProtegido() en un objeto del tipo Alpha, que tambin es ilegal. import Griego.*; package Latin; class Delta extends Alpha { void metodoAccesor(Alpha a, Delta d) { a.estoyProtegido = 10; // ilegal d.estoyProtegido = 10; // legal a.metodoProtegido(); // ilegal d.metodoProtegido(); // legal } } Si una clase es una subclase o se cuentra en el mismo paquete de la clase con el miembro protegido, la clase tiene acceso al miembro protegido. Public El especificador de acceso ms sencillo es 'public'. Todas las clases, en todos los paquetes tienen acceso a los miembros pblicos de la clase. Los miembros pblicos se declaran slo si su acceso no produce resultados indeseados si un extrao los utiliza. Aqu no hay secretos familiares; no importa que lo sepa todo el mundo. Para declarar un miembro pblico se utiliza la palabra clave public. Por ejemplo, package Griego; class Alpha { public int soyPublico; public void metodoPublico() { System.out.println("metodoPublico"); } } Reescribamos nuestra clase Beta una vez ms y la ponemos en un paquete diferente que la clase Alpha y nos aseguramos que no estn relacionadas (no es una subclase)
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

de Alpha. import Griego.*; package Romano; class Beta { void metodoAccesor() { Alpha a = new Alpha(); a.soyPublico = 10; // legal a.metodoPublico(); // legal } } Como se puede ver en el ejemplo anterior, Beta puede inspeccionar y modificar legalmente la variable soyPublico en la clase Alpha y puede llamar legalmente al mtodo metodoPublico(). Acceso de Paquete Y finalmente, el ltimo nivel de acceso es el que se obtiene si no se especifica ningn otro nivel de acceso a los miembros. Este nivel de acceso permite que las clases del mismo paquete que la clase tengan acceso a los miembros. Este nivel de acceso asume que las clases del mismo paquete son amigas de confianza. Este nivel de confianza es como la que extiende a sus mejores amigos y que incluso no la tiene con su familia. Por ejemplo, esta versin de la clase Alpha declara una variable y un mtodo con acceso de paquete. Alpha reside en el paquete Griego. package Griego; class Alpha { int estoyEmpaquetado; void metodoEmpaquetado() { System.out.println("metodoEmpaquetado"); } } La clase Alpha tiene acceso a estoyEmpaquetado y a metodoEmpaquetado(). Adems, todas las clases declaradas dentro del mismo paquete como Alpha tambin tienen acceso a estoyEmpaquetado y metodoEmpaquetado(). Supongamos que tanto Alpha como Beta son declaradas como parte del paquete Griego. package Griego; class Beta { void metodoAccesor() {
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Alpha a = new Alpha(); a.estoyEmpaquetado = 10; // legal a.metodoEmpaquetado(); // legal } } Entonces Beta puede metodoEmpaquetado(). Constructores Todas las clases Java tienen mtodos especiales llamados Constructores que se utilizan para inicializar un objeto nuevo de ese tipo. Los contructores tienen el mismo nombre que la clase --el nombre del constructor de la clase Rectangle es Rectangle(), el nombre del constructor de la clase Thread es Thread(), etc... Java soporta la sobrecarga de los nombres de mtodos, por lo que una clase puede tener cualquier nmero de constructores, todos los cuales tienen el mismo nombre. Al igual que otros mtodos sobrecargados, los constructores se diferencian unos de otros en el nmero y tipo de sus argumentos. Consideremos la clase Rectangle del paquete java.awt que proporciona varios constructores diferentes, todos llamados Rectangle(), pero cada uno con nmero o tipo diferentes de argumentos a partir de los cuales se puede crear un nuevo objeto Rectangle. Aqu tiene las firmas de los constructores de la clase java.awt.Rectangle. public Rectangle() public Rectangle(int width, int height) public Rectangle(int x, int y, int width, int height) public Rectangle(Dimension size) public Rectangle(Point location) public Rectangle(Point location, Dimension size) El primer constructor de Rectangle inicializa un nuevo Rectangle con algunos valores por defecto razonables, el segundo constructor inicializa el nuevo Rectangle con la altura y anchura especificadas, el tercer constructor inicializa el nuevo Rectangle en la posicin especificada y con la altura y anchura especificadas, etc... Tpicamente, un constructor utiliza sus argumentos para inicializar el estado del nuevo objeto. Entonces, cuando se crea un objeto, se debe elegir el constructor cuyos argumentos reflejen mejor cmo se quiere inicializar el objeto. Basndose en el nmero y tipos de los argumentos que se pasan al constructor, el compilador determina cual de ellos utilizar, As el compilador sabe que cuando se escribe. new Rectangle(0, 0, 100, 200); el compilador utilizar el constructor que requiere cuatro argumentos enteros, y cuando se escribe. acceder legalmente a estoyEmpaquetado y

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

new Rectangle(miObjetoPoint, miObjetoDimension); utilizar el constructor que requiere como argumentos un objeto Point y un objeto Dimension. Cuando escribas tus propias clases, no tienes porque proporcionar constructores. El constructor por defecto, el constructor que no necesita argumentos, lo proporciona automticamente el sistema para todas las clases. Sin embargo, frecuentemente se querr o necesitar proporcionar constructores para las clases. Se puede declarar e implementar un constructor como se hara con cualquier otro mtodo en una clase. El nombre del constructor debe ser el mismo que el nombre de la clase y, si se proporciona ms de un constructor, los argumentos de cada uno de los constructores deben diferenciarse en el nmero o tipo. No se tiene que especificar el valor de retorno del constructor. El constructor para esta subclase de Thread, un hilo que realiza animacin, selecciona algunos valores por defecto como la velocidad de cuadro, el nmero de imgenes y carga las propias imgenes. class AnimationThread extends Thread { int framesPerSecond; int numImages; Image[] images; AnimationThread(int fps, int num) { int i; super("AnimationThread"); this.framesPerSecond = fps; this.numImages = num; this.images = new Image[numImages]; for (i = 0; i <= numImages; i++) { ... // Carga las imgenes ... } } } Observa cmo el cuerpo de un constructor es igual que el cuerpo de cualquier otro mtodo -- contiene declaraciones de variables locales, bucles, y otras sentencias. Sin embargo, hay una lnea en el constructor de AnimationThread que no se ver en un mtodo normal--la segunda lnea. super("AnimationThread"); Esta lnea invoca al constructor proporcionado por la superclase de AnimationThread-Thread. Este constructor particular de Thread acepta una cadena que contiene el nombre del Thread. Frecuentemente un constructor se aprovechar del cdigo de inicializacin escrito para la superclase de la clase.
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

En realidad, algunas clases deben llamar al constructor de su superclase para que el objeto trabaje de forma apropiada. Tpicamente, llamar al constructor de la superclase es lo primero que se hace en el constructor de la subclase: un objeto debe realizar primero la inicializacin de nivel superior. Cuando se declaren constructores para las clases, se pueden utilizar los especificadores de acceso normales para especificar si otros objetos pueden crear ejemplares de su clase. private Niguna otra clase puede crear un objeto de su clase. La clase puede contener mtodos pblicos y esos mtodos pueden construir un objeto y devolverlo, pero nada ms. protected Slo las subclases de la clase pueden crear ejemplares de ella. public Cualquiera puede crear un ejemplar de la clase. package-access Nadie externo al paquete puede construir un ejemplar de su clase. Esto es muy til si se quiere que las clases que tenemos en un paquete puedan crear ejemplares de la clase pero no se quiere que lo haga nadie ms. Escribir un Mtodo finalize() Antes de que un objeto sea recolectado por el recolector de basura, el sistema llama al mtodo finalize(). La intencin de este mtodo es liberar los recursos del sistema, como ficheros o conexiones abiertas antes de empezar la recoleccin. Una clase puede proporcionar esta finalizacin simplemente definiendo e implementando un mtodo llamado finalize(). El mtodo finalize() debe declararse de la siguiente forma. protected void finalize () throws throwable Esta clase abre un fichero cuando se construye. class AbrirUnFichero { FileInputStream unFichero = null; AbrirUnFichero (String nombreFichero) { try { unFichero = new FileInputStream(nombreFichero); } catch (java.io.FileNotFoundException e) { System.err.println("No se pudo abrir el fichero " + nombreFichero); } } }

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Para un buen comportamiento, la clase AbrirUnFichero debera cerrar el fichero cuando haya finalizado. Aqu tienes el mtodo finalize() para la clase AbrirUnFichero. protected void finalize () throws throwable { if (unFichero != null) { unFichero.close(); unFichero = null; } } El mtodo finalize() est declarado en la clase java.lang.Object. As cuando escribas un mtodo finalize() para tus clases ests sobreescribiendo el de su superclase. En Sobreescribir Mtodos encontrars ms informacin sobre la sobreescritura de mtodos. Si la superclase tiene un mtodo finalize(), probablemente este mtodo deber llamar al mtodo finalize() de su superclase despus de haber terminado sus tareas de limpieza. Esto limpiar cualquier recurso obtenido sin saberlo a travs de los mtodos heredados desde la superclase. protected void finalize() throws Throwable { ... // aqu va el cdigo de limpieza de esta clase ... super.finalize(); } Subclases, Superclases y Herencia En Java, como en otros lenguajes de programacin orientados a objetos, las clases pueden derivar desde otras clases. La clase derivada (la clase que proviene de otra clase) se llama subclase. La clase de la que est derivada se denomina superclase. De hecho, en Java, todas las clases deben derivar de alguna clase. Lo que nos lleva a la cuestin Dnde empieza todo esto?. La clase ms alta, la clase de la que todas las dems descienden, es la clase Object, definida en java.lang. Object es la raz de la herencia de todas las clases. Las subclases heredan el estado y el comportamiento en forma de las variables y los mtodos de su superclase. La subclase puede utilizar los tems heredados de su superclase tal y como son, o puede modificarlos o sobreescribirlos. Por eso, segn se va bajando por el rbol de la herencia, las clases se convierten en ms y ms especializadas. Definicin: Una subclase es una clase que desciende de otra clase. Una subclase hereda el estado y el comportamiento de todos sus ancestros. El trmino superclase se refiere a la clase que es el ancestro ms directo, as como a todas las clases ascendentes.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Crear Subclases Se declara que un clase es una subclase de otra clase dentro de La declaracin de Clase. Por ejemplo, supongamos que queremos crear una subclase llamada SubClase de otra clase llamada SuperClase. Se escribira esto. class SubClass extends SuperClass { ... } Esto declara que SubClase es una subclase de SuperClase. Y tambin declara implcitamene que SuperClase es la superclase de SubClase. Una subclase tambin hereda variables y miembros de las superclases de su superclase, y as a lo largo del rbol de la herencia. Para hacer esta explicacin un poco ms sencilla, cuando este tutorial se refiere a la superclase de una clase significa el ancestro ms directo de la clase as como a todas sus clases ascendentes. Una clase Java slo puede tener una superclase directa. Java no soporta la herencia mltiple. Crear una subclase puede ser tan sencillo como incluir la clausula extends en la declaracin de la clase. Sin embargo, normalmente se deber realizar alguna cosa ms cuando se crea una subclase, como sobreescribir mtodos, etc... Qu variables miembro hereda una subclase? Regla: Una subclase hereda todas las variables miembros de su superclase que puedan ser accesibles desde la subclase (a menos que la variable miembro est oculta en la subclase). Esto es, las subclases.

heredan aquellas variables miembros declaradas como public o protected heredan aquellas variables miembros declaradas sin especificador de acceso (normalmente conocidas como "Amigas") siempre que la subclase est en el mismo paquete que la clase no hereda las variables miembros de la superclase si la subclase declara una variable miembro que utiliza el mismo nombre. La variable miembro de la subclase se dice que oculta a la variable miembro de la superclase. no hereda las variables miembro private

Ocultar Variables Miembro Como se mencion en la seccin anterior, las variables miembros definidas en la subclase ocultan las variables miembro que tienen el mismo nombre en la superclase. Como esta caracterstica del lenguaje Java es poderosa y conveniente, puede ser una fuente de errores: ocultar una variable miembro puede hacerse deliberadamente o por

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

accidente. Entonces, cuando nombres tus variables miembro se cuidadoso y oculta slo las variables miembro que realmente deseas ocultar. Una caracteristica interesante de las variables miembro en Java es que una clase puede acceder a una variable miembro oculta a travs de su superclase. Considere este pareja de superclase y subclase. class Super { Number unNumero; } class Sub extends Super { Float unNumero; } La variable unNumero de Sub oculta a la variable unNumero de Super. Pero se puede acceder a la variable de la superclase utilizando. super.unNumero super es una palabra clave del lenguaje Java que permite a un mtodo referirse a las variables ocultas y mtodos sobreescritos de una superclase. Qu mtodos hereda una Subclase? La regla que especifica los mtodos heredados por una subclase es similar a la de las variables miembro. Regla: Una subclase hereda todos los mtodos de sus superclase que son accesibles para la subclase (a menos que el mtodo sea sobreescrito por la subclase). Esto es, una Subclase.

hereda aquellos mtodos declarados como public o protected hereda aquellos mtodos sin especificador de acceso, siempre que la subclase est en el mismo paquete que la clase. no hereda un mtodo de la superclase si la subclase declara un mtodo que utiliza el mismo nombre. Se dice que el mtodo de la subclase sobreescribe al mtodo de la superclase. no hereda los mtodos private.

Sobreescribir Mtodos La habilidad de una subclase para sobreescribir un mtodo de su superclase permite a una clase heredar de su superclase aquellos comportamientos "ms cercanos" y luego suplementar o modificar el comportamiento de la superclase. Sobreescribir Mtodos

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Una subclase puede sobreescribir completamente la implementacin de un mtodo heredado o puede mejorar el mtodo aadiendole funcionalidad. Reemplazar la Implementacin de un Mtodo de una Superclase Algunas veces, una subclase querra reemplazar completamente la implementacin de un mtodo de su superclase. De hecho, muchas superclases proporcionan implementaciones de mtodos vacas con la esperanza de que la mayora, si no todas, sus subclases reemplacen completamente la implementacin de ese mtodo. Un ejemplo de esto es el mtodo run() de la clase Thread. La clase Thread proporciona una implementacin vaca (el mtodo no hace nada) para el mtodo run(), porque por definicin, este mtodo depende de la subclase. La clase Thread posiblemente no puede proporcionar una implementacin medianamente razonable del mtodo run(). Para reemplazar completamente la implementacin de un mtodo de la superclase, simplememte se llama a un mtodo con el mismo nombre que el del mtodo de la superclase y se sobreescribe el mtodo con la misma firma que la del mtodo sobreescrito. class ThreadSegundoPlano extends Thread { void run() { ... } } La clase ThreadSegundoPlano sobreescribe completamente el mtodo run() de su superclase y reemplaza completamente su implementacin. Aadir Implementacin a un Mtodo de la Superclase Otras veces una subclase querr mantener la implementacin del mtodo de su superclase y posteriormente ampliar algn comportamiento especfico de la subclase. Por ejemplo, los mtodos constructores de una subclase lo hacen normalmente--la subclase quiere preservar la inicializacin realizada por la superclase, pero proporciona inicializacin adicional especfica de la subclase. Supongamos que queremos crear una subclase de la clase Windows del paquete java.awt. La clase Windows tiene un constructor que requiere un argumento del tipo Frame que es el padre de la ventana. public Window(Frame parent) Este constructor realiza alguna inicializacin en la ventana para que trabaje dentro del sistema de ventanas. Para asegurarnos de que una subclase de Windows tambin trabaja dentro del sistema de ventanas, deberemos proporcionar un constructor que realice la misma inicializacin. Mucho mejor que intentar recrear el proceso de inicializacin que ocurre dentro del constructor de Windows, podramos utilizar lo que la clase Windows ya hace. Se puede
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

utilizar el cdigo del constructor de Windows llammdolo desde dentro del constructor de la subclase Window. class Ventana extends Window { public Ventana(Frame parent) { super(parent); ... // Ventana especifica su inicializacin aqu ... } } El constructor de Ventana llama primero al constructor de su superclase, y no hace nada ms. Tpicamente, este es el comportamiento deseado de los constructores--las superclases deben tener la oportunidad de realizar sus tareas de inicializacin antes que las de su subclase. Otros tipos de mtodos podran llamar al constructor de la supeclase al final del mtodo o en el medio. Mtodos que una Subclase no Puede Sobreescibir

Una subclase no puede sobreescribir mtodos que hayan sido declarados como final en la superclase (por definicin, los mtodos finales no pueden ser sobreescritos). Si intentamos sobreescribir un mtodo final, el compilador mostrar un mensaje similar a este y no compilar el programa. FinalTest.java:7: Final methods can't be overriden. Method void iamfinal() is final in class ClassWithFinalMethod. void iamfinal() { ^ 1 error Para una explicacin sobre los mtodos finales, puedes ver: Escribir Mtodos y Clases Finales.

Una subclase tampoco puede sobreescribir mtodos que se hayan declarado como static en la superclase. En otras palabras, una subclase no puede sobreescribir un mtodo de clase. Puedes ver Miembros del Ejemplar y de la Clase para obtener una explicacin sobre los mtodos de clase.

Mtodos que una Subclase debe Sobreescribir Las subclases deben sobreescribir aquellos mtodos que hayan sido declarados como abstract en la superclase, o la propia subclase debe ser abstracta. Escribir Clases y Mtodos Abstractos explica con ms detalle los mtodos y clases abstractos. Escribir Clases y Mtodos Finales Se puede declarar que una clase sea final; esto es, que la clase no pueda tener subclases. Existen (al menos) dos razones por las que se querra hacer esto: razones de seguridad y de diseo.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Seguridad: Un mecanismo que los hackers utilizan para atacar sistemas es crear subclases de una clase y luego sustituirla por el original. Las subclases parecen y sienten como la clase original pero hacen cosas bastante diferentes, probablemente causando daos u obteniendo informacin privada. Para prevenir esta clase de subversin, se puede declarar que la clase sea final y as prevenir que se cree cualquier subclase. La clase String del paquete java.lang es una clase final slo por esta razn. La clase String es tan vital para la operacin del compilador y del intrprete que el sistema Java debe garantizar que siempre que un mtodo o un objeto utilicen un String, obtenga un objeto java.lang.String y no algn otro string. Esto asegura que ningn string tendr propiedades extraas, incosistentes o indeseables. Si se intenta compilar una subclase de una clase final, el compilador mostrar un mensaje de error y no compilar el programa. Adems, los bytescodes verifican que no est teniendo lugar una subversin, al nivel de byte comprobando que una clase no es una subclase de una clase final. Diseo: Otra razn por la que se podra querer declarar una clase final son razones de diseo orientado a objetos. Se podra pensar que una clase es "perfecta" o que, conceptualmente hablando, la clase no debera tener subclases. Para especificar que una clase es una clase final, se utiliza la palabra clave final antes de la palabra clave class en la declaracin de la clase. Por ejemplo, si quisieramos declarar AlgoritmodeAjedrez como una clase final (perfecta), la declaracin se parecera a esto. final class AlgoritmodeAjedrez { ... } Cualquier intento posterior de crear una subclase de AlgoritmodeAjedrez resultar en el siguiente error del compilador. Chess.java:6: Can't subclass final classes: class AlgoritmodeAjedrez class MejorAlgoritmodeAjedrez extends AlgoritmodeAjedrez { ^ 1 error Mtodos Finales Si la creaccin de clases finales parece algo dura para nuestras necesidades, y realmente lo que se quiere es proteger son algunos mtodos de una clase para que no sean sobreescritos, se puede utilizar la palabra clave final en la declaracin de mtodo para indicar al compilador que este mtodo no puede ser sobreescrito por las subclases. Se podra desear hacer que un mtodo fuera final si el mtodo tiene una implementacin que no debe ser cambiada y que es crtica para el estado consistente del objeto. Por ejemplo, en lugar de hacer AlgoritmodeAjedrez como una clase final, podramos hacer siguienteMovimiento() como un mtodo final.
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

class AlgoritmodeAjedrez { ... final void siguienteMovimiento(Pieza piezaMovida, PosicionenTablero nuevaPosicion) { } ... } Escribir Clases y Mtodos Abstractos Algunas veces, una clase que se ha definido representa un concepto abstracto y como tal, no debe ser ejemplarizado. Por ejemplo, la comida en la vida real. Has visto algn ejemplar de comida? No. Lo que has visto son ejemplares de manzanas, pan, y chocolate. Comida representa un concepto abstracto de cosas que son comestibles. No tiene sentido que exista un ejemplar de comida. Similarmente en la programacin orientada a objetos, se podran modelar conceptos abstractos pero no querer que se creen ejemplares de ellos. Por ejemplo, la clase Number del paquete java.lang representa el concepto abstracto de nmero. Tiene sentido modelar nmeros en un programa, pero no tiene sentido crear un objeto genrico de nmeros. En su lugar, la clase Number slo tiene sentido como superclase de otras clases como Integer y Float que implementan nmeros de tipos especficos. Las clases como Number, que implementan conceptos abstractos y no deben ser ejemplarizadas, son llamadas clases abstractas. Una clase abstracta es una clase que slo puede tener subclases--no puede ser ejemplarizada. Para declarar que una clase es un clase abstracta, se utiliza la palabra clave abstract en la declaracin de la clase. abstract class Number { ... } Si se intenta ejemplarizar una clase abstracta, el compilador mostrar un error similar a este y no compilar el programa. AbstractTest.java:6: class AbstractTest is an abstract class. It can't be instantiated. new AbstractTest(); ^ 1 error Mtodos Abstractos Una clase abstracta puede contener mtodos abstractos, esto es, mtodos que no tienen implementacin. De esta forma, una clase abstracta puede definir un interface de programacin completo, incluso porporciona a sus subclases la declaracin de todos los mtodos necesarios para implementar el interface de programacin. Sin embargo, las clases abstractas pueden dejar algunos detalles o toda la implementacin de aquellos mtodos a sus subclases.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Veamos un ejemplo de cuando sera necesario crear una clase abstracta con mtodos abstractos. En una aplicacin de dibujo orientada a objetos, se pueden dibujar crculos, rectngulos, lneas, etc.. Cada uno de esos objetos grficos comparten ciertos estados (posicin, caja de dibujo) y comportamiento (movimiento, redimensionado, dibujo). Podemos aprovecharnos de esas similitudes y declararlos todos a partir de un mismo objeto padre-ObjetoGrafico. Sin embargo, los objetos grficos tambin tienen diferencias subtanciales: dibujar un crculo es bastante diferente a dibujar un rectngulo. Los objetos grficos no pueden compartir estos tipos de estados o comportamientos. Por otro lado, todos los ObjetosGraficos deben saber como dibujarse a s mismos; se diferencian en cmo se dibujan unos y otros. Esta es la situacin perfecta para una clase abstracta. Primero se debe declarar una clase abstracta, ObjetoGrafico, para proporcionar las variables miembro y los mtodos que van a ser compartidos por todas las subclases, como la posicin actual y el mtodo moverA(). Tambin se deberan declarar mtodos abstractos como dibujar(), que necesita ser implementado por todas las subclases, pero de manera completamente diferente (no tiene sentido crear una implementacin por defecto en la superclase). La clase ObjetoGrafico se parecera a esto. abstract class ObjetoGrafico { int x, y; ... void moverA(int nuevaX, int nuevaY) { ... } abstract void dibujar(); } Todas las subclases no abstractas de ObjetoGrafico como son Circulo o Rectangulo debern proprocionar una implementacin para el mtodo dibujar(). class Circulo extends ObjetoGrafico { void dibujar() { ... } } class Rectangulo extends ObjetoGrafico { void dibujar() { ... } } Una clase abstracta no necesita contener un mtodo abstracto. Pero todas las clases que contengan un mtodo abstracto o no proporcionen implementacin para cualquier mtodo abstracto declarado en sus superclases debe ser declarada como una clase abstracta. Estructuras de Datos y Algoritmos en Java

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Autor: Traductor: Juan Antonio Palos (Ozito)

Jeff

Friesen

Arrays
o

o o

o o o o

Arrays de Una Dimensin Utilizar slo un Inicializador Utilizar slo la Palabra Clave "new" Utilizar la palabra clave "new" y un Inicializador Trabajar con un array uni-dimensional Algoritmos de bsqueda-lineal, bsqueda-binaria y ordenacin de burbuja Bsqueda Lineal Bsqueda Binaria Ordenacin de Burbuja Arrays de Dos Dimensiones Utilizar slo un Inicializador Utilizar slo la palabra clave "new" Utilizar la palabra clave "new" y un inicializador trabajar con Arrays bi-dimensionales Algoritmo de Multiplicacin de Matrices Arrays Desiguales Los Arrays Java son Objetos

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

ARRAYS El array es una de las estructuras de datos ms ampliamente utilizada por su flexifilidad para derivar en complejas estructuras de datos y su simplicidad. Empezaremos con una definicin: un array es una secuencia de elementos, donde cada elemento (un grupo de bytes de memoria que almacenan un nico tem de datos) se asocia con al menos un indice (entero no-negativo). Esta definicin lanza cuatro puntos interesantes:

Cada elemento ocupa el mismo nmero de bytes; el nmero exacto depende del tipo de datos del elemento. Todos los elementos son del mismo tipo. Tendemos a pensar que los elementos de un array ocupan localizaciones de memoria consecutivas. Cuando veamos los arrays bi-dimensionales descubrir que no es siempre as. El nmero de ndices asociados con cada elemento es la dimensin del array

Nota: Esta seccin se enfoca exclusivamente en arrays de una y dos dimensiones porque los arrays de mas dimensiones no se utilizan de forma tan frecuente. Arrays de Una Dimensin El tipo de array ms simple tiene una dimensin: cada elemento se asocia con un nico ndice. Java proporciona tres tcnicas para crear un array de una dimensin: usar slo un inicializador, usar slo la palabra clave new, y utilizar la palabra clave new con un inicializador. Utilizar slo un Inicializador Utilizando un inicializador se puede utilizar cualquiera de estas dos sintaxis: type variable_name '[' ']' [ '=' initializer ] ';' type '[' ']' variable_name [ '=' initializer ] ';' Donde el inicializador tiene la siguiente sintaxis: '{' initial_value1 ',' initial_value2 ',' ... '}' El siguiente fragmento ilustra como crear un array de animales: // Create an array of animals. String animals [] = { "Tiger", "Zebra", "Kangaroo" }; Utilizar slo la Palabra Clave "new" Utilizando la palabra clave new se puede utilizar cualquiera de estas dos sintaxis:
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

type variable_name '[' ']' '=' 'new' type '[' integer_expression ']' ';' type '[' ']' variable_name '=' 'new' type '[' integer_expression ']' ';' Para ambas sintaxis:

variable_name especifica el nombre de la variable del array uni-dimensional type especifica el tipo de cada elemento. Como la variable del array unidimensional contiene una referencia a un array uni-dimensional, el tipo es type [] La palabra clave new seguida por type y seguida por integer_expression entre corchetes cuadrados ([]) especfica el nmero de elementos. new asigna la memoria para los elementos del array uni-dimensional y pone ceros en todos los bits de los bytes de cada elementos, lo que significa que cada elemento contiene un valor por defecto que interpretamos basndonos en su tipo. = asigna la referencia al array uni-dimensional a la variable variable_name.

Truco: Los desarrolladores Java normalmente situan los corchetes cuadrados despus del tipo (int [] test_scores) en vez de despus del nombre de la variable (int test_scores []) cuando declaran una variable array. Mantener toda la informacin del tipo en un nico lugar mejora la lectura del cdigo. El siguiente fragmento de cdigo utiliza slo la palabra clave new para crear un array uni-dimensional que almacena datos de un tipo primitivo: int [] test_scores = new int [4]; int [] test_scores declara una variable array uni-dimensional (test_scores) junto con su tipo de variable (int []). El tipo de referencia int [] significa que cada elemento debe contener un tem del tipo primitivo entero. new int [4] crea una arra uni-dimensional asignando memoria para cuatro elementos enteros consecutivos. Cada elemento contiene un nico entero y se inicializa a cero. El operador igual a (=) asigna la referencia del array uni-dimensional a test_scores. La siguiente figura ilustra los elementos y la variable array uni-dimensional resultante:

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Cuidado: Cuando se crea un array uni-dimensional basado en un tipo primitivo, el compilador requiere que aparezca la palabra clave que indica el tipo primitivo en los dos lados del operador igual-a. De otro modo, el compilador lanzar un error. Por ejemplo, int [] test_scores = new long [20]; es ilegal porque las palabras claves int y long representan tipos primitivos incompatibles. Los arrays uni-dimensionales de tipos primitivos almacenan datos que son valores primitivos. Por el contrario, los arrays uni-dimensiones del tipo referencia almacenan datos que son referencias a objetos. El siguiente fragmento de cdigo utiliza la palabra clave new para crear una pareja de arrays uni-dimensionales que almacenan datos basados en tipo referencia: Clock [] c1 = new Clock [3]; Clock [] c2 = new AlarmClock [3]; Clock [] c1 = new Clock [3]; declara una variable array uni-dimensional, (c1) del tipo Clock [], asigna memoria para un array uni-dimensional Clock que consta de tres elementos consecutivos, y asigna la referencia del array Clock a c1. Cada elemento debe contener una referencia a un objeto Clock (asumiendo que Clock es una clase concreta) o un objeto creado desde una subclase de Clock y lo inicializa a null. Clock [] c2 = new AlarmClock [3]; se asemeja a la declaracin anterior, excepto en que se crea un array uni-dimensional AlarmClock, y su referencia se asgina a la variable Clock [] de nombre c2. (Asume AlarmClock como subclase de Clock.) Utilizar la palabra clave "new" y un Inicializador Utilizar la palabra clave new con un inicializador requiere la utilizacin de alguna de las siguientes sntaxis: type variable_name> '[' ']' '=' 'new' type '[' ']' initializer ';'
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

type '[' ']' variable_name '=' 'new' type '[' ']' initializer ';' Donde initializer tiene la siguientes sintaxis: '{' [ initial_value [ ',' ... ] ] '}'

variable_name especifica el nombre de la variable del array uni-dimensional type especifica el tipo de cada elemento. Como la variable del array unidimensional contiene una referencia a un array uni-dimensional, el tipo es type [] La palabra clave new seguida por type y seguida por corchetes cuadrados ([]) vacos, seguido por inicializer. No se necesita especificar el nmero de elementos entre los corchetes cuadrados porque el compilador cuenta el nmero de entradas en el inicializador. new asigna la memoria para los elementos del array uni-dimensional y asigna cada una de las entradas del inicializador a un elemento en orden de izquierda a derecha. = asigna la referencia al array uni-dimensional a la variable variable_name.

Nota: Un array uni-dimensional (o de ms dimensiones) creado con la palabra clave new con un inicializador algunas veces es conocido como un array annimo. El siguiente fragmento de cdigo utiliza la palabra clave new con un inicializador para crear un array uni-dimensional con datos basados en tipos primitivos: int [] test_scores = new int [] { 70, 80, 20, 30 }; int [] test_scores declara una variable de array uni-dimensional (test_scores) junto con su tipo de variable (int []). El cdigo new int [] { 70, 80, 20, 30 } crea un array unidimensional asignando memoria para cuatro elementos enteros consecutivos; y almacena 70 en el primer elemento, 80 en el segundo, 20 en el tercero, y 30 en el cuarto. La referencia del array uni-dimensional se asigna a test_scores. Cuidado: No especifique una expresin entera entre los corchetes cuadrados del lado derecho de la igualdad. De lo contrario, el compilador lanzar un error. Por ejemplo, new int [3] { 70, 80, 20, 30 } hace que el compilador lance un error porque puede determinar el nmero de elementos partiendo del inicializador. Adems, la discrepancia est entre el nmero 3 que hay en los corchetes y las cuatro entradas que hay en el inicializador. La tcnica de crear arrays uni-dimensionales con la palabra clave new y un inicializador tambin soporta la creacin de arrays que contienen referencias a objetos. El siguiente fragmento de codigo utiliza esta tcnica para crear una pareja de arrays unidimensionales que almacenan datos del tipo referencia: Clock [] c1 = new Clock [] { new Clock () }; Clock [] c2 = new AlarmClock [] { new AlarmClock () };
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Clock [] c1 = new Clock [3]; declara una variable de array uni-dimensional (c1) del tipo Clock [], asigna memoria para un array Clock que consta de un slo elemento, crea un objeto Clock y asigna su referencia a este elemento, y asigna la referencia del array Clock a c1. El cdigo Clock [] c2 = new AlarmClock [3]; se parece a la declaracin anterior, excepto en que crea un array uni-dimensional de un slo elemento AlarmClock que inicializa un objeto del tipo AlarmClock. Trabajar con un array uni-dimensional Despus de crear un array uni-dimensional, hay que almacenar y recuperar datos de sus elementos. Con la siguiente sintaxis se realiza esta tarea: variable_name '[' integer_expression ']' integer_expression indentifica un ndice de elemento y debe evaluarse como un entero entre 0 y uno menos que la longitud del array uni-dimensional (que devuelve variable_name.length). Un ndice menor que 0 o mayor o igual que la longitud causa que se lance una ArrayIndexOutOfBoundsException. El siguiente fragmento de codigo ilustra accesos legales e ilegales a un elemento: String [] months = new String [] { "Jan", "Feb", "Mar", "Apr", "May", "Jun" "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; System.out.println (months [0]); // Output: Jan // The following method call results in an ArrayIndexOutOfBoundsException // because index equals the month's length System.out.println (months [months.length]); System.out.println (months [months.length - 1]); // Output: Dec // The following method call results in an ArrayIndexOutOfBoundsException // because index < 0 System.out.println (months [-1]); Ocurre una situacin interesante cuando se asigna la referencia de una subclase de un array a una variable de array de la superclase, porque un subtipo de array es una clase del supertipo de array. Si intenta asignar una referencia de un objeto de la superclase a los elementos del array de la subclase, se lanza una ArrayStoreException. El siguiente fragmento demuestra esto: AlarmClock [] ac = new AlarmClock [1]; Clock [] c = ac; c [0] = new Clock (); El compilador no dar ningn error porque todas las lneas son legales. Sin embargo, durante la ejecucin, c [0] = new Clock (); resulta en una ArrayStoreException. Esta excepcin ocurre porque podramos intentar acceder a un miembro especfico de AlarmClock mediante una referencia a un objeto Clock. Por ejemplo, supongamos que
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

AlarmClock contiene un mtodo public void soundAlarm(), Clock no lo tiene, y el fragmento de cdigo anterior se ejecuta sin lanzar una ArrayStoreException. Un intento de ejecutar ac [0].soundAlarm (); bloquea la JVM Mquina Virtual Java porque estmos intentando ejecutar este mtodo en el contexto de un objeto Clock (que no incorpora un mtodo soundAlarm()). Cuidado: Tenga cuidado cuando acceda a los elementos de un array porque podra recibir una ArrayIndexOutOfBoundsException o una ArrayStoreException. Algoritmos de bsqueda-lineal, bsqueda-binaria y ordenacin de burbuja Los desarrolladores normalmente escribien cdigo para buscar datos en un array y para ordenar ese array. Hay tres algoritmos muy comunes que se utilizan para realizar estas tareas. Bsqueda Lineal El algoritmo de bsqueda lineal busca en un array uni-dimensional un dato especfico. La bsqueda primero examina el elemento con el ndice 0 y continua examiando los elementos sucesivos hasta que se encuentra el tem o no quedan ms elementos que examinar. El siguiente pseudocdigo demuestra este algoritmo: DECLARE INTEGER i, srch = 72 DECLARE INTEGER x [] = [ 20, 15, 12, 30, -5, 72, 456 ] FOR i = 0 TO LENGTH (x) - 1 IF x [i] IS srch THEN PRINT "Found ", srch END END IF NEXT i PRINT "Did not find ", srch END El siguiente listado presenta el equivalente Java al pseudocdigo anterior: // LSearchDemo.java class LSearchDemo { public static void main (String [] args) { int i, srch = 72; int [] x = { 20, 15, 12, 30, -5, 72, 456 }; for (i = 0; i <= x.length - 1; i++) if (x [i] == srch) { System.out.println ("Found " + srch); return; } System.out.println ("Did not find " + srch);
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

} } LSearchDemo produce la siguiente salida: Found 72 Dos de las ventajas de la bsqueda lineal son la simplicidad y la habilidad de buscar tanto arrays ordenados como desornedados. Su nica desventaja es el tiempo empleado en examinar los elementos. El nmero medio de elementos examinados es la mitad de la longitud del array, y el mximo nmero de elementos a examinar es la longitud completa. Por ejemplo, un array uni-dimensional con 20 millones de elementos requiere que una bsqueda lineal examine una media de 10 millones de elementos y un mximo de 20 millones. Como este tiempo de examen podra afectar seriamente al rendimiento, utilice la bsqueda lineal para arrays uni-dimensionales con relativamente pocos elementos. Bsqueda Binaria Al igual que en la bsqueda lineal, el algoritmo de bsqueda binaria busca un dato determinado en un array uni-dimensional. Sin embargo, al contrario que la bsqueda lineal, la busqueda binaria divide el array en seccin inferior y superior calculando el ndice central del array. Si el dato se encuentra en ese elemento, la bsqueda binaria termina. Si el dato es numricamente menor que el dato del elemento central, la bsqueda binaria calcula el ndice central de la mitad inferior del array, ignorando la seccin superior y repite el proceso. La bsqueda continua hasta que se encuentre el dato o se exceda el lmite de la seccion (lo que indica que el dato no existe en el array). El siguiente pseudocdigo demuestra este algoritmo: DECLARE INTEGER x [] = [ -5, 12, 15, 20, 30, 72, 456 ] DECLARE INTEGER loIndex = 0 DECLARE INTEGER hiIndex = LENGTH (x) - 1 DECLARE INTEGER midIndex, srch = 72 WHILE loIndex <= hiIndex midIndex = (loIndex + hiIndex) / 2 IF srch > x [midIndex] THEN loIndex = midIndex + 1 ELSE IF srch < x [midIndex] THEN hiIndex = midIndex - 1 ELSE EXIT WHILE END IF END WHILE IF loIndex > hiIndex THEN PRINT srch, " not found" ELSE PRINT srch, " found" END IF
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

END El siguiente cdigo representa el equivalente Java del pseudocdigo anterior: // BSearchDemo.java class BSearchDemo { public static void main (String [] args) { int [] x = { -5, 12, 15, 20, 30, 72, 456 }; int loIndex = 0; int hiIndex = x.length - 1; int midIndex, srch = 72; while (loIndex <= hiIndex) { midIndex = (loIndex + hiIndex) / 2; if (srch > x [midIndex]) loIndex = midIndex + 1; else if (srch < x [midIndex]) hiIndex = midIndex - 1; else break; } if (loIndex > hiIndex) System.out.println (srch + " not found"); else System.out.println (srch + " found"); } } BSearchDemo produce la siguiente salida: 72 found La nica ventaja de la bsqueda binaria es que reduce el tiempo empleado en examinar elementos. El nmero mximo de elementos a examinar es log2n (donde n es la longitud del array uni-dimensional). Por ejemplo, un array uni-dimensional con 1.048.576 elementos requiere que la bsqueda binaria exmine un mximo de 20 elementos. La bsqueda binaria tiene dos inconveniemtes; el incremento de complejidad y la necesidad de pre-ordenar el array. Ordenacin de Burbuja Cuando entra en juego la ordenacin de datos, la ordenacin de burbuja es uno de los algoritmos ms simples. Este algoritmo hace varios pases sobre un array unidimensional. Por cada pase, el algoritmo compara datos adyacentes para determinar si numricamente es mayor o menor. Si el dato es mayor (para ordenaciones ascendentes) o menor (para ordenaciones descendientes) los datos se intercambian y se baja de nuevo por el array. En el ltimo pase, el dato mayor (o menor) se ha movido al final del array. Este efecto "burbuja" es el origen de su nombre. El siguiente pseudocdigo dumuestra este algoritmo (en un contexto de ordenacin ascendente):
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

DECLARE INTEGER i, pass DECLARE INTEGER x [] = [ 20, 15, 12, 30, -5, 72, 456 ] FOR pass = 0 TO LENGTH (x) - 2 FOR i = 0 TO LENGTH (x) - pass - 2 IF x [i] > x [i + 1] THEN SWAP x [i], x [i + 1] END IF NEXT i NEXT pass END La siguiente figura muestra una ordenacin de burbuja ascendente de un array unidimensional de cuatro elementos. Hay tres pasos, el paso 0 realiza tres comparaciones y dos intercambios, el paso 1 realiza dos comparaciones y un intercambio y el paso realiza una comparacin y un intercambio.

El siguiente listado presenta el equivalente Java del pseudocdigo anterior: // BSortDemo.java class BSortDemo { public static void main (String [] args) { int i, pass; int [] x = { 20, 15, 12, 30, -5, 72, 456 }; for (pass = 0; pass < = x.length - 2; pass++) for (i = 0; i < = x.length - pass - 2; i++) if (x [i] > x [i + 1]) { int temp = x [i]; x [i] = x [i + 1]; x [i + 1] = temp; } for (i = 0; i < x.length; i++) System.out.println (x [i]); } } BSortDemo produce la siguiente salida:

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

-5 12 15 20 30 72 456 Aunque la ordenacin de burbuja es uno de los algoritmos de ordenacin ms simples, tambin es uno de los ms lentos. Entre los algoritmos ms rpidos se incluyen la ordenacin rpida y la ordenacin de pila. Truco: Otro algoritmo muy utilizado para arrays uni-dimensionales copia los elementos de un array fuente en otro array de destino. En vez de escribir su propio cdigo para realizar esta terea puede utilizar el mtodo public static void arraycopy(Object src, int srcindex, Object dst, int dstindex, int length) de la clase java.lang.System, que es la forma ms rpida de realizar la copia. Arrays de Dos Dimensiones Un array de dos dimensiones, tambin conocido como tabla o matriz, donde cada elemento se asocia con una pareja de ndices, es otro array simple. Conceptualizamos un array bi-dimensional como una cuadrcula rectngular de elementos divididos en filas y columnas, y utilizamos la notacin (fila, columna) para identificar un elemento especfico. La siguiente figura ilustra esta visin conceptual y la notacin especfica de los elementos:

Java proporciona tres tcnicas para crear un array bi-dimensional: Utilizar slo un Inicializador Esta tcnica requiere una de estas sintaxis: type variable_name '[' ']' '[' ']' '=' '{' [ rowInitializer [ ',' ... ] ] '}' ';'

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

type '[' ']' '[' ']' variable_name '=' '{' [ rowInitializer [ ',' ... ] ] '}' ';' Donde rowInitializer tiene la siguiente sintaxis: '{' [ initial_value [ ',' ... ] ] '}' Para ambas sintaxis:

variable_name especifica el nombre de la variable del array bi-dimensional. type especifica el tipo de cada elemento. Como una variable de array bidimensional contiene una referencia a un array bi-dimensional, su tipo es type [ ] [ ]. Especifica cero o ms inicializadores de filas entre los corchetes ({ }). Si no hay inicializadores de filas, el array bi-dimensional est vaco. Cada inicializador de fila especifica cero o ms valores iniciales para las entradas de las columnas de esa fila. Si no se especifican valores para esa fila, la fila est vaca. = se utiliza para asignar la referencia del array bi-dimensional a variable_name.

El siguiente cdigo usa slo un inicialiador para crear un array bi-dimensional que almacena datos basados en un tipo primitivo: double [][] temperatures = { { 20.5, 30.6, 28.3 }, { -38.7, -18.3, -16.2 } }; // Celsius temperatures double [][] temperatures declara una variable de array bi-dimensional (temperatures) junto con su tipo de variable (double [][]). El tipo de referencia double [][] signigica que cada elemento debe contener datos del tipo primitivo double. { { 20.5, 30.6, 28.3 }, { 38.7, -18.3, -16.2 } } especifica un array bi-dimensional de dos filas por tres columnas, donde la primera fila contiene los datos 20.5, 30.6, y 28.3, y la segunda fila contitne los datos -38.7, -18.3, y -16.2. Detrs de la escena, se asigna memoria y se inicializan esto datos. El operador igual-a asigna la referencia del array bi-dimensional a temperatures. La siguiente figura ilustra el array bi-dimensional resultante desde un punto de vista conceptual y de memoria.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Utilizar slo la palabra clave "new" Esta tcnica requiere cualquiera de estas sintaxis: type variable_name '[' ']' '[' ']' '=' 'new' type '[' integer_expression ']' '[' ']' ';' type '[' ']' '[' ']' variable_name '=' 'new' type '[' integer_expression ']' '[' ']' ';' En ambas sintaxis:

variable_name especifica el nombre de la variable del array bi-dimensional. type especifica el tipo de cada elemento. Como es una variable de array bidimensional contiene una referencia a un array bi-dimensional, su tipo es type [ ] [ ].

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

La palabra clave new seguida por type y por una expresin entera entre corchetes cuadrados, que indentifica el nmero de filas. new asigna memoria para las filas del array uni-dimensional de filas y pone a cero todos los bytes de cada elemento, lo que significa que cada elemento contiene una refeencia nula. Debe crear un array uni-dimensional de columnas separado y asignarle su referencia cada elemento fila. = se utiliza para asignar la referencia del array bi-dimensional a variable_name.

El siguiente fragmento de cdigo usa slo la palabra clave new para crear un array bidimensional que almacena datos basados en un tipo primitivo: double [][] temperatures = new double [2][]; // Allocate two rows. temperatures [0] = new double [3]; // Allocate three columns for row 0 temperatures [1] = new double [3]; // Alllocate three columns for row 1 temperatures [0][0] = 20.5; // Populate row 0 temperatures [0][1] = 30.6; temperatures [0][2] = 28.3; temperatures [1][0] = -38.7; // Populate row 1 temperatures [1][1] = -18.3; temperatures [1][2] = -16.2; Utilizar la palabra clave "new" y un inicializador Esta tcnica requiere una de estas sintaxis: type variable_name '[' ']' '[' ']' '=' 'new' type '[' ']' '[' ']' '{' [ rowInitializer [ ',' ... ] ] '}' ';' type '[' ']' '[' ']' variable_name '=' 'new' type '[' ']' '[' ']' '{' [ rowInitializer [ ',' ... ] ] '}' ';' donde rowInitializer tiene la siguiente sintaxis: '{' [ initial_value [ ',' ... ] ] '}' En ambas sintaxis:

variable_name especifica el nombre de la variable del array bi-dimensional. type especifica el tipo de cada elemento. Como es una variable de array bidimensional contiene una referencia a un array bi-dimensional, su tipo es type [ ] [ ]. La palabra clave new seguida por type y por dos parejas de corchetes cuadrados vacos, y cero o ms inicializadores de filas enrre un par de corchetes cuadrados. Si no se especifica ningun inicializador de fila, el array bidimensional est vaco. Cada inicializador de fila especifica cero o ms valores iniciales para las columnas de esa fila. = se utiliza para asignar la referencia del array bi-dimensional a variable_name.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

El siguiente fragmento de cdigo usa la palabra clave new y un inicilizador para crear un array bi-dimensional que almacena datos basados en un tipo primitivo: double [][] temperatures = new double [][] { { 20.5, 30.6, 28.3 }, { -38.7, -18.3, -16.2 } }; El fragmento de cdigo de arriba se comporta igual que el anterior double [][] temperatures = new double [][] { { 20.5, 30.6, 28.3 }, { -38.7, -18.3, -16.2 } };. trabajar con Arrays bi-dimensionales Despus de crear un array bi-dimensional, querr almacenar y recuperar datos de sus elementos. Puede realizar estas tareas con la siguiente sintaxis: variable_name '[' integer_expression1 ']' '[' integer_expression2 ']' integer_expression1 identifica el ndice de fila del elemento y va de cero hasta la longitud del array menos uno. Igual ocurre con integer_expression2 pero para el ndice de columna. como todas las filas tienen la misma longitud, podra encontrar conveniente especificar variable_name [0].length para especificar el nmero de columnas de cualquier fila. El siguiente fragmento de cdigo almacena y recupera datos de un elemento de un array bi-dimensional: double [][] temperatures = { { 20.5, 30.6, 28.3 }, { -38.7, -18.3, -16.2 } }; temperatures [0][1] = 18.3; // Replace 30.6 with 18.3 System.out.println (temperatures [1][2]); // Output: -16.2 Algoritmo de Multiplicacin de Matrices Multiplicar una matriz por otra es una operacin comn en el trabajo con grficos, con datos econmicos, o con datos industriales. Los desarrolladores normalmente utilizan el algoritmo de multiplicacin de matrices para completar esa multiplicacin. Cmo funciona ese algoritmo? Dejemos que 'A' represente una matriz con 'm' filas y 'n' columnas. De forma similar, 'B' representa un matriz con 'p' filas y 'n' columnas. Multiplicar A por B produce una matriz C obtenida de multiplicar todas las entradas de A por su correpondencia en B. La siguiente figura ilustra estas operaciones.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Cuidado: La multiplicacin de matrices requiere que el nmero de columnas de la matriz de la izquierda (A) sea igual al de la matriz de la derecha (B). Por ejemplo, para multiplicar una matriz A de cuatro columnas por fila por una matriz B (como en A x B), B debe contener exactamente cinco filas. El siguiente pseudocdigo demuestra el algoritmo de multiplicacin de matrices:

// __________ _____ _________________________ // | 10 30 | | 5 | | 10 x 5 + 30 x 7 (260) | // | |X| |=| | // | 20 40 | | 7 | | 20 x 5 + 40 * 7 (380) | // __________ _____ _________________________ DECLARE INTEGER a [][] = [ 10, 30 ] [ 20, 40 ] DECLARE INTEGER b [][] = [ 5, 7 ] DECLARE INTEGER m = 2 // Number of rows in left matrix (a) DECLARE INTEGER p = 2 // Number of columns in left matrix (a) // Number of rows in right matrix (b) DECLARE INTEGER n = 1 // Number of columns in right matrix (b) // Note: cs1 must equal rs2 DECLARE INTEGER c [m][n] // c holds 2 rows by 1 columns // All elements initialize to 0 FOR i = 0 TO m - 1 FOR j = 0 TO n - 1 FOR k = 0 TO p - 1 c [i][j] = c [i][j] + a [i][k] * b [k][j] NEXT k NEXT j NEXT i

El pseudocdigo de arriba requiere tres bucles FOR para realizar la multiplicacin. El bucle ms interno multiplica una sla fila de la matriz a por un sola columna de la
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

matriz B y aade el resultado a un sola entrada de la matriz C. El siguiente listado presenta el equivalente Java del pseudocdigo anterior: // MatMultDemo.java class MatMultDemo { public static void main (String [] args) { int [][] a = int [][] b = dump (a); System.out.println (); dump (b); System.out.println (); int [][] c = multiply (a, b); dump (c); } static void dump (int [][] x) { if (x == null) { System.err.println ("array is null"); return; } // Dump the matrix's element values to the standard output device // in a tabular order for (int i = 0; i < x.length; i++) { for (int j = 0; j < x [0].length; j++) System.out.print(x [i][j] + " "); System.out.println (); } } static int [][] multiply (int [][] a, int [][] b) { // ========================================================= // 1. a.length contains a's row count // // 2. a [0].length (or any other a [x].length for a valid x) // contains a's column count // // 3. b.length contains b's row count // // 4. b [0].length (or any other b [x].length for a valid x) // contains b's column count // ========================================================= // If a's column count != b's row count, bail out if (a [0].length != b.length) { System.err.println ("a's column count != b's row count"); return null; } // Allocate result matrix with a size equal to a's row count x b's // column count
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

int [][] result = new int [a.length][]; for (int i = 0; i < result.length; i++) result [i] = new int [b [0].length]; // Perform the multiplication and addition for (int i = 0; i < a.length; i++) for (int j = 0; j < b [0].length; j++) for(int k = 0; k < a [0].length; k++) // Or k < b.length result [i][j] += a [i][k] * b [k][j]; // Return the result matrix return result; } } MatMultDemo produce esta salida:

10 30 20 40 5 7 260 380 Exploremos un problema donde se necesita la multiplicacin de matrices para obtener una solucin. Un frutero de Florida carga una pareja de semitrailers con 1250 cajas de naranjas, 400 cajas de melocotones y 250 cajas de uvas. En la siguiente figura aparece la tabla de precios de mercado, por cada tipo de fruta en cinco ciudades diferentes.

A qu ciudades debera enviar los semitrailers para obtener el mximo ingreso? Para resolver este problema, primero consideremos la tabla de la imagen anterior como una matriz de precios de cuatro filas por tres columnas. Luego construimos una matriz de tres filas por una columna con las cantidades, que aparece abajo:
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

== == | 1250 | | | | 400 | | | | 250 | == == Ahora que tenemos las dos matrices, simplemente multiplicamos la matriz de precios por la matriz de cantidades para producir una matriz de ingresos:

== == == == | 10.00 8.00 12.00 | == == | 18700.00 | New York | | | 1250 | | | | 11.00 8.50 11.55 | | | | 20037.50 | Los Angeles | |X | 400 | = | | | 8.75 6.90 10.00 | | | | 16197.50 | Miami | | | 250 | | | | 10.50 8.25 11.75 | == == | 19362.50 | Chicago == == == ==

Enviar los dos semitrailers a Los Angles produce el mayor ingreso. Pero cuando se consideren la distancia y el consumo de gasoil, quizs New York sea la mejor apuesta Arrays Desiguales Suponga que su cdigo fuente contiene la siguiente declaracin de matriz: int [][] x = new int [5][];. Esto declara una matriz de enteros que contiene cinco filas, y x.length devuelve ese nmero de filas. Normalmente, completa la creacin de la matriz especificando el mismo nmero de columnas para cada fila. Por ejemplo, especificando 10 columnas para cada fila utilizando el siguiente cdigo: for (int i = 0; i < x.length; i++) x [i] = new int [10]; Al contrario que otros lenguajes, Java no le fuerza a especificar el mismo nmero de columnas por cada fila. Utilizando el fragmento de codigo anterior, asigne tres columnas a la fila cero, dos a la fila 1, tres a la fila 2, cinco a la fila 3 y una a la fila 4, lo que demuestra el siguiente fragmento de cdigo: x [0] = new int [3]; x [1] = new int [2]; x [2] = new int [3]; x [3] = new int [5]; x [4] = new int [1]; Despus de ejecutar este cdigo, usted tendr una matriz degenerada conocida como un array desigual. La siguiente imagen ilustra este tipo de arrays:

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

Los arrays desiguales son estructuras de datos tiles debido a su capacidad de ahorro de memoria. Por ejemplo, considere una hoja de clculo con el potencial de 100.000 filas por 20.000 columnas. Si intentamos utilizar una matriz que contenga toda la hoja de calculo, requeriremos una enorme cantidad de memoria. Pero supongamos que la mayora de la celdas contienen valores por defecto, como un 0 para valores numricos y null para celdas no numricas. Si utilizamos un array desigual en lugar de una matriz, almacenaremos slo las celdas que contienen datos numricos. (Por supuesto, necesitamos algn tipo de mecanismo de mapeo que mapee las coordenadas de la hoja de clculo [filas, columnas] a las coordenadas del array desigual [filas], [columnas]). Los Arrays Java son Objetos La primera sentencia del captulo 10 de la Especificacin del Lenguaje Java dice lo siguiente: En el lenguaje Java, los arrays son objetos. Detrs de la escena, cada array es un ejemplar de una clase oculta que hereda 11 mtodos de la clase Object y sobreescribe el mtodo protected Object clone() throws CloneNotSupportedException de la misma clase para que un array pueda ser clonado en la sombra. Adems, esta clase oculta proporciona un campo length. El siguiente listado demuestra la asociacin entre arrays y objetos: // ArrayIsObject.java class ArrayIsObject { public static void main (String [] args) { double [] a = { 100.5, 200.5, 300.5 }; double [] b = { 100.5, 200.5, 300.5 }; double [] c = b; System.out.println ("a's class is " + a.getClass ()); System.out.println ("a and b are " + ((a.equals (b)) ? "" : "not ") + "equal");
Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

PONTIFICIA UNIVERSIDAD JAVERIANA Departamento de Ciencias e Ingeniera de la Computacin Objetos y Programacin a mediana escala Profesora : Olga Luca Roa

System.out.println ("b and c are " + ((b.equals (c)) ? "" : "not ") + "equal"); double [] d = (double []) c.clone (); System.out.println ("c and d are " + ((c.equals (d)) ? "" : "not ") + "equal"); for (int i = 0; i < d.length; i++) System.out.println (d [i]); } } Cuando se ejecuta ArrayIsObject produce la siguiente salida: a's class is class [D a and b are not equal b and c are equal c and d are not equal 100.5 200.5 300.5 ArrayIsObject crea las referencias a los arrays a- y b con la misma precisin y los mismos contenidos y las misma longitud. Para el array a, a.getClass () devuelve class [D, donde [D es el nombre de la clase oculta. A pesar de que ambos arrays tienen los mismos contenidos, a.equals (b) devuelve false porque equals() compara referencias (no contenidos), y a y b contienen diferentes referencias. La referencia de b se asigna a c, y b.equals (c) devuelve true porque b y c referencian al mismo array. c.clone() crea un clon de c, y una referencia de ese array se asigna a d. Para probar que la referencia d contiene los mismos contenidos que la referencia del array c, el bucle for itera sobre todos los elementos e imprime su contenido. El bucle lee los contenidos y el campo de slo lectura length para determinar sobre cuantos elementos iterar. Truco: En el cdigo fuente, especifique siempre .length (como d.length) en vez de la longitud real del array. De esta forma, eliminar el riesgo de introducir bugs relacionados con la longitud, si despus decide modificar la longitud del array en su cdigo de creacin.

Documentacin [en linea] http://www.programacion.net/java/tutorial/java_basico/ [Fecha Consulta: 9 Junio, 2005]

You might also like