Arreglos String Polimorfismo y Excepciones en Java

download Arreglos String Polimorfismo y Excepciones en Java

of 62

Transcript of Arreglos String Polimorfismo y Excepciones en Java

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    1/62

    Mdulo 4

    Arreglos, String,

    Polimorfismo y

    Excepciones en Java

    Programacin Orientada a Objetos

    De las Heras, Sebastin

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    2/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 2

    4.1- Arreglos y la clase

    Vector

    4.1.1- Arreglos

    El objetivo que perseguiremos en esta seccin ser el aprendizaje dearreglos en Java. Estudiaremos qu es un arreglo y la sintaxis utilizadapara declarar, crear, inicializar y manipularun arreglo.

    Conceptualmente, los arreglos en Java son objetos que puedenalmacenar mltiples variables del mismo tipo de dato. A un arreglotambin se lo suele denominar arraypor su denominacin en ingls. Losarreglos pueden mantener referencias a tipos de datosprimitivoso tipos de

    de datos por referencia (objetos), pero el arreglo propiamente dicho essiempre un objeto.

    Los arreglos se clasificanen:

    Unidimensionales: almacenan datos indicando un solo ndicedebido a que estn compuestos por una nica dimensin. A estostipos de arreglos se los denomina tambin vectores. La siguientefigura representa un arreglo unidimensional que almacena seisvalores numricos enteros:

    ndice 0 1 2 3 4 5

    Elementos 24 12 14 28 9 2

    Para referenciar al primer elemento de un arreglo, se utiliza el ndicecero, es decir el conteo del ndice comienza en cero.

    Bidimensionales: estn compuestos por dos dimensiones,razn por la cual para manipularlos se deben indicar dos ndices.Imaginemos que tenemos un arreglo en el cual los elementos de laprimera dimensin, almacenan a su vez otros arreglos:

    Dimensin 1

    Dimensin 2

    La figura anterior representa un arreglo bidimensional cuya primeradimensin contiene tres elementos que almacenan nuevos arreglosde cuatro elementos.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    3/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 3

    Otra representacin ms intuitiva es considerar que los datos de losarreglos bidimensionales se almacenan en una estructura con formade matriz. La siguiente figura representa el mismo arreglo definidoanteriormente pero para su representacin se utiliza una matriz:

    Columnas

    0 1 2 3

    Filas

    0 43 21 7 25

    1 3 67 34 67

    2 6 2 56 87

    Debido a que la primera dimensin del arreglo contiene treselementos, entonces se puede considerar que la matriz querepresenta al arreglo contiene tres filas. Tambin se puedeconsiderar que la matriz contiene cuatro columnas debido a que lasegunda dimensin del arreglo contiene cuatro elementos.

    Multidimensionales: tienen ms de dos dimensiones. Paramanipular a este tipo de arreglo se tiene que utilizar un ndicepara cada una de las dimensionesque componen al arreglo. Lasiguiente figura representa un ejemplo de un arreglomultidimensional de tres dimensiones que almacena elementos detipo char:

    - Laprimera dimensinpuede almacenar tres elementos. Loselementos que se almacenan son nuevos arreglos (dimensin2).

    - Los arreglos de la segunda dimensinpueden almacenar doselementos. Los elementos que se almacenan son nuevosarreglos (dimensin 3).

    - Los arreglos de la tercera dimensinpueden almacenar treselementos. Se almacenan valores de tipo char.

    Dimensin 1

    Dimensin 2

    Dimensin 3

    Debido a que el arreglo representado contiene tres dimensiones,

    entonces tambin se lo puede representar mediante la figura de uncubo como se muestra a continuacin:

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    4/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 4

    A modo de ejemplo, podemos observar que el elemento que seencuentra en la posicin [0,1,1] tiene almacenado el valor k. Cuandoindicamos la posicin [0,1,1] hacemos referencia a la primera fila de ladimensin 1 (ndice 0), la segunda fila de la dimensin 2 (ndice 1)y lasegunda fila de la dimensin 3 (ndice 1). Es importante recordar que elconteo de los ndices comienza en cero.

    Para aprender a utilizar un arreglo, es fundamental conocer los siguientesconceptos:

    Declaracin de un arreglo. Creacin de un arreglo.

    Inicializacin de un arreglo.

    Cada uno de estos puntos tiene distintas variantes y estudiaremos las msutilizadas.

    Declaracin de un arreglo

    Un arreglo se declaraindicando el tipo de datode los elementos que elarreglo almacenar, pudiendo ser tipos de datos primitivoso tipos de datospor referencia (objeto), seguido de un par de corchetes que se puedenubicar a la izquierda o a la derecha del identificador del arreglo. Acontinuacin se declaran dos arreglos para ejemplificar:

    int []numeros;

    String palabras[];

    El primer arreglo es un objeto cuyo identificador es numeros y almacenavalores numricos enteros (int). El segundo arreglo es un objeto cuyo

    identificador es palabras y almacena cadenas de caracteres de tipoString.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    5/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 5

    Los corchetes se pueden colocar indistintamente a la izquierda o a laderecha del identificador. En la declaracin del primer arreglo, loscorchetes se colocaron a la izquierda del identificador mientras que para elsegundo arreglo se opt por colocarlos a la derecha del identificador.

    Si deseamos declarar un arreglo de ms de una dimensin, entonces se

    deben colocar tantos pares de corchetes como nmero de dimensionescontenga el arreglo. Por ejemplo, declararemos un arreglo de tresdimensiones que contendr objetos de tipoPersona.

    Persona[][][] listadoPersonas;

    Tambin se lo podra haber declarado de la siguiente forma:

    Persona listadoPersonas[][][];

    Por el momento, solamente hemos definido una variable que representa unarreglo pero no hemos creado ningn objeto. Para crear o construir unarreglo es necesario invocar al operador new.

    Creacin de un arreglo

    La creacin de un arreglo significa invocar a su constructor para que estdisponible en memoria junto a todos los objetos creados por la MquinaVirtual Java. Para la creacin de un arreglo, Java debe conocer cuntoespacio de memoria debe reservar, motivo por el cual se debeespecificar el tamaodel arreglo durante la creacin del mismo. El tamaodel arreglo hace referencia a la cantidad de elementos que el arreglo podralmacenar.

    Hay diferentes alternativas para construir un arreglo. La formas msestandarizada es utilizando la palabra reservada new, seguida del tipo dedato del arreglo con un par de corchetes que indican la cantidad deelementos del arreglo. Veamos el siguiente ejemplo:

    int[] calificaciones; // declaracin de un arreglo// que contendr nmeros enteros

    calificaciones = new int[3]; // Creacin de un// arreglo unidimensional// de 3 elementos

    Tambin se puede declarar y crear un arreglo en una sola sentencia:

    int[] calificaciones = new int[3];

    Para crear un arreglo de objetos tambin se procede de la misma manera:

    Alumno[] listadoAlumnos = new Alumno[3];

    No hay que confundir la utilizacin del operador new. Si nos fijamos en elejemplo anterior, cuando construimos el arreglo listadoAlumnosutilizando el operador new, no estamos invocando al constructor de la

    clase Alumno, no estamos creando instancias de tipo Alumno, sino queestamos construyendo o instanciando un objeto arreglo.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    6/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 6

    Tambin es importante tener en cuenta que en la creacin de un arreglosiempre se debe indicar el tamao del mismo, de lo contrario obtendremosun error de compilacin. En la siguiente lnea de cdigo, se intenta crear unarreglo sin especificar su tamao, y por consiguiente obtenemos un error decompilacin:

    Alumno[] listadoAlumnos = new Alumno[]; // No compila

    Esto se debe a que la Mquina Virtual Java necesita conocer cunto espaciode memoria debe reservar para almacenar el arreglo.

    Para la construccin de arreglos de ms de una dimensin, se debe seguir lamisma lgica como lo muestra el ejemplo a continuacin:

    Persona listadoPersonas[][][]; // declaracin de un// arreglo de 3// dimensiones de objetos// de tipo Persona

    listadoPersonas = new Persona[3][2][2];

    En el ejemplo anterior, hemos declarado un arreglo de tipo Personade tresdimensiones. Posteriormente hemos construido dicho arreglo e indicamosque la primera dimensin contendr tres elementos, y la segunda y terceradimensiones contendrn dos elementos cada una.

    Inicializacin de un arreglo

    Hasta el momento, hemos podido declarar y crear un arreglo, pero nohemos indicado el almacenamiento de algn elemento en el mismo. Loselementos que se pueden almacenar pueden ser valores primitivos uobjetosmediante variables de referencia.

    Los elementos de un arreglo pueden ser accedidosmediante un ndiceque indica una posicinexacta en el arreglo. Este ndice es un nmeroque comienza en cero. Si por ejemplo, tenemos un arreglo de seiselementos, los ndices del arreglo comenzarn en cero y llegarn hasta elvalor cinco.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    7/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 7

    Supongamos que tenemos definida la clase Persona, y declaramos unarreglo que contiene elementos de tipoPersona:

    Persona[] empleados = new Persona[3];

    El objeto empleados puede almacenar elementos que representan

    referencias a objetos de tipo Persona, pero hasta el momento solamentetenemos tres referencias de tipo Persona pero nulas, es decir, no hemosinicializado cada uno de los elementos de tipo Persona del arreglo. Lasiguiente figura es una representacin del arreglo empleados luego dehaber sido declarado y creado:

    Si observamos cada uno de los elementos del arreglo, todos ellos puedenalmacenar objetos de tipoPersona, pero por el momento tienen referenciasnulas. El prximo paso entonces, es crear objetos de tipo Personay asignarestos objetos a las posiciones del arreglo empleados. Esto lo podemosrealizar de la siguiente manera:

    empleados[0] = new Persona(Juan);empleados[1] = new Persona(Lucas);empleados[2] = new Persona(Florencia);

    De esta forma, para cada posicin del arreglo empleados, hemosinicializado un objeto de tipoPersona.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    8/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 8

    Juan

    Persona

    Lucas

    Persona

    Florencia

    Persona

    Hay que tener en cuenta que si intentamos acceder a una posicin delarreglo inexistente entonces obtendremos un error en tiempo de ejecucin(ArrayIndexOutOfBoundsException). Por ejemplo, si en el caso anteriorintentamos inicializar la posicin del ndice 3del arreglo, obtendremos unerror en tiempo de ejecucin.

    empleados[3] = new Persona(Pedro);

    El ndice 3 se encuentra fuera de rango, no existe, ya que el tamao delarreglo es tres y por consiguiente los posibles valores de los ndices son 0, 1y 2.

    Para inicializar un arreglo de ms de una dimensin hay que aplicar lamisma lgica; se debe referenciar a alguna posicin especfica del arreglo yasignar un objeto o valor en dicha posicin. El siguiente cdigo es unejemplo de inicializacin de un arreglo bidimensional que almacena valoresboolean.

    boolean[][] a = new boolean[2][2];a[0][0] = true;

    a[0][1] = false;a[1][0] = false;a[1][1] = true;

    Algo importante a tener en cuenta, es que si declaramos y construimos unarreglo de tipo primitivo, entonces sus elementos quedan inicializadoscon losvalores por defectocorrespondientes al tipo de dato del arreglo.

    int[] a = new int[4];boolean[][] b = new boolean[2][3];

    En el ejemplo anterior, los elementos del arreglo a estn inicializados conel valor cero ya que este es el valor por defecto o predeterminado para el

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    9/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 9

    tipo de dato int. Los elementos del arreglo b estn inicializados con elvalor false ya que este es el valor por defecto del tipo de dato boolean.

    Un arreglo tambin puede ser inicializado utilizando sentenciasiterativas, otorgando de esta forma una alternativa ms sencilla parainicializar un arreglo cuando su tamao es grande. Supongamos que

    tenemos un arreglo deStringde cien elementos y deseamos inicializar cadauno de ellos con una cadena de caracteres vaca . De acuerdo a lo queacabamos de analizar anteriormente, una de las formas de hacerlo es lasiguiente:

    String[] s = new String[100];s[0] = new String();s[1] = new String();s[2] = new String();...

    s[98] = new String();s[99] = new String();

    Pero como podemos ver, esta forma de inicializar un arreglo resultabastante tediosa si el nmero de elementos que contiene el arreglo es alto.Para facilitar esta tarea podemos hacer uso de las sentencias iterativas. Losarreglos tienen un atributo denominado length que representa elnmero de elementos que puede almacenar un arreglo, es decir, su tamao.Entonces por ejemplo, en el arreglo anterior, el valor de s.length es igual a100. Si hacemos uso de este atributo y de las sentencias iterativas entoncespodemos inicializar el arreglo. Una de las formas ms utilizadas esmediante la sentenciafor:

    String[] s = new String[100];for (int i=0; i

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    10/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 10

    2. for (int a=0 ; a

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    11/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 11

    char[] d;d = new char[]{'p','o','o'};

    Esta forma de crear e inicializar arreglos se denomina creacin annimade arreglos. Esta alternativa es poco utilizada, pero no deja de ser unaposibilidad con la que nos encontremos alguna vez.

    Una vez que tenemos un arreglo declarado, creado e inicializado, parautilizarlo simplemente se deben referenciar a sus elementos utilizando elndice correspondiente a la posicin del elemento con el que se deseatrabajar.

    A continuacin se muestra un ejemplo de una aplicacin que generainstancias de la clase Usuario, las asigna a un arreglo de cinco elementos ypor ltimo realiza una iteracin sobre el arreglo para imprimir en consolalos objetos almacenados.

    // Clase GeneracionDeUsuarios

    package programacion;

    public class GeneracionDeUsuarios {public static void main(String[] args) {Usuario[] listadoUsuarios = new Usuario[5];

    for (int i=0; i

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    12/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 12

    4.1.2- Vector

    En la seccin anterior estudiamos los conceptos asociados a los arreglos enJava y vimos que los mismos son tiles para almacenar varios elementos deun mismo tipo de dato. Para ello debemos conocer de antemano la cantidadde elementos que se podrn almacenar en el arreglo. Sin embargo, hayalgunos escenarios en los cuales no sabemos con precisin la cantidad deelementos que sern almacenados en el arreglo. Una posible solucin a esteproblema es crear un arreglo que pueda almacenar un nmero deelementos mucho mayor a la cantidad de elementos que estimamos quepodemos llegar a guardar. El inconveniente de esta solucin, es que cadaposicin del arreglo ocupa un lugar en memoria, y de esta forma estaremosocupando espacio adicional en memoria en forma innecesaria.

    Java provee la clase Vectorque permite representar arreglos que puedenaumentaro disminuirla cantidad de elementos posibles a almacenar enforma dinmica. La clase Vectorse encuentra en el paquete java.utily

    cada vez que queramos hacer uso de esta clase ser necesario importardicho paquete.

    Vector nombres = new Vector(5);

    La lnea de cdigo anterior crea un objeto de tipo Vectorcon una capacidadinicial de cinco elementos. En el caso que hayamos agregado cincoelementos al vector y agreguemos un elemento adicional, entonces sucapacidadser duplicada en forma automtica, es decir se incrementar adiez elementos. Si en un futuro esta capacidad es superada, entoncesnuevamente su capacidadser duplicada automticamente, en este caso aveinte elementos. En otras palabras, si utilizamos este constructor su

    capacidad inicial ser aquella indicada por medio del parmetro que seenva en su constructor, y por cada vez que su capacidad sea superada,entonces la misma ser duplicada en forma automtica. Hay que tenerprecaucin en la utilizacin de este constructor especialmente cuando sedebe almacenar una gran cantidad de elementos, ya que en el punto en elque superemos la capacidad, la misma ser duplicada y por consiguiente serequerir mayor cantidad de memoria disponible.

    Si deseamos tener un mayor control sobre cmo se incrementa la capacidaddel vector cada vez que la misma es superada entonces podemos utilizar elsiguiente constructor:

    Vector nombres = new Vector(5, 5);El constructor anterior recibe dos parmetros: el primero de ellos indica lacapacidad inicial del vector, y el segundo indica cunto debe aumentar lacapacidad por cada vez que se la supere. En el ejemplo anterior, lacapacidad inicial del vector es cinco y por cada vez que la misma seasuperada, entonces ser incrementada de a cinco unidades (5, 10, 15, 20,25).

    Tambin se puede utilizar un tercer constructor que no recibe ningnparmetro:

    Vector nombres = new Vector();

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    13/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 13

    En este caso, la capacidad inicial del vector es diez y ser duplicada por cadavez que la misma sea superada.

    No se deben confundir los conceptos de capacidad y tamao. Lacapacidad tiene una relacin con la cantidad de espacio en memoriareservado por un vector, mientras que el tamao de un vector hace

    referencia a la cantidad de elementos almacenados en un momentodeterminado.

    Sus mtodos

    A continuacin, analizaremos los mtodos que provee la clase Vector quenos permiten manipular objetos de este tipo.

    Si deseamos aadir un elemento a un vector podemos utilizar los mtodosaddElement(Object o)o add(Object o):

    Vector nombres = new Vector(5, 5);nombres.add(Juan);nombres.add(Mara);nombres.add(Rodrigo);nombres.addElement(Florencia);

    Se pueden utilizar los mtodos addElement()y add()en forma indistinta yaque proveen la misma funcionalidad. Estos mtodos agregan un elementoal final del vector.

    Si deseamos insertar un elemento en una determinada posicin entoncespodemos hacer uso del mtodo insertElementAt():

    nombres.insertElementAt(Daro, 2);

    Si utilizamos el mtodo insertElementAt(), entonces debemos enviar unprimer parmetro que representa el objeto que deseamos insertar y unsegundo parmetro que indica la posicin en la cual deseamos insertar elobjeto dentro del vector. A la posicin la debemos indicar mediante unndice y el conteo del mismo comienza en cero. En el ejemplo anterior,agregamos un objeto de tipo Stringcon la cadena de caracteres Daro enla tercera posicin (ndice 2).

    Tambin se puede utilizar en forma indistinta el mtodo add(int index,Object element):

    nombres.add(4, Paula);

    A diferencia del mtodo insertElementAt(), este mtodo recibe comoprimer parmetro un ndice que hace referencia a la posicin en la que sedesea insertar el objeto, y recibe como segundo parmetro el objeto que sedesea insertar. En el ejemplo anterior, agregamos un objeto de tipo Stringcon la cadena de caracteres Paula en laquinta posicin (ndice 4).

    Cuando se utiliza un ndice para referenciar una posicin especfica parainsertar un elemento en un vector, el mismo debe ser igual o mayor a cero(el conteo comienza en cero) y menor o igual al tamao del vector.Recordemos que el tamao de un vector hace referencia a la cantidad de

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    14/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 14

    elementos almacenados. Si hacemos referencia a una posicin inexistentepor el momento entonces obtendremos un error(ArrayIndexOutOfBoundsException). En el siguiente ejemplo, se intentainsertar un elemento en la sptima posicin (ndice 6), pero la misma esinexistente ya que el tamao del vector en el momento que se inserta elobjeto es tres.

    import java.util.Vector;

    public class EjemplosVector {

    public static void main(String[] args) {Vector numeros = new Vector();numeros.add(uno);numeros.add(dos);numeros.add(tres);

    /* Insertamos el objeto siete

    * en la sptima posicin(ndice 6) */numeros.insertElementAt(siete, 6);

    }}

    Si ejecutamos el cdigo anterior obtenemos el siguiente error:

    Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException: 6 > 3at java.util.Vector.insertElementAt(Vector.java:551)atprogramacion.EjemplosVector.main(EjemplosVector.java

    :15)Java Result: 1

    Si deseamos conocer el tamao de un vector se puede utilizar el mtodosize()y para conocer su capacidad se puede utilizar el mtodo capacity():

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);

    System.out.println(Tamao del vector: +numeros.size());System.out.println(Capacidad del vector: +numeros.capacity());

    El cdigo anterior produce la siguiente salida en consola:

    Tamao del vector: 3Capacidad del vector: 5

    Esto se debe a que solamente hemos agregado tres elementos al vector y lohemos inicializado con una capacidad inicial de cinco.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    15/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 15

    Un vector se considera vaco si su tamao es cero, es decir, si no tieneningn elemento almacenado. Para saber si un vector est vaco, podemosobtener su tamao mediante el mtodo size()y verificar si el mismo es iguala cero; o tambin podemos hacer uso de un mtodo ms directodenominado isEmpty(). Este mtodo retorna el valor booleantrue si elvector se encuentra vaco, y en caso contrario retorna el valor booleanfalse.

    Vector numeros = new Vector(5);

    /* Por el momento, el vector no contiene* ningn elemento, entonces est vaco.* La siguiente sentencia imprime true*/System.out.println(Vector vaco? +numeros.isEmpty());

    numeros.add(uno);numeros.add(dos);

    numeros.add(tres);

    /* Se han agregado elementos al vector.* En consecuencia, la siguiente sentencia* imprime false*/System.out.println(Vector vacio? +numeros.isEmpty());

    Si deseamos eliminar todos los elementos de un vector podemos utilizar losmtodos removeAllElements()o clear()en forma indistinta:

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);

    System.out.println(Tamao del vector: +numeros.size()); // Imprime 3

    // Se remueven todos los elementos del vectornumeros.removeAllElements();

    System.out.println(Tamao del vector: +

    numeros.size()); //Imprime 0

    Si pretendemos remover algn elemento especfico del vector entoncespodemos utilizar los mtodos removeElement() o remove() enviandocomo parmetro el objeto que estamos interesados en remover:

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);

    System.out.println(Tamao del vector: +

    numeros.size()); // Imprime 3

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    16/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 16

    /* Se remueve el objeto de tipo String* con la cadena de caracteres dos*/numeros.removeElement(dos);

    System.out.println(Tamao del vector: +numeros.size()); // Imprime 2

    Tambin podemos remover un elemento en particular indicando la posicinen la que se encuentra el elemento. Para ello se utiliza el mtodoremoveElementAt() y se enva como parmetro el ndicecorrespondiente a la posicin en la que se encuentra el objeto que deseamosremover:

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);

    System.out.println(Tamao del vector: +numeros.size()); // Imprime 3

    /* Se remueve el elemento que se encuentra* en la tercera posicin (ndice 2) */numeros.removeElementAt(2);

    System.out.println(Tamao del vector: +numeros.size()); // Imprime 2

    En el caso que queramos remplazar un elemento del vector por otro,podemos hacer uso del mtodo setElementAt(). Para utilizarlo, debemosenviar como parmetros el nuevo objeto que deseamos almacenar y unndice que hace referencia a la posicin del objeto que deseamos remplazar.

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(nueve);numeros.add(cuatro);

    /* Remplazamos el objeto que se encuentra

    * en la posicin del ndice 2 por el* objeto String tres*/numeros.setElementAt(tres, 2);

    Los mtodos firstElement() y lastElement() devuelven el primer yltimo elemento del vector respectivamente:

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);numeros.add(cuatro);

    /* Se imprime el primer elemento del vector,

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    17/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 17

    * en este caso uno*/System.out.println(numeros.firstElement());

    /* Se imprime el ltimo elemento del vector,* en este caso cuatro*/System.out.println(numeros.lastElement());

    Si deseamos conocer el ndice correspondiente a un elemento en particular,entonces podemos hacer uso del mtodo indexOf(). A este mtodo se ledebe enviar como parmetro el objeto sobre el cual nos interesa conocer sundice correspondiente en el vector.

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);numeros.add(cuatro);

    /* Se imprime el ndice correspondiente* a la posicin en la que se encuentra* el objeto tres*/System.out.println(numeros.indexOf(tres));

    En el ejemplo anterior, si hubiramos enviado como parmetro un objetoinexistente al mtodo indexOf(), entonces el valor devuelto por el mtodo es-1.

    Para saber si un elemento en particular se encuentra almacenado o no en

    un vector, podemos utilizar el mtodo contains(). Este mtodo recibecomo parmetro el objeto del cual se desea conocer su existencia o nodentro del vector. En caso que el objeto est contenido en el vector,entonces el mtodo contains()retorna un valor booleano true, y en casocontrario, retorna un valor booleano false.

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);numeros.add(cuatro);

    /* El objeto tres

    S existe en el vector,* en consecuencia se imprime true*/

    System.out.println(numeros.contains(tres));

    /* El objeto ochoNO existe en el vector,* en consecuencia se imprime false*/System.out.println(numeros.contains(ocho));

    Para acceder a los elementos de un vector, se pueden utilizar los mtodoselementAt()o get()en forma indistinta. Para ello, estos mtodos recibencomo parmetro un ndice que hace referencia a una posicin determinadadel vector y retornan el objeto que se encuentra en dicha posicin.

    Vector numeros = new Vector(5);

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    18/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 18

    numeros.add(uno");numeros.add(dos);numeros.add(tres);numeros.add(cuatro);

    System.out.println(numeros.elementAt(0));

    System.out.println(numeros.elementAt(1));System.out.println(numeros.get(2));System.out.println(numeros.get(3));

    Las ltimas cuatro sentencias del cdigo anterior imprimen en consola loselementos del vector correspondientes a los ndices 0, 1, 2 y 3. Si en algnmomento intentamos acceder a un elemento que se encuentra fuera derango, obtendremos un error en tiempo de ejecucin. En el ejemploanterior, el ltimo ndice vlido es 3; si intentamos utilizar un ndicesuperior a este ltimo entonces obtendremos una excepcin de tipoArrayIndexOutOfBoundsException.

    Al igual que los arreglos, tambin es posible utilizar sentencias iterativaspara manipular los elementos de un objeto de tipo Vector.

    Vector numeros = new Vector(5);numeros.add(uno);numeros.add(dos);numeros.add(tres);numeros.add(cuatro);

    for (int i = 0; i

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    19/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 19

    En el cdigo anterior, se utiliza la sentencia iterativa while. Mientras secumpla la condicin de que haya elementos para recorrer en el vectornumeros entonces se ejecuta el ciclo iterativo, es decir, mientras lafuncin hasMoreElements() retorne el valor true, entonces se ejecutarun nuevo ciclo del bloque while(). Dentro de este bloque de cdigo, seutiliza el mtodo nextElement() para obtener una referencia al siguienteelemento del vector. De esta forma, este mtodo permite avanzarsecuencialmente sobre los elementos de un vector. A medida queavanzamos, antes de ejecutar un nuevo ciclo, se evala que el vector tengams elementos para recorrer utilizando el mtodo hasMoreElements(). Unavez que lleguemos al ltimo elemento del vector, el mtodohasMoreElements()retornar un valor booleanfalse debido a que no hayms elementos para recorrer, y en consecuencia, la ejecucin del ciclo whilese detendr. Cuando se utilicen estos mtodos hay que tener en cuenta queel mtodo nextElement() retorna una referencia a un objeto de la claseObject. Esto quiere decir que en la mayora de los casos ser necesarioaplicar castinga la clase adecuada con la que tengamos que trabajar.

    Ventajas y desventajas de arreglos yVectores

    Los arreglosy vectoresen Java permiten disponer de estructuras de datospara almacenar elementos que contienen informacin. Dependiendo delescenario en el que nos encontremos, es conveniente utilizar un arregloouna instancia de la clase Vector.

    Un arreglo representa una estructura de datos esttica que puedealmacenar un determinado nmero de variables. Estas variables sonalmacenadas en una posicin especfica del arreglo. Cuando construimos unarreglo, se debe especificar la cantidad de variables que se podrnalmacenar.

    int[] arreglo = new int[5];

    En el ejemplo anterior, se declara un arreglo y en su creacin se reservancinco espacios en memoria. Una vez que un arreglo es creado, el tamao delmismo no puede ser alterado.

    A diferencia de un arreglo, un Vector (instancia de la clase Vector) tieneuna estructura de datos dinmica. La capacidad de almacenamiento de unvector puede cambiar en forma dinmica. Cuando un Vector esinstanciado, el mismo es inicializado con una capacidad inicial, y cuandoesta es superada, la misma es incrementada en forma automtica, e inclusopodemos configurar cmo debe incrementarse la capacidad en caso que seanecesario. La clase Vector nos ofrece muchos mtodos que nos permitenmanipular un Vectory todos ellos brindan una alternativa ms sencilla paradesarrollar aplicaciones.

    Un objeto de la clase Vector utiliza arreglos internamente. La principalventaja de un Vectorsobre un arreglo es que un Vectorpuede aumentar su

    capacidad en forma automtica; en cambio, un arreglo una vez creadocon un tamao determinado, no se puede modificar, por lo tanto, si en

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    20/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 20

    el escenario que estamos trabajando, necesitamos una estructura de datospara almacenar informacin cuyo tamao puede ser cambiante, entonces esconveniente la utilizacin de la clase Vector.

    En el caso que estemos trabajando en un escenario en el que necesitemosalmacenar informacin en una estructura de datos pero la misma tiene un

    tamao fijo y no cambiante en el tiempo, entonces es aconsejable utilizararreglos. Esto se debe principalmente a que un arreglo tiene mejorperformance que un Vector ya que sus operaciones y el acceso a suselementos tienen mejor performance. Los mtodos definidos en la claseVectorestn basados en operaciones entre objetos y tienen menor eficienciaen comparacin a los algoritmos utilizados para manipular arreglos. Esdecir, un Vectornos puede ofrecer mayor facilidad para su manipulacin encomparacin a un arreglo, pero este ltimo tiene mejor performance encuantos a sus operaciones. Si la performance del escenario en el queestamos trabajando es un punto crtico a tener en cuenta, entonces esrecomendable la utilizacin de arreglosen lugar de Vectores.

    El siguiente cuadro expone las ventajas y desventajas de Arreglos yVectores.

    Estructura Arreglo Vector

    Ventajas

    Las operaciones sobrearreglostienen mejor

    performance que las de unVector.

    Su estructura es dinmica.Su tamao puede

    incrementarse o reducirse.

    DesventajasSu tamao es fijo y no

    puede cambiar.

    Define operaciones a nivelde objetos, por lo tanto son

    ms ineficientes que losalgoritmos de los arreglos.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    21/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 21

    4.2- Clase String

    4.2.1- Utilizacin de la clase String

    La manipulacin de texto o cadena de caracteres es una parte fundamentalen la gran mayora de los lenguajes de programacin. En Java, lascadenas de caracteres son objetos. Para trabajar con estos objetos,Java provee una clase para tal fin. Dicha clase se llama String ypertenece al paquete java.lang. Mediante la utilizacin de esta clasepodremos crear instancias que representan cadenas de caracteres.

    Al igual que cualquier otro objeto, se puede instanciar un objeto de tipoStringutilizando el operador new como se muestra a continuacin:

    String s1 = new String();

    La lnea de cdigo anterior crea una instancia de la clase String y se laasigna a la variable s1. En este caso, la variable s1representa una cadenade caracteres vaca. Esto se debe a que en el momento de su inicializacin,no se envi por parmetro ninguna cadena de caracteres especfica.

    Si deseramos inicializar un objeto de tipo String con una cadena decaracteres en particular, podemos utilizar el constructor de la clase Stringque recibe una cadena de texto como parmetro de la siguiente manera:

    String s2 = new String(Ejemplo de un objeto String);

    La clase Stringtambin provee otros constructores que permiten crear un

    objeto por medio de distintas alternativas. El cdigo de ejemplo siguienteconstruye un objetoStringutilizando un constructor que recibe un arreglode elementos char:

    char[] javaArray = {'','J','a','v','a','!'};String javaString = new String(javaArray);System.out.println(javaString);

    El cdigo anterior imprimir en consola la cadena de caracteres Java!.

    La utilizacin de cadena de caracteres es bastante frecuente en la

    programacin, y por este motivo, Java nos ofrece una forma ms sencilla deinicializar un objeto de tipoString.

    String s3 = Ejemplo de un objeto String;

    La lnea de cdigo anterior tambin crea un objeto de tipo String quecontiene la cadena de caracteres Ejemplo de un objeto String.

    Algo importante que debemos conocer acerca de la utilizacin de objetos detipoStringes que los mismos son inmutables. Esto quiere decir que unavez que asignamos una cadena de caracteres a un objeto de tipo String,dicha cadena de caracteres representada por el objeto no podr sermodificada. Analicemos este concepto mediante un ejemplo:

    String s4 = Programacin;

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    22/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 22

    s4.concat( Orientada a Objetos);System.out.println(s4 = + s4); //la salida en

    //consola es Programacin

    En la primera lnea se crea un objeto s4de tipo Stringy se le asigna el

    valor Programacin. En la siguiente lnea se utiliza el mtodo concat()con la intencin de concatenar la cadena de caracteres Orientada aObjetos al objeto s4. En la tercera lnea imprimimos en consola el valordel objeto s4, pero los resultados muestran que en lugar de imprimirProgramacin Orientada a Objetos, se imprime solamenteProgramacin. Esto se debe a la inmutabilidadde los objetos de tipoString. En el ejemplo anterior, cuando utilizamos el mtodo concat(), estemtodo devuelve un objeto de tipo String con las cadenas de caracteresProgramacin Orientada a Objetos como resultado de la concatenacinentre los valores Programacin y Orientada a Objetos pero no hayninguna variable que referencie a este nuevo objeto. La variable s4 siguereferenciando al objeto original con el valor Programacin.

    Analicemos este nuevo ejemplo:

    String s5 = java;s5.toUpperCase();System.out.println(s5 = + s5); // la salida en

    // consola es java

    El mtodo toUpperCase() devuelve un objeto String cuya cadena decaracteres se encuentra en mayscula, pero la cadena de caracteresrepresentada por el objeto s5 permanece inmutable. Este es el motivo porel cual se imprime la cadena de caracteres java en minscula en lugar de

    mayscula cuando imprimimos el valor del objeto s5. Para imprimir lacadena de caracteres en mayscula, debemos referenciar al objeto Stringdevuelto por el mtodo toUpperCase()en una variable y luego imprimirdicha variable:

    String s5 = java;String s6 = s5.toUpperCase();System.out.println(s5 = + s5); // la salida en

    // consola es java

    System.out.println(s6 = + s6) ;// la salida en// consola es JAVA

    Las siguientes figuras describen las sentencias ejecutadas del cdigoanterior:

    String s5 = java;

    javas5

    Variable de tipoString

    Objetos en memoria

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    23/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 23

    String s6 = s5.toUpperCase();

    java

    JAVA

    s5

    s6

    Objetos en memoria

    toUpperCase()

    Variable de tipo

    String

    Variable de tipoString

    Otra consideracin a tener en cuenta de la clase String es que la mismacontiene el modificador final en su declaracin, lo cual implica que nopuede ser derivada.

    4.2.2- Mtodos de la clase String

    La clase Stringprovee muchos mtodos que pueden ser utilizados para lamanipulacin de cadena de caracteres y son de gran ayuda para los

    programadores de aplicaciones. A continuacin analizaremos los mtodosms utilizados que provee esta clase.

    public char charAt(int index)

    Devuelve el carcter que se encuentra en la posicin indicada por la variableindex recibida por parmetro. Los ndices utilizados por la clase Stringcomienzan en cero.

    String java = "Java";System.out.println(java.charAt(1)); //La salida es a

    public String concat(String s)

    Devuelve un objeto String compuesto por la unin de la cadena decaracteres del objeto que invoca el mtodo y la cadena de caracteres delobjeto que se recibe por parmetro.

    String lenguaje = "Lenguaje";System.out.println(lenguaje.concat(" Java"));

    Tambin se pueden utilizar los operadores +y +=como si se tratara de

    un tipo de dato primitivo. La utilizacin de estos operadores sobre unobjeto de tipoStringpermite tambin concatenar cadenas de caracteres.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    24/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 24

    Ejemplo utilizando operador +:

    String lenguaje = "Lenguaje";System.out.println(lenguaje + " Java");

    Ejemplo utilizando operador =+:String lenguaje = "Lenguaje";lenguaje += " Java";System.out.println(lenguaje);

    public boolean endsWith(String suffix)

    Devuelve un valor boolean (true o false) que indica si la cadena decaracteres del objeto recibido por parmetro (suffix) es sufijo de la cadenade caracteres del objeto que invoca el mtodo.

    String poo = "Programacin Orientada a Objetos";System.out.println(poo.endsWith("a Objetos")); //trueSystem.out.println(poo.endsWith("a Objetosss")); //false

    public boolean equals(Object anObject)

    Devuelve un valor boolean (true o false) que indica si la cadena decaracteres que representa el objeto que invoca el mtodo es igual a lacadena de caracteres representada por el objeto recibido por parmetro.Este mtodo tiene en cuenta la distincin entre minsculas y maysculas.

    String JAVA = "JAVA";String c = "c";System.out.println(JAVA.equals("JAVA")); // trueSystem.out.println(JAVA.equals("java")); // falseSystem.out.println(JAVA.equals("jAvA")); // falseSystem.out.println(JAVA.equals(c)); // false

    Este mtodo es heredado de la clasejava.lang.Objecty lo analizaremos conmayor detalle en el apartado 4.4 de la lectura (Comparacin de Objetos).

    public boolean equalsIgnoreCase(String s)

    Devuelve un valor boolean (true o false) que indica si la cadena decaracteres que representa el objeto que invoca el mtodo es igual a lacadena de caracteres recibida por parmetro. A diferencia del mtodoequals(), este mtodo no tiene en cuenta la distincin entre minsculas ymaysculas.

    String JAVA = "JAVA";String c = "c";System.out.println(JAVA.equalsIgnoreCase("JAVA")); // trueSystem.out.println(JAVA.equalsIgnoreCase("java")); // trueSystem.out.println(JAVA.equalsIgnoreCase("jAvA")); // trueSystem.out.println(JAVA.equalsIgnoreCase(c)); // false

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    25/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 25

    public int indexOf(int ch)

    Devuelve un valor entero que indica la posicin de la primera ocurrencia delcarcter recibido por parmetro. Si no hay ninguna ocurrencia, entonces elvalor devuelto es -1.

    String poo = "Programacin Orientada a Objetos";System.out.println(poo.indexOf('t'));System.out.println(poo.indexOf('k'));

    El cdigo anterior, primero imprime en consola el valor 18, ya que laprimera ocurrencia del carcter t se da en la posicin 18 (la primeraposicin es cero). Luego imprime en consola -1 ya que no hay ningunaocurrencia del carcter k en la cadena de caracteres ProgramacinOrientada a Objetos.

    public int indexOf(String str)

    Devuelve un valor entero que indica la posicin de la primera ocurrencia dela cadena de caracteres recibida por parmetro. Si no hay ningunaocurrencia, entonces el valor devuelto es -1.

    String poo = "Programacin Orientada a Objetos";System.out.println(poo.indexOf("Orientada"));System.out.println(poo.indexOf("No Orientada"));

    El cdigo anterior imprime en consola el valor 13, ya que la primera

    ocurrencia de la subcadena de caracteres Orientada se da en la posicin13(la primera posicin es cero). Luego imprime en consola -1 ya que nohay ninguna ocurrencia de la subcadena de caracteres No Orientada.

    public int length()

    Devuelve un entero que indica el largo de la cadena de caracteres, es decirindica cuntos caracteres contiene la cadena de caracteres del objeto.

    String java = "Java";System.out.println(java.length()); // Imprime el

    // valor 4

    public String replace(char old, char new)

    Este mtodo remplaza todas las ocurrencias del carcter oldrecibido porparmetro por el carcter newtambin recibido por parmetro y devuelveun objeto String como resultado. Este mtodo distingue maysculas yminsculas.

    String JaVa = "JaVa";System.out.println(JaVa.replace('a', 'A')); //Imprime JAVA

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    26/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 26

    public boolean startsWith(String prefix)

    Devuelve un valor un boolean (true o false) que indica si la cadena decaracteres del objeto recibido por parmetro (prefix) es prefijo de la cadenade caracteres del objeto que invoca el mtodo. Este mtodo distinguemaysculas y minsculas.

    String poo = "Programacin Orientada a Objetos";System.out.println(poo.startsWith("Programacin")); // trueSystem.out.println(poo.startsWith("Programacin No

    Orientada")); // false

    public String substring(int begin)

    Este mtodo es utilizado para devolver una subcadena de caracteres querepresenta una parte de la cadena de caracteres del objeto sobre el que seinvoca el mtodo. El parmetro recibido indica a la posicin inicial en laque inicia la subcadena de caracteres a devolver. El ndice comienza en

    cero.

    String poo = "Programacin Orientada a Objetos";System.out.println(poo.substring(13));

    El cdigo anterior imprime en consola la cadena de caracteres Orientada aObjetos.

    public String substring(int begin, int end)

    Este mtodo es utilizado para devolver una cadena de caracteres querepresenta una parte de la cadena de caracteres del objeto sobre el que seinvoca el mtodo. A diferencia del mtodo anterior, este ltimo recibe dosparmetros. El primer parmetro recibido (begin) indica la posicin inicialen la que inicia la subcadena de caracteres a devolver y el segundoparmetro recibido (end) indica la posicin final en la que debe terminar lasubcadena de caracteres a devolver. Hay que tener en cuenta que en ladeterminacin de la posicin inicial de la subcadena de caracteres, seconsidera que la primera posicin comienza en cero, mientras que para ladeterminacin de la posicin final de la subcadena de caracteres seconsidera que la primera posicin comienza en 1.

    String poo = "Programacin Orientada a Objetos";System.out.println(poo.substring(13,22));

    El cdigo anterior imprime en consola la subcadena de caracteresOrientada.

    public String toLowerCase()

    Devuelve un objetoStringconstituido por la cadena de caracteres del objetoque invoc al mtodo pero con todos sus caracteres en minscula.

    String JAVA = "JAVA";System.out.println(JAVA.toLowerCase()); //Imprime java

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    27/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 27

    public String toString()

    Devuelve un objeto String con la cadena de caracteres que representa elobjeto.

    String Java = "Java";

    System.out.println(Java.toString()); //Imprime Java

    public String toUpperCase()

    Devuelve un objetoStringconstituido por la cadena de caracteres del objetoque invoc al mtodo pero con todos sus caracteres en mayscula.

    String Java = "Java";System.out.println(JAVA.toUpperCase()); //Imprime JAVA

    public String trim()

    Devuelve un objetoStringcompuesto por la cadena de caracteres del objetoque invoc al mtodo, pero si dicha cadena de caracteres tiene espacios enblancos tanto al comienzo como al final, entonces los mismos sonremovidos.

    String lenguajeJava = " Lenguaje Java ";System.out.println(lenguajeJava.trim());

    El mtodo anterior imprime en consola la cadena de caracteresLenguaje Java en lugar de Lenguaje Java , ya que el mtodotrim() elimina los espacios en blanco que se encuentran al comienzo y alfinal de la cadena de caracteres.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    28/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 28

    4.3- PolimorfismoCuando declaramos una variable de referencia de un tipo de clase que secorresponde a una clase base de una jerarqua, dicha variable puede hacer

    referencia a cualquier subclase de dicha jerarqua. Esta propiedad sedenominaPolimorfismo.

    Si definimos una variable Figura f, dicha variable puede hacer referenciaa objetos de la claseFigurao tambin puede hacer referencia a objetos de laclaseRectanguloo de la clase Triangulo:

    Figura figura = new Figura(); // Suponiendo que la// clase Figura no// fuera abstracta

    Figura rectangulo = new Rectangulo();Figura triangulo = new Triangulo();

    En todos los casos hemos declarado variables de tipo Figura, pero en elcaso de las variables rectangulo y triangulo, ambas hacen referencia auna instancia de la clase Rectanguloy una instancia de la clase Triangulorespectivamente.

    En el momento que se declara una variable de un cierto tipo de clase,cuando se crea efectivamente el objeto usando el operador new, la variablepuede apuntar a cualquier instancia de una subclase de la clase definida enla variable. Esta propiedad se conoce como Polimorfismo. Tenemos unavariable que apunta a un objeto distinto al que se esperara por el tipo dedato de la variable.

    Cuando se invoca un mtodo desde una variable con una referenciapolifrmica, el mtodo invocado ser aquel que se encuentra definido en laclase de la referencia polifrmica.

    Veamos un ejemplo que explique estos conceptos:

    En este ejemplo vamos a usar el mtodo toString(), razn por la cual lovamos a redefinir en la clase Rectangulo y Triangulo de la misma formaque lo hicimos en su momento para la claseFigura.

    Mtodo toString()para la claseRectangulo:

    public String toString() {String s = super.toString() + "Es Cuadrado?: " +

    isCuadrado;return s;

    }

    Mtodo toString()para la clase Triangulo:

    public String toString() {String s = super.toString() + "Tipo de tringulo: " +

    tipoTriangulo;return s;

    }

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    29/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 29

    En la siguiente clase definiremos un mtodo main() en el quedeclararemos dos variables con referencias polifrmicas e invocaremos almtodo toString() para ambas variables.

    package programacion;

    public class Polimorfismo {

    public static void main(String args[]) {Figura rectangulo = new Rectangulo("Rectngulo", 4, 4,

    true);System.out.println("Datos de la variable rectangulo");System.out.println(rectangulo.toString());

    System.out.println("\n");

    Figura triangulo = new Triangulo("Tringulo", 4, 6,"Escaleno");

    System.out.println("Datos de la variable triangulo");

    System.out.println(triangulo.toString());}

    }

    Si ejecutamos el mtodo main(), obtendremos los siguientes resultadosen consola:

    Datos de la variable rectanguloNombre: RectnguloAlto: 4Ancho: 4

    Es Cuadrado?: true

    Datos de la variable trianguloNombre: TringuloAlto: 4Ancho: 6Tipo de tringulo: Escaleno

    Como podemos ver, en el caso de la variable rectangulo, cuando hemosinvocado al mtodo toString(), el mtodo ejecutado es el que se encuentra

    en la clase Rectangulo porque efectivamente el objeto creado y al que sehace referencia es una instancia de esta clase. La misma lgica se aplicapara la variable triangulo. Esta variable es de tipo Figura pero hacereferencia a una instancia de la clase Triangulo, en consecuencia, el mtodotoString() a ejecutar ser el de la clase Triangulo.

    Vamos a mencionar otro ejemplo pero esta vez usando el mtodocalcularArea(). Como bien sabemos, el mtodo calcularArea() es unmtodo abstracto en la clase Figura, pero tanto en la clase Rectangulocomo en la clase Triangulo, el mtodo ha sido redefinido con su propiaimplementacin particular para cada clase.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    30/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 30

    package programacion;

    public class Polimorfismo {

    public static void main(String args[]) {Figura[] figuras = new Figura[2];

    figuras[0] = new Rectangulo("Rectngulo", 4, 4, true);figuras[1] = new Triangulo("Tringulo", 4, 6,

    "Escaleno");

    for (int i=0 ; i

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    31/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 31

    La variable figurasolamente podr invocar a los mtodos definidos en laclaseFigura. Aunque la variable figuraest referenciando a una instanciade la clase Triangulo, no podr invocar los mtodos definidos en estaltima clase. Cualquier intento de invocar un mtodo definido en lasubclase ocasionar un error de compilacin:

    Figura figura = new Triangulo();figura.getTipoTriangulo(); // Error de compilacin!

    En tiempo de compilacin, se debe invocar a los mtodos definidos en laclase base de la variable. Esto se debe a que una variable de tipo Figurapuede referenciar a instancias de las subclases Rectangulo o Triangulo yhay mtodos que estn definidos en la clase Rectangulopero no en la claseTrianguloy viceversa.

    Sin embargo, hay una forma de invocar a los mtodos definidos en la clase ala que la instancia hace referencia. En estos casos se debe realizar un

    castinga la clase polifrmica.Triangulo t = (Triangulo) figura;t.getTipoTriangulo();

    Mediante el empleo de casting, le estamos diciendo al compilador que lavariable figuraen realidad se trata de una instancia de la clase Triangulo.

    Si la variable figura no hiciera referencia a una instancia de la claseTriangulo, obtendramos un error en tiempo de ejecucin(ClassCastException). Una forma de saber la clase a la que pertenece lainstancia referida por una variable es mediante el operador instanceof.

    Figura figura = new Triangulo();if (figura instanceof Triangulo) {

    System.out.println("La variable figura hacereferencia a una instancia dela clase Triangulo");

    }

    Lo importante a tener en cuenta con respecto al Polimorfismoes que unavariable de cierta clase puede referirse a una subclase. Cuando se invocanlos mtodos sobre dicha variable, solamente pueden invocarse los mtodos

    definidos en la clase base. Pero en tiempo de ejecucin, el mtodo invocadoser el que est definido en la subclase a la que hace referencia.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    32/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 32

    4.4- Comparacin deobjetosPara comprender la comparacin de objetosen Java primero debemosentender algunos conceptos relacionados a la forma en que Java almacenauna variable en memoria. Una variable en Java puede ser primitivao porreferencia. Ambas nos sirven para manipular informacin, pero difieren ensu complejidad y el manejo que hace la Mquina Virtual de Java paraalmacenarlas en memoria.

    Cuando declaramos una variable localde tipoprimitivaen Java, la mismaes almacenada en un sector de la memoria denominado Stack. Una de lascaractersticas de este sector de la memoria es su rpido acceso. Cadavariable local primitiva declarada, cuenta con su espacio de memoriareservado en elStack.

    int a = 10;int b = 6;int c = 2;int d = a;

    Suponiendo las variables anteriores declaradas son locales, cada una deellas es almacenada en elStack. La declaracin de la variable dindica quese asigne como valor de la misma el valor de la variable apero esto noquiere decir que ambas variables compartan el mismo espacio de memoria.Se crea una copia del valor de la variable a, en este caso 10 y se lo asigna

    a la variable d.

    Stack

    d

    c

    b

    a

    Cuando se trata de objetos, su creacin difiere en cuanto a la forma en laque se crean variables primitivas, ya que para crear un objeto se debeprimero declarar una variable y luego se debe indicar la construccin de unobjeto que ser referenciado por la variable creada:

    Auto a1;

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    33/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 33

    En el ejemplo anterior, se declara nicamente una variable de tipo Auto,pero por el momento esta variable no referencia a ningn objeto, solamentecontamos con la variable que apunta a una referencia nula. Para que estavariable referencie a un objeto, se debe primero construir un objeto y luegoasignar este objeto a la variable a1. Para ello, se utiliza el operador newyel operador de asignacin (=).

    a1 = new Auto(Ford Fiesta, LAR123);

    En la lnea de cdigo anterior, primero se crea un objeto de tipo Autoutilizando el operador newy luego dicho objeto es asignado a la variable dereferencia a1, es decir, la variable a1 referencia al objetocreado de tipoAuto. Una variable de referencia se almacena en el Stackpero el objeto alque referencia se almacena en un sector de la memoria denominado Heap.En el ejemplo anterior, una vez creado el objeto, el mismo es almacenado enelHeap. Este sector de memoria es ms lentoen comparacin al sectorde memoriaStack, por lo tanto, por el momento contamos con una variablede referenciay un objeto referenciado por dicha variable. Una variable de

    referenciaes una variable que indica mediante una direccin de memoria laubicacin donde se encuentra el objeto que referencia.

    Auto a1;Auto a2;Auto a3;Auto a4;

    En las lneas de cdigo anteriores, se declaran cuatro variables de referenciade tipo Auto. Supongamos que la clase Auto tiene definidos los atributosmodelo y patente y su constructor recibe dos variables de tipo String

    para inicializar dichos atributos.1. a1 = new Auto("Ford Fiesta", "LAR123");2. a2 = new Auto("Volkswagen Gol", "HIJ583");3. a3 = new Auto("Ford Fiesta", "KUS392");4. a4 = a1;

    La lnea de cdigo 1 crea un objeto de tipo Auto y se asigna a la variablea1. La lnea de cdigo 2 crea un objeto de tipo Auto y se asigna a lavariable a2. La lnea de cdigo 3 crea un objeto de tipoAutoy se asigna ala variable a3. La lnea de cdigo 4, indica que la referencia indicada porla variable a1 sea asignada a la variable a4, es decir, se indica que lavariable a4referencie al mismo objeto referenciado por la variable a1.

    La siguiente figura ilustra una representacin de las variables declaradas ysus respectivas referencias.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    34/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 34

    Heap

    Ford FiestaLAR123

    Ford Fiesta

    KUS392

    Instancia de Auto

    Instancia de Auto

    Instancia de Auto

    Vokswagen Gol

    HIJ583

    Como se puede ver en la figura, un objeto puede ser referenciado por msde una variable.

    Luego de comprender los conceptos relacionados a la asignacin y creacinde objetos en memoria, y siguiendo con el ejemplo anterior, nos podemos

    plantear la siguiente pregunta:

    Son las variables a1 y a2 iguales?

    Son las variables a1 y a3 iguales?

    Son las variables a1 y a4 iguales?

    Para responder a estas preguntas, en primer lugar debemos tener en cuentael criterio que se aplica para definir cundo dos variables son iguales o no.Un criterio podra considerar que dos variables de referencia son iguales siambas referencian al mismo objeto. Si seguimos este criterio, entonces

    las nicas variables que son iguales entre s seran las variables a1 y a4,ya que ambas hacen referencia al mismo objeto y el resto de las variablesreferencian a objetos distintos.

    El operador == permite aplicar este tipo de comparacin entre dos objetos.Este operador devuelve como resultado el valor lgico true si ambasvariables referencian al mismo objeto y devuelve el valor lgico false siambas variables referencian a objetos distintos. A continuacin se muestraun ejemplo en el que se hace uso de este operador:

    Auto a1 = new Auto("Ford Fiesta", "LAR123");Auto a2 = new Auto("Volkswagen Gol", "HIJ583");Auto a3 = new Auto("Ford Fiesta", "KUS392");

    Auto a4 = a1;

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    35/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 35

    // Comparacin 1if (a1 == a2) {

    System.out.println("Las variables a1 y a2 hacenreferencia al mismo objeto");

    } else {System.out.println("Las variables a1 y a2 hacen

    referencia a objetos distintos");}

    // Comparacin 2if (a1 == a3) {

    System.out.println("Las variables a1 y a3 hacenreferencia al mismo objeto");

    } else {System.out.println("Las variables a1 y a3 hacenreferencia a objetos distintos");

    }

    // Comparacin 3if (a1 == a4) {

    System.out.println("Las variables a1 y a4 hacenreferencia al mismo objeto");

    } else {System.out.println("Las variables a1 y a4 hacenreferencia a objetos distintos");

    }

    En Comparacin 1, se comparan las referencias de las variables a1 ya2. El resultado de dicha comparacin es false ya que ambas variables

    apuntan a distintos objetos. La misma lgica se aplica en Comparacin 2pero aplicado a las variables a1 y a3. Estas ltimas hacen referencia aobjetos distintos y en consecuencia el resultado de la comparacin esfalse. En Comparacin 3 se comparan las referencias de las variablesa1 y a4 y ambas variables referencian al mismo objeto, y porconsiguiente el resultado de la comparacin es true.

    Por el momento, el criterio de igualdadque aplicamos es el de considerarque dos variables de referencia son iguales si ambas referencian al mismoobjeto. Para aplicar este criterio de comparacin se utiliza el operador ==. Asu vez, el operador != es utilizado en sentido inverso, es decir, paradeterminar si dos variables de referencia no son iguales. En el caso que las

    variables de referencia no sean iguales entonces el operador != retornatrue y en caso que sean iguales retorna false.

    Otro criterio de comparacin podra considerar que dos variables dereferencia son iguales, si los objetos a los que referencian sonconceptualmente iguales. Siguiendo con el ejemplo anterior, losatributos que contiene una instancia de la clase Auto son modelo ypatente. Podramos considerar que dos objetos de tipo Autoson igualesconceptualmentesi son del mismo modelo y tienen la misma patente, peroa modo de ejemplo, vamos a considerar que dos objetos de tipo Auto sonconceptualmente iguales si ambos tienen definido el mismo modelo.Siguiendo este criterio, entonces las variables a1 y a3 son las nicas

    variables conceptualmente iguales ya que los objetos referenciados porambas variables tienen el mismo modelo definido (Ford Fiesta).

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    36/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 36

    Para definir este criterio de igualdad conceptual entre objetos de tipo Autodebemos redefinir un mtodo especial que tienen todos los objetosdenominado equals(). Este mtodo se encuentra definido en la clasejava.lang.Object, por lo tanto todos los objetos heredan este mtodo, peropara definir nuestro propio criterio conceptual de igualdad es necesarioredefinir este mtodo con una implementacin acorde a nuestro criterio deigualdad.A continuacin se redefine el mtodo equals() de la claseAuto:

    public boolean equals(Object o) {if ((o instanceof Auto) &&

    (((Auto)o).getModelo().equalsIgnoreCase(this.modelo)){

    return true;} else {

    return false;}

    }

    El mtodo equals() recibe un objeto como parmetro. Luego seaplica eloperador instanceof para comprobar que el objeto recibido sea unainstancia de la claseAutopara verificar que se comparan objetos del mismotipo. A continuacin se compara el modelo del objeto recibido porparmetro y el modelo del objeto actual y en caso que sean iguales, seretorna el valor lgico true y en caso contrario se retorna el valor lgicofalse.

    En el siguiente cdigo, se utiliza el mtodo equals() para comparar lasvariables de referencia a1, a2, a3 y a4.

    Auto a1 = new Auto("Ford Fiesta", "LAR123");

    Auto a2 = new Auto("Volkswagen Gol", "HIJ583");Auto a3 = new Auto("Ford Fiesta", "KUS392");Auto a4 = a1;

    // Comparacin 4if (a1.equals(a2)) {System.out.println("Las variables a1 y a2 son igualesconceptualmente");

    } else {System.out.println("Las variables a1 y a2 no soniguales conceptualmente");

    }

    // Comparacin 5if (a1.equals(a3)) {System.out.println("Las variables a1 y a3 son igualesconceptualmente");

    } else {System.out.println("Las variables a1 y a3 no soniguales conceptualmente");

    }

    // Comparacin 6if (a1.equals(a4)) {

    System.out.println("Las variables a1 y a4 son igualesconceptualmente");

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    37/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 37

    } else {System.out.println("Las variables a1 y a4 no soniguales conceptualmente");

    }

    En Comparacin 4, se comparan conceptualmente las referencias de lasvariables a1 y a2. El resultado de dicha comparacin es false ya quelos objetos referenciados por ambas variables tienen modelos distintos deautos. En Comparacin 5, se comparan conceptualmente las referenciasde las variables a1 y a3. Ambas variables referencian objetos distintos,pero tienen el mismo modelo de auto, por lo tanto conceptualmente soniguales y en consecuencia el valor devuelto por el mtodo equals() estrue. En Comparacin 6, se comparan conceptualmente las referenciasde las variables a1 y a4, pero ambas variables referencian al mismoobjeto y en consecuencia se est comparando conceptualmente al mismoobjeto y en consecuencia el resultado de la comparacin es true.

    De acuerdo a lo analizado anteriormente, siempre que queramos verificar laigualdad entre dos objetos, debemos tener en cuenta si lo que queremosverificar es si las variables de referencia hacen referencia al mismo objeto(operador ==), o si los objetos referenciados por ambas variables sonconceptualmente iguales (mtodos equals()).

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    38/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 38

    4.5- Sobrecarga de mtodosLa sobrecarga de un mtodo hace referencia a la definicin de distintasversionesdel mismo mtodo en una clase. Para sobrecargar un mtodo,

    debe mantenerse el mismo nombre pero debe modificarse la lista deparmetros del mismo. No se toma como sobrecarga la diferenciacinsolamente en el tipo de salida del mtodo.

    Ejemplos de mtodos sobrecargados:

    void ejemplo(int a, String b){..

    }

    int ejemplo(int a){..

    }

    int ejemplo(int a, int b){..

    }

    int ejemplo(){..

    }

    Se trata de mtodos distintos pero todos ellos tienen el mismonombre. La diferencia que existe entre ellos radica en que tienen distintonmero y/o tipo de argumentosen su declaracin.

    Algo a tener en cuenta es que los mtodos sobrecargados pueden cambiar eltipo de retorno y se pueden definir tambin en subclases.

    En el momento en el que se invoca a un mtodo sobrecargado, elcompilador busca el mtodo que tenga la definicin que se corresponde conel nmero y/o tipo de parmetros en la invocacin del mtodo. Si elcompilador no encuentra ningn mtodo que se corresponda con lainvocacin, entonces obtendremos un error de compilacin.

    Otro claro ejemplo del uso de mtodos sobrecargados es cuando definimosdistintos constructores para una misma clase.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    39/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 39

    4.6- La palabra clave thisLa palabra clave this hace referencia a la instancia u objeto actual.Por medio de ella podemos referirnos a cualquier miembro del objeto

    actual.Veamos a continuacin un ejemplo que permita clarificar este concepto:

    En la clase Ejemplo, tenemos un constructor con dos parmetros (int c,int d) que son asignados a las variables de instancia ay b.

    public class Ejemplo {public int a = 0;public int b = 0;

    //constructor con 2 parmetrospublic Ejemplo(int c, int d) {

    a = c;b = d;

    }}

    A continuacin vamos a escribir la misma clase Ejemplopero haciendouso de la palabra clave "this":

    public class Ejemplo {public int a = 0;public int b = 0;

    //constructor con 2 parmetrospublic Ejemplo(int c, int d) {

    this.a = c;this.b = d;

    }}

    Podemos ver que lo nico que cambi en el constructor fue el agregado dela palabra "this". sta se puede utilizar para evitar ambigedades en elcdigo.

    Veamos el siguiente ejemplo:

    public class Ejemplo {public int a = 0; // variable de instanciapublic int b = 0; // variable de instancia

    //constructor con 2 parmetrospublic Ejemplo(int a, int b) {

    a = a; // variable localb = b; // variable local

    }

    }

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    40/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 40

    En este caso, el constructor define dos parmetros del mismo nombre quelas variables de instancia (a y b) Cul es el valor de las variables deinstancia ay bluego de llamar al constructor?

    La respuesta es a = 0, y b = 0, porque el compilador est asignando lavariable aque viene por parmetro a la misma variable aque viene por

    parmetro, y lo mismo se aplica para la variable b, es decir, en elconstructor nunca hacemos referencia a las variables de instancia, sino quesiempre nos estamos refiriendo a las variables locales.

    Este problema de ambigedad se soluciona agregando la palabra clave"this" antes de las variables ay b, como se muestra a continuacin:

    public class Ejemplo {public int a = 0;//variable de instanciapublic int b = 0;//variable de instancia

    //constructor con 2 parmetros

    public Ejemplo(int a, int b) {this.a= a;this.b= b;

    }}

    Supongamos que invocamos al constructor de la clase Ejemplo y comoparmetros enviamos los valores 1y 2. Como resultado de la ejecucindel constructor, los valores de las variables de instancia son a = 1y b = 2.

    Hay que tener en cuenta que la palabra clave this no puede ser utilizadadesde un mtodo esttico debido a que estos mtodos no se refieren aninguna instancia en particular y al usar la palabra clave thispretenderamos obtener la instancia actual, lo cual es contradictorio.

    public class Ejemplo {int a;

    public static void main(String args[]) {System.ou.println(this.a);//Error de compilacin

    }}

    La utilizacin de la palabra clave this se considera una buena prctica deprogramacin para evitar ambigedades.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    41/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 41

    4.7- La palabra clave superLa palabra clave super se utiliza cuando se quiere acceder a losmiembros de la clase padre, desde la clase hija.

    Si se redefine un mtodo de la clase padre, en la clase hija, y se quiereacceder al mtodo de la clase padre, la forma de hacerlo es con la palabraclave super.

    public class EjemploPadre {

    public void escribir() {System.out.println("Estoy en la clase padre");

    }}

    public class EjemploHija extends EjemploPadre {

    public void escribir() {System.out.println("Estoy en la clase hija");

    }

    public static void main(String[] args) {EjemploHija ejemploHija = new EjemploHija();ejemploHija.escribir();

    }}

    Cuando ejecutamos el mtodo main() de la clase hija, vemos por laconsola el siguiente mensaje:

    Estoy en la clase hija

    Vemos este mensaje en la consola, porque el mtodo escribir()de la clasepadre, fue sobrescrito en la clase hija.

    Para poder ejecutar desde la clase hija el mtodo escribir() de la clasepadre, agregamos la palabra clave super como vemos a continuacin:

    public class EjemploHija extends EjemploPadre {

    public void escribir() {super.escribir();//Se utiliza super SIN parntesis.System.out.println("Estoy en la clase hija");

    }

    public static void main(String[] args) {EjemploHija ejemploHija = new EjemploHija();ejemploHija.escribir();

    }}

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    42/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 42

    Cuando ejecutamos el mtodo main() de la clase hija, vemos por laconsola el siguiente mensaje:

    Estoy en la clase padreEstoy en la clase hija

    Si tenemos en la clase hija una variable de instancia int a=8, y queremosacceder a una variable de instancia int a=6que se encuentra en la clasepadre, lo podemos hacer de la siguiente manera:

    public class EjemploPadre {public int a = 6;//variable de instancia

    }

    public class EjemploHija extends EjemploPadre {public int a = 8;//variable de instancia

    public void escribir() {System.out.println("El valor de a en la clase padre

    es: " + super.a);System.out.println("El valor de a en la clase hija

    es: " + a);}

    public static void main(String[] args) {EjemploHija ejemploHija = new EjemploHija();ejemploHija.escribir();

    }

    }

    Luego de ejecutar el mtodo main() de la clase hija, vemos por la consolael siguiente mensaje:

    El valor de a en la clase padre es: 6El valor de a en la clase hija es: 8

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    43/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 43

    4.8- Manejo de excepciones

    4.8.1- Concepto de excepcin

    En los lenguajes de programacin, escribir cdigo que verifique y haga uncorrecto manejo de las situaciones anmalas que podra tener unaaplicacin puede resultar tedioso. Sin embargo, la deteccin de posibleserrores y la determinacin de cmo debera reaccionar la aplicacinante esos errores es un aspecto fundamental que definir cun robustayconfiable es la aplicacin. Para ello, Java provee los mecanismosnecesarios para el manejo de eventos anormales.

    El objetivo del manejo o gestin de excepciones es el de proveer uncontextoacorde para que la aplicacin pueda resolver las situacionesanmalas de la forma en que nosotros creamos ms conveniente. Paraentender mejor estos conceptos, analicemos el siguiente cdigo de ejemplo:

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;

    public class Division {

    public static void main(String args[]) throws IOException {System.out.println("Divisin entre dos nmeros enteros");

    BufferedReader br = new BufferedReader(newInputStreamReader(System.in));

    System.out.println("Ingrese un dividendo entero");int dividendo = Integer.parseInt(br.readLine());

    System.out.println("Ingrese un divisor entero");int divisor = Integer.parseInt(br.readLine());

    int cociente = dividendo/divisor;

    System.out.println("El resultado de la divisin es: " +cociente);

    }

    }

    El cdigo anterior solicita al usuario el ingreso de dos nmeros enteros pararealizar el clculo de su cociente. Si ejecutamos la aplicacin podemos verlos siguientes mensajes en la consola:

    Divisin entre dos nmeros enterosIngrese un dividendo entero

    Definiremos entonces a una excepcincomo un evento anormaloinesperadoque ocurre durante la ejecucin de un programa y altera

    su flujo normal.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    44/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 44

    8Ingrese un divisor entero4El resultado de la divisin es: 2

    Veamos qu sucede si ingresamos como divisor el valor cero:

    Divisin entre dos nmeros enterosIngrese un dividendo entero2Ingrese un divisor entero0Exception in thread "main"java.lang.ArithmeticException: / by zero

    at Division.main(Division.java:18)Java Result: 1

    En consola podemos ver que ha ocurrido una excepciny la aplicacin haterminado abruptamente:

    Exception in thread "main"java.lang.ArithmeticException: / by zero

    at Division.main(Division.java:18)

    Esta informacin se la conoce como stack traceo rastreo de la pila dela excepcin. Esta informacin incluye el nombre de la excepcinque haocurrido (java.lang.ArithmeticException) junto a algn mensajedescriptivo de la misma y la cadena de llamadas a mtodos al momento enque ocurri la excepcin. En este caso, se intent hacer una divisin porcero en la siguiente lnea de cdigo y la misma arroj una excepcin:

    int cociente = dividendo/divisor;

    El nombre de la excepcin que se obtuvo esjava.lang.ArithmeticException y se informa que se intent hacer unadivisin por cero (/ by zero). La divisin por cero en el conjunto de losnmeros enteros es una operacin no permitida, siendo ste el motivo porel cual obtuvimos la excepcin.

    En el cdigo de ejemplo que vimos, el flujo normal de la aplicacin sera

    esperar que el usuario siempre ingrese valores enteros vlidos, pero comovimos, se puede dar la ocasin en la que el usuario ingrese valores noesperados, dando a producir situaciones anmalas conocidas comoexcepciones.

    Una aplicacin puede arrojar varios tipos de excepciones. Intentemosejecutar la aplicacin e ingresar alguna letra en lugar de un nmero. Elresultado obtenido es el siguiente:

    Divisin entre dos nmeros enterosIngrese un dividendo enteroa

    Exception in thread "main"java.lang.NumberFormatException: For input string: "a"

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    45/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 45

    atjava.lang.NumberFormatException.forInputString(NumberFormatException.java:48)

    at java.lang.Integer.parseInt(Integer.java:449)at java.lang.Integer.parseInt(Integer.java:499)at Division.main(Division.java:13)

    Java Result: 1

    Como podemos ver, la consola nos informa que se ha lanzado una excepcinde tipo java.lang.NumberFormatException y la aplicacin finalizaabruptamente. Esto se debe a que la aplicacin espera que siempre seingresen nmeros enteros, pero darse la situacin en la que un usuario seequivoque e ingrese una letra en lugar de un nmero. En dicho caso lasiguiente lnea de cdigo arrojar una excepcin:

    int dividendo = Integer.parseInt(br.readLine());

    Esto se debe a que la funcin Integer.parseInt() intenta obtener elnmero entero que representa la cadena de caracteres ingresada, pero siingresamos como cadena de caracteres alguna letra, esta funcin no podrconvertir dicha letra en un nmero entero y arroja una excepcin.

    4.8.2- Captura de excepciones

    Como bien se mencion anteriormente, el trmino excepcin hace

    referencia a un evento anormal que puede alterar el flujo normal de unaaplicacin. Muchas pueden ser las causas que pueden originar unaexcepcin: fallas en el hardware, no disponibilidad de recursos, situacionesno contempladas, errores matemticos, invocacin de un mtodo sobre unpuntero nulo, ndices fuera de rango, entre otros.

    Cuando una excepcinocurre, se dice que la misma ha sido arrojaday elcdigo responsable de hacer algo con dicha excepcinse denomina gestorde la excepcin. Se dice que dicho cdigo captura la excepcinarrojada. De esta forma, la ejecucin del programa se transfiere almanejador de la excepcinapropiado.

    Entonces, por ejemplo, si llamamos a un mtodo que intenta abrir unarchivo pero por algn motivo, ste no puede ser abierto, la ejecucin dedicho mtodo se detendr y el cdigo que hayamos definido para que

    Mediante el manejo de excepciones, los desarrolladores puedendetectar posibles eventos anormales sin tener que escribir demasiadoscdigos e indicar cmo se debe comportar la aplicacin ante estoseventos. Una excepcines representada por un objeto que laMquinaVirtual de Java instancia en tiempo de ejecucin si algn eventoanmalo ha sucedido, permitiendo al programador que intervenga endicha situacin si as lo deseare para recuperarse del estado anormal yevitar que la aplicacin finalice en forma abrupta.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    46/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 46

    controle esta situacin ser ejecutado. Pero para que este modelo funcione,necesitamos indicarle de alguna forma a la Mquina Virtual Java qucdigo se debe ejecutar cuando alguna excepcinen particular ocurre. Parahacer esta indicacin, se utilizan las palabras claves try y catch.

    La palabra clave try se utiliza para definir un bloque de cdigo en donde

    alguna excepcinpuede ocurrir.

    La palabra clave catch se utiliza para capturar alguna excepcin enparticular o grupo de excepciones para luego ejecutar algn bloque decdigo.

    Analicemos la utilizacin de las palabras claves try y catch siguiendo elescenario del ejemplo anterior:

    1. import java.io.BufferedReader;2. import java.io.IOException;3. import java.io.InputStreamReader;4.

    5. public class Division {6.7. public static void main(String args[]) throws

    IOException {8. boolean reprocesarCiclo = true;9. do {10. try {11. System.out.println("Divisin entre dos nmeros

    enteros");12.13. BufferedReader br = new BufferedReader(new

    InputStreamReader(System.in));14.

    15. System.out.println("Ingrese un dividendoentero");

    16. int dividendo = Integer.parseInt(br.readLine());17.18. System.out.println("Ingrese un divisor entero");19. int divisor = Integer.parseInt(br.readLine());20.21. int cociente = dividendo/divisor;22.23. System.out.println("El resultado de la divisin

    es: " + cociente);24.25. reprocesarCiclo = false;

    26. } catch (ArithmeticException e) {27. System.out.println("No se puede dividir por

    cero!");28. } catch (NumberFormatException e) {29. System.out.println("El valor ingresado no es un

    nmero entero!");30. }31. } while (reprocesarCiclo);32.33. System.out.println("Fin de la aplicacin");34. }36. }

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    47/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 47

    En el ejemplo, el cdigo que se encuentra entre las lneas 11 y 25constituye una regin de cdigo en donde alguna excepcinpuede ocurrirya que dicho cdigo se encuentra en un bloque try.Es nuestra forma dedecirle al compilador que en dicho bloque de cdigo puede producirsealguna excepcin.

    El cdigo que se encuentra entre las lneas 26y 27se corresponde conun bloque catch y le indica a la aplicacin qu acciones debe realizar en elcaso que el bloque de cdigo try indicado con anterioridad arroje unaexcepcinde tipo ArithmeticException.

    El cdigo que se encuentra entre las lneas 28y 29se corresponde conun bloque catch y le indica a la aplicacin qu acciones debe realizar en elcaso que el bloque de cdigo try indicado con anterioridad arroje unaexcepcinde tipo NumberFormatException.

    Como pudimos ver, cada bloque catch debe especificar entre parntesisun parmetro que indica el tipo de excepcinque manipular dicho bloque

    de cdigo catch. Esto permite trabajar con el objeto que representa laexcepcinque ha ocurrido para obtener mayor informacin de la misma sias se desea. Cuando ocurre una excepcin en un bloque de cdigo tryentonces inmediatamente se ejecutar el bloque de cdigo catchcorrespondiente a la excepcinque ocurri.

    Se debe tener en cuenta que los bloques de cdigo catch se deben colocarinmediatamente despus del bloque de cdigo try.A su vez, si hay variosbloques de cdigo catch, los mismos deben colocarse consecutivamente,es decir, no se puede colocar alguna sentencia intermedia entre los bloquescatch.

    La ejecucin del cdigo protegido por el bloque try comienza en la lnea11. Si la aplicacin logra ejecutarse hasta llegar a la lnea 25sin arrojarninguna excepcin, es decir si ningn evento anormal sucede, entonces laejecucin de la aplicacin continuar en la lnea 32hacia abajo. Pero si enalgn momento durante la ejecucin del cdigo que se encuentra entre laslneas 11 y 25ocurre alguna excepcin de tipo ArithmeticException,entonces la ejecucin se transferir directamente a la lnea 26 y enconsecuencia se ejecutar el bloque de cdigo catchcorrespondiente a lalnea 27. Una vez que el bloque de cdigo catch finaliza, la ejecucin delprograma contina en la lnea 32.

    Algo importante a tener en cuenta tambin es que si por ejemplo, unaexcepcin se produce en la lnea 16, entonces el resto de las lneassucesivas que se encuentran en el bloque de cdigo try no sernejecutadas, es decir, una vez que el control de un programa se encuentra enun bloque de cdigo catch entonces el control nunca regresar al bloquede cdigo try para completar su ejecucin.

    Uno de los beneficios de este modelo de manejo de excepcioneses que elcdigo necesario para manejar alguna excepcin en particular que puedaser arrojada en cualquier seccin de un bloque de cdigo try debe serescrita una nica vez. En el ejemplo anterior, una excepcin de tipoNumberFormatExceptionpuede ocurrir tanto en la lnea 16y 19, perosin importar en qu lnea se arroje la excepcin, el mismo bloque de cdigocatch capturar la excepcin.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    48/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 48

    4.8.3- Lanzamiento de excepciones

    En la seccin anterior vimos de qu forma se poda escribir un bloque decdigo catchpara capturaralguna excepcinen particular y determinarcmo queremos que se comporte el programa ante dicha excepcin. Enalgunos casos es apropiado capturaruna excepcinen el mismo mtodo endonde ocurre dicha excepcin mediante los bloques de cdigo try ycatch, pero tambin hay otros casos en los cuales puede resultar msconveniente que la excepcin sea capturadapor algn mtodo superior oprevio en pila de llamadas (stack trace). Para ello se dice que se debelanzarla excepcinhacia los mtodos previos de la pila de llamadas. Paraentender este concepto debemos primero comprender el funcionamiento delapila de llamadasde un mtodo.

    Si nuestro programa inicia con el mtodo main(), y dentro de este mtodose invoca al mtodo a(), y ste invoca al mtodo b(), y ste ltimo invocaal mtodo c(), lapila de llamadases la siguiente:

    c()

    b()

    a()

    main()

    En lapila de llamadasde mtodos, el ltimo mtodo invocado es el que seencuentra en lo ms alto del listado, mientras que el primer mtodoinvocado es el que encuentra en lo ms bajo del listado. En este caso, c()es el mtodo que se estaba ejecutando actualmente, y a medida quedescendemos hacia abajo en el listado observamos los mtodospreviamente invocados. En algunos casos se representa la pila de llamadascon el orden invertido al expuesto en el ejemplo.

    Supongamos ahora que existe la posibilidad de que durante la ejecucin delmtodo c()ocurra una excepcin. Una de las opciones que tenemos es lade capturardicha excepcinmediante los bloques de cdigo try y catchdentro del mismo mtodo c(). Otra opcin que tenemos es la de lanzar laexcepcin hacia el mtodo que previamente fue invocado, en este caso elmtodo b()y que sea ste quien tenga la responsabilidad de manipular laexcepcin. Pero para ello, debemos indicarle a laMquina Virtual Javaqueexiste la posibilidad de que el mtodo c() pueda arrojar una excepcin.Esto lo indicamos en la declaracin del mtodo utilizando la palabra clavethrows.

    A continuacin, analizaremos un cdigo de ejemplo para que podamoscomprender mejor estos conceptos:

    La pila de llamadasde un mtodo es la cadena de mtodos que elprograma ejecuta para obtener el mtodo actual que est siendoejecutado.

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    49/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 49

    import java.io.FileWriter;import java.io.IOException;

    public class EscribirArchivo {

    private static FileWriter file;

    public static void main(String args[]) {leerArchivo();escribirArchivo();

    }

    public static void leerArchivo() {try {file = new FileWriter("test.txt");

    } catch (IOException ex) {System.out.println("Una excepcin ha ocurrido: " +

    ex.toString());}

    }

    public static void escribirArchivo() {try {file.write("Programacin Orientada a Objetos");file.close();

    } catch (IOException ex) {System.out.println("Una excepcin ha ocurrido: " +

    ex.toString());}

    }

    }

    El cdigo anterior escribe la cadena de caracteres ProgramacinOrientada a Objetos enun archivo de texto plano denominado test.txt. Sidicho archivo no existe, entonces el archivo es creado. Cuando se ejecuta elmtodo leerArchivo(),lapila de llamadases la siguiente:

    leerArchivo()

    main()

    Esto indica que primero se ejecut el mtodo main() y luego dentro deeste mtodo se invoca al mtodo leerArchivo(). Una vez que finaliza elmtodo leerArchivo(), el control vuelve al mtodo main()y este ltimoinvoca ahora al mtodo escribirArchivo(). Cuando se ejecuta el mtodoescribirArchivo()lapila de llamadases la siguiente:

    escribirArchivo()

    main()

    Esto indica que el primer mtodo en ser ejecutado fue el mtodo main()y

    en algn momento este ltimo invoca al mtodo escribirArchivo().

  • 7/26/2019 Arreglos String Polimorfismo y Excepciones en Java

    50/62

    Programacin Orientada a ObjetosDe las Heras, Sebastin | 50

    Si observamos los mtodos leerArchivo() y escribirArchivo(), ambosmtodos contienen bloques de cdigo try y catch debido a que lassentencias utilizadas pueden arrojar excepciones de tipo IOException.Este tipo de excepcinrepresenta errores relacionados con operaciones deentrada y salida de datos, como puede ser por ejemplo algn error en elintento de creacin del archivo test.txt o algn problema mientras se

    intenta guardar una cadena de caracteres en el archivo.

    En este caso, hemos definido bloques de cdigo try y catch que seencargan de manipular las excepciones dentro del mtodo donde hasucedido la excepcin. A continuacin modificaremos el cdig