curso de java_8.pdf

Upload: sergio-juan

Post on 11-Oct-2015

34 views

Category:

Documents


0 download

TRANSCRIPT

  • Curso de Java

    Curso de Java Gratuito orientado a emuladores de

    Lineage Java para la comunidad de Adminspro.

    K i m e r a w e b

    e m a i l : b r u j u l a t o @ y a h o o . e s

    m s n : k i m e r a @ k i m e r a w e b . e s

    f b : k i m e r a k i m e r a w e b

    1 6 / 0 9 / 2 0 1 2

    Kimeraweb

    Estas clases gratuitas pretenden abarcar los aspectos

    mnimos que hay que conocer para poder programar

    en cualquier lenguaje usando como herramienta el

    Lenguaje Java. Como modelo usar el emulador L2J.

    El curso est dirigido a todos los niveles de usuarios,

    desde los que no tienen conocimiento de

    programacin a los programadores habituales.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 1

    El ndice se ir modificando conforme este manual se expanda.

    ndice

    Tema 1, Introduccin.

    1.1 Conceptos de programacin orientada a objetos

    1.2 Desarrollo de un objeto

    1.3 El cuerpo de un objeto

    1.4 Reglas para crear nombres (nomenclatura)

    Tema 2, las clases

    2.1 Alcance de una clase 2.2 Reglas de declaracin de una clase 2.3 Creando una clase 2.4 La clase abstracta

    Tema 3, los mtodos

    3.1 Funciones de un mtodo 3.2 Modificadores de acceso 3.3 Modificadores que no dan acceso 3.4 Argumentos de los mtodos 3.4.1 Pasando variables referenciando a objetos 3.4.2 Pasando variables primitivas 3.5 Constructores

    Tema 4, las variables

    4.1 Variables primitivas 4.2 Variables de instancia 4.3 Variables locales 4.4 Variables de tipo final, transient y volatile 4.5 Variables estticas 4.6 Arrays

    4.6.1 Inicializando los elementos en un bucle 4.6.2 Arrays annimos 4.6.3 Arrays primitivos 4.6.4 Array de referencias a objetos 4.6.5 Asignaciones para arrays de una sola dimensin 4.6.6 Asignaciones para arrays de varias dimensiones

    Tema 5, Enumeraciones

    5.1 Declarando una enumeracin 5.2 Declarando mtodos y variables en una enumeracin Tema 6, usando las caractersticas de la POO

    6.1 La encapsulacin 6.2 Polimorfismo

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 2

    6.3 Casteo de variables de referencia 6.4 Implementando una interfaz 6.5 Tipos de retornos en constructores sobrecargados

    6.5.1 Devolviendo un valor 6.6 Autoboxing

    Tema 7, los constructores 7.1 Construccin, reglas y sobrecargas de constructores

    7.2 Encadenamiento de constructores

    Tema 8, modificador esttico 8.1 Mtodos y variables estticas

    8.2 Mtodos estticos y variables

    Tema 9, recolector de basuras 9.1 Funcionamiento del recolector de basuras

    9.1.2 Cmo funciona el recolector de basuras? 9.1.3 Puede una aplicacin Java quedarse sin memoria?

    9.2 Escribir cdigo que maneje explcitamente objetos elegibles para ser borrados 9.3 Reasignado una variable de referencia 9.4 Aislando una referencia 9.5 Forzando el recolector de basuras 9.6 Limpiar antes de ejecutar el GC - el mtodo finalize()

    Tema 10, operadores

    10.1 Operadores de asignacin 10.2 Operadores de asignacin compuestos 10.3 Operadores relacionales 10.4 Operaciones de igualdad 10.5 Comparacin de primitivos 10.6 Igualdad para variables de referencia 10.7 Igualdad para enumeraciones 10.8 Comparacin con instanceof()

    10.8.1 Errores de compilacin con instanceof() 10.9 Operadores aritmticos

    10.9.1 El operador resto % 10.9.2 Operador de concatenacin de cadenas

    10.10 Operadores de incremento y decremento 10.11 Operador condicional 10.12 Operadores lgicos 10.13 Operadores e Bitwise 10.14 Atajo para operadores lgicos 10.15 Operadores lgicos sin atajos 10.16 Operadores lgicos ^ y

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 3

    Tema 11, Control de flujo

    11.1 Estamento if 11.2 Estamento switch 11.2.1 Expresiones vlidas para switch y case

    11.2.2 Interrupciones y flujo en los boques switch 11.2.3 El caso default

    11.3 Estamento while 11.4 Estamento do while 11.5 Estamento for, o for-in (el bucle bsico)

    11.5.1 El for mejorado (para arrays, for each) 11.6 El uso de break y continue

    11.6.1 Estamentos sin etiquetas 11.6.2 Estamento con etiquetas

    Tema 12, excepciones y aserciones 12.1 El estamento try catch 12.1.1 El uso de finally 12.1.2 Programacin de excepciones no capturadas

    12.1.3 Definiendo excepciones 12.1.4 Jerarqua de las excepciones 12.1.5 Manejando una clase completa de la jerarqua de excepciones 12.1.6 Declaracin de Excepciones e Interfaces Pblicas 12.1.7 Relanzando la misma excepcin 12.1.8 Definicin de conceptos, excepcin y error 12.1.9 Programando el arrojo de excepciones

    12.2 Mecanismo de aserciones

    12.2.1 Reglas de expresin de las aserciones 12.2.2 Aserciones, identificados o palabra clave 12.2.3 Ejecucin con aserciones 12.2.4 Selector para activar y desactivar los assert 12.2.5 El uso apropiado para las aserciones

    Tema 13, la clase String, StringBuilder y StringBuffer

    13.1 La clase String 13.1.1 String y memoria 13.1.2 Mtodos importantes de la clase String

    13.2 StringBuffer y StringBuilder 13.2.1 Mtodos importantes de las clases StringBuffer y StringBuilder

    Tema 14, paquete I/O, lectura y escritura de ficheros 14.1 Resumen de las clases I/O

    14.2 Creando ficheros, el uso de la clase File 14.3 El uso de FileWriter y FileReader 14.4 Combinando clases I/O, BufferedWriter y BufferedReader 14.5 Ficheros y directorios

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 4

    Tema 15, paquete I/O, la serializacin

    15.1 ObjectOutputStream y ObjectInputStream 15.2 Objetos grficos 15.3 El uso de writeObject y readObject 15.4 La herencia y la serializacin 15.5 Serializacin y clases estticas

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 5

    S que queremos hacer cosas ya, pero este manual no va indicado para personas con

    inquietudes exprs, es decir, lo leo ya y lo quiero ya. Un buen programador, espero que

    cuando acabes el manual lo seas, ha de ser meticuloso y usar todas las reglas aceptadas

    universalmente por los programadores, muy importante cuando se trabaja en equipo o se

    retoma el trabajo de otra persona, como es nuestro modelo L2J.

    En este captulo sabremos que es un objeto, como funciona y reglas de programacin. No te

    preocupes, empezaremos a programar tan pronto tengas la base necesaria. Acurdate de que

    un gigante con pies de barro...

    1.1 Conceptos de la programacin orientada a objetos

    En programacin moderna, se usa una estructura llamada programacin orientada a objetos.

    Esto no es ms complicado que decir para programar algo haremos uso de otros cdigos que

    ya existen.

    Entonces, el concepto de objeto: ahora mismo diremos que un objeto es un programa que

    podemos incorporar a nuestro cdigo.

    En este objeto existen funciones.

    Una funcin, tal como su nombre indica es algo que est destinado a hacer, por ejemplo, las

    funciones de un coche? Frenar, acelerar, girar...

    Ahora imaginemos algo que podramos crear en breve, un formulario.

    Funciones de un formulario? Recoger informacin, guardar informacin, recuperar

    informacin...

    Que podra necesitar el formulario para guardar la informacin al disco? Acceso al disco,

    obviamente y... tendremos que crearnos un programa para poder grabar al disco? NO!!

    Afortunadamente, todos los lenguajes tienen incluidos objetos bsicos (realmente no son tan

    bsicos, se podran escribir miles de pginas... pero de momento lo dejamos aqu) que

    usaremos.

    Os habis dado cuenta de una cosa? Un objeto que slo sirve para acceder al disco... y nada

    ms.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 6

    1.2 Desarrollo de un objeto

    Los objetos en cualquier lenguaje, y Java no es una excepcin, es que deben ser de bajo

    acoplamiento y alta cohesin.

    Bueno, y esto para qu sirve?

    Ojo, si no ejecutas esta premisa a la perfeccin, tu programa va a ser un churro (para que

    hablar con rodeos).

    Primero, entremos en detalles, que es bajo acoplamiento?

    Un programa de bajo acoplamiento significa, que si el programa se modifica, no afectar al

    objeto que lo usa. Por ejemplo, imaginemos que tenemos un objeto llamado SUMADOR que

    lo nico que hace es sumar dos nmeros. Este objeto se invoca por otro objeto llamado

    CALCULADORA. SUMADOR acepta tomar dos nmeros y devolver su suma. Por cualquier

    desdicha de la naturaleza, el cdigo de SUMADOR tiene que ser reescrito porque se ha

    descubierto un fallo en su programacin. El bajo acoplamiento significa que aun reescribiendo

    el cdigo de SUMADOR, CALCULADORA seguir usando a SUMADOR sin tener que editar su

    cdigo, resumiendo, SUMADOR es totalmente independiente de CALCULADORA.

    La alta cohesin significa que el programa har exactamente y nicamente eso para lo que fue

    diseado, y nada ms; de esta manera, sabemos que SUMADOR solo suma, y no har las

    funciones de RESTADOR (ms adelante explicaremos otras ventajas).

    Con lo explicado aqu, sera censurable que CALCULADORA fuese un objeto que hiciese otra

    tarea que no fuese calcular, y que su edicin forzase a que otro objeto que usase

    CALCULADORA tuviera que ser editado tambin.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 7

    1.3 El cuerpo de un objeto

    Un objeto comn, est compuesto de funciones y variables. Explicado brevemente, el objeto

    tiene como misin hacer algo, y sus funciones son las tareas que puede realizar.

    Hay tareas que necesitan guardar alguna informacin para poder ser realizada, para guardar

    esta informacin se usan variables (porque su valor varia al menos, una vez).

    Entonces, resumiendo porque esto no tiene ms:

    Los objetos contienen funciones y contienen variables.

    Las funciones contienen variables.

    Al principio cit objeto comn porque ms adelante veremos otra clase de objetos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 8

    1.4 Reglas para crear nombres, o nomenclatura.

    Como sabemos cundo leemos un cdigo, si lo que leemos es un objeto, una funcin o una

    variable? Es por su nomenclatura (no, no vamos a hacer qumica... todava).

    Las reglas para crear nombres son:

    Un objeto (tambin se le llama clase) siempre comienza su nombre por maysculas.

    Una funcin siempre comienza su nombre por minsculas.

    Una variable de clase ir antecedida con el smbolo de guin bajo _, ejemplo _xPos.

    Este tipo de variables suelen ser privadas. Las veremos ms adelante.

    Las dems variables sern en minsculas.

    Aparte de la nomenclatura, los nombres de las clases tienen que ser descriptivas, es decir, su

    nombre debe intuir lo que va a hacer, de tal manera, que cualquier lector ajeno al proyecto,

    pueda saber, sin leer el cdigo, que es o hace la clase.

    Sus mtodos deben ser creados de forma verbal, por ejemplo, las funciones de un coche se

    llamarn frenar, acelerar y no freno o aceleracion.

    Cuando se quiere obtener o asignar valores, se usan get y set, seguidos del nombre, get

    significa obtener, y set, seleccionar. As que si queremos obtener la velocidad del coche,

    getVelocidad.

    Si lo que deseamos es saber si una operacin se est realizando, usaremos is, que significa en

    castellano, ser o estar. Est frenando? -> isFrenando.

    Debo decir, que en ingls, queda mejor -> isStopping.

    Si estas fijndote, cuando se unen dos palabras, la segunda se pone en maysculas, a esto se le

    llama camelCase, y tambin es otra regla que se aplica a todo.

    Adems de las clases y funciones, las variables si van a trabajar durante un periodo largo,

    tambin han de ser descriptivas, por ejemplo, fuerzaDeFrenado = 100.

    Para terminar, las constantes de clase en maysculas, sin usar camelCase, y su lugar, guion

    bajo (constante es una variable que una vez asignado su valor, ya no va a cambiarlo) ejemplo:

    ANCHO_DOCUMENTO.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 9

    2.1 Asignar el alcance de una clase

    Estos modificadores tambin se pueden aplicar a las funciones y variables.

    Cuando creas un objeto, puedes querer que ese objeto, pueda ser usado o no, dentro de su

    mbito. Podemos querer que nuestra clase CALCULADORA sea invisible para la clase

    INSTRUMENTO MUSICAL y que sea visible para la clase MATEMATICAS por razones evidentes.

    Para poder hacer esto, al declarar una clase, podemos hacerlo de diferentes maneras:

    Public

    Al declarar una clase como pblica, ser visible desde cualquier otra clase situada en

    cualquier otra parte.

    Sin modificador o Default

    Por defecto, una clase es visible en el paquete que se crea nicamente.

    Al igual que creamos directorios en Windows (u otro sistema operativo) para agrupar ficheros

    que son comunes entre s, o sea, que tienen alguna relacin entre ellos, los ficheros creados en

    Java tambin cumplen la misma lgica. En un paquete Musica podramos encontrar los

    paquetes Instrumento de Percusion, Instrumento de viento, Instrumento de cuerda, y dentro

    de cada uno, mas directorios. Cada directorio se denomina paquete.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 10

    2.2 Reglas de declaracin de una clase

    Antes de crear tu primera clase, an tienes que conocer unas reglas ms, si, lo siento, es

    pesado pero necesario, pero no te preocupes, slo con leerlas, te acordars de ellas, porque a

    medida que avancemos, vers que son normas evidentes.

    Slo puede existir una clase pblica por fichero fuente.

    El nombre de la clase siempre ser el mismo que el nombre del fichero que la

    contiene.

    Si la clase est dentro de un paquete, el estamento package ser lo primero que

    aparezca en el fichero de la clase conteniendo su ruta.

    Lo siguiente que aparece despus de un package, son los comandos import.

    Las instrucciones import y package se aplican a todas las clases del fichero, en otras

    palabras, no hay manera de declarar diferentes package para cada clase definida en el

    fichero.

    Un fichero puede tener ms de una clase no pblica.

    Las clases no pblicas del fichero pueden tener un nombre distinto al fichero que las

    contiene.

    En un package se inserta la ruta de la clase.

    Los import se usan para importar otras clases.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 11

    2.3 Creando una clase

    Bien, ya hemos ledo todas las normas habidas y por haber para crear una clase. En estos

    momentos somos unos eruditos en lo que a normas se refiere pero ya vamos a empezar la

    accin.

    Nuestra primera clase va a hacer poco, ya que, como dije antes, la programacin orientada a

    objetos se basa en el uso de otras clases para hacer uso de ellas, y como no hemos visto

    ninguna, no podemos hacer nada. Est fue una gran leccin, verdad? Nunca la olvidars.

    Pero aun sin conocer ninguna clase, podemos crear un pseudo cdigo que tiene como misin

    introduciros en el mundo de la programacin orientada a objetos, POO.

    Mi primera ilustracin va a consistir en crear un coche y sus funcionalidades.

    public class Coche {

    public void frenar() { }

    public void acelerar() { }

    public String getAceleracion() {return null; }

    public String getFrenada() {return null; }

    }

    Que estamos viendo aqu?

    Primero, al escribir la clase, se indica su visibilidad. Recuerda que si no se indica, se obtiene un

    alcance por defecto, es decir, slo es visible en el paquete que se crea.

    Despus tenemos la instruccin class y el nombre de la clase abriendo y cerrando llaves al final

    del cdigo, encerrando sus mtodos.

    En sus mtodos podemos ver tres palabras que no habamos visto antes, se trata de void,

    String y return.

    Cuando un mtodo no devuelve nada, al nombre del mtodo le precede la instruccin void.

    Cuando un mtodo devuelve algo, le precede el nombre del tipo que devuelve y entre

    corchetes la instruccin return seguido de una variable (en este caso, nada, null).

    El tipo se refiere a la clase de objeto que va a ser devuelto. Clases de tipos son por ejemplo,

    cadenas (conjunto de letras), nmeros, nombres de clases como String, Integer, Object, etc...

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 12

    2.4 La clase abstracta

    El nico propsito de una clase abstracta es la de crear un patrn para crear clases del mismo

    tipo y funcionalidad que la clase abstracta.

    No puede duplicarse.

    abstract class Coche {

    private double precio;

    private String modelo;

    private String year;

    public abstract void goFast();

    public abstract void goUpHill();

    public abstract void impresionarVecinos();

    }

    Cuando creas un coche heredando la clase abstracta Coche, lo que haces es coger un patrn y

    asimilarlo a tu cdigo.

    Podras pensar que, qu utilidad tiene esto?

    Imagina que eres el programador de Coche, y has creado un programa que usa los mtodos

    creados en Coche. Otro programador, podra crear un Coche como el tuyo, que adems volase,

    pero para que el cdigo ya implementado por ti funcione correctamente en el coche volador,

    necesita implementar los mtodos que tu esperas que estn ah, como el precio, el modelo, el

    impresionarVecinos... aparte este nuevo programador, hara que su coche volase sin tener que

    programar el precio, el modelo, el goFast... que ya estn creados por ti.

    Extrapola esto a un NPC de Lineage, si tienes un NPCWalker que quisieras a la vez que vendiera

    como un GMShop, que necesitas? Un NPCWalker vendedor, cierto?

    Al implementar esto en tu nuevo coche, inmediatamente se incluirn los cdigos necesarios

    para que tu clase est correctamente implementada.

    Si te fijas, en cuanto heredo CochePlantilla, me exige Add unimplemented methods, aadir

    mtodos no implementados. En cuanto pulses ah, se implementarn los mtodos, pero el

    cdigo de su interior, es cosa tuya.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 13

    Los mtodos marcados como abstractos terminan siempre en punto y coma, en lugar de llaves.

    Si el mtodo estuviera en una clase normal, es decir, con cdigo, con tan slo un mtodo

    abstracto que tenga una clase, tiene que ser marcada como abstracta tambin.

    Cuando una clase abstracta, lo es al 100%, es decir, que no posee ningn cdigo, algo como

    esto:

    se dice que es una interfaz.

    Mientras que en una clase abstracta puedes tener funciones con cdigo y funciones abstractas

    mezcladas, en una interfaz no.

    Tambin, los mtodos de una interfaz son por defecto pblicos y abstractos, por lo tanto no

    tienes que declarar que son pblicos y abstractos. La razn es simple, si el mtodo fuera

    privado, cuando heredases la clase abstracta, las subclases no tendran acceso a ellos.

    En la interfaz, las variables que puedes crear tienen que ser pblicas (por lo explicado antes),

    estticas (que no cambian su valor) y finales (que no pueden duplicarse).

    Sin embargo, los mtodos no deben ser estticos, ya que, cuando se hereda la interfaz, los

    mtodos abstractos hay que editarlos. Si fueran estticos, no se podran modificar.

    Una interfaz puede heredar una o ms interfaces, adems, no puede heredar otra cosa que no

    sea una interfaz.

    No confundir heredar con implementar, ya que la interfaz no puede implementar nada.

    Cuando se declara una interface, debe ser indicado con el modificador interface.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 14

    Si quieres que tu interfaz sea accesible desde cualquier parte del cdigo, has de aadir el

    modificador public, sino el acceso por defecto (de paquete, default) ser seleccionado.

    Aunque sea redundante, puedes usar los modificadores public y abstract para declarar una

    interfaz.

    En una interface, como dije antes, puedes declarar constantes. Al hacer esto, se garantiza el

    acceso a esa variable desde cualquier clase.

    Los modificadores que tienes que usar son: public static final, es decir, que son pblicas, que

    no varan su valor, y que no se pueden duplicar. Al no poder duplicarse, te aseguras que

    ninguna clase tenga acceso a la variable y altere su valor.

    Si en cualquier caso olvidases esto, no olvides que, aunque no declares la variable como tal,

    ser tomada como public static final irremediablemente:

    por lo tanto, al querer modificar la variable:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 15

    obtenemos un error que nos comunica que borremos el modificador final de

    VELOCIDAD_MAXIMA, y como veis en la captura anterior, no existe tal modificador, es decir,

    se hace evidente que JDK nos ha declarado por defecto que es public, static y final.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 16

    3.1 Funciones de los mtodos.

    Sin los mtodos, las clases no tendran mucho sentido. Los mtodos son los responsables de

    que la clase cobre vida, y sentido.

    Cuando invocamos una clase, actuamos sobre sus mtodos.

    Lo principal que definimos en un mtodo, son las funciones get y set, encargadas de devolver y

    actuar sobre las variables de la clase directamente.

    Es una buena prctica crear las variables de las clases de forma privada, y manipularlas a travs

    de sus mtodos para evitar fallos en su uso. Por ejemplo, podramos usar la clase Coche, y en

    su variable VELOCIDAD_MAXIMA, le passemos un valor de cadena en lugar de un valor

    numrico, tal como se esperaba. Sin duda, acabara en tragedia:

    Para evitar situaciones parecidas, la buena prctica nos obliga a usar un mtodo para prevenir

    o evitar errores, porque, en lugar de una cadena de texto, podramos haber pasado como valor

    un nmero decimal, pero aun as, sera un valor incorrecto.

    Las funciones pueden ejecutar una serie de acciones y devolver un valor, o no devolver nada.

    Para indicar que no devuelve nada, despus del modificador, o antes del nombre de la funcin,

    indicamos con void nuestra intencin, que traducido significa vaco, es decir, devuelve un valor

    vaco.

    Cuando queremos devolver el resultado de una operacin, de cualquier clase, entonces el

    lugar de void lo ocupa el tipo de objeto que vamos a devolver, una cadena (String), un objeto

    (Object) u cualquier otra cosa que hayamos inventado (un Coche por ejemplo).

    Para usar el mtodo de una clase, se usa el nombre de la clase seguido por un punto, y luego el

    nombre del mtodo. Es como el ejemplo, solo que, una funcin lleva parntesis, y las variables

    no llevan.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 17

    3.2 Modificadores de acceso

    Los modificadores de acceso de los mtodos son cuatro, en lugar de dos como en las clases

    (Default y Public) y sus caractersticas son compartidas con las variables.

    Si no defines ningn modificador, el modificador por defecto es Default (te lo recuerdo

    nuevamente, con Default solo se logra visibilidad dentro del paquete donde se crea).

    Public

    Cuando un mtodo o una variable se declara pblica puede verse desde cualquier

    parte del programa.

    Private

    Cuando el mtodo o la variable se declara privada, solo es accesible donde es creada.

    Protected

    Igual que privada, slo que tambin ser accesible por sus subclases.

    Default

    Por defecto, no estas forzado a declarar una clase Default. Si se omite el modificador,

    Default es tomado por defecto.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 18

    3.3 Modificadores que no dan acceso.

    Estos modificadores se usan para limitar el uso de los mtodos, se les denominan

    Nonaccess y hay siete clases.

    Final

    Se usa para evitar que el mtodo sea sobrescrito en una subclase. Si se pasa

    final como parmetro al mtodo, es decir, proporcionarle un valor final, el

    mtodo no podr cambiar el valor.

    Abstract

    Un mtodo abstracto se declara pero no se implementa. En otras palabras, es

    un mtodo no funcional. Recuerda que un mtodo abstracto no lleva llaves,

    termina en punto y coma. Cuando usas este modificador, lo que buscas es que

    la subclase implemente estos mtodos, forzando a definir las acciones que

    debe hacer la clase, pero no la manera en que debe hacerlas. As por ejemplo,

    nuestro Coche puede obligar a sus subclases a implementar

    gastarCombustible, y dependiendo del coche, podra gastar gasolina, diesel,

    queroseno, agua, hidrogeno...

    Ahora una pregunta de control antes de continuar, podras crear un mtodo abstracto

    y final? Piensa en ello, la respuesta ms adelante.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 19

    Synchronized

    Indica que el mtodo slo puede ser accedido una vez al tiempo, es decir, que

    hasta que la tarea con la primera clase que invoc este mtodo no haya

    acabado, pondr en espera a los dems hilos que estn esperando ejecutar

    este hilo. Esto es til para una tarea como guardar un fichero. Si se estn

    guardando datos, sera un error permitir que otro hilo insertase nuevos datos

    mientras se lleva a cabo la operacin de salvar datos. El resultado final es

    imprevisible. Las variables no pueden ser declaradas Synchronized.

    Native

    Este modificador indica que el mtodo se ha implementado desde otra

    plataforma de cdigo diferente, normalmente en lenguaje C. Tambin, al igual

    que Synchronized, es exclusivo de los mtodos.

    Transient

    Para entender este, hay que saber primero que es serializar. Cuando se

    serializa un objeto, se pretende guardar la informacin que contiene

    normalmente en disco. Por ejemplo, el objeto Agenda podra contener objetos

    Personas. Si queremos guardar el contenido de la agenda, primero, hay que

    serializar el objeto. Bien, pues Transient indica que ese campo no debe ser

    serializado por ejemplo, porque sean derivadas de otros campos.

    Strictfp

    Se usa para asegurar que cualquiera que sea la plataforma donde se ejecute el

    programa, la precisin de un nmero decimal sea el mismo. Si se omite, la JVM

    usar la precisin que mejor considere.

    Static

    El ms complejo de usar. Resumir brevemente aunque ser comentado en

    profundidad ms adelante.

    Una variable esttica es una variable que pertenece a la clase, no al objeto,

    quiero decir, una instancia de ese objeto (una instancia, un clon).

    Las variables estticas se inicializan una sola vez, al comienzo de la ejecucin

    del programa antes que cualquier otra variable.

    Un mtodo esttico slo puede acceder a otros mtodos estticos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 20

    Un mtodo o variable esttica es accesible directamente,

    NombreClase.NombreMetodo.

    Un mtodo esttico no puede usar this o super.

    Se puede marcar como static:

    Mtodos

    Variables

    Clases anidadas (no dentro de un mtodo, se ver ms adelante)

    Inicializacin de bloques

    No se puede marcar como static:

    Constructores (ya que se usan para crear instancias)

    Clases (a menos que estn anidadas)

    Interfaces

    Mtodos locales dentro de las clases (lo veremos en detalle)

    Mtodos internos de clase y variables de instancia.

    Variables locales.

    La palabra reservada this se usa para referirse a la variable de la clase, y super a la

    variable de la superclase, es decir, la clase de la que se deriva la clase actual.

    La respuesta a la pregunta, se puede declarar un mtodo como abstracto y final es... falso.

    Ambas declaraciones son opuestas, un mtodo abstracto tiene que ser sobrescrito, recuerda

    que se declara sin cdigo, mientras que un mtodo final evita ser modificado.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 21

    3.4 Argumento de los mtodos

    Es comn en cualquier lenguaje, que los mtodos acepten parmetros, es decir, en un

    objeto, para que se cree una accin, a veces es necesario decirle alguna informacin.

    Por ejemplo, si el mtodo fuera, acelerar, una pregunta obvia sera, cunto?

    Recordarte antes que nada, que un mtodo se crea primero poniendo su modificador

    de acceso (que es opcional, sino se elige, la JVM toma Default), luego el tipo de retorno

    que poda ser cualquier cosa (si no quieres ningn tipo de retorno, se escribe void),

    seguido del nombre del mtodo y entre parntesis los parmetros.

    Pues en Java, la manera ms simple de crear un mtodo es hacer uno que no tome

    ningn parmetro:

    public class ejemplos {

    public void digoHola()

    {

    System.out.print ("HOLA");

    }

    }

    Explico un poco lo que vemos, primero, la clase, que abre llaves y encierra a un mtodo que no

    toma parmetros y se cierran las llaves de la clase.

    En el interior de la clase, el mtodo se declara encerrando entre llaves las acciones.

    Cuando insertamos un parmetro en el mtodo, debemos decirle a la JVM el tipo de dato que

    va a ser insertado. Puede ser cualquier cosa que exista. En este ejemplo, ser de tipo String,

    que significa cadena de texto.

    public class ejemplos {

    public void digoHola(String nombre)

    {

    System.out.print ("HOLA " + nombre);

    }

    }

    Ahora podemos ver que al ejecutar nuestro ejemplo, nos pedir un nombre para incluir, y que

    en el mtodo usaremos ese nombre para incluir en el saludo.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 22

    Continuemos con el ejercicio y ahora tomaremos la edad como siguiente parmetro:

    public class ejemplos {

    public void digoHola(String nombre, String edad)

    {

    System.out.print ("HOLA " + nombre + ", se que tienes " +

    edad + "aos.");

    }

    }

    Ahora nuestro resultado sera algo como:

    Hola Maria, se que tienes 17 aos.

    El cdigo para obtener este resultado sera:

    ejemplos.digoHola("Maria","17);

    Puedes seguir sumando parmetros hasta que la RAM de tu ordenador se quede sin memoria.

    No hay problema.

    Si quisiramos hacer una operacin matemtica con la edad, usaramos el tipo int, que

    significa, entero, o mejor dicho, nmero entero:

    La clase main, que sera la clase que siempre se ejecuta primero por defecto y porque la JVM

    busca un mtodo llamado main para ejecutar el programa. Sino existiese ningn mtodo main,

    nos lanzara un error.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 23

    La consola nos devuelve el resultado de la operacin.

    Como colofn de los parmetros hay un argumento denominado var-args, cuando declaramos

    como parmetro un var-args estamos diciendo que esperamos un nmero indeterminado de

    parmetros.

    Este tipo slo se acepta una sola vez en un mtodo y siempre tiene que ser declarado el

    ltimo:

    Salida de la consola:

    Esta forma var args se forma escribiendo tres puntos despus del tipo y en realidad lo que

    hace es convertir la variable en un array que se puede recorrer con un for.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 24

    Conceptos nuevos:

    Un array es una variable capaz de almacenar ms de un dato.

    Este for se denomina foreach porque toma un valor del array y lo introduce en una

    variable. Se trata de un bucle que recorre todos los valores almacenados en la variable,

    en cada vuelta introduce el valor del array en la variable hasta llegar al ltimo valor.

    Un bucle es un bloque de instrucciones que se repite un nmero de veces.

    Todo esto se ver ms en detalle.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 25

    3.4.1 Pasando variables referenciando a objetos

    La memoria en Java se divide en 2 partes, la memoria permanente, Heap, donde viven los

    objetos, y la memoria Stack, donde viven las variables.

    Cuando pasas un objeto como argumento a un mtodo, debes tener en cuenta que ests

    pasando un objeto de referencia, y no el objeto en s mismo. Recuerda que una variable de

    referencia almacena los bits que representa (para la JVM) una manera de conseguir ese objeto

    en la memoria Heap. Ms importante, tienes que recordar que no ests pasando la variable de

    referencia actual, sino una copia. Una copia significa que consigues el patrn de bits de la

    variable de referencia, as que cuando pasas una variable de referencia, estas pasando la copia

    de bits del objeto que representa. En otras palabras, ambos, el invocador y el mtodo

    invocado tendrn ahora una copia idntica de la referencia, pero ambos se refieren

    exactamente al mismo objeto del Heap (no a la copia).

    3.4.2 Pasando variables primitivas

    Cuando una variable primitiva se pasa por un mtodo tampoco cambia de valor, ya que se

    pasa una copia de la variable, al igual que ocurre con los objetos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 26

    3.5 Constructores

    En un lenguaje orientado a objetos la principal caracterstica es que los objetos se instancian

    para obtener nuevos objetos con distinto comportamiento.

    Por ejemplo, si creamos un objeto Coche, las propiedades del objeto podran ser, marca,

    modelo, potencia y velocidad mxima por poner un ejemplo.

    Si a cada modelo Coche, le asignamos una marca distinta, estamos creando nuevos modelos de

    coches, al fin y al cabo son coches con distintas caractersticas. No creamos un modelo Ford,

    otro Ferrari y otro modelo Porche, sino que creamos estos modelos a partir de un objeto que

    rene todas las similitudes de un Coche.

    Habiendo aclarado que instanciando un objeto Coche podemos crear nuevos coches con

    distintos comportamiento, es hora de explicar la funcin de un constructor.

    Cada vez que instancias un objeto, por decirlo de otra manera, un nuevo clon de un objeto,

    ests ejecutando un constructor. Si no lo haces t, la JVM lo hace por ti.

    La primera cosa que llama la atencin es que un constructor se parece horrores a un mtodo, y

    para diferenciar un mtodo de un constructor nos fijamos que el constructor no lleva return ni

    lleva void.

    Qu vemos aqu? Pues estamos viendo dos clases, la clase pblica Main creando un Ferrari, y

    la clase por defecto Coche. Recuerda que un fichero slo puede tener una clase pblica.

    Para instanciar un objeto se usa el comando new.

    Para convertir la variable Ferrari en una instancia de coche, primero se usa el nombre del

    objeto que se va a instanciar, en el ejemplo es Coche, seguido de la variable, y luego usando

    new (traducido significa nuevo, nuevo Coche) seguido del objeto que queremos instanciar (o

    clonar, como lo veas ms claro) y entre parntesis, las opciones del constructor.

    Si el constructor no existiese, la JVM implementara (aunque no aparecer en el cdigo):

    public Coche (){}

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 27

    Ahora veamos el cdigo del Coche:

    La variable de la clase, tal como indicamos antes, por el convenio de Java, se escribe en

    maysculas y los espacios separados mediante guin bajo, MARCA_DEL_COCHE.

    Luego tenemos el constructor, el nombre es el mismo que el de la clase, Coche, y su funcin es

    la de asignar la variable de la clase la marca del coche, de esta manera, cada vez que

    instanciemos un Coche, tendremos una marca.

    Luego tenemos un mtodo coche, respetando el convenio de Java para los mtodos, el

    formato del nombre es camelCase. Pero aun respetando el convenio, es una mala prctica

    nombrar un mtodo con el mismo nombre que su clase, porque slo es til para crear

    confusin, como es este caso. La funcin de este mtodo es imprimir en pantalla la marca del

    coche pasada por parmetro.

    Hay una tcnica de programacin que se llama sobrecarga de mtodos, consiste en crear

    mtodos con el mismo nombre pero aceptando diferentes parmetros.

    Por ejemplo, aqu declaro dos constructores, el primer constructor (lnea 13) construye un

    coche sin parmetros, en la lnea 14 construye un Coche con la MARCA_DEL_COCHE.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 28

    Ahora completemos lo que sera un Coche:

    Este cdigo es algo ms completo definiendo el Coche.

    En la clase Coche ahora hay cuatro propiedades en lugar de una. Tambin tenemos un

    constructor que toma dos parmetros de tipo String (cadena de texto) y dos ms de tipo int

    (nmeros enteros). Para completar, aadimos un mtodo para obtener la informacin del

    Coche, respetando siempre el convenio de Java, usamos get como parte del nombre

    (traducido significa obtener).

    Ahora, al instanciar un Coche, tendremos que introducir toda la informacin que el constructor

    de la clase est esperando, sino, nos dar error y no nos dejar compilar. As que la clase

    pblica Main instancia un Coche pasando cuatro parmetros en lugar de dos. Si te fijas, los

    parmetros que no son cadenas de texto, se pasan sin usar comillas. Slo las cadenas de texto

    se rodean con comillas.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 29

    Ahora hagamos dos coches y probemos el resultado.

    La consola arroja:

    la especificacin de los dos coches. Como ves, el usar un objeto con diferentes propiedades da

    como resultado nuevos objetos con diferentes comportamientos. Esto es la programacin

    orientada a objetos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 30

    4 Las variables

    Decamos antes que las variables son palabras que guardan un valor, y el nombre de la variable

    debe ser significativo, para relacionar de forma humana lo que guarda.

    4.1 Variables primitivas

    Hay ocho tipos de datos primitivos en Java, son:

    char: es un carcter, su rango va desde el 0 al 65,535

    boolean: es un 0 o un 1, se usa para indicar si una condicin es falsa o verdadera.

    byte: almacena un valor entre -128 al 127.

    short: almacena un valor entre -32,768 y 32,767.

    int: almacena un valor entre -2,147,483,648 y 2,147,483,647.

    long: almacena un valor entre -9,223,372,036,854,775,808 y 9,223,372,036,854,775,807

    float: almacena un valor entre 1.40129846432481707e-45 y 3.40282346638528860e+38

    double: almacena un valor entre 4.94065645841246544e-324d y

    1.79769313486231570e+308d

    Aunque para nuestros efectos, usaremos normalmente float.

    Esto slo es a ttulo informativo, no tendrs que aprendrtelo de memoria, aunque si tendrs

    que aprender bien boolean e int, que son los ms usados.

    Si prefieres aprendrtelo de otra manera, a m me gusta ms esta:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 31

    4.2 Variables de instancia

    Las variables de una instancia (no de una clase), se definen dentro de una clase pero fuera de

    cualquier mtodo, y se inicializan cuando se inicializa la clase.

    Qu diferencia hay entre una variable de clase y otra de instancia? La variable de clase no se

    instancia, es decir, no se puede clonar con new.

    Muy importante es recordar que las variables de instancia pueden usar cualquiera de los

    cuatro niveles de acceso (te acuerdas? public, private, default y protected) y que pueden ser

    marcadas como final y transient.

    No puedes declararlas como abstract, synchronized, stricfp, native y por supuesto, static.

    Para entender variable de clase y variable de instancia, he modificado el cdigo:

    Fjate que en la variable de instancia, cada modelo de Coche tiene sus propias caractersticas,

    pero al poner como esttica una de las variables, automticamente se transforma en variable

    de clase, y al asignarle un valor al Ferrari, tambin se le asigna el valor al Toyota, de manera

    que cuando se ejecuta:

    Obtenemos:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 32

    4.3 Variables locales

    Las variables locales se encuentran en los mtodos, viven y mueren dentro de el, y se

    destruyen cuando el mtodo ha terminado su tarea.

    Las variables locales slo pueden ser marcadas como final.

    Al contrario que las variables de clase, las variables locales para poder usarlas, es necesario

    inicializarlas primero, es decir, asignarle un valor.

    Que es declarar una variable? Decir que existe sin que contenga un valor, por ejemplo:

    Que es inicializar una variable? Asignarle un valor (aunque sea un valor vaco).

    Tambin puedes inicializar la variable cuando la declaras:

    El resumen de los modificadores que puedes usar:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 33

    4.4 Variables de tipo final, transient y volatile

    El modificador final hace imposible reiniciar la variable una vez que se ha obtenido un valor

    explcito (que es distinto que un valor por defecto, como ocurre con las variables de clase).

    Acurdate que una clase final no puede heredarse, un mtodo final no puede sobrescribirse en

    una subclase y una variable final, no puede modificar su valor.

    El modificador transient sirve para decirle a la JVM que ignore la variable cuando se quiere

    serializar el objeto o deserializarlo. Cuando de/serializas un objeto lo que haces es

    recuperar/almacenar la informacin (del/en disco duro por ejemplo). Este recurso tan

    interesante ser visto ms adelante en profundidad.

    El modificador volatile le dice a la JVM que el hilo que accede a la variable debe obtener su

    propia copia. Esto se usa en procesos multihilos, donde cada hilo de ejecucin podr variar el

    valor de la variable. Profundizaremos en esto ms adelante, ahora solo tienes que saber que

    existe para ser usados en programacin multihilos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 34

    4.5 Variables estticas.

    El modificador static se usa para crear variables estticas. Una variable esttica pertenece

    siempre a la clase donde se crea, no a sus instancias (o clones). Como vimos en el ejemplo

    anterior, al crear una variable esttica en la clase Coche, su valor cambiaba en todas las

    instancias creadas con Coche, en el ejemplo, al cambiar el valor en Ferrari, Toyota tambin fue

    afectado.

    4.6 Arrays

    Los arrays son variables de tipo objeto porque son capaces de guardar mltiples valores o

    variables al mismo tiempo. Pueden almacenar datos primitivos o referencias a objetos. Esta

    clase de variables viven en el Heap.

    Los arrays se declaran comenzando por el tipo de elemento que el array va a almacenar,

    puede ser un objeto o datos primitivos seguidos de llaves cuadradas, luego le seguira el

    nombre de la variable.

    Aunque podramos poner los corchetes al final, resulta menos legible.

    Si colocamos ms corchetes, estamos creando dimensiones.

    Podemos hacer cosas absurdas como esta, aunque tambin son vlidas:

    Esto es lo mismo que poner dos corchetes juntos.

    En la declaracin nunca se pone el tamao al contrario que ocurre con otros lenguajes, que se

    puede iniciar el array declarando la cantidad de slots disponibles en el array.

    Quiero decir, esto, es ilegal:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 35

    La forma ms directa de construir un array es usando new seguido del tipo del array.

    En este ejemplo hemos creado 11 slots para guardar cadenas de texto en la variable nombre.

    Digo 11 porque se cuenta a partir del cero, si contamos el cero y el diez, tenemos once slots.

    Cuando se inicializa una variable, por defecto, en los slots encontraremos los valores por

    defecto del objeto. Para una cadena es nada, para un nmero es cero, y para objetos es null.

    Null no significa que nulo, no es un error, como en otros lenguajes, significa que no guarda

    ninguna referencia a ningn objeto.

    En los arrays dimensionales podramos decir que son arrays de arrays (en caso de arrays de

    dos dimensiones), es como imaginar el juego de hundir la flota. Si declaras una variable de 10 y

    10, imagnate un eje X de 10 posiciones y un eje Y de 10 posiciones (10 x 10), son 100

    posiciones de memoria reservadas.

    Los arrays de dos dimensiones pueden ser declarados de las siguientes maneras:

    Es decir, puedes inicializar la cantidad de slots en cada dimensin del array.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 36

    4.6.1 Inicializando los elementos en un bucle

    Un bucle es un bloque de instrucciones que se repite mientras se cumple una condicin.

    Veremos las diferentes clases que hay en profundidad.

    Los objetos de un array tienen solo una variable pblica que devuelve el nmero de elementos

    del array. El ltimo valor del ndex es siempre uno menos que la longitud del array. Esto se

    debe a que la posicin cero del array se cuenta en la longitud.

    As que, array[3] es array.lenght = 4, suponiendo que haya un elemento en cada slot del array.

    La forma ms sencilla de recorrer un array es usar el for de tipo foreach (sera la forma que

    correspondera a otros lenguajes, en Java no hay distincin).

    Lo que vemos aqu es que se ha declarado un array llamado numeros con 11 slots.

    El bucle es for y encierra entre llaves la repeticin de instrucciones.

    Dentro de for se declara a para que acepte cada elemento guardado en numeros.

    Inicializamos cada slot con el valor guardado en slot, que en cada repeticin del bucle suma

    uno (slot++). As que en cada bucle, se est eligiendo un slot para asignarle un valor

    (numeros[slot]=slot).

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 37

    O sea, esto est haciendo:

    numeros[0] = 0

    numeros[1] = 1

    numeros[2] = 2

    etc, hasta llegar al ltimo slot del array, el 9. Recuerda, del 0 al 9 son 10 slots.

    Otra manera es usando la antigua versin de for y la variable len del array.

    Lo que estamos viendo aqu es que en el for se inicializa la variable x con el valor de cero.

    En segundo lugar se especifica la condicin que mientras sea cierta, ejecutar el bloque de

    instrucciones, esta es que x sea menor que la longitud de numeros.

    Finalmente, le sumamos a la variable x un uno.

    Dentro del bucle se iguala la variable numeros con el ndice x al valor de x.

    Es exactamente el mismo proceso que el anterior, slo que aqu el final del array lo conocemos

    porque hacemos uso de la propiedad length del array. En for actualizado, esto se hace de

    forma automtica, el bucle se detiene porque conoce el ltimo elemento.

    Otra manera de declarar e inicializar un array es asignarle los valores en la misma lnea:

    Al hacer eso, ya le hemos dicho al compilador que nuestro array tendr 10 elementos.

    Se pueden crear los elementos in situ:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 38

    4.6.2 Arrays annimos

    La otra manera de crear e inicializar un array se la conoce como array annimo. Esto sirve para

    crear un array justo en el momento de su uso, por ejemplo, para drselo a un mtodo que lo

    coja como parmetro. El array se crea sin variable de referencia.

    4.6.3 Arrays primitivos

    Los arrays primitivos pueden aceptar cualquier valor que pueda ser promocionado

    implcitamente al tipo declarado en el array. Por ejemplo, un array de int, puede almacenar

    cualquier tipo de datos que pueda albergarse en 32bits. As que el siguiente cdigo es vlido:

    4.6.4 Array de referencias a objetos

    Si el tipo de array es una clase, puedes poner objetos de cualquier subclase del tipo declarado

    en el array. Por ejemplo, si Subaro es subclase de Coche, puedes ponerlo tal como se muestra

    en el ejemplo:

    Esto ayuda a recordar que los elementos en un Coche son solo variables de referencia a Coche.

    As que cualquier cosa que pueda ser asignada a Coche, puede ser asignada a un array de

    elementos de tipo Coche.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 39

    Si el array es declarado como un tipo de interfaz, los elementos del array pueden referirse a

    cualquier instancia de cualquier clase que implemente la interfaz. El siguiente cdigo

    demuestra el uso de una interfaz en un array:

    4.6.5 Asignaciones para arrays de una sola dimensin

    No estamos hablando sobre referencias en el array (en otras palabras, array de elementos),

    sino ms bien una referencia al array. Por ejemplo, si declaras un array int, la variable de

    referencia que declaras puede ser reasignada a cualquier array int (de cualquier tamao), pero

    no puede ser reasignado a cualquier que no sea un array int, incluyendo el valor int.

    Recuerda que todos los arrays son objetos, as que una referencia a un int no puede referirse

    a un nmero int. El siguiente cdigo muestra asignaciones vlidas y no vlidas para arrays

    primitivos:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 40

    Es tentador suponer que porque una variable de tipo byte, short, o char puede ser

    explcitamente casteada y asignada a un int, un array de cualquiera de los tipos podra ser

    asignado a un array int.

    No puedes hacer eso en Java.

    Los arrays que almacenan referencias a objetos, lo opuesto a datos primitivos, no tienen

    restriccin. As como puedes poner un Honda en Coche (porque Honda hereda Coche), puedes

    asignar un array de tipo Honda a una variable de referencia tal como sigue:

    Aplica el test ES-UN para distinguir lo que se puede de lo que no se puede hacer. Honda ES-UN

    Coche, as que el array de Honda puede ser asignado al array Car. Beer ES-UN Coche, no es

    cierto, no hereda Coche, as que no es vlido.

    Las reglas de los arrays se aplican por igual a las interfaces como a las subclases. Un array de

    interfaces, puede referenciar un array del tipo que haya implementado la interfaz. Recuerda

    que cualquier objeto de una clase que implementa una interfaz particular pasara el test de ES-

    UN. Por ejemplo, si Box implementa Foldable, lo siguiente, es vlido:

    4.6.6 Asignaciones para arrays de varias dimensiones

    Cuando asignas un array a un array ya declarado, el array que asignas debe ser de las mismas

    dimensiones que las referencias que estas asignando.

    Por ejemplo, un array de dos dimensiones de int no se le puede asignar a un int normal, tal

    como sigue:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 41

    Presta una atencin en especial a la asignacin de los arrays usando dimensiones diferentes.

    Podras por ejemplo, confundirte al asignar un array int al primero elemento de un array de

    int, como sigue:

    Puedes inicializar los bloques que quieras en una clase. Lo importante a tener en cuenta, es

    que, al contrario que los mtodos o constructores, el orden en el que los bloques aparecen en

    la clase, si importa.

    Cuando es la hora en que tienen que ejecutarse los bloques, si la clase tiene ms de uno,

    empezaran a ejecutarse en el orden en que aparecen la clase... en otras palabras, desde arriba

    hacia abajo.

    Acurdate de estas reglas:

    Los constructores se ejecutan en el orden en que aparecen.

    Los bloques estticos solo se ejecutan una vez, cuando la primera clase se haya cargado.

    Las instancias de los constructores se ejecutan cada vez que la clase se instancia.

    Las instancia de los constructores se ejecutan despus de la llamada a super(). Este cdigo:

    tendr esta salida:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 42

    Como puedes ver, las instancias de los bloques init se han ejecutado dos veces. Instanciar los

    bloques init son a menudo usadas en lugar de poner todo el cdigo en los constructores en la

    clase que deberan compartir.

    De esa manera, el cdigo no tiene que estar duplicado a travs de los constructores.

    Finalmente, si haces un error en tu bloque esttico, la JVM puede arrojar un

    ExceptionInInitalizationError.

    Veamos un ejemplo:

    producira un error como:

    Los bloques estticos se ejecutan antes, sin importar si estn despus:

    Este cdigo dar como resultado:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 43

    5.1 Declaracin de una enumeracin

    Una enumeracin se usa para minimizar an ms los riesgos de equivocacin en un grupo de

    trabajo. Esta es una buena prctica, adems que facilita la lectura del cdigo.

    En Java se puede restringir una variable para tener unos valores predefinidos, a esto se le

    llama lista enumerada o enumeraciones.

    Digamos por ejemplo que tenemos varios tipos de coches que podemos tener, deportivos,

    turismo y comerciales. Para evitar que otro programador intente obtener un coche que no

    existe, digamos 4x4, se restringe los valores de la enumeracin a los que tengas creados.

    Declarar una enumeracin es tan fcil como esto:

    Respetando el convenio de Java, se presentan en maysculas.

    El uso es igual de sencillo, adems, cuando declaras una enumeracin, el editor (yo uso

    Eclipse) te ayuda mostrando las opciones disponibles:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 44

    De tal manera que la nica forma de conseguir coches ahora es usar las opciones que nos deja

    disponible la enumeracin:

    Los componentes bsicos de una enumeracin son sus constantes. Pueden ser declaradas

    como clase propia (como en este ejemplo), miembro de una clase, pero no pueden ser

    declaradas dentro de un mtodo.

    As se declara como miembro de una clase:

    Acurdate que slo puede existir una clase pblica por fichero.

    Esto sera miembro de una clase:

    Es posible que encuentres la declaracin de una enumeracin terminando en ; esto es

    opcional.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 45

    Bueno, y una vez que tengo una enumeracin, que hago?

    Antes hay que explicar un poco ms. Una enumeracin no es un tipo String o int. Cada

    miembro de una enumeracin es una instancia de la misma (o sea, un nuevo clon). As que

    DEPORTIVO no es slo una constante de la enumeracin, es un tipo de TiposDeCoches. Es

    decir, al igual que un tipo es un String o un int, pues acabamos de crear tres tipos nuevos de

    TiposDeCoches.

    Una enumeracin es como una clase, la diferencia es que a cada valor le corresponde una

    instancia de la enumeracin, donde la instancia es esttica y final, es decir, no se puede editar

    su valor, ni se puede hacer una subclase de ella (usar la palabra new) as que realmente se

    tratan como de una constante.

    A cada valor de la enumeracin le corresponde un orden de indexado, es decir, la enumeracin

    sabe en que orden estn los tipos de coche.

    Ms adelante profundizaremos en este tema, de momento tienes que saber que existe y cmo

    funciona bsicamente.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 46

    5.2 Mtodos y variables en una enumeracin

    Una enumeracin adems de declarar tipos estticos y finales, puede ejecutar acciones al igual

    que una clase, es decir, podemos usar mtodos y variables, y algo raramente conocido como

    cuerpo de clase constante especfica. Esto es til por ejemplo, si quieres aadir una propiedad

    a los tipos, como por ejemplo, el nmero de puertas (por decir algo):

    Bien, no te asustes, es sencillo y te lo voy a explicar. A cada tipo le hemos asignado un nmero,

    presumiendo que representan el nmero de puertas de cada tipo de coche. Pero para poder

    usar estos nmeros es necesario crear un constructor, ese constructor, al igual que en las

    clases, tiene el mismo nombre que la clase donde se crea. En nuestro caso acepta un

    parmetro de tipo int que se recoge del valor guardado en el tipo, es decir, nuestro

    constructor acepta un nmero que representa la cantidad de puertas del tipo de coche.

    Al igual que las clases, he incluido un mtodo para saber cuntas puertas tiene ese vehculo,

    getPuertas.

    No puedes olvidar que en el constructor no se puede invocar directamente. Se convoca

    automticamente con los argumentos que defines en las constantes. Por ejemplo

    DEPORTIVO(3) invoca al constructor y le pasa el parmetro 3. Esto lo habrs adivinado, y si no

    es as, es que necesitas practicar esto un poco. Coge Eclipse (u otro editor) y practica un poco.

    Al igual que en las clases, puedes sobrecargar el constructor, es decir, crear ms de uno.

    Tambin puedes hacer cosas extraas, como que parezca una clase annima interna (este tipo

    de clases la veremos ms adelante), se conoce como cuerpo de constante especfico y se usa

    cuando necesitas una constante para definir un mtodo definido en la enumeracin.

    Lo veremos ms claro con un ejemplo.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 47

    Imaginemos que necesitamos devolver el tipo de combustible del coche, por defecto son todos

    gasolina pero el comercial sera diesel.

    Puedes fijarte que a la enumeracin se incluye getCombustible, pero en COMERCIAL se han

    abierto unas llaves donde se define el mismo mtodo, es decir, lo est sobrescribiendo.

    Mientras que para el DEPORTIVO y el TURISMO el combustible devuelto ser gasolina, el

    COMERCIAL devolver diesel.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 48

    6.1 Encapsulacin

    La encapsulacin consiste en el acceso a las variables de la clase mediante un mtodo en lugar

    de hacerlo directamente. Bueno, y esto para qu sirve?

    Imagnate que estas creando un cdigo donde ests trabajando con un puado de personas,

    que no conocen las clases que has hecho, y la misma situacin es la tuya, tu no conoces su

    trabajo aunque estis participando en el mismo proyecto, te va sonando L2J?

    Si accedieses directamente a las variables podras pasarle tipos errneos.

    Que es un tipo?

    Un tipo es cada clase creada para trabajar con ellas, cada objeto que se crea o existe en Java,

    es un tipo.

    Otra ventaja es el mantenimiento del cdigo. Si en tu cdigo hubiera que corregir el cdigo y

    otro programador usase tu clase mediante los mtodos de la clase, este programador no

    necesitar saber siquiera los cambios que hagas en tu programa, no se enterar.

    Por ejemplo:

    Aqu tenemos el hipottico caso en que un programador ha creado la clase Arma, y otro

    programador que la est usando. Como vemos, puede declarar un Arma con una potencia

    infinita. Si Coder crease un arma con potencia cien millones y resultase que esa arma

    descompensase el server (porque el jugador se hiciese invulnerable, por ejemplo), habra que

    arreglar este bug!

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 49

    Como arreglar este bug sin que Coder tenga que editar su cdigo? Bien, pues Magneto lo

    nico que tiene que hacer es limitar la potencia del arma:

    Magneto rescribe su cdigo, si la potencia es mayor de 100, entonces la potencia es 100. De

    esta manera Coder no tiene que editar su cdigo, ni se ha enterado, l sigue haciendo lo suyo

    sin tener que mirar tu cdigo.

    Los beneficios que recibes pensando en POO es flexibilidad y mantenimiento.

    La habilidad de hacer cambios en tu cdigo sin romper el cdigo de otros programadores es la

    clave de la encapsulacin.

    Cuando creas una serie de mtodos accesibles desde otras clases (y manteniendo tus

    implementaciones ocultas para proteger tu clase), estas creando APIs.

    Para conseguir mantenimiento, flexibilidad y extensibilidad debes seguir estas premisas:

    Las variables de la instancias deben estar protegidas, el modificador de acceso

    normalmente, privado.

    Crea mtodos de acceso pblico para forzar a otros programadores a acceder

    directamente a los mtodos en lugar de a las variables.

    Usa la convencin de JavaBeans, setNombreMetodo, getNombreMetodo.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 50

    Veamos ejemplos:

    Como habamos dicho antes, las variables de instancia han de ser privadas, de tal manera que

    el programador no pueda acceder directamente a ella.

    Ahora la nica manera de seleccionar la potencia del arma es mediante el mtodo

    setPotencia.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 51

    Encapsulada la variable de clase y protegiendo el exceso de potencia mediante nuestro cdigo,

    an tenemos un posible error que controlar, os pongo el cdigo:

    El error es que Coder an podra crear un arma con potencia -100, pero te diste cuenta

    demasiado tarde, ya estn usando el programa.

    Vas a decirle a Coder que ha ingresado un valor negativo para el arma y que la gente se est

    quejando porque su arma no mata sino que cuenta chistes?

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 52

    NO! Magneto rescribe su cdigo gracias a que ha hecho uso de la encapsulacin.

    y Coder ni se entera.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 53

    6.2 Polimorfismo

    El polimorfismo es la posibilidad de que una clase hereda las caractersticas de otra clase para

    crear una nueva.

    La clave para usar de buena forma el polimorfismo es preguntarte ES UN?

    Ejemplo, creamos la clase Coche, y luego creamos Ferrari heredando las caractersticas de

    Coche. Como saber si lo estamos haciendo bien? Plantate la pregunta, Es un Ferrari un

    Coche? La respuesta es SI.

    Ahora creas la clase Mercedes heredando las caractersticas de Ferrari. Ambos son coches,

    parece estar bien, pero si te preguntas Un Mercedes es un Ferrari? La respuesta es NO, as

    que estas liando los objetos.

    Con este truco jams te equivocars. Recuerda, ES UN.

    Para usar esta caracterstica usamos la palabra clave extends.

    En que consiste la herencia?

    La herencia consiste en heredar todas las propiedades de una clase. La utilidad de esto es que

    aadiendo nuevas propiedades creas nuevos objetos.

    Ejemplo, la clase Coche lleva ruedas, puertas, frenos, motor.

    La clase Ferrari lleva adems de lo que lleva un Coche, un caballo como smbolo, el constructor

    es Minielli y el diseador es Montiveri (por decir cualquier cosa).

    La clase Spider que hereda a Ferrari, adems de lo que lleva Ferrari, y de lo que lleva un Coche,

    mide 5 metros y alcanza los 295Km/h.

    Podramos sacar una nueva clase de Ferrari heredando Ferrari, o podramos sacar un Coche

    nuevo como Mercedes heredando Coche, o incluso podramos sacar un

    CocheVoladorSubmarino heredando Coche y aadiendo las caractersticas de un coche que

    vuele y se sumerja.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 54

    En este ejemplo vemos cmo se crea Coche, CocheVolador y CocheVoladorSubmarino, donde

    CocheVolador aparte de tener alas y flaps propias de un avin, hereda rueda, frenos, puertas

    y chasis. Ms complejo aun es el CocheVoladorSubmarino, que aparte de llevar timn, vela y

    mastil propias de un barco, lleva alas y flaps del CocheVolador, y como el CocheVolador

    hereda Coche, CocheVoladorSubmarino tambien hereda ruedas, frenos, puertas y chasis.

    Aparte de sus variables de instancia, tambin heredarn sus mtodos, como podra ser

    frenar() (para el Coche), despegar() (para el coche volador) e inmersin() (para el coche

    volador submarino).

    Y si quisiera hacer un CocheTanque? Pues... heredara las propiedades de un Coche y le aado

    las caractersticas de un Tanque.

    La nica manera de acceder a un objeto es a travs de una variable de referencia, es decir, la

    variable que usas con new, en el ejemplo podemos ver que mi referencia a un coche volador

    submarino es DelfinConAlas.

    Tienes que saber que la variable de referencia slo puede ser de un slo tipo, es decir, aunque

    DelfinConAlas es el resultado de la herencia de un Coche y de un CocheVolador, el tipo es

    CocheVoladorSubmarino y nada ms.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 55

    A la variable de referencia le puedes asignar otros objetos, a menos que sea declarada como

    final. Es decir:

    Una variable de referencia tambin puede referirse a cualquier objeto del mismo tipo

    declarado en la referencia, incluso puede hacer referencia al subtipo declarado.

    A esto se le llama casteo que lo veremos en profundidad. En el ejemplo vemos que declaro un

    CocheVoladorSubmarino donde la variable de referencia est referida a un CocheVolador.

    Como es del mismo subtipo, el compilador no lanza error y lo acepta como correcto.

    Una variable de referencia tambin puede ser declarada como un tipo de clase o un tipo de

    interfaz. Si se declara como un tipo de interfaz puede referenciar cualquier objeto de cualquier

    clase que implemente la interfaz.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 56

    En el ejemplo la variable de referencia est declarada como interfaz Frenar pero se inicializa

    como CocheVoladorSubmarino, ya que CocheVoladorSubmarino implementa la interfaz

    Frenar.

    Al implementar una interfaz (lo habamos visto antes) se deben implementan los mtodos

    declarados, pero el cdigo de los mtodos abstractos tiene que ser escrito por ti.

    Fjate que la nica clase que implementa los mtodos es Coche, CocheVolador y

    CocheVoladorSubmarino no lo escriben. Eso es, como ya dije antes, que heredan sus mtodos,

    y no hace falta volver a escribirlos. Es ms, si se rescriben, estaras sobrescribiendo los

    mtodos de la clase que se hereda, o sea, creando unos nuevos. Esto est bien cuando el

    cdigo del mtodo no es suficiente para la clase que lo hereda.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 57

    6.3 Casteo de variables de referencia

    Como hemos visto en el tema anterior, un casteo consiste en cambiar de un tipo a otro tipo,

    siendo el otro tipo un subtipo, es decir, un casteo de Ferrari a Coche es posible, pero no uno

    de Ferrari a CocheVoladorSubmarino.

    Es un Ferrari un CocheVoladorSubmarino?

    NO! Acurdate siempre de este truco.

    En el casteo existen dos direcciones, subir en la escala de la herencia, que se denomina

    upcasting y el compilador funciona explcitamente (es decir, no tienes que indicarle que ests

    haciendo un casteo) y bajar en la escala de herencia, denominado downcasting, donde si

    tienes que indicar explcitamente el casteo.

    Ejemplo:

    Aqu vemos que se declara c1 como Clase1 y se hace un casteo a la Clase4. Como la herencia es

    ascendente, no hace falta indicar expresamente el casteo.

    Pero al hacerlo al revs (downcasting):

    el compilador se queja, indicar el casteo se hace obligatorio.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 58

    Pero, qu pasa si una vez casteado, queremos usar el mtodo de otro tipo?

    El casteo ahora est hecho correctamente, el compilador est feliz por la aclaracin, pero al

    ejecutar el programa, sorpresa...

    Por qu ocurre esto? Por qu el compilador no nos ayuda y ver que Clase1 y Clase4 son del

    mismo subtipo? El compilador lo nico que puede hacer es confirmar que ambos tipos

    pertenecen al mismo rbol de la herencia.

    En un upcasting, el nmero de mtodos se restringe, as que no existe la posibilidad de que un

    mtodo de una clase se haya sobrescrito, al contrario que ocurre con un downcasting. El punto

    es que ninguna referencia de tipo Clase4 puede hacer llamadas seguras a una instancia de

    Clase1.

    Ojo, con esto no digo que el downcasting est prohibido. Si el compilador ve que hay

    posibilidad de que en tiempo de ejecucin funcione, compilar.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 59

    En este ejemplo vemos como el downcasting si est permitido. Explico el ejemplo.

    La clase Object es la clase de la que derivan todas las clases en Java, es la primera clase.

    La clase String es una clase derivada de Object que contiene cadenas de texto.

    Como la referencia o es una cadena de texto, cuando hacemos downcasting de Object a String,

    el compilador ve que la referencia es una cadena de texto, el mismo tipo que hace referencia

    o, y no da error. Esto compila sin problemas.

    Aunque es raro usar esto de esta manera, nunca est de ms saber que existe y como

    funciona.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 60

    6.4 Implementando una interfaz

    Al crear interfaces te aseguras que otro programador seguir las reglas que tu creaste para el

    comportamiento de una clase.

    Por ejemplo, si creas una interfaz como Volador te aseguras que alguien que cree un objeto

    que vuele tenga los mtodos que necesitas para poder hacer que ese objeto vuele.

    En el ejemplo vemos la implantacin forzosa de los mtodos que nos supone usar la interfaz

    Volador.

    Los comentarios los aade automticamente Eclipse al aceptar implementar los mtodos de la

    interfaz. @Override significa sobrescribir, y eso es lo que tenemos que hacer, crear cdigo para

    que esta clase pueda volar. Esos mtodos sern invocados desde otras clases que ya presumen

    que todos los objetos que vuelan podrn realizar las acciones que indica la interfaz.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 61

    Aunque el compilador no se va a quejar de que no pongas nada en los mtodos que

    implementas, no quiere decir que ests haciendo una buena implementacin, por eso hay que

    seguir esta serie de reglas:

    Proveer de implementaciones no abstractas de todos los mtodos de la interfaz.

    Usar las reglas de la sobrescritura, es decir, debe devolver el mismo tipo.

    Declarar las excepciones no declaradas en los mtodos implantados que son

    declarados en el mtodo de la interfaz o subclase. Veremos cmo se hace esto ms

    adelante.

    Mantener el nombre del mtodo de la interfaz y el mismo tipo o subtipo.

    Una implementacin tambin puede ser abstracta por si misma, es decir, una interfaz puede

    heredar otra interfaz, o ms de una, y no tiene que declarar los mtodos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 62

    Mientras que una clase slo puede heredar una clase, una interfaz puede heredar mltiples

    clases.

    Pero una interfaz no puede implementar nada aunque una clase puede implementar mltiples

    clases.

    Las interfaces son siempre pblicas, aunque no lo declares explcitamente.

    Los mtodos implementados de la interfaz, han de ser pblicos, no puedes usar los

    modificadores private, final, protected, o default.

    Recuerda, que extends se usa para heredar otra clase, e implements se usa para clases

    abstractas o interfaces. Las clases abstractas tienen mtodos no implementados (sin cuerpo) y

    deben ser sobrescritos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 63

    6.5 Tipos de retornos en constructores sobrecargados

    Sobrecargar un mtodo es crear otro mtodo con el mismo nombre pero aceptando diferentes

    parmetros.

    Tambin se puede sobrecargar un mtodo cuando una clase hereda a otra (heredando sus

    mtodos) y rescribes el mtodo.

    Cuando se crean mtodos que devuelven tipos distintos, segn los parmetros dados en el

    mtodo, el tipo de retorno es distinto.

    Lo que no puedes hacer es rescribir el mtodo en lugar de sobrecargarlo, as sin ms:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 64

    Si quieres rescribir el mtodo en tu subclase, es decir, sobrescritura, puedes cambiar el tipo de

    retorno si el tipo es un subtipo de la superclase.

    En este ejemplo int y byte son distintos tipos, pero pueden ser casteados, es decir, si el valor

    de int no supera el valor de 255 que es el rango mximo de byte, puede funcionar sin errores

    en tiempo de ejecucin.

    Otro ejemplo:

    Aqu Main hereda Uno, as que Main automticamente es subtipo de Uno, por eso el retorno

    del tipo es correcto.

    6.5.1 Devolviendo un valor

    Hay cinco sencillas reglas para devolver un valor.

    1. Puedes devolver null en un mtodo con un objeto de referencia de tipo return.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 65

    2. Puedes devolver un array. Aunque no hemos visto como se construye un array, en

    el ejemplo se puede observar que se incluye unos corchetes [] al lado del tipo de

    devolucin, para indicar que se trata de un array, y dentro del mtodo, al inicializar

    la variable con los valores.

    3. En un mtodo con tipo de retorno primitivo, puedes devolver cualquier valor o

    variable que pueda ser convertida implcitamente al tipo declarado. Esto es lo que

    vimos antes del casting.

    4. Si el mtodo usa void (vaco) se presume que no devuelve nada, o sea, un valor

    vaco. Hacer que devuelva un valor es ilegal:

    5. Un mtodo que use un objeto de referencia, puede devolver cualquier tipo que

    pueda ser casteado implcitamente al tipo de retorno.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 66

    6.6 Autoboxing

    Esta caracterstica consiste en convertir tipos automticamente, y es una caracterstica

    aadida en Java 5.

    Antes de existir esto, era ms complicado hacer una conversin evidente:

    y ahora:

    Donde se puede hacer autoboxing?

    La regla general es que el boxing y unboxing funcionan cuando normalmente usas un dato

    primitivo o un envoltorio (o sea, el nombre del objeto como Integer).

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 67

    7.1 Construccin, reglas y sobrecargas de constructores

    Cuando instancias un objeto con new se invoca el constructor de la clase siempre, pero

    adems de esto, se ejecuta el constructor de la superclase, es decir, se ejecutan todos los

    constructores de su superclase, y la ltima clase, de donde nacen todas las clases es Object.

    Un constructor por defecto es como esto:

    Lleva el mismo nombre de la clase y entre llaves no hay nada. Este constructor no es necesario

    crearlo, el compilador lo hace por ti.

    Los constructores normalmente se usan para inicializar las variables de la instancia, es decir,

    los valores de las variables de la clase instanciada:

    La palabra clave this se usa para hacer hincapi en que nos referirnos a la variable de instancia,

    no a las variables del mtodo que tienen el mismo nombre. Adems, Eclipse pinta de azul las

    variables de la instancia siempre que entienda que te refieres a ellas.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 68

    Cuando creas un constructor, el constructor por defecto se omite, as que si quieres crear un

    Circulo sin pasar los parmetros que has establecido, dar error:

    Las opciones que muestra Eclipse para arreglar el error es:

    Aadir los argumentos que encajen con Circulo(int, int, int)

    Cambiar el constructor Circulo(int, int, int): Quitar los parmetros int, int, int

    Crear el constructor Circulo()

    Como ves, si uno de los consejos es crear el constructor que debera estar por defecto, es que

    ya no est ah.

    Aunque sea deseable siempre tener un constructor sin argumentos para una clase, muchas

    veces, como en el ejemplo, no tiene sentido u ocasionara un error.

    Puedes crear tantos constructores como quieras dentro de una clase.

    Las reglas para crear un constructor:

    Los constructores pueden usar cualquier modificador de acceso.

    El nombre del constructor tiene que ser el mismo que el de la clase.

    Los constructores no devuelven nada (no tienen return).

    Es legal aunque estpido tener un mtodo con el mismo nombre que la clase. Esto no

    significa que sea un constructor.

    Si no se crea un constructor, el compilador crea uno por defecto, aunque no se vea en

    el cdigo.

    El constructor por defecto nunca lleva argumentos.

    Si has escrito un constructor y quieres otro sin argumentos, tendrs que hacerlo t

    mismo.

    Cada constructor invoca implcitamente a this o super.

    Si no incluyes this o super, el compilador lo har por ti, con o sin argumentos.

    No se puede invocar a ninguna parte de una instancia hasta que su constructor se haya

    ejecutado.

    Solo las variables estticas y mtodos pueden ser accedidas con super o this.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 69

    Las clases abstractas tambin tienen constructores, son ejecutados cuando la subclase

    que los instancia son ejecutadas.

    Las interfaces no tienen constructores, como no son parte de ningn objeto, no

    forman parte de ningn rbol de herencia.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 70

    7.2 Encadenamiento de constructores

    Los constructores solo se ejecutan cuando usamos new en alguna clase, pero no slo se

    ejecuta este nico constructor.

    Al iniciar un constructor, tambin se inicia el de su superclase, hay un comando que se usa

    implcitamente, se ejecuta super(), y sirve para invocar a la superclase, y as sucesivamente

    hasta llegar a la superclase de todas las clases, Object.

    Para ver el efecto domin, miremos este ejemplo:

    La clase Main crea una instancia de la Clase4, pero fjate que antes de ejecutarse el

    constructor de la clase 4, se ejecuta primero el de la superclase ms alta hasta llegar a la clase

    4.

    Cuando se ejecuta un mtodo sin usar super, en este ejemplo, info, se ejecuta el de la clase

    que sobrescribe al de la superclase:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 71

    Pero si quitamos el mtodo de la clase 4, se ejecuta el de la clase 1, lo mismo que si

    hubiramos usado super(), solo que el compilador ya lo hace por nosotros:

    Aqu inserto super() en la clase 4:

    En este ejemplo, se usa super para invocar al constructor de la superclase, pero si te fijas, al

    pasarle solo un argumento, se ejecuta el constructor de la clase2 sin arrojar error:

    Al pasar 2 argumentos da error, porque no hay constructores con dos argumentos:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 72

    Finalmente, si instanciamos la clase 1, la clase 2 podr leer las variables de la superclase:

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 73

    8.1 Mtodos y variables estticas

    Hay que hacer una distincin entre las variables y variables marcadas como estticas.

    Las variables no estticas se resetean en cada nueva clase instanciada, mientras que la variable

    esttica pertenece a la clase, en lugar de a la instancia.

    Estudiemos este ejemplo:

    Mientras que numero ha sido declarado sin el modificador static, es inicializado en cada

    instancia de la clase, mientras que conteo suma uno cada vez que se ejecuta el constructor, es

    decir, cada vez que se usa new. En ambas clases instanciadas, conteo tiene el mismo valor, ya

    que es esttico, no es una variable de la instancia, sino que es una variable esttica, que

    pertenece a la clase, no a sus copias. Esto tambin es aplicable a los mtodos estticos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 74

    8.2 Accediendo a mtodos y variables estticas

    En el momento en que no necesitas una instancia para acceder a los mtodos o variables

    estticas usaremos el operador punto(.).

    Reglas que debes conocer:

    Adems los mtodos estticos no pueden ser rescritos.

  • Curso gratuito de Java en emuladores L2 Java 2012

    e m a i l : b r u j u l a t o @ y a h o o . e s

    Pgina 75

    9.1 Funcionamiento del recolector de basuras

    Vamos a ver lo que queremos decir cuando hablamos del recogedor de basuras en la tierra de

    Java. A diez mil metros de altura, el recolector de basuras es la frase que se usa para describir

    el manejo de memoria en Java. Cuando un programa se ejecuta (en Java, C, C++, Lisp, Ruby...)

    usa la memoria de diferentes maneras. No vamos a meternos en la ciencia 101 de la

    computacin, pero lo tpico de la memoria es que se use para crear una pila en el Heap, que es

    la piscina donde Java pone sus mtodos y sus constantes. El Heap es la parte de la memoria

    donde los objetos de Java viven, y es una y nica parte de memoria que esta de cualquier

    modo envuelta en el proceso del recolector de basuras.

    As, que la directiva del recolector de basuras es liberar al Heap, para dejar libre el mayor

    espacio de memoria disponible. Lo que hace es borrar los objetos que no son alcanzables por

    el programa Java que est corriendo. Hablaremos ms cuando lleguemos al siguiente punto.

    Cuando el recolector de memoria se ejecuta, su propsito es encontrar y borrar objetos que

    no pueden ser alcanzados. Imagina un programa Java que es el comienzo de un bucle de

    creacin de objetos (que estn en el Heap), y que elimina los objetos cuando no se necesiten

    ms, crear nuevos objetos, descartarlos, etc... la pieza que falta es el recolector de basuras.

    Cuando se ejecuta, buscara esos objetos descartados y los borrara de la memoria

    descargndola para que pueda continuar. Ah, el gran circulo de la vida.

    9.1.1 Cuando se ejecuta el recolector de basuras?

    El recolector de basuras funciona bajo el control de la JVM. La JVM decide cuando se ejecuta el

    recolector de basuras. Dentro de tu programa Java puedes pedir a la JVM que ejecute el

    recolector de basuras, pero no hay garantas, bajo ninguna circunstancia, de lo que la JVM va a

    hacer. La JVM ejecutar el recolector cuando la memoria alcance mnimos. La experiencia me

    indica que cuando le pides a la JVM que