tareasjavanet Introducción a Java

download tareasjavanet Introducción a Java

of 79

Transcript of tareasjavanet Introducción a Java

  • 8/14/2019 tareasjavanet Introduccin a Java

    1/79

    porDavid Muoz Daz

    Este documento est escrito para ayudar a quien lo necesite. Puedes hacer con l lo que quieras,pero siempre de forma gratuita y desinteresada. Adems, es demasiado malo como para venderlo. Sereiran de ti :)

    Si quieres aportar algo a este documento, no dudes en ponerte en contacto con el Grupo deUsuarios de Linux de la Universidad Carlos III de Madrid ([email protected]).

  • 8/14/2019 tareasjavanet Introduccin a Java

    2/79

    Contenido

    Aqu tienes la lista de contenidos del texto. Los apartados marcados con * son slo orientativos y no estnampliamente explicados aqu, ya que no forman parte del objetivo de este texto. Puedes encontrar una

    explicacin exhaustiva de estos apartados en cualquier libro de Java, adems de las explicaciones que tedar el profesor de la asignatura. Bueno, en algunas ocasiones, que debera dar.

    Prefacio* (que no, que es coa)

    Introduccin. Cultureta.peln de historia

    Platn y la OOPel problema...... y la solucinconcepto de objeto

    propiedades

    mtodosconcepto de clase

    Javapor qu Java?caracteraticas generales de Java *

    facilidad (je je jeeee)lenguaje interpretadotamao de los programasorientado a InternetJVM

    Cmo usar el compilador y la JVM (javac, java)

    El movimiento se demuestra andandodefincin de una mesapropiedadestipos bsicos de datos *mtodos

    valor de retornoparmetros

    creacin y uso de objetoscreacin

    primero: las referenciassegundo: new

    usoel operador punto

    ms sobre creacin: constructoresqu son?peculiaridadesdefinicin y uso

    breve iniciacin al polimorfismo *mtodos get/set

    Por qu?uso

  • 8/14/2019 tareasjavanet Introduccin a Java

    3/79

    Variables de clase. Modificador Staticel problema...... y la solucinuso de static

    en propiedades

    en mtodosconstantes

    El mtodo main, arrays y a lanzar programas!por qu el mtodo maindefinicin del mtodo mainargumentos

    un inciso: arrayssacab el inciso

    nuestro primer programa

    Programando a lo bestia: estructuras de control

    Sentencias condicionalessentencia ifexpresin lgicabloque de sentenciascomparadores de magnitudAND, OR, NOTcomparadores de cadenasifs anidadosif sin elses: CUIDADO!

    solucin rarasolucin ms rara

    sentencia switchusobreak

    comerte el coco 4Sentencias repetitivas

    definicinsentencia while

    regla general para el uso de buclesvariacin do - while

    sentencia forWhile o for?

    Recursividaddefinicinmetodologa: la cola del cinepartes de un mtodo recursivo

    los factoriales

    Herenciapara qu sirvecmo se usa: extendsredefinicin de mtodosuso de super()una nota bastante importante

  • 8/14/2019 tareasjavanet Introduccin a Java

    4/79

    Castingpreludio al casting: las referencias

    la seora referenciacmo funcionacomparacin de referenciasArreglando bicicletas: parmetros que son referencias

    castingPor qu?cmo se usa

    resumencomerte el coco 6upcasting, downcasting, Y siguiendo con el ingls, explicit and implicit cast

    upcastingdowncastingcasting implcitocasting explcito

    La Clase Objectdefinicincontenido *para qu ese contenido?la gran utilidad de la clase Object: referencias de tipo Object

    Interfacesdefinicinuso bsico de interfacesuso avanzado de interfaces: referencias de tipo de interfacesherencia?Interfaces?comorl?

    Eplogo

    El contenido de este texto es el estrictamente necesario para poder abordarcualquier problema de Programacin. Este texto es, por tanto, la base necesaria parapoder enfrentarnos a las asignaturas de Programacin y Laboratorio de Programacin.En este texto no vamos a ver determinados temas, como Applets, paquetes, pruebas de

    programas, etc. Para cualquier consulta sobre dichos temas, te recomiendo los libros deJava de la editorial Sun o alguno de la infinidad de manuales gratuitos que hay por lared.

    Por tanto, es necesario que te conciencies de que leer este texto no implicaaprobar: implica ser capaz de aprobar. Si te sirve de algo, cuando yo llegu a primero,saba bastante menos de lo que hay aqu escrito.

  • 8/14/2019 tareasjavanet Introduccin a Java

    5/79

    Prefacio

    No te engaes: tenemos mucha labor por delante. Pero no hay que pensar que esardua y temible. En absoluto. O al menos, espero que no lo sea para ti.

    Programar implica siempre dos cosas:

    Primero, hay que comerse el coco bastante, pero no para alcanzar complejosconceptos (bueno, para esto tambin), sino para todo lo contrario: para conseguir ponernuestro pensamiento a la altura de un cacho de silicio, que no parece muy listo....

    Segundo, la curiosidad no mata al gato, sino que

    curiosity Skilled the cat(por cierto, n.p.i. de de quin es esta frase. Se la he copiado a un miembro del

    GUL. As que si esta frase es suya, le pido diculpas por no pagar derechos de autor)

    O sea, que siempre, repito, siempre es bueno parar de estudiar y encender elordenador para hacer alguna prueba de lo que estemos estudiando. Si vemos castingser muy positivo que mandes a tomar por saco los apuntes y escribas un par de clasespara probar el acceso a los miembros de una calse va una referencia de tipo lasuperclase. Parece mentira, pero esta frase tiene sentido. En serio, nunca vas a

    aprender a programar con un libro, siempre lo aprenders por tu cuenta. As que vetehaciendo a la idea de que vas a pasar muncho rato delante de la pantalla, aunque esperoque no sea demasiado tiempo. O que al menos no sea tedioso.

    He intentado explicar todo este rollo usando ejemplos de la vida real. Tal vezquede un poco asquerosamente pedante explicar las clases metiendo a Platn pormedio, pero creo que hacindolo vamos a entender los conceptos ms fcilmente, ysobre todo, no se van a olvidar. Por supuesto, no creas que todo es Platn, tambinhablaremos de tu vecina, de la mesa Margarita, de pginas gu, la bicicleta Anacleta,y de mil cosas ms. Bueno, mil... lo que se dice mil....

    Por supuesto, todo ello respaldado por el pez Otilio, el pato Onorato y el pjaroque no s cmo demonios se llama, que no son ms que excusas para apartar un poco laatencin y hacer la lectura un peln ms agradable.

    Espero haber logrado, aunque slo sea en pequea parte, estos objetivos. Ahora,como dice la historia de la sopa de piedra, debes poner t de tu parte. nimo!

  • 8/14/2019 tareasjavanet Introduccin a Java

    6/79

    Introduccin. Cultureta.

    Normalmente, para empezar se opta por definir qu es programar, cmo se llevaa cabo, conceptos como software, hardware,memoria, etc etc etc. Vamos a ignorar todo

    este rollo porque realmente no importaen absoluto. Nosotros, por ahora, nonos vamos a preocupar de la Yo soy un programadorcapacidad de la memoria o de la leche.de la velocidad del proce-sador. A nosotros nos inte-resa programar.

    Cuando aprendemosa programar siempre se nos

    plantea si debemoscompaginar la progra-macin con el lenguaje de programacin. Parece una tontera,pero podemos aprender OOP sin saber ningn lenguaje. Es cierto: podemossaber sobre clases, objetos, herencia, casting, etc sin saber una maldita palabra deningn lenguaje. Sin embargo, siempre es positivo compaginar nuestro aprendizaje deprogramacin con el de un lenguaje propicio para ello.

    Adems de la OOP, y a modo de curiosidad (cultureta), existen otros tipos deprogramacin, cada uno con un lenguaje de programacin tpico. Esta parte, si quieres,

    te la puedes saltar.

    La programacin lineal tiene como fundador el antiguo BASIC. A lo largo delos aos, el BASIC ha ido cambiando hasta que hoy en da existen compiladores deBASIC orientado a objetos (Visual Basic, por ejemplo, mantiene una filosofa de OOP).La programacin lineal se daba con los primeros intrpretes de BASIC. Aqu hay unejemplo de este lenguaje:

    10 INPUT Cmo te llamas?, NOMBRE$20 SALUDO$ = Hola +NOMBRE$+ 30 PRINT SALUDO$

    40 END

    Ves? El programa empieza en un punto, y acaba en otro. Esto, claro, tiene susinconvenientes: no podemos hacer repeticiones, ni nada de eso. Nacieron las sentenciascondicionales:

    10 INPUT Cmo ests?,COMO$20 IF COMO$=bien GOTO 5030 IF COMO$=mal GOTO 7040 GOTO 1050 PRINT Vaya, me alegro.60 GOTO 80

    70 PRINT Algrate!80 END

  • 8/14/2019 tareasjavanet Introduccin a Java

    7/79

    El siguiente paso es la programacin procedimental: consiste en dividir el cdigo enfragmentos independientes. Lenguaje tpico, el Pascal.

    varcad:String;

    procedure debuti;beginWriteln('me alegro');

    end;

    procedure notandebuti;beginWriteln('alegrate!');

    end;

    beginWriteln('Cmo ests?');readln(cad);

    if (cad='bien') then debuti else notandebuti;end.

    Hay muchos ms tipos de programacin, y tambin muchos otros lenguajes muyraros, Smalltalk, ADA, Prolog.... En realidad, hoy en da muchos de estos lenguajes seusan con fines didcticos o experimentales.

    A nosotros nos interesa la Programacin Orientada a Objetos (OOP, deObject-Oriented Programming). Se basa en encapsular fragmentos de cdigo enburbujas independientes entre s. Los cdigos mostrados antes no tienen sentido en

    OOP. Vamos a ver por qu.

    Platn y la OOP

    La pregunta es las siguiente: Tenemos una mesa en la cocina, una en el saln,una mesilla de noche y una en un taller. Estas mesas son diferentes entre s, pero, sinembargo, hay algo en ellas que hace que todas SEAN mesas. Una es cuadrada, otraredonda, unas con tres patas y otras con cuatro. Por qu, si son tan diferentes, son todasmesas?

    Este hombre de aqu dijo que haba un mundo aparte delnuestro en el que existan unos seres perfectos, inmutables,universales, etc etc etc, a quienes llam Ideas. Los seres de nuestromundo fsico seran copias imperfectas de estas Ideas. Imagina portanto que todos los objetos que tenemos alrededor son copias de lasIdeas. De esta forma, al ser copias imperfectas, no seran igualesentre s, pero seguiran teniendo esa esencia comn.

    Esta teora sirve para explicar la realidad y dar un poco decabida a la ciencia. Si la ciencia trata sobre las cosas globales, es

    decir, los hechos universales, no los especficos, entonces tiene que haber algouniversal.

  • 8/14/2019 tareasjavanet Introduccin a Java

    8/79

    Bueno, pues nuestra intencin es semejante: vamos a tratar de explicar, no larealidad, sino los problemas que nos encontramos, que de una forma u otra, son parte dela realidad. o no?

    En OOP definimos un concepto ms que fundamental: el concepto de objeto.Un objeto es un conjunto de:

    a) Datosb) Mtodos

    Supongamos dos objetos semejantes, por ejemplo, dos mesas. Datos que puedenconcernir a las mesas, por ejemplo, son su color, nmero de patas, su forma, etc. As, sitenemos dos objetos mesa, cada uno con datos diferentes, tenemos dos mesasdiferentes, que es lo que plantebamos al principio: dos objetos de la misma naturaleza

    (mesa), pero diferentes entre s. A Platn esto le habra encantado!

    Debido a que los datos de un objeto definen en parte este objeto (lo diferencian delos dems), a veces llamamos a estos datos Propiedades.

    Se te ocurre algn mtodo propio de una mesa? A m no, las mesas son objetospuramente pasivos, ellas mismas no hacen nada. Sin embargo, vamos a suponer que elcambio de color es una accin propia de la mesa (y no del pintor).

    De acuerdo, ya tenemos el diseo de nuestra mesa. Ya conocemos el concepto de

    objeto. Vamos a seguir con el seor Platn.

    Cmo un carpintero puede crear una mesa? Segn este griego, su alma, antes denacer, vislumbr las Ideas, y durante la vida de la persona, el alma recuerda algunas deestas Ideas (aunque no todas....) As, un carpintero recuerda haber visto la Idea deMesa, y por ello sabe hacer mesas. Es decir, el carpintero se FIJA en la Idea de Mesapara crear una mesa.

    Si ya conocemos lo que es un Objeto, Qu es una Idea? Pues, sencillamente, ladefinicin de ese objeto, que, por cierto, nosotros llamamos clases. Platn dice que los

    objetos fsicos son copias de las Ideas. Nosotros decimos que los objetos con instanciasde las clases.

  • 8/14/2019 tareasjavanet Introduccin a Java

    9/79

    Para Platn, los objetos son copias de unosseres universales llamados Ideas. Las Ideasson, por tanto, la definicin de los objetosfsicos, aunque stos pueden ser diferentes entres. Para la OOP, los Objetos son instancias de

    unas definiciones generales que llamamos Clases.Dos objetos con propiedades diferentes(dos mesas con diferente color)siguen siendo instancias de la mismaclase (la clase mesa).

    stos son losconceptos fundamentales de laOOP. Es estrictamente necesario comprenderlos a fondo antes de seguir adelante. Prateun momento a pensar si entiendes a fondo...

    OBJETOCLASEPROPIEDADESMTODOSINSTANCIA

    Cuidado!Si decimos que dos objetos de la misma clase tienen las mismas propiedades, talvez lo que realmente queramos decir es que dos objetos de la misma clase tienen

    EL MISMO VALOR PARA TODAS Y CADA UNA.DE SUS PROPIEDADES.Es evidente que dos objetos de la misma clase van a tener las mismaspropiedades: dos mesas tendrn color, forma, nmero de patas, etc. Pero tal vezdigamos que dos mesas tienen las mismas propiedades cuando queremos decirque ambas mesas tienen la misma forma, el mismo color y el mismo nmero depatas. Hay que tener cuidado con esto, aunque tampoco es tan importante.

    Para comerse el coco.... (1)Tenemos dos objetos de la misma clase, con exactamente las mismaspropiedades Son el mismo objeto?

    Java

    Java es un lenguaje de programacin. La verdad es que no va a recibir ningnpremio por este simple hecho. Sin embargo, s va a recibir cierta atencin por nuestraparte, porque, sencillamente, es la herramienta que nosotros vamos a utilizar. Que quedemuy claro, Java es un MEDIO para programar en OOP. Podemos programar en OOPcon otros muchos lenguajes, Delphi, Visual Basic, o C++.

    Java naci con una intencin muy clara: hacer la vida ms fcil al programador.

    C++ es el lenguaje ms potente que existe ahora mismo. Pero tiene un grave problema:es lo ms complicado que hay. Un ejemplo:

  • 8/14/2019 tareasjavanet Introduccin a Java

    10/79

    #include

    // Define la clase derivada de TApplication

    class THelloApp : public TApplication

    {public:THelloApp(LPSTR AName,

    HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

    : TApplication(AName,hInstance,hPrevInstance,lpCmdLine,nCmdShow) {};

    virtual void InitMainWindow();

    };

    // el MainWindow de la clase

    void THelloApp::InitMainWindow(){MainWindow = new TWindow(NULL, "Hola Mundo");

    }

    int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,

    int nCmdShow){THelloApp HelloApp ("HelloApp",

    hInstance,

    hPrevInstance,lpCmdLine,nCmdShow);

    HelloApp.Run();

    return HelloApp.Status;}

    Bueno, pues este fragmento de cdigo abre una ventana con el ttulo Hola

    Mundo!.

    Visto lo visto, Java trata de hacer la vida un poco ms fcil. Adems, unprograma en Java ocupa bastante poco espacio en disco, mientras que uno en C++ ocupatodo lo que quieras y un poco ms. As que, gracias a eso, Java es tambin propicio paraaplicaciones que corran por Internet y esas cosas. Pero todo eso ya lo veremos.

    Java NO lo entiende directamente el procesador. Java es un lenguajeINTERPRETADO, es decir, que se traduce para que el procesador pueda entenderlo.C++, una vez compilado, es entendido perfectamente por el procesador, mientras que

    Java no. Java se compila y se generan los bytecodes, que es otro lenguaje mucho mssencillo, pero el procesador sigue sin entenderlo. Para ello, los bytecodes tienen que

  • 8/14/2019 tareasjavanet Introduccin a Java

    11/79

    INTERPRETARSE por la Java Virtual Machine (JVM), que, en realidad, es otroprograma (escrito, por cierto, en C++) que sabe interpretar los bytecodes. Bueno, esto esun poco extrao, pero en realidad es muy fcil. Al escribir un programa en C++, porejemplo, se compila y funciona solito. Pero al escribirlo en Java, se compila y necesitaotro programa que lo haga funcionar. Este otro programa se llama JVM. Ya est. No es

    tan mortal, no?

    Ventajas de Java sobre los lenguajes no interpretados? muchas, por ejemplo,seguridad: Si un programa en Java intenta hacernos la pueta, la JVM lo detendr,mientras que el procesador no podr detener nunca un virus escrito en C++. Otra ventajaes el ya mencionado reducido tamao de los programas en Java. Otra, mucho msimportante, un programa en Java funciona en Windows, en Linux, en Mac, en Solaris,etc, porque lo que cambia es la JVM.

    Aqu no vamos a extendernos en el funcionamiento de los compiladores de Java

    y las JVM. Sin embargo, vamos a recordar un poco el proceso.

    1.- Creamos el archivo xxxx.java2.- lo compilamos con javac xxxx.java3.- lo ejecutamos con java xxxx

    El paso 3 es el que invoca a la JVM. Ms explicaciones, ayuda en lnea.

    Antes de seguir adelante, vamos a pararnos un poco para recapacitar sobre si hasentendido los conceptos de:

    LENGUAJE Empiezo a plantearmeLENGUAJE INTERPRETADO esto de programar....Y COMPILADO

    COMPILADORJVMBYTECODES

    Para comerse el coco......(2)Teniendo en cuenta que la JVM esun programa escrito en un lenguajecompilado, puede ser entendido por la propia JVM?

    El movimiento se demuestra andando.

    Vamos a escribir un pequeo programa en Java. Su fin? definir las mesas quetanto tiempo nos han acompaado. Recordemos la CLASE MESA:

    Propiedades: color, nmero de patas, formaMtodos: cambiar el color

  • 8/14/2019 tareasjavanet Introduccin a Java

    12/79

    Bueno, vamos a pensar un poco. Como sabrs, los nombres oIDENTIFICADORES en Java son una cadena de caracteres que almacenan un valordeterminado, o el nombre de un mtodo, o el nombre de una clase, o yo qu s.Tenemos que tratar de inventarnos identificadores con nombres sencillos, que no sean

    rebuscados, sin caracteres raros. A m se me ocurren los siguientes:

    para el color, pues colorpara el nmero de patas, numPataspara la forma, pues formapara el mtodo que cambia el color, pues cambiarColor

    Definicin de propiedades

    Vamos a centrarnos en las propiedades, y luego veremos los mtodos.

    Seguimos pensando. El color ser una cadena de caracteres (marrn, violeta,joer, una mesa violeta...), que en Java se denomina String, al igual que la forma(Redonda, cuadrada). El nmero de patas ser un nmero entero, que se llama int.

    La definicin de la clase Mesa.java empezara as:

    class Mesa {String color;int numPatas;String forma;...

    Esto ya tenemos que ser capaces de entenderlo bien. Una mesa tiene un color, unnmero de patas y una forma. El nmero de patas es un nmero entero, mientras que laforma y el color son cadenas de caracteres. Bueno, pues as se han definido. Ahora noha lugar a pensar cmo se define el color de una mesa determinada, o su forma, o cmosaber qu color tiene otra mesa cualquiera..... todo eso ya lo veremos. Ahora estamosDEFINIENDO la clase Mesa, no hacemos nada ms.

    En cualquier libro encontrars los tipos bsicos de variables y sus rangos devalores. Tendrs que aprendrtelos, aunque slo para el examen. Luego, puedesolvidarlos. Bsicamente son

  • 8/14/2019 tareasjavanet Introduccin a Java

    13/79

    int, short, long, double, float, char,String y boolean.

    Este es un buenmomento para

    aprenderte los tiposde datos bsicos.

    Definicin de mtodos

    ya te los has aprendido?Bien! Vamos a porel mtodocambiarColor.Un mtodoconsta, aparte de su nombre

    (o IDENTIFICADOR), claro est, de

    a) valor de retorno.b) parmetros

    Un mtodo puede devolver un valor, o puede no hacerlo. Por ejemplo, unmtodo que calcule la suma de dos nmeros debera devolver otro nmero, o un mtodoque abra un fichero del disco debe devolver si ha podido abrirlo o no. Ahora bien, haymtodos que no tienen por qu devolver nada. Por ejemplo, un mtodo que muestre un

    saludo en pantalla no tiene por qu devolver nada.

    A la hora de definir el tipo de dato que devuelve un mtodo, se antepone alnombre de ese tipo de dato (int, float, boolean, String....) al nombre del mtodo. Porejemplo:

    int calculaSuma() // devuelve un enterofloat raizCuadrada() // devuelve un realboolean abrirArchivo() // devuelve un valor lgico

    Los mtodos que no devuelven nada se declaran como void:

    void saludo() // no devuelve nada

    Bien. Vayamos ahora a por los parmetros.

    Un mtodo que calcule 5*4 est claro que no va a necesitar parmetros, porque elmtodo no puede hacer nada ms que calcular 5*4. Sin embargo, un mtodo que calculela multiplicacin de dos enteros cualquiera necesitar conocer esos enteros, es decir, selos daremos como parmetro. Es como si queremos saber dnde est determinada calle,

    y le preguntamos a alguien: tenemos que decirle qu calle buscamos. Imagnate,Disculpe, podra decirme dnde est la calle? No tiene sentido, habra que preguntar

  • 8/14/2019 tareasjavanet Introduccin a Java

    14/79

    Disculpe (educacin ante todo), podra decirme dnde est la calle Butarque?.Bueno, pues como ste se te pueden ocurrir mil ejemplos

    EsMUY IMPORTANTEque diferencies cundo

    un mtodo necesitaparmetros y cundo no.

    Una cosa s es cierta: no hay una regla general para saber si un mtodo necesitaparmetros, para saberlo necesitamos la mplementacin del cdigo, y el sentido comn.

    Vamos a ver unos ejemplos:

    int suma(int a, int b)recibe un entero a y un entero b y devuelve otro entero

    String concatenar(String a, String b)recibe dos cadenas de caracteres y devuelve otra cadena de caracteres

    float raizCuadrada(int a)recibe un entero y devuelve un real

    Debe quedar MUY MUY MUY claro este rollo de los parmetros y del tipo dedato devuelto por un mtodo. Vamos a ver los mtodos anteriores implementados ycomentados para que se vea todo mucho mejor, y ya de paso aprendemos cmo hace un

    mtodo para devolver un valor usando return:

    int suma(int a, int b){return a+b;

    }

    Este mtodo recibe dos enteros, a y b, y devuelve su suma, que ser otro entero.Si hacemos en cualquier parte del programa

    int numero = suma(3,5);

  • 8/14/2019 tareasjavanet Introduccin a Java

    15/79

    estamos diciendo que el entero numero va a valer lo que devuelva el mtodosuma pasndole como parmetros 3 y 5. suma devolver 3+5, y entonces numeropasar a valer 3+5.

    String concatenar(String a, String b){

    return a+ +b; // las comillas encierran un espacio en blanco}

    Recibe dos cadenas y las concatena poniendo un espacio en blanco entre medias.Fjate en la diferencia entre usar + con nmeros y usarlo con cadenas. Si en cualquierpunto del programa escribimos

    String cad = concatenar(Hola,Mundo);

    estamos diciendo que la cadena (String) cad va a valer el resultado queconcatenar devuelva pasndole como argumentos las cadenas Hola y Mundo;Como concatenar coge las dos cadenas que hemos pasado como parmetros (Hola yMundo) y las devuelve juntas con un espacio entre medias (devuelve Hola Mundo),la cadena cad pasar a valer Hola Mundo

    void saludo(){System.out.println(Holas!);

    }

    este mtodo no tiene parmetros, y no devuelve nada de nada. As, se le invocaren cualquier parte del programa:

    saludo();

    y ya est. Como en el mtodo no hay definidos parmetros, pues no le pasamosparmetros, y como el mtodo no devuelve nada, pues es ilcito escribir algo como:

    int resultado = saludo(); // mal!!!!!

    porque saludo() no devuelve nada (recuerda: se ha definido como void y nose ha escrito ningn return), y como no devuelve nada, Java no sabe qu valor meteren resultado.

    Bueno, pues este es el funcionamiento de un mtodo. A modo de resumen,cuando un mtodo es invocado, puede necesitar o no parmetros. Que los necesite o nodepende de cmo hemos definido dicho mtodo, es decir, si hemos definido variablesentre los parntesis del mtodo:

    ... metodo(parametro1, parametro2, ....) por ejemplo:int suma(int a, int b)

    o si no las hemos definido:

  • 8/14/2019 tareasjavanet Introduccin a Java

    16/79

    ... metodo() por ejemplo:void saludo()

    Un mtodo puede devolver un valor, o bien puede no devolver nada. Depende de cmohemos definido el mtodo: si lo definimos como void:

    void saludo()

    entonces no devuelve nada, pero si lo definimos de otra forma:

    int suma(....)

    entonces devolver un dato de un tipo determinado (int, float...), y ser OBLIGATORIOescribir un return en el cuerpo del mtodo.

    int suma(int a, int b){int resultado = a+b;

    }

    Este mtodo es casi igual al que hemos visto poco ms arriba, peeeeeeeeeero tiene ungrave problema: hemos dicho que devuelve un entero ( INT suma(int a, int b) ), pero nohay ningn return en el cuerpo del mtodo. Habr un error de compilacin!

    Una cosa ms, que un mtodo devuelva algn valor NO IMPLICA(curiosamente) que haya alguna variable que reeciba dicho valor. Es decir, las siguienteslneas son perfectamente legales:

    int resultado = suma(5,3);...suma(5,3);

    La nica pega es que la segunda lnea llama al mtodo suma, le pasa susparmetros pertinentes, pero nadie recibe el resultado. Esto, parece una chorrada, peroes til. Supongamos que tenemos un mtodo:

    boolean abrirFichero(String nombreFichero)

    cuya tarea es abrir un fichero determinado. Este mtodo devuelve un booleanque indica si se ha abierto el fichero con xito. Bien, puede que en algn momentohagamos:

    boolean hemosPodido = abrirFichero(miFichero.txt);

  • 8/14/2019 tareasjavanet Introduccin a Java

    17/79

    para saber si hemos podido abrir el fichero. Esto sera lo ms normal, pero en algunasocasiones no necesitamos saber si se ha abierto exitosamente, porque sabemos que va aser as, por ejemplo, al hacer algn programilla tonto en nuestra casa. Si no necesitamosasegurarnos de si el fichero se ha abierto o no, entonces podemos hacer

    abrirFichero(miFichero.txt);

    e ignoramos el valor que abrirFichero devuelve.

    Bueno, pues esto es todo sobre los mtodos! Antes de seguir adelante, comosiempre, asegrate de haber entendido bien los conceptos de:

    PROPIEDADMTODOTIPO DE DATOS (int, float....)

    PARMETROSVALOR DE RETORNO DE UN MTODOSENTENCIA RETURNVOIDRecuerda siempre que un valor de retorno puede ser ignorado

    Ejercicio

    Una vez hayas entendido perfectamente todo este rollo, puedes escribir ladefinicin completa de la clase Mesa. Plantate qu parmetros le pasaramos al mtodo

    cambiarColor() y qu valor devolvera. Vamos!

    Solucin

    A m se me ocurre que cambiarColor() tendra como parmetros una nicaString, y no devolvera nada. El resto de la clase ya lo hemos definido.

  • 8/14/2019 tareasjavanet Introduccin a Java

    18/79

    class Mesa {String color;int numPatas;String forma;

    void cambiarColor(String nuevoColor){color = nuevoColor; Empieza lo bueno...

    }}

    Creacin y uso de objetos

    Ya tenemos definida la clase Mesa. Ahora quiero crear una mesa. Cmo se haceeso?...

    primero: las referencias

    Cuando creemos un objeto, la JVM genera una burbujita que es nuestro objeto.Claro, que para que ese objeto haga cosas necesitamos llamarlo de alguna forma. Siquieres que, en medio de una fiesta atestada de gente tu amigo Miguel te diga, porejemplo, la hora, como digas Dime la hora!, no te van a hacer ni caso, porque cada

    uno pensar (si te ha odo) que no le ests llamando a l. Tendrs que decir Miguel,dime la hora!, para que el seor Miguel te haga caso. En definitiva, que si vas dandogritos por la calle ni Dios te va a hacer caso, mientras que si a cada frase le antepones elnombre de la persona a la que imperas, pues ya te puede atender.

    En Java esto es exactamente igual, a cada objeto se le debe dar un nombre parapoder llamarle de alguna forma cuando le necesites. Bien, pues a estos nombres se lesdenomina Referencias. Si yo creo dos mesas y quiero cambiar el color de una sla,Cmo le digo a la JVM a qu mesa quiero cambiar el color? Pues fcil, si creo dosmesas, a una la llamo Margarita y a la otra Alberto, y luego digo que cambie el

    color de Margarita.

    segundo: el operador new

    newsignifica nuevo. Y este es un ejemplo de otra cosa que por este simplehecho no va a recibir ningn premio. new sirve para

    a) crear un nuevo objetob) definir la REFERENCIA a ese nuevo objeto.

    Cmo se usa? Pues muy fcil:

  • 8/14/2019 tareasjavanet Introduccin a Java

    19/79

    CLASE REFERENCIA = new CLASE();

    por ejemplo:

    Mesa Margarita = new Mesa();Mesa Alberto = new Mesa();

    por ahora, olvida losparntesis de new CLASE()

    Por qu esos parntesisen new Mesa()? Por ahora,haz caso al pez.

    Pues ya sabemos definir objetos e incluso crearlos! Ahora, vamos a aprender autilizarlos.

    Supongamos que quiero crear dos mesas, Margarita y Alberto, y quiero cambiarel color de la mesa Margarita. Tendr que llamar al mtodo cambiarColor() de la mesaMargarita. Cmo se hace esto? Pues usando algo tan tonto y tan simple como un punto:

    Mesa Margarita = new Mesa();Mesa Alberto = new Mesa();Margarita.cambiarColor(Rojo);

    Quiero cambiar el color de la mesa Alberto?

    Alberto.cambiarColor(Azul);

    Ya est. Hala. Pareca complicado todo esto? Pues ya ves qu complicacinms grande. Ya sabemos definir objetos, crearlos y usar sus mtodos. Para que teconvenzas, aqu tienes un cachito de mi prctica de Junio:

    log.write(" tipoReserva = "+r.getTipoReserva());

    log.write(" horaInicio = "+r.getHoraInicio());log.write(" horaFin = "+r.getHoraFin());log.write(" fecha = "+r.getStringFecha();

    Sabiendo que log y r son objetos, Hay algo complicado? Hay algo que noentiendas? Claro que no!

    Constructores

  • 8/14/2019 tareasjavanet Introduccin a Java

    20/79

    A primera vista, parece que new es un CONSTRUCTOR, porque su misin esconstruir nuevos objetos. Bueno, pues nooooop. new INVOCA a un constructor, NOES un constructor. Bueno, no es tan difcil. new invoca a un constructor. Vale. Yqu es un constructor?

    Un constructor es un mtodo especial, propio de cada clase. Su funcin esINICIALIZAR el contenido, las propiedades, el estado, etc etc del objeto. Podemoshacer que cuando creemos una mesa cualquiera, comience siendo cuadrada de cuatropatas y azul. Pero eso lo veremos luego.

    Por qu el constructor es especial? Por varias razones:

    Primero: se invoca UNA VEZ para cada objeto. Los mtodos de un objeto sepueden llamar todas las veces que quieras:

    Margarita.cambiarColor(rojo); // y acto seguido....Margarita.cambiarColor(azul); // y otra vez...Margarita.cambiarColor(verde);

    Sin embargo, el constructor va a ser invocado una sla vez, cuando lo diganew.

    Segundo: nunca devolver ningn valor

    Tercero: sin embargo, no se define como void. Recuerda que cuando un

    mtodo no devuelve ningn valor, se define como void. Bueno, pues elconstructor no.

    Cuarto: su nombre es el mismo nombre de la clase a la que pertenece. Nopuedes escoger el nombre del constructor.

    Recuerdas los parntesis a los que se refera el pez?

    Mesa Margarita = new Mesa();

    Por qu estos parntesis? Pues est ya claro: Mesa() es el nombre de unmtodo, el CONSTRUCTOR, y por eso lleva parntesis.

    Bueno, pues una vez dicho esto, vamos a cambiar un poco lo que decamos sobreel uso de new, y vamos a cambiarlo por:

    CLASE REFERENCIA = new CONSTRUCTOR();

    Antes de seguir, asegrate de entender bien los conceptos de

    REFERENCIAOPERADOR PUNTO .

  • 8/14/2019 tareasjavanet Introduccin a Java

    21/79

    NEWCONSTRUCTOR

    Definicin de constructores

    Vamos a definir un constructor para la clase Mesa. Nuestra intencin, hacer quecada mesa nueva sea cuadrada, azul y con cuatro patas. Bueno, pues es muy fcil,aadimos a la clase el mtodo en negrita:

    class Mesa {String color;int numPatas;String forma; RECUERDA:

    el constructor tiene el

    void cambiarColor(String nuevoColor){ mismo nombre que su clase,color = nuevoColor; no devuelve ningn valor,

    } y se define sin void

    Mesa() {color = azul;numPatas = 4;forma = cuadrada;

    }}

    Ahora, cuando hagamos

    Mesa Margarita = new Mesa();

    Margarita ser una mesa cuadrada azul de cuatro patas, Una mesa encondiciones, vaya!

    Pero hay un problema: yo no quiero mil mesas iguales. Yo quiero crear una mesacomo a m me d la gana, yo no quiero que todas las mesas sean azules y cuadradas con

    cuatro patas. Se te ocurre algo para solucionar esto?

    Podemos definir un constructor con parmetros! As, cuando creemos una mesale daremos su color, su nmero de patas y su forma iniciales. A ver, sera algo as:

    Mesa(String colorInicial, int numPatasInicial, String formaInicial){color = colorInicial;numPatas = numPatasInicial;forma = formaInicial;

    }

  • 8/14/2019 tareasjavanet Introduccin a Java

    22/79

    Esto es genial. Ahora podemos hacer:

    Mesa Margarita = new Mesa(rojo, 4, redonda);Mesa Catalina = new Mesa(verde, 3, triangular);

    Hala. Qu constructor te gusta ms? Podemos prescindir de uno de ellos.Aunque, gracias a algo que llamaremos Polimorfismo, podemos quedarnos con losdos constructores A LA VEZ. (Vaya! dos constructores diferentes!)

    El Polimorfismopermite tener varios

    mtodos diferentes entre sy con el mismo nombre.

    Un buen momento para echarleun vistazo!

    Si te digo la verdad, yo pocas veces uso los constructores con parmetros (queno significa que sean malos, eh? no te creas......). En su lugar, utilizo los.....

    Mtodos get/set

    Cuando no definimos un constructor en una clase, al invocar new la JVMusar el CONSTRUCTOR POR DEFECTO, que inicializa las propiedades del objetocon ceros, referencias nulas, etc (que lo de referencias nulas no te asuste! ya loveremos). Para inicializar las propiedades usamos un constructor personalizado,propio, caracterstico, o como lo quieras llamar. Estupendo.

    supn que en medio del programa quiero cambiar UNA SOLA propiedad de unobjeto. En nuestro caso, puedo cambiar el color. Pero imagina que tengo una mesa roja:

    Mesa Margarita = new Mesa(rojo, 4, redonda);

    Y quiero hacer que sea amarilla. Bueno, pues tengo dos opciones:

  • 8/14/2019 tareasjavanet Introduccin a Java

    23/79

    primera: crear una nueva mesa, casi igual:

    Mesa Margarita = new Mesa(amarillo, 4, redonda);

    (Esto parece guai, pero te aseguro que no siempre va a resultar fcil)

    segunda: definir una serie de mtodos que cambien UNA SOLA propiedad delobjeto. A este tipo de mtodos se les denomina mtodos set, porque suelen comenzarcon la palabra set (poner):

    Vamos a definir tres nuevos mtodos para nuestra clase Mesa:

    void setColor(String nuevoColor){color = nuevoColor;

    }

    void setForma(String nuevaForma){forma = nuevaForma;

    }

    void setNumPatas(int nuevoNumPatas){

    numPatas = nuevoNumPatas;}

    Fjate t qu cosas, oche. Ahora resulta que setColor y cambiarColor hacenexactamente lo mismo. Prescindiremos de uno de ellos. Por ejemplo, decambiarColor.

    Est bien esto, eh?

    Bueno, tmate un respiro, y vamos a por los mtodos get. Su funcin es

    obtener (get) el valor de una propiedad determinada. No es difcil adivinar que todomtodo get se definir con algn tipo de dato de retorno (int, String...) y que ademstendr un return. Normalmente los mtodos get no tendrn parmetros. Recuerdastodo eso? Si no, ya sabes....

    Vamos a definir los mtodos get de nuestra clase Mesa. Empecemos con elcolor. Llamaremos al mtodo getColor. Ya que el color es una String, getColordevolver una String:

    String getColor(){

    return color;}

  • 8/14/2019 tareasjavanet Introduccin a Java

    24/79

    De forma semejante haremos con getForma:

    String getFoma(){return forma;

    }

    getNumPatas devolver un valor entero:

    int getNumPatas(){return numPatas;

    }

    Bueno, pues resumimos nuestra clase Mesa; tres propiedades, tres mtodos setpara definir esas propiedades, tres mtodos get para obtener el valor de laspropiedades, un constructor con parmeros y otro sin parmetros, y pasamos delmtodo cambiarColor. La clase Mesa est escrita en la siguiente pgina. Aqu nocabe....

  • 8/14/2019 tareasjavanet Introduccin a Java

    25/79

    class Mesa {String color;int numPatas;String forma;

    void setColor(String nuevoColor){color = nuevoColor;

    }

    void setNumPatas(int nuevoNumPatas){numPatas = nuevoNumPatas;

    }

    void setForma(String nuevaForma){forma = nuevaForma;

    }

    String getColor(){return color;

    }

    String getForma(){return forma;

    }

    int getNumPatas(){return numPatas;

    }

    Mesa(String colorInicial, int numPatasInicial, String formaInicial){color = colorInicial;numPatas = numPatasInicial;

    forma = formaInicial;}

    Mesa() {color = azul;numPatas = 4;forma = cuadrada;

    }}

  • 8/14/2019 tareasjavanet Introduccin a Java

    26/79

    Variables de clase. Modificador static.

    Supn que tenemos una empresa que publica pginas web en Internet para otrascompaas. Supn que, como empresa que somos, en cada pgina queremos anunciarnuestros servicios, por ejemplo, poniendo nuestro nmero de telfono. As, cada vez que

    alguien visitase la pgina de uno de nuestros clientes sabra cul es nuestro telfono paraas poder contratar nuestros servicios. Hasta aqu bien, verdad?

    Vale. Supn que tenemos una clase paginaGu con las propiedades direccin,contenido y numeroTelfono. Cada vez que creemos una pgina, le daremos uncontenido, una direccin y nuestro nmero de telfono. Por supuestodefinimos en la clase todos los mtodos set y get necesarios. Creo que eresAhora supn que cambiamos nuestra sede y, por tanto, totalmente capaz denuestro nmero de telfono. escribir la clase

    paginaGuDios! Hemos creado mil pginas web

    y ahora tenemos que cambiar el nmero detelfono de todas! Mil llamadas al mtodosetNumeroTelfono!

    Pues no, si hacemos que todoslos objetos de la clase paginaGu compartanla propiedad numeroTelfono. As, si cambiamosel nmero de telfono de una sola pgina, cambiar el de todas las dems pginas. Guai.

    Creo que este ejemplo es muy ilustrativo, verdad? Bueno, pues pasemos a laaccin.

    En Java, una propiedad que se comparte por todos los objetos de una clase sellama variable (propiedad) de clase o esttica. Por qu? La primera denominacinhace referencia a que podemos entender que una variable compartida NO pertenece a lospropios objetos, sino slo a su clase. Es como si las Ideas de Platn definiesen no slolas propiedades y el comportamiento de los objetos fsicos, sino que adems definiesenel contenido de alguna propiedad. Si todas las mesas fuesen de madera, la propiedadmaterial de una mesa estara definida en la Idea de mesa, no en cada mesa.

    Bueno, pues es slo una idea. Respecto al otro nombre, variable esttica, steviene dado porque en Java, para definir una variable compartida se le antepone elmodificados static:

    static int numeroTelfono;

    Hala. Pues ya est. Aadiendo un static antes de una propiedad hacemos queesa propiedad sea compartida por todos los objetos.

    Supn ahora que queremos saber cuntas mesas hemos fabricado. Bueno, puesvamos a aadir una propiedad esttica numMesasFabricadas a la clase Mesa.

  • 8/14/2019 tareasjavanet Introduccin a Java

    27/79

    Inicialmente, numMesasFabricadas valdr cero, pero cada vez que un constructor seainvocado, aumentar en una unidad. Despus definiremos un mtodogetNumMesasFabricadas() para saber cuntas mesas llevaremos creadas. Bueno, puesla clase Mesa quedara definida asn (de nuevo, en una hoja aparte):

  • 8/14/2019 tareasjavanet Introduccin a Java

    28/79

    class Mesa {String color;int numPatas;String forma;static int numMesasFabricadas = 0;

    void setColor(String nuevoColor){color = nuevoColor;

    }

    void setNumPatas(int nuevoNumPatas){numPatas = nuevoNumPatas;

    }

    void setForma(String nuevaForma){forma = nuevaForma;

    }

    String getColor(){return color;

    }

    String getForma(){return forma;

    }

    int getNumPatas(){return numPatas;

    }

    Mesa(String colorInicial, int numPatasInicial, String formaInicial){color = colorInicial;numPatas = numPatasInicial;forma = formaInicial;numMesasFabricadas = numMesasFabricadas + 1;

    }

    Mesa() {color = azul;numPatas = 4;forma = cuadrada;numMesasFabricadas = numMesasFabricadas + 1;

    }

    int getNumMesasFabricadas() {return numMesasFabricadas;

    }}

  • 8/14/2019 tareasjavanet Introduccin a Java

    29/79

  • 8/14/2019 tareasjavanet Introduccin a Java

    30/79

    Constantes

    S! Tambin podemos definir constantes en Java. Una constante, comocomprenders, no slo no puede cambiar de valor: adems, debe ser compartida portodos los objetos. Vaya una constante tan estpida aqulla que no es la misma en todoslos objetos de la clase donde esa constante se define. En Pascal, C, C++, BASIC, etc etcetc las constantes se definen como const (de constant). Bueno, pues en Java, como es unlenguaje tan especialito el jodo, se definen con final.

    Es decir, que si yo quiero definir una constante, por ejemplo, pi, hago:static final int pi = 3,1415926535897932384626433832795;

    Hala. Ahora pi es una variable compartida por todos los objetos de la clase en lacual hemos definido la propia pi, y adems no puede cambiar de valor. Hala.

    Antes de seguir adelante, ya sabes...

    VARIABLE COMPARTIDAMODIFICADOR STATICMTODO COMPARTIDOLLAMADAS A MTODOS MEDIANTE EL NOMBRE DE LA CLASE

    ( Mesa.getNumMesasFabricadas() )MODIFICADOR FINAL

    Para comerse el coco..... (3)

    La clase Math contiene mtodos que hacen clculos numricos, comocoseno, seno, etc..... Si miras la definicin de estos mtodos, vers que ningunose salva, todos son mtodos static. Por qu crees que es as?

    El mtodo main, arrays y a lanzar programas!

    Seguro que te has dado cuenta de que hemos definido mil clases, mtodos ypropiedades, pero que realmente todava no hemos hecho ningn programa. Bueno.

    Vamos a solucionar eso.

    Un programa siempre tiene un punto de arranque, es decir, empieza en unmomento determinado. Bueno, pues en Java, este punto de arranque se llama mtodomain.

    Un programa suele constar de varios archivos, uno por cada clase que definimos.Bueno, pues en una de estas clases debemos definir el mtodo main. Comocomprenders, ser una buena prctica de programacin definir una claseexclusivamente para albergar el main. No es necesario, pero es muy buena prctica, es

    decir, que al margen de toda nuestra fabulosa coleccin de clases definimos otra mscuyo contenido sea un slo mtodo main. Bueno, pero vamos con el propio mtodo.

  • 8/14/2019 tareasjavanet Introduccin a Java

    31/79

    El main se define siempre igual, por norma en Java. Es un mtodo:

    esttico: ya sabes qu es esto.pblico: si lo sabes, te felicito. Bsicamente significa que puede accederse a este

    mtodo desde cualquier lugar, a diferencia de otros mtodos que puedenser privados. Bueno, ya lo veremos, vale?

    no devuelve datos: se define como voidse llama siempre mainrecibe como argumentos un array de Strings: tambin lo veremos.

    main queda definido entonces como:

    public static void main(String[] IDENT)

    Como comprenders, IDENT es un identificador al que puedes llamar como ted la gana. Normalmente recibe el nombre arg o args. Para qu sirve?

    Cuando ejecutamos un programa Java, lo que hacemos es escribir

    java clase

    y esto invoca a la JVM. Pero nosotros somos muy listos, y podemos arrancar elprograma pasndole argumentos:

    java clase arg1 arg2 arg3 ... argn

    Bueno, pues la JVM coge estos argumentos los mete en una lista. A este tipo delistas se les denomina array, y funciona de la siguiente manera:

    Uninciso: arrays

    Un array es una lista ordenada de elementos. Cada elemento tiene asociado unndice. El primer ndice es el cero, y el ltimo depende del nmero de elementos que

    haya guardados en el array.

    Un array, como una variable cualquiera, tiene un TIPO (int, float, String...) y unIDENTIFICADOR. Veamos cmo se declaran:

    tipo[] IDENT = new tipo[tamao];

    por ejemplo, hagamos un array de Strings de 5 posiciones:

    String[] miArray = new String[5];

  • 8/14/2019 tareasjavanet Introduccin a Java

    32/79

    y usamos el array como si fuese una variable normal, pero teniendo en cuenta losndices en los que guardamos valores:

    miArray[0] = Posicin primera...;miArray[1] = ... segunda...;

    miArray[2] = ...tercera...;miArray[3] = ...cuarta...;miArray[4] = y al siguiente da dej el colegio;

    Para saber el nmero de posiciones de un array usamos el operador .lengthFjate en el punto inicial de .length!:

    int tamao = miArray.length;

    Ahora tamao vale 5.

    sacab el inciso.

    Sigamos con el main.

    public static void main(String[] args)

    Cuando invocamos a la JVM, sta determina el nmero de argumentos quehemos introducido en

    java clase arg1 arg2 arg3 ...

    y crea el array que hemos llamado args. Bueno, Podemos, por ejemplo, escribirun programa al que le pasemos como argumentos un color y la forma, y l nos cree unamesa con cuatro patas y con ese color y esa forma. Usando System.out.printlnpodemos mostrar en pantalla las propiedades de la mesa.

    Meteremos el main en una nueva clase MesaMain (archivo MesaMain.java):

    class MesaMain{public static void main(String[] args) {

    Mesa Margarita = new Mesa( args[0], 4, args[1] );System.out.println(Hemos creado una mesa);System.out.println(con +Margarita.getNumPatas()+ patas,);System.out.println(de color +Margarita.getColor());System.out.println(y de forma +Margarita.getForma());

    }}

    Ahora, si compilamos Mesa y MesaMain con:

  • 8/14/2019 tareasjavanet Introduccin a Java

    33/79

    javac Mesa.javajavac MesaMain.java

    y hacemos:

    java MesaMain rojo, redonda

    el programa nos dice:

    Hemos creado una mesacon 4 patas,de color rojoy de forma redonda

    Hala. Nuestro primer programa. Es una pena, normalmente el primer programaque se escribe es mostrar en pantalla el saludo Hola mundo!, pero alguna vez hay quesaltarse las reglas, no? De todas formas eres perfectamente capaz de programar talsaludo, no? Haz una clase Saludo que contenga un main que muestre en pantalla elsaludo Hola mundo!. En total, cinco lneas de cdigo.

    Cuidado! El programa MesaMain exige que metamos al menos dosargumentos. Si ponemos slo uno, habr un error, y si ponemos siete, los ltimos cincose ignorarn.

    Programando a lo bestia. Estructuras de control.

    Hay una serie de estructuras que la mayora de los lenguajes de programacinposeen. Son las estructuras del control.

    Estas estructuras son fundamentalmente las condicionales y las repetitivas.Empecemos por las primeras.

    Sentencias condicionales

    sentencia if

    if es la estructura condicional por antonomasia en todos los lenguajes. Susintaxis es muy fcil:

    if (condicin) {bloque1

    } else {bloque2

    }

  • 8/14/2019 tareasjavanet Introduccin a Java

    34/79

    Si cualquier bloque consta slo de una sentencia, entonces las llavescorrespondientes a ese bloque pueden eliminarse. Es cuestin de comodidad.

    Expliquemos. la condicin es una expresin lgica, es decir, booleana. Si estaexpresin da como resultado TRUE, se ejecuta el bloque1, mientras que si la expresines FALSE se ejecuta bloque2. As de simple. Claro, que queda un poco al aire eso de laexpresin booleana. Vemosla:

    Una expresin booleana es cualquier cosa que pueda dar como resultado TRUEo FALSE. Por ejemplo, la comparacin de dos variables.Este es un buen momento paraver los comparadores de magnitud:

    == igual a!= diferente de> mayor que< menor que>= mayor o igual que 5) && (n2 < 3)) || !(n3 >= n4)

    Otro tipo de expresin booleana puede ser un valor boolean devuelto por unmtodo. Veamos un ejemplo:

    Para saber si dos nmeros son iguales utilizamos el smbolo ==

    if (num1 == num2){System.out.prinln(Son iguales);

    } else {System.out.println(Son diferentes);

    }

    Sin embargo, para saber si dos String son iguales no podemos utilizar elsimbolo de igualdad. Es una peculiaridad de Java que no viene ahora a cuento:

  • 8/14/2019 tareasjavanet Introduccin a Java

    35/79

    Aparentemente, si tenemos

    String string1 = Hola;String string2 = Hola;String string3 = Adis;

    la expresin booleana ( string1 == string2 ) debera ser TRUE, pero no es as.

    Para comparar Strings utilizamos el mtodo .equals() ste es un mtodo quefunciona de la siguiente manera: partiendo de las strings anteriores,

    string1.equals(string2) da un resultado de TRUE, mientras questring1.equals(string3) da como resultado FALSE.

    En definitiva, .equals() es el mtodo que utilizamos para comparar una Stringcon otra. Como ves, un mtodo puede devolver un valor booleano, por lo que este valorpuede ser utilizado en una sentencia if:

    if (string1.equals( string2 )) { RECUERDA:System.out.println(Son iguales); los nmeros se comparan

    } else { con == != > < >=

  • 8/14/2019 tareasjavanet Introduccin a Java

    36/79

    Una sentencia ifpuede definirse sin su else correspondiente:

    if (string1.equals(string2)){System.out.println(Son iguales);

    }...

    Pero hay que tener mucho cuidado con esto, sobre todo si anidamos ifs.Supongamos que queremos comparar dos enteros n1 y n2, y saber si son iguales o si n1> n2. No nos importa saber si n2 > n1. Recuerda que cuando un bloque consta slo deuna sentencia (que puede ser perfectamente una sentencia if), las llaves pueden

    eliminarse.

    int n1 = 1;int n2 = 10;

    if (n1 != n2)if (n1 > n2)

    System.out.println(n1 > n2);

    // no comprobamos si n2 > n1

    elseSystem.out.println(Son iguales);

    Bueno, pues este fragmento es errneo. Si n1 y n2 son iguales, el programa noavisa. De hecho, tomando los valores 1 y 10, el programa dice que son iguales. La raznes que el else aparentemente pertenece al primer if, pero en realidad pertenece alsegundo if! El fragmento correcto sera el siguiente:

    int n1 = 1;int n2 = 10;

    if (n1 != n2)if (n1 > n2)

    System.out.println(n1 > n2);else

    // cualquier sentencia que no haga nada, por ejemplon1 = n1;

    else

    System.out.println(Son iguales);

  • 8/14/2019 tareasjavanet Introduccin a Java

    37/79

    Bueno, hay que pasar siempre por estas cosas! Mucho cuidado cuando anidesifs, pon siempre sus elses, aunque no hagan nada. Otra opcin, tal vez te guste ms, esla siguiente:

    int n1 = 1;int n2 = 10;

    if (n1 != n2)if (n1 > n2)

    System.out.println(n1 > n2);else { } // bloque de cdigo vaco

    else System.out.println(Son iguales);

    Aqu hacemos uso de un bloque vaco, lo delimitamos con { }, y sin embargo nometemos nada entre esas llaves. Bueno, todo son opciones.

    Personalmente te recomiendo que cuando empieces a programar siempreescribas las llaves, aunque encierren una sla sentencia, o aunque estn vacas:

    int n1 = 1;int n2 = 10;

    if (n1 != n2) {

    if (n1 > n2) {System.out.println(n1 > n2);

    } else { }

    } else {System.out.println(Son iguales);

    }

    As siempre vers claramente los bloques y la dependencia de ifs y elses.

    Como vers en las pruebas de programas, las sentencias condicionales sonsiempre una fuente de errores, debido, por ejemplo, a cosas como estas. Estos errores seeliminan mediante las pruebas de caja blanca, es decir, conociendo el cdigo delprograma. Si tienes que probar un programa y te dan el cdigo, mira siempre la

    dependencia de ifs y elses, vale?

  • 8/14/2019 tareasjavanet Introduccin a Java

    38/79

    sentencia switch

    Esta sentencia es muy peculiar. Permite ejecutar determinada parte de unfragmento de cdigo en funcin de un nmero enteo. Me explico.

    switch (expresin) {

    case caso1:bloque1

    case caso2:bloque2

    .

    .

    .

    }

    Bueno, pues esto es fcil. Vamos a ver. expresin es un nmero entero. Si hayalgn caso que coincida con ese nmero entero, entonces se ejecutan todos los bloquesque haya a partir de ese caso, no slo el bloque que corresponde a ese caso. Unpoco raro, no? Bueno, veamos un ejemplo:

    switch (n){

    case 1:System.out.println(uno);

    case 2:System.out.println(dos);

    case 3:System.out.println(tres);

    }

    Date cuenta de que no es necesario poner llaves, sean los bloques como sean,una sentencia o ms.

    Si n = 1, por lo que se ejecuta el caso 1 y todos los casos posteriores, es decir,el 2 y el 3. Por eso, si n = 1 se imprimira en pantalla

    unodostres

  • 8/14/2019 tareasjavanet Introduccin a Java

    39/79

    mientras que si n = 2 se imprimira

    dostres

    y si n = 3, pues se mostrara

    tres

    Por la razn que hemos visto. Repito. Se ejecuta el bloque que corresponde alcaso y los bloques siguientes. Por eso, si n = 1, se ejecuta el caso 1 y los siguientes, esdecir, los casos 2 y 3.

    Hay alguna forma de hacer que se ejecute slo el caso que corresponda, y que

    no se ejecuten los casos siguientes? Pues claro! usando break:

    switch (n){

    case 1:System.out.println(uno);break;

    case 2:System.out.println(dos);

    break;case 3:

    System.out.println(tres);break;

    }

    ahora, si n = 1, se muestra en pantalla

    uno

    a diferencia de antes.

    Otra cosa sobre los switches: existe un caso especial, el llamado default. Seejecuta este caso si no hay otro caso que corresponda a la expresin:

    switch (n){case 1:

    System.out.println(uno);case 2:

    System.out.println(dos);case 3:

  • 8/14/2019 tareasjavanet Introduccin a Java

    40/79

    System.out.println(tres);case default:

    System.out.println(ms de tres);}

    Aqu, si n = 4, se mostrara en pantalla

    ms de tres

    mientras que si n = 1, se vera

    unodostres

    ms de tres

    Bueno, no es tan mortal.

    Para comerse el coco...... (4)se te ocurre algn error en el siguiente cdigo de programa?

    switch (n){case 1:

    System.out.println(uno);

    break;case 2:

    System.out.println(dos);break;

    case 3:System.out.println(tres);break;

    case default:System.out.println(ms de tres);

    }piensa, piensa............

    Sentencias repetitivas (o iterativas)

    Adivina por qu se llaman as. Nos permiten repetir determinado fragmentode cdigo un nmero definido de veces.

    En realidad lo que se hace es determinar una condicin, una expresin lgica.As, mientras esta expresin sea TRUE el fragmento se repite, hasta que sea FALSE. Es

    decir, que no definimos un nmero de repeticiones, sino una condicin para que se

  • 8/14/2019 tareasjavanet Introduccin a Java

    41/79

    repita. Naturalmente podemos adecuar una condicin para que un fragmento se repitaun nmero determinado de veces. Bueeeno, poco a poco. Vale.

    Ya hemos tomado contacto con las expresiones lgicas, verdad? Fantstico.Aprndetelas bien, porque las vas a usar muncho muncho muncho.

    while

    permite repetir un bloque mientras una condicin sea TRUE. Primero secomprueba la condicin, y si es TRUE entonces se ejecuta el bloque:

    while (condicin){bloque

    }

    Un ejemplo:

    int n = 0;

    System.out.println(a contar);

    while (n

  • 8/14/2019 tareasjavanet Introduccin a Java

    42/79

    segundo, la condicin tiene que aceptar el primer valor . Es estpido que nopueda entrar en el bucle en el primer caso.

    tercero, las variables se actualizan al final del bloque. Es decir, es aconsejable

    que las variables cambien de valor justo en el final del bloque, no en la mitad ni alprincipio. Fjate, el n = n + 1 est al final.

    Repito que no es una regla general, que no tiene por qu ser as, pero queconviene. De hecho, seguir esta regla a veces complica la existencia una barbaridad.

    una variante de while: do while

    while, como hemos dicho, primero comprueba la condicin y si es TRUEejecuta el bloque. do while (o duguail para los amigos) primero ejecuta el bloque yluego comprueba la condicin. De esta forma, while puede no ejecutar nunca un bloque,ya que primero comprueba la condicin, pero do while, al comprobar la condicin alfinal, siempre ejecuta el bloque al menos una vez. Tpica pregunta de examen.

    Bueno, la estructura es semejante a la del while:

    do {bloque

    } while (condicin)

    Y esas reglas de antes, yo que t intentaba aplicarlas aqu tambin.

    for

    Esta es la ms complicada de todas. Se basa en lo siguiente:

    Fjate que while y do while tenan como tres partes:

    inicializacin de las variables

    condicinactualizacin de las variables

    te suena?

    int n = 0; // INICIALIZACIN

    System.out.println(a contar);

    while (n

  • 8/14/2019 tareasjavanet Introduccin a Java

    43/79

    }

    System.out.println(Ay!, que me canso);

    Bueno, pues for resume estas tres partes en una sola sentencia:

    for (inicializacin, condicin, actualizacin){bloque

    }

    Por ejemplo:

    System.out.println(a contar);

    for (int n = 0; n

  • 8/14/2019 tareasjavanet Introduccin a Java

    44/79

    Debo decirte que todo en programacin se aprende primero mediante teora, yluego mediante horas de prctica. Eso ya lo sabes. Pero en el uso de bucles ycondicionales es especialmente necesario que practiques con ellos. Trata de hacerprogramas simples (que sean un un solo main) que, por ejemplo, cuenten de un nmeroa otro, que cuenten pares, impares, que calculen sumatorios, factoriales..... Se te ocurre

    alguna forma de calcular los 100 primeros primos? Puedes implementar la criba deErasttenes con dos bucles for anidados y un array de enteros..... En fin, que cualquiercosa que se te ocurra, a por ella sin temor. Hazlo por m....

    Existe otra forma de abordar los problemas que se resuelven mediante sentenciasrepetitivas. Es una visin muy diferente y que, desgraciadamente, cuesta muchoentender. As que tratar de esforzarme. Es el temido tema de...

    Recursividad

    Como acabo de decir, la recursividad es una forma de solucionar problemas.Siempre se dice que todo algoritmo iterativo puede traducirse a una forma recursiva, yviceversa. Bueno, pues es cierto: si tienes un algoritmo iterativo puedes cambiarlo yconvertirlo en recursivo. De hecho es una pregunta muy propia de los exmenes deLaboratorio de Programacin. Bueno, vamos a ver entonces qu es esto de larecursividad.

    La recursividad es un concepto muy abstracto. As que atencin. Consiste en queun fragmento de cdigo se usa a s mismo. Ese es el corazn de la definicin. Porejemplo: hay un cuento que narra cmo un prncipe se meti en un gran barrizal, el cual

    le impeda caminar, ya que el lodo era demasiado denso. As que lo que hizo para salirfue tirar l mismo de sus botas hacia ariba, primero una, luego la otra, y as consegua lafuerza suficiente para avanzar por el barrizal, y logr salvarse.

    Bueno, es un ejemplo muy simple de cmo algo puede usarse a s mismo.Desgraciadamente abordaremos este tema de una forma ms difcil.

    Hay un ejemplo tpico del uso de la recursividad. Es el clculo de factoriales. Yasabes:

    n! = n (n-1) (n-2) ... 3 2 1

    pero, fjate:

    n! = n (n-1) (n-2) ... 3 2 1(n+1)! = (n+1) n (n-1) (n-2) ... 3 2 1

    entonces,

    (n+1)! = (n+1) n!

    y, por tanto,

    n! = n (n-1)!

  • 8/14/2019 tareasjavanet Introduccin a Java

    45/79

    Vale. Cursillo intensivo de Calculo I. Bueno. Observa que la definicin defactorial engloba un factorial. Por eso es recursivo.

    Para ver fcilmente cmo funciona la recursividad, vamos a considerar el

    siguiente ejemplo. A ver si te gusta.

    Supn la cola de la taquilla del cine. Si, antes de entrar a ver la pelcula hay unascuantas personas comprando la entrada. Aqu las tenemos:

    En un momento dado, el ltimo de ellos, el de la camiseta amarilla, desea saber aqu hora es la siguiente sesin. As que lo que hace es preguntrselo al de la camisetaroja:

    Pero, claro, resulta que el de la camiseta roja tampoco lo sabe. Un fastidio. Asque lo que hace es preguntrselo al de las rastas, mientras mantiene al de la camisetaamarilla a la espera.

    Pero el de las rastas tampoco lo sabe. As que hace la misma pregunta al de loszapatos amarillos, mientras mantiene al de la camiseta roja a la espera. Por supuesto, elde la camiseta amarilla sigue a la espera de que le responda el de rojo.

  • 8/14/2019 tareasjavanet Introduccin a Java

    46/79

    En fin, puedes adivinar que el de los zapatos amarillos no tiene ni idea, as que loque hace es preguntrselo a la taquillera de los pelos rojos. El de las rastas se quedaesperando a que el de los zapatos amarillos le responda. A todo esto, el de rojo estesperando al de las rastas, y el de la camiseta amrilla est hartndose de esperar.

    Pero vaya! resulta que la taquillera de los pelos rojos, a pesar de ser su primer

    da de trabajo, est muy puesta en el tema y sabe la respuesta. Claro, que ella responde aquien le ha preguntado, al de los zapatos amarillos:

    Ahora que el de los zapatos amarillos sabe la respuesta, se la dice al de las rastas,que le estaba esperando. El de rojo sigue esperando, claro, y el de la camiseta amarilla,ni te cuento.

  • 8/14/2019 tareasjavanet Introduccin a Java

    47/79

    Ahora el de las rastas ya sabe la respuesta. Pues va y contesta a quien le hapreguntado. El de la camiseta amarilla, todava sigue esperando.

    Una vez que el de rojo sabe la respuesta, por fin, se la dice al de la camisetaamarilla, que es el primero que pregunt, justito antes de que le diera un ataque de

    histeria.

    En fin, acabas de ver intuitivamente cmo funciona un algoritmo recursivo. Elprimero llama al segundo y espera a que le responda. El segundo llama al tercero yespera a que le responda, mientras el primero sigue esperando. Y as sucesivamente... yas recursivamente....

    Todo mtodo recursivo tiene parmetros y valor de retorno. Es parte del juego.Por qu?

    Bueno, vayamos poco a poco. Un algoritmo recursivo trata de resolver un

    problema, por ejemplo, el mtodo factorial() halla un factorial., por ejemplo, 5!. Siqueremos calcular 5! debemos pasar ese 5 al mtodo:

  • 8/14/2019 tareasjavanet Introduccin a Java

    48/79

    float resultado = factorial(5);

    Lo cual ya es una buena razn para pensar que el mtodo necesita parmetros.Pero, lo mejor de todo, y lo ms importante es que el propio mtodo factorial()llamar a factorial() pero con otro parmetro. factorial(5) llama a factorial(4), yste a factorial(3), y as sucesivamente. Por tanto, es ms que obvio que un mtodorecursivo necesita parmetros. Ufff...

    Pensar que un mtodo recursivo no ha de tener parmetros es como pensar queen la cola del cine el de la camiseta amarilla pregunta al de rojo disculpe, podradecirme?

    Decamos que un mtodo recursivo siempre devolver un valor. Claro, Por qu?Pues muy sencillo: cuando factorial(5) llama a factorial(4) lo hace para averiguar el

    factorial de cuatro. As que factorial(4) debe devolver un valor, exactamente 24.

    Pensar que un mtodo recursivo no devuelve ningn valor es como pensar queen la cola del cine el de rojo responde al de amarillo claro! la pelcula empieza a las.Joer, imagina la conversacin.

    En definitiva, esto es una especie de demostracin intuitiva para que te percatesde que un mtodo recursivo necesita, exige, precisa y requiere parmetros, ysiempre devuelve algn valor. Si algn mtodo recursivo no tiene parmetros y/o nodevuelve algn valor, es porque tiene un diseo extrao, poco comn.

    Mi compaero de la prctica de Programacin, primer cuatrimestre, resolvivarios problemas de la prctica mediante un mtodo recursivo que ni tena parmetros,ni devolva valores. Y funcionaba a las mil maravillas. Pero, repito, es un caso muyraro. Yo jams habra hecho tal mtodo recursivo, sino iterativo. O sea, que la mximade antes no es tal mxima, pero yo te aconsejo que la sigas siempre que puedas.

    Todo mtodo recursivo consta de tres partes. Primero veamos esas partes y luegote pondr un ejemplo, vale?

    a) caso base: el caso en el que no se necesita una llamada recursiva. Porejemplo, factorial de 1.b) caso no base: el caso en el que se hace la llamada recursiva. Por ejemplo, el

    factorial de 36.c) conquista: consiste en, despus de hacer la llamada recursiva, obtener el

    resultado que piden al mtodo.

    El caso base podramos relacionarlo con la taquillera de los pelos rojos. Ellapuede contestar a la pregunta sin necesidad de preguntar a nadie ms, es decir, sin hacerninguna llamada recursiva. El caso no base es cualquiera de las personas de la cola:

    para resolver la duda han de plantersela a otra persona, no pueden resolverla por smismos. La conquista sera un poco ms rara: el paso de la respuesta que a uno le ha

  • 8/14/2019 tareasjavanet Introduccin a Java

    49/79

    llegado hacia la persona que le ha preguntado. Es decir, el de rojo lleva a cabo laconquista cuando el de las rastas le responde, y el de rojo toma esa respuesta y se la daal de amarillo.

    No confundas caso no base y conquista: el caso no base es la condicin, y la

    conquista es la accin. Huy, qu bonito.

    Bueno, lo prometido es deuda. Vamos a implementar el mtodo factorial. Loimplementaremos poco a poco, as que no te hagas un lo con las llaves, vale?

    Bueno: primero necesitamos parmetros, un entero, y devolveremos un enterolargo:

    long factorial( int numero ) {

    Vamos a definir un entero largo, que ser la respuesta que el mtodo devolver:

    long respuesta = 0;

    Ahora debemos diferenciar entre caso base y caso no base. El caso base ser elfactorial de 1, y el caso no base, cualquier otro.

    if ( numero == 1 ) { // caso baserespuesta = 1;

    } else {

    Ahora viene el caso no base. La respuesta se hallar mediante la llamadarecursiva. Ya que n! = n * (n-1)!, haremos:

    respuesta = numero * factorial(numero 1);}

    Y por ltimo, la conquista. Debemos devolver la respuesta que hemoshallado a quien nos lo pregunta:

    return respuesta;}

    Aqu est el mtodo al completo:

  • 8/14/2019 tareasjavanet Introduccin a Java

    50/79

    long factorial( int numero ) {

    long respuesta = 0; // lo que devolveremos

    if ( numero == 1 ) { // caso baserespuesta = 1; // devolveremos 1

    } else { // caso no base: llamada recursivarespuesta = numero * factorial(numero 1);

    }

    return respuesta; // conquista!}

    Pues nada, esto compila perfectamente, y funciona. Por cierto, este cdigo notiene tratamiento de errores, as que no le hagas perreras, tipo factorial(-3), porque se teva a quedar ms colgao que el telefrico. Claro, que... Por qu no le haces t lasmedidas de seguridad? No es difcil... nimo!

    Bueno, ahora voy a contarte un pequeo truco que nadie cuenta para entenderbien el funcionamiento de un mtodo recursivo.

    Vers, cuando un mtodo se llama a s mismo, imagina que lo que ocurre es queen la memoria del ordenador se hace una copia del mtodo. As que lo que t deberashacer para entender un mtodo recursivo es pensar que existen varias copias del mtodoen memoria. Si tienes este cdigo:

    long factorial( int numero ) {long respuesta = 0;

    if ( numero == 1 ) {respuesta = 1;

    } else {respuesta = numero * factorial(numero 1);

    }

    return respuesta;}

    Trata de pensar que, cuando el programa arranque, por ejemplo, al calcular elfactorial de 3, lo que tendrs es esto:

  • 8/14/2019 tareasjavanet Introduccin a Java

    51/79

    Uff... no se ve muy bien... he tenido que reducir mucho la letra para que entrenlas tres copias. Sorry. Bueno, pues con esta imagen t puedes imaginar el proceso que se

    lleva a cabo al calcular factorial(3). El trascurso del programa est marcado con la lnearoja.

    El dibujo est en la pgina siguiente, porque es un poco grande. En l puedes vercmo la primera llamada viene desde las alturas, en la parte de arriba a la izquierda. Esallamada mete el 3 como parmetro en la primera copia de factorial. ste, al ver queno es un caso bsico, hace la segunda llamada pasando como parmetro 2 a lasegunda copia del mtodo. La segunda copia acta de forma semejante, pasando 1 a latercera copia. sta identifica que es el caso bsico y conquista la respuesta, en estecaso 1. La respuesta vuelve a la segunda copia, quien lleva a cabo la segunda conquista,

    devolviendo a la primera copia 2. La primera copia, a su vez, lleva a cabo suconquista devolviendo al ente en las alturas 6.

  • 8/14/2019 tareasjavanet Introduccin a Java

    52/79

    Espero que haya sido una explicacin muy grfica. Creo que no soy capaz deexplicarlo de otra manera mejor, as que, si no lo has pillado bien, releelo tododespacito. Trata de ir muy lentamente, viendo cmo se comporta cada copia defactorial, identificando cada paso con la situacin de la cola del cine, vale? Espero quehayas perdido el miedo a la recursividad, y estoy convencido de que cada vez quepreguntes algo a alguien, y este alguien se lo pregunte a otro te acordars de todo esto.

    Hala. Se acab. Crees que te voy a dejar sin la lista de conceptos? Puesnoooooo...

    MTODO ITERATIVO / RECURSIVOMETODOLOGA DE LA RECURSIN: la cola del cineMTODO RECURSIVO

    PARTES DE UN MTODO RECURSIVOcaso base, caso no base, conquista

    Como curiosidad....Sabes por qu se le llama conquista? Pues es muy sencillo. Los mtodos

    recursivos se suelen usar para resolver problemas partindolos en cachitos mspequeos. Por ejemplo, buscar a una persona en una cola de gente: primero buscas en lamitad izquierda, y luego en la derecha. Esto lo vers muy profundamente en Laboratoriode Programacin. Bueno, pues como ya sabrs, hay un refrn rabe que dice: divide y

    vencers. En ingls, divide and conquer. De ah lo de conquista.

  • 8/14/2019 tareasjavanet Introduccin a Java

    53/79

    Bueno, vamos a abordar una de las partes ms bonitas de la OOP, aunque traesus dolores de cabeza, no te creas. Algunos lenguajes, como C++ basan gran parte de suingente potencial en esto que llamamos...

    Herencia

    Bueno, est claro qu es la herencia. Es lo que unos padres dejan a sus hijos. Omejor dicho, lo que unos padres transmiten a sus hijos por va gentica. Las personassomos creadas mediante herencia de genes, a pachas entre papi y mami. En definitiva,que pap y mam no nos definen desde el principio, sino que toman sus propios genespara crearnos a nosotros. Bueno, afortunadamente esto no es tan fcil en gentica comoen programacin.

    Pero el concepto que te tiene que quedar muy claro es que la herencia es unmecanismo de definicin, no un mtodo para suspender a los de primero de Teleco, niun galimatas conceptual, sino que es una forma de definir nuevos objetos a partir delos existentes. La herencia sirve para definir.

    En Java una clase slo puede heredar de otra clase. No se admite que unaclase herede de varias clases, como s se puede hacer, por ejemplo, en C++. En Java, portanto, no hablamos nunca de herencia mltiple. Adems, la herencia en Java sedenomina extensin: decimos que una clase extiende a otra.

    Por tanto tenemos que tener en cuenta que, en Java, los objetos slo tienen un

    padre, y adems, heredan de l el 100%, no como en las personas que heredan el 50%

    Bueno, pues sin ms prembulos nos podemos plantear alguna estructurajerrquica, es decir, algn diagrama de clases en el que dichas clases se relacionenmediante mecanismos de herencia. Por ejemplo, se me ocurre pensar que una moto escomo una bicicleta con motor. De ah lo de motocicleta. Bieeeeen

    Bueno, pues pasemos a escribir. Por cierto, veremos muchasel fin de este cdigo que ahora vamos a escribir es clases definidas de forma

    puramente didctico, no funcional. muy tonta. A veces inclusosin definir. Eso es porqueEs decir, que vamos a definir una realmente su contenido

    bicicleta y una moto, pero de una no importa nada.forma muy estpida. Vers:vamos a definir las clases Rueday Motor de una forma un tantopeculiar, aunque simpticadonde quepa:

  • 8/14/2019 tareasjavanet Introduccin a Java

    54/79

    class Rueda {void saludar() {

    System.out.println(Soy una rueda);}

    }

    class Motor {void saludar() {

    System.out.println(Soy un motor);}

    }

    Ahora hacemos que una bicicleta sea, simplemente, dos ruedas:

    class Bicicleta {Rueda delantera;Rueda trasera;

    Bicicleta(){ // el constructordelantera = new Rueda();trasera = new Rueda();

    }

    void saludar() {System.out.println(Soy una bicicleta);

    }}

    Bueno, pues vamos a definir la moto. Para hacer que una clase hijo extienda aotra padre, la primera clase se define as:

    class hijo extends padreBueno, pues a ello.

    class Moto extends Bicicleta {Motor motor;

    Moto() { // el constructormotor = new Motor();

    }

    void saludar(){System.out.println(Soy una amoto);

  • 8/14/2019 tareasjavanet Introduccin a Java

    55/79

    }}

    Estas cuatro clases son lo ms fcil del mundo. Si no las entiendes, para y vuelveatrs, porque son de lo ms bsico. Pero seguro que las entiendes sin problemas,verdad?

    Fjate en el uso de la herencia: la clase Moto slo define un mtodo saludar yuna propiedad Motor, pero hereda de la clase Bicicleta, por lo que tambin posee todoslos contenidos de Bicicleta. Por tanto, Moto hereda de la clase Bicicleta las dos ruedas.Te percatas de cmo se usa la herencia para definir clases? Definimos el contenido deMoto a partir del contenido de Bicicleta.

    Respecto al mtodo saludar, fjate que Motorredefine el mtodo saludar que

    hereda de Bicicleta. La clase padre tena un mtodo saludar, pero la clase hija tambinlo tiene. Se dice que lo redefine (overrides). Sin embargo, debe quedar muy claro queredefinir un mtodo no implica que el mtodo anterior deje de existir, es decir, queel mtodo saludar de Bicicleta sigue existiendo a pesar de haberlo redefinido en laclase moto.

    No tendra sentido que una moto saludase como una bicicleta, no? Aunque note creas, que gracias al casting, que en breve veremos, podemos hacer que una motopueda saludar como moto y como bicicleta.

    Bueno, pues eso es todo sobre cmo se usa la herencia. Vemos cmo hemosdefinido una moto a partir de la definicin de una bicicleta, verdad?. Ahora, encualquier parte del cdigo, por ejemplo, en un main podemos hacer sin problemas:

    Bicicleta Antonieta = new Bicicleta();Moto Anacleta = new Moto();

    Bueno, pues al crear a Antonieta se crearn las ruedas, y al crear a Anacleta secrear el motor. Podemos hacer sin problemas:

    Antonieta.saludar();Anacleta.saludar();

    y cada una nos saludara diciendo lo que son. Hala. Voy a compilar este cdigo aver si da problemas...... no, parece que no los da.

    Vamos a plantear una cuestin: una Bici, al crearse, crea las dos ruedas. Unamoto, al crearse, crea un motor. Pero, Se crean las ruedas al crearse la moto? Fjate enel constructor de la clase Moto:

    Moto() { // el constructor

  • 8/14/2019 tareasjavanet Introduccin a Java

    56/79

    motor = new Motor();}

    Pregunta: Crees que al invocar al constructor de Moto se invocaautomticamente el constructor de su superclase Bicicleta?

    Desgraciadamente no. Tal y como estamos, al crear una moto se crea su motor,pero no sus ruedas. Ayayayayyyyyy.... cmo arreglamos esto?

    Opcin primera: crear especficamente las ruedas en el constructor de la moto:

    Moto() { // el constructordelantera = new Rueda();trasera = new Rueda();motor = new Motor();

    }

    Esto es perfectamente vlido. Pero hay otra solucin ms mejor:

    Opcin guai: Hacer uso de la palabra super(). Esta palabreja se utiliza en elconstructor de una clase para llamar al constructor de su superclase. Es decir, que

    si hacemos:

    Moto() { // el constructorsuper();motor = new Motor();

    }

    entonces, cada vez que creemos una moto se crear la bicicleta que reside en suinterior (oh! una lgrima resbala por mi mejilla....) y luego el motor. Es como si

    al crear a una persona primero

  • 8/14/2019 tareasjavanet Introduccin a Java

    57/79

    En definitiva, creas lo que tiene de sucuando una clase extiende padre y luego creas ela otra, el constructor de la resto de cosas.clase hija debe llamar al Una visin muy peculiar,

    constructor de la clase madre, no crees?y esto se hace mediante Por cierto, conviene

    super(). que super() sea lo primero queaparezca en el constructor, antes de

    cualquier otra sentencia. Te has preguntadopor qu super() tiene parntesis? Deberas adivinarlo,

    pero por si acaso, te lo digo. super() es el constructor dela superclase, y recuerda que el constructor no es ms que

    un mtodo un tanto especialito, pero mtodo al fin y al cabo.Y si no recuerdas mal, los mtodos llevan parntesis siempre....

    nota

    Cuando una clase hereda de otra no es necesario que llame al constructor de su superclase, perosiempre que crees una clase hija, lo ms normal es que s lo haga. Plantate la lgica de este hecho: supnun mecnico que sabe que una moto es una bicicleta con motor. Si le piden fabricar una moto, entoncesprimero crear una bicicleta y luego le pondr un motor. Es decir, primero crea la clase padre y luego lahija. Supn ahora que defines una motopija, que es una moto con aire acondicionado . Pues al crearla,primero crears una moto y luego le pondrs el aire. Esto implica crear primero una bicicleta, luego

    ponerle motor para hacer la moto, y luego ponerle el aire para hacer la motopija. Vaya, dos super()....

    Weno, pues, como siempre, antes de seguir asegrate de pilotar:

    HERENCIACLASE PADRE / CLASE HIJOUSO DE extendsREDEFINICIN (OVERRIDING) DE MTODOS

    (que a continuacin veremos con ms detalle)USO DE super()

    CONCEPTO DE MOTO CON AIRE ACONDICIONADO

    Animo! ya queda poco de OOP!

    Preludio al Casting: las referencias

    Bueno, no tiene nada que ver con actores. Qu pena, verdad?

    Casting significa algo as como convertir. El objetivo del casting es hacer queun objeto que se ha definido mediante herencia se comporte como un objeto de una de

    sus superclases. Es decir, que una moto salude como una bicicleta, o que una moto deje

  • 8/14/2019 tareasjavanet Introduccin a Java

    58/79

    de tener motor, o cosas por el estilo. En realidad el casting es algo un poco msprofundo, pero empezaremos por lo fcil. No te creas, acabaremos con lo difcil....

    Bueno, pues recordemos las definiciones de Moto y de Bicicleta:

    class Bicicleta {Rueda delantera;Rueda trasera;

    Bicicleta(){ // el constructordelantera = new Rueda();trasera = new Rueda();

    }

    void saludar() {System.out.println(Soy una bicicleta);}

    }

    class Moto extends Bicicleta {Motor motor;

    Moto() { // el constructorsuper(); // llamamos al constructor de Bicicleta

    motor = new Motor();}

    void saludar(){System.out.println(Soy una amoto);

    }}

    Vamos a crear dos objetos:

    Bicicleta Antonieta = new Bicicleta();Moto Anacleta = new Moto();

    Si hacemos:

    Anacleta.saludar();

    veremos en pantalla :

    Soy una amoto

  • 8/14/2019 tareasjavanet Introduccin a Java

    59/79

    Como sabemos, una moto es una bicicleta con motor. Eso significa que unamoto tiene una bicicleta dentro de s. o lo que es lo mismo, que una moto puedecomportarse como una bicicleta. Cmo? Ahora lo veremos. Para qu sirve? Eso loveremos luego.

    Supn que tenis una vecina que conoce muy bien a tu madre, mucho mejor quea ti. Un buen da te ve y te saluda, y te dice Vaya, tienes los ojos de tu madre. Porqu te dice esto? Aparte de porque realmente puede que tengas los ojos de tu madre, lavecina te lo dice porque conoce a tu madre. Si no la conociese no podra decirlo, no?Es decir, que la vecina puede decir lo que has sacado de tu madre si conoce a tu madre.

    Bueno, pues una referencia, que se supone que ya sabes a la perfeccin qu es,es como la vecina. Es capaz de ver en los objetos los rasgos que conoce. Si unareferencia es del tipo bicicleta, entonces ver los contenidos propios de la bicicleta en elobjeto al que apunte. Por ejemplo:

    Bicicleta refABicicleta = new Bicicleta();

    Estamos cerando una referencia llamada refABicicleta (referencia a bicicleta)que es del tipo Bicicleta y que apunta a una nueva Bicicleta ( new Bicicleta() ). Estoes claramente legal, es como si la vecina ve a tu madre, no hay nada que no conozca deella. Pero si hacemos un truco...

    Bicicleta refAOtraBicicleta = new Moto();

    Hacemos que la referencia refAOtraBicicleta apunte a una nueva moto. Cmoes esto posible? Pues es como la vecina que se encuentra un da contigo. La vecina ve enti lo que has heredado de tu madre, porque conoce a tu madre. La referenciarefAOtraBicicleta ve en la nueva moto lo que ha heredado de bicicleta porqueconoce las bicicletas (es del tipo bicicleta).

    Entonces, usando la referencia refAOtraBicicleta podemos hacer que una motosalude como una bicicleta, porque refAOtraBicicletaconoce el mtodo saludar de labicicleta: Si hacemos

    refAOtraBicicleta.saludar();

    veremos

    Soy una bicicleta

    aunque refAOtraBicicleta apunta a una moto!. Por qu? Pues por lo dicho,porque refAOtraBicicleta no conoce el mtodo que saluda como una moto, sloconoce el mtodo que saluda como una bicicleta. Pretender que refAOtraBicicleta

    haga saludar a la moto como si fuese una moto sera como pretender que la vecina te

  • 8/14/2019 tareasjavanet Introduccin a Java

    60/79

    diga que tienes las manos de tu abuelo, al que nunca conoci. Aqu tienes un pequeogrfico que tal vez te ayude:

    Vamos a olvidar por ahora los constructores, vale? Bueno, pues te presento a laseora referencia de tipo Bicicleta!:

    TACHAAAAAAN!!!

    no esperars que tres flechas piensen comolo hacen el pez y los otros, no? Vaya unasideas que tienes...... :)

    Bueno, pues Por qu la referencia de tipo Bicicleta tiene esa forma? Pues fjateen cmo funciona esta referencia con un objeto de tipo Bicicleta:

    Te percatas de cmo de ajusta la referencia al contenido del objeto? Unareferencia del tipo Bicicleta ver todo el contenido de una bicicleta, as como tu vecina

    conoce a tu madre por completo. Ahora fjate en esto:

  • 8/14/2019 tareasjavanet Introduccin a Java

    61/79

  • 8/14/2019 tareasjavanet Introduccin a Java

    62/79

    Mesa Catalina = new Mesa(Azul, 3, cuadrada);

    La pregunta es la siguiente: Qu valor lgico (TRUE FALSE) dar lasiguiente expresin?

    Margarita == Catalina

    Pues veamos: estamos comprobando si son iguales dos referencias. Cada una deellas apunta a una mesa cuadrada, azul y de tres patas. As que, como son iguales, estodebera dar TRUE.

    Pues no.

    Fjate: las dos mesas son azules, de tres patas y cuadradas. PERO SON DOSMESAS DIFERENTES, no son la misma mesa. Es como decir que dos gemelos, por seridnticos, son la misma persona. Bueno, ten esto muy presente siempre, vale? Puedescomparar dos nmeos con ==, pero no dos objetos.

    Antes de seguir asegrate que has alcanzado la Idea platnica de los dos puntosanteriores. Si no es as, en realidad lo nico que tienes que hacer es pensar muyprofundamente en ello, vuelve a escribir las clases, prueba a hacer pequeosprogramas... recuerda lo dicho en el prefacio. Y, por supuesto, si tienes ms probelmas,aqu estoy.

    Arreglando bicicletas: parmetros que son referencias

    Supn ahora que se nos pincha una rueda de la bicicleta. Pues la llevaremos a untaller:

    class Taller {void arreglar(Bicicleta bici){

    System.out.println(A arreglar!);}

    }

    Bueno, fjate: definimos un taller con un mtodo arreglar al que le vamos apasar como parmetro una bicicleta. Realmente este mtodo no hace absolutamentenada con la bicicleta que le damos a arreglar, pero repito que el objetivo de este rollo espuramente didctico.

    Pues eso, que ahora podemos hacer sin problemas:

    Bicicleta Antonieta = new Bicicleta();Taller elTaller = new Taller();

    // despus de largas horas de uso...

  • 8/14/2019 tareasjavanet Introduccin a Java

    63/79

  • 8/14/2019 tareasjavanet Introduccin a Java

    64/79

    cambiarAceite requiere que le pasemos una moto (porque cambiar el aceite a una bicise las traera, no?), pero arreglar requiere una bicicleta. Madre ma. Necesitamos unareferencia de tipo Bicicleta para arreglar la moto y otra de tipo Moto para cambiarle elaceite!

    Taller elTaller = new Taller();Bicicleta refMoto = new Moto();

    Si queremos cambiar el aceite a la moto, es fcil:

    elTaller.cambiarAceite(refMoto);

    Pero, para arreglar las ruedas necesitbamos una referencia de tipo bicicleta, y la

    referencia que tenemos es de tipo Moto. Tendremos que crear una nueva referencia:

    Bicicleta refBicicleta = refMoto;

    Esta referencia nueva apunta al mismo objeto al que apuntaba refMoto. Ahora ses lcito hacer

    elTaller.arreglar(refBicicleta);

    Bueno, pues esto es perfectamente legal, funciona. Pero coincidirs conmigo que

    es un engorro. Tener dos referencias de tipo distinto para un mismo objeto no es sermuy ahorrativo. Ni muy prctico, todo sea dicho.

    Casting

    Como dijimos hace una eternidad, casting es algo as como convertir. Elobjetivo es el siguiente:

    Hemos visto casos en los que un objeto necesita varias referencias de distintotipo, como con el taller: arreglar las ruedas necesita una bicicleta, pero cambiar el aceite

    necesita una moto. Para cambiar el aceite a una moto no hay mucho problema, pero paraarreglarle las ruedas haba que hacer una nueva referencia de un tipo diferente.

    Bueno, pues existe una manera de hacer esto mismo con una sola referencia.Cmo? Pues muy fcil: convirtindola.

    Convertir una referencia de un tipo inicial a un tipo final se hace as:

    (tipo final)referencia

    Por ejemplo, si quiero convertir un nmero entero en uno de coma flotante(CUIDADO! no te creas que en este caso hay herencia de algn tipo, eh?)

  • 8/14/2019 tareasjavanet Introduccin a Java

    65/79

    (float)miEntero

    O si quiero convertir una moto en bicicleta...

    (Bicicleta)refMoto

    Es decir, que usando esta conversin, puedo hacer sin problemas:

    Taller elTaller = new Taller();Moto Maroto = new Moto();

    y, por fin....

    elTaller.cambiarAceite(Maroto);elTaller.arreglar( (Bicicleta)Maroto ); // esto es casting!!!!!!!!!

    Tenemos una sola referencia, llamada Maroto que es de tipo Moto, peropodemos usar esta referencia de tipoMoto en mtodos que requieran una referencia de

    tipoBicicleta (como el mtodo arreglar) porque podemos convertirla. BIEN!

    Relee el prrafo anterior.Vuelve a leerlo.

    Est claro?Seguro?Fabuloso.Realmente te parece el casting lo que te pareca antes?

    Hala. A modo de resumen:

    1. Una moto puede saludar como una bici. Podemos hacer que un objeto de untipo se comporte como un objeto de otro tipo.

    2. El mtodo arreglar ve a una moto como si fuese una bici, mientras quecambiarAceite ve la misma moto como lo que realmente es, una moto.Podemos hacer que un mtodo vea a un objeto como si fuese de una clase yque otro mtodo vea el mismo objeto como si fuese de otra clase.

    3. Esto lo podemos hacer mediante varias referencias de diferentes tipos queapunten al mismo objeto....

    4. O mediante una sola referencia y el truco del casting

    El Casting se acaba aqu. Con estos conocimientos puedes enfrentarte a unfragmento de cdigo que contenga conversiones de referencias, es decir, casting.

  • 8/14/2019 tareasjavanet Introduccin a Java

    66/79

    Pensado puedes saber qu sentencias sern correctas y cuales no lo sern. Slo tienesque pensar qu contenidos del objeto es capaz de ver una referencia.

    Antes de seguir (y por supuesto despus de realizar tus ejercicios espirituales)plantate los conceptos de:

    REFERENCIATIPO DE UNA REFERENCIACMO las referencias apuntan a un objetoCMO dos referencias de diferentes tipos ven contenidos diferentes de un

    mismo objetoCOMPARACIN DE REFERENCIAS: == no funciona como quisiramos....CMO un mtodo requiere referencias de determinado tipo (como parmetros)SENTIDO DE usar distintas referencias para un objetoFINALIDAD DEL CASTING

    SINTAXIS DEL CASTING

    Recuerda!

    Vimos cmo se usaba el casting para convertir enteros a coma flotante. Aesto se le llama tambin CASTING, pero no tiene nada que ver con herencia. El