miércoles, 16 de febrero de 2011

C4, 12/02/11: Bloque I.8: Clases de Utilidad

  • Introducción

  • A medida que vayas programando en Java te darás cuenta de que existe una gran cantidad de clases que resuelven muchos de los problemas que se te pueden presentar.


    Conocer la existencia de estas clases y su funcionalidad te ayudará a desarrollar rápidamente tus propias aplicaciones.


    En este capítulo se presentan algunas clases útiles que rápidamente incorporarás en tus aplicaciones, en particular vamos a estudiar los tipos genéricos, introducidos en Java SE5.



  1. Envolturas

  2. En Java existen dos tipos de datos: los tipos primitivos y los tipos referencia.


    La colecciones sólo pueden almacenar referencias.


    Entonces, ¿Cómo podemos utilizar las colecciones con los tipos primitivos?


    Tipo base primitivoEnvoltura
    voidjava.lang.Void
    booleanjava.lang.Boolean
    charjava.lang.Character
    bytejava.lang.Byte
    shortjava.lang.Short
    intjava.lang.Integer
    longjava.lang.Long
    floatjava.lang.Float
    doublejava.lang.Double

    Siempre es posible recuperar un tipo base a partir de su envoltura:



    Integer envolturaEntero = new Integer(15);
    Float envolturaReal = new Float(15.5f);
    int entero = envolturaEntero.intValue();
    float real = envolturaFloat.floatValue();

    Por otro lado, se pueden conseguir tipos numéricos primitivos a partir de String:



    String stringEntero = “505”;
    String stringReal = “1.234”;
    int entero = Integer.parseInt(stringEntero);
    float real = Float.parseFloat(stringReal);

    Muy útil al procesar los parámetros de entrada de la función main.


  3. Colecciones. Genéricos.

  4. Las colecciones son contenedores de objetos, como por ejemplo vectores, tablas de dispersión, listas,...





    InterfaceImplementación
    SetHashSet
    SortedSetTreeSet
    ListArrayList, LinkedList, Vector
    MapHashMap, HashTable
    SortedMapTreeMap

    Interface Collection



    public boolean add(Object o)
    public boolean remove(Object o)
    public boolean contains(Object o)
    public int size()
    public boolean isEmpty()
    public Iterator iterator()
    public Object[] toArray()
    public Object[] toArray(Object[] a)


    public void add(int posicion, Object o)
    public void remove(int posicion)
    public Object get(int posicion)
    public void set(int posicion, Object o)


    public class A { //Aunque no es indique explícitamente, esta clase es hija de "Object"
    protected int a = 0;
    public A() {};
    public A(int a) { this.a = a; }
    public void getA() {
    System.out.println("Clase A, valor: "+a);
    }
    }
    class B extends A { //Y por lo tanto esta también
    public B() { super(0); }
    public B(int a) { super(a); }
    public void getA() {
    System.out.println("Clase B, valor:"+a);
    }
    }


    public static void main(String args[]) { //¿Qué imprime?
    public static void main(String args[]) {
    ArrayList al = new ArrayList(); //Clase A, valor: 0
    for(int i = 0; i < 10; i += 2) //Clase A, valor: 2
    al.add(new A(i));//Objetos de tipo A //Clase A, valor: 4
    for(int i = 1; i < 10; i += 2) //Clase A, valor: 6
    al.add(new B(i));//Objetos de tipo B //Clase A, valor: 8
    A a = null; //Clase B, valor: 1
    Iterator it = al.iterator(); //Clase B, valor: 3
    while(it.hasNext() == true) { //Clase B, valor: 5
    a = (A)it.next(); //Objetos de tipo Object //Clase B, valor: 7
    a.getA(); //Clase B, valor: 9
    }
    }


    public class A {
    private int a;
    public A(int a) {this.a = a;}
    public void print() {
    System.out.println("Soy A y mi valor es: "+a);
    }
    }
    public class B {
    private int b;
    public B(int b) {this.b = b;}
    public void print() {
    System.out.println("Soy B y mi
    valor es: "+b);
    }
    }


    public static void main(String args[]) {
    ArrayList al = new ArrayList();
    for(int i = 0; i < i =" 5;" it =" al.iterator();" obj =" it.next();">

    public static void main(String args[]) { //Ahora Compila!!!
    ArrayList al = new ArrayList(); //Soy A y mi valor es : 0
    for(int i = 0; i < i =" 5;" it =" al.iterator();"> Error en tiempo
    A a; //de ejecución en "a=(A)it.next()"
    while(it.hasNext()) {
    a = (A)it.next();
    a.print();
    }
    }

    ¿Cómo solucionarlo?



    //Solucionado!!
    public static void main(String args[]) {
    ArrayList al = new ArrayList();
    for(int i = 0; i < i =" 5;" it =" al.iterator();" ob =" it.next();" a =" (A)ob;" b =" (B)ob;">

    Solución utilizando Interfaces



    public class A implements Imprime {
    private int a;
    public A(int a) {
    this.a = a;
    }
    public void print() {
    System.out.println("Soy A y mi valor es: "+a);
    }
    }

    public interface Imprime {
    public void print();
    }

    public class B implement Imprime {
    private int b;
    public B(int b) {
    this.b = b;
    }
    public void print() {
    System.out.println("Soy B y mi valor es: "+b);
    }
    }

    public static void main(String args[]) {
    ArrayList al = new ArrayList();
    for(int i = 0; i < 5; i++)
    al.add(new A(i));
    for(int i = 5; i < 10; i++)
    al.add(new B(i));
    Iterator it = al.iterator();
    Imprime imp;
    while(it.hasNext()) {
    imp = (Imprime) it.next();
    imp.print();
    }
    }
    //SOLUCIONADO!!

    Desde la versión del lenguaje SE%, se han introducido los tipos de datos genéricos, similares a los tipos de datos bastracto en C++



    ArrayList al = new ArrayList();
    al.add(1); // Se crea un Integer con «1».
    int i = al.get(0); // A partir de Integer se obtiene un int

    Se hace conversión entre tipos primitivos y envolturas:

    int <--> Integer

    float <--> Float

    boolean <--> Boolean

    ...


    También se ha introducido una nueva estructura de control, el bucle for-each, con una sintaxis compacta.


    • Sin genéricos:


    • ArrayList al = new ArrayList();
      for(int i = 0; i < 10; i++)
      al.add(new Integer(i));
      for(int i = 0; i < 10; i++)
      System.out.println(((Integer)al.get(i)).intValue);

    • Con genéricos:


    • ArrayList<Integer> al = new ArrayList<Integer>();
      for(int i = 0; i < 10; i++)
      al.add(i); // Conversión int --> Integer
      for(Integer i: al) // Bucle for-each
      System.out.println(i); // Conversión Integer --> int


    Además los genéricos evitan errores que antes sólo se detectarían en tiempo de ejecución: Antes de JAVA SE5



    ArrayList al = new ArrayList();
    al.add(new Integer(1));
    al.add(new Float(1.2));
    Iterator it = al.iterator();
    while(it.hasNext())
    Integer i = (Integer)it.next(); // Error en ejecución,
    //2º elemento Float


    ArrayList<Integer> al = new ArrayList<Integer>();
    al.add(new Integer(1));
    al.add(new Float(1.2)); // Error en compilación.

  5. Strings

  6. Los Strings almacenan cadenas de caracteres que NO se pueden modificar.



    String unaCadena = “Nombre “;
    String otraCadena = “Apellidos”;
    unaCadena = unaCadena + otraCadena; //El objeto String que contenía "Nombre" se pierde, y se crea
    // otro con el contenido "Nombre Apellidos" que es referenciado por "unCadena"

    Existe una gran cantidad de constructores para los Strings:



    String cadena = "Esto es una cadena.";
    char letras[]={"a", "b", "c"};
    String otraCadena = new String(letras);
    String pi = String.valueOf(3.141592);

    Y muchos métodos de utilidad



    public boolean equals(Object o)
    public int length()
    public String toLowerCase()
    public String toUpperCase()
    public String[] split(String s)
    String cadena = “Esto es una cadena”;
    String palabras[] = cadena.split(“ “);
    palabras[] = {“Esto”, “es”, “una”, “cadena”};

    • StringBuffer

    • Esta clase se comporta como un String pero se puede modificar. Es Thread safe


    • StringBuilder

    • Funcionalidad muy parecida a StringBuffer pero no es Thread safe.



  7. Matemáticas

    • Métodos de la clase java.lang.Math


    • public static [double|float|etc] abs(double|float|etc)
      public static double sin(double a)
      public static double cos(double a)
      public static double tan(double a)
      public static double log(double a)
      public static double sqrt(double a)
      public static double pow(double a, double b)
      public static double asin(double a)
      public static double acos(double a)
      public static double atan(double a)
      //Como se puede apreciar todos son "static"

    • Métodos de la clase java.util.Random


    • public boolean nextBoolean()
      public float nextFloat()
      public int nextInt()
      public int nextInt(int n)
      public long nextLong()
      public double nextDouble()
      public double nextGaussian()


  8. Entrada desde teclado

  9. La clase java.util.Scanner es una potente clase para leer datos desde streams de entrada, por ejemplo el teclado:



    Scanner escaner = new Scanner(System.in);
    escaner.useDelimiter(“\\n”);
    String cadena = escaner.next();
    int entero = escaner.nextInt();

    • Resumen

    • A medida que vayas conociendo más clases Java disminuirás el tiempo de codificación.


      En esta sesión se han presentado clases de uso inmediato en tus aplicaciones:


    • Envolturas.

    • Colecciones y Genéricos.

    • Cadenas de caracteres.

    • Matemáticas..


martes, 15 de febrero de 2011

C3, 11/02/11: Bloque I.7: Excepciones

  • Introducción

  • Las excepciones son situaciones anómalas que se producen durante la ejecución, como por ejemplo acceder a una posición de un vector inexistente.


    En algunos casos el error no se podrá gestionar, por ejemplo los producidos por la JVM, y en otros casos sí.


    Java proporciona un mecanismo para resolver este tipo de situaciones, y en el caso en que sea necesario establecer algún tipo de respuesta ante ellas. No podremos compilar el código a menos que lo hagamos, o indiquemos explícitamente que lo queremos hacer.




  1. Qué es una excepción

  2. Tipos de excepciones

  3. Cómo se gestiona una exepción


  4. try {
    readFromFile("esteFicheroNoExiste");
    }
    catch(FileNotFoundException e) {
    //Aquí tratamos esta excepción
    }
    catch(IOException e) {
    //Aquí tratamos esta otra
    }
    finally {
    //Aquí realizamos las tareas comunes.
    }


    void metodoLanzador() throws IOException { // "throws IOException" indica que hay excepciones que no se van a gestionar
    //...
    }

  5. Creación de excepciones propias


  6. public class MiExcepcion extends Exception {
    public MiExcepcion() {
    super("Texto de la excepcion");
    }
    }

    public class LanzaExcepcion {
    public void metodo() throws MiExcepcion { //Indica la posible excepción
    if(a < b) throw new MiExcepcion(); //Lanza la excepción
    }
    }


    public class OtraClase {
    public void metodo() {
    LanzaExcepcion le = new LanzaExcepcion();
    try {
    le.metodo();
    }
    catch (MiExcepcion e) {
    System.err.println(e.getMessage());
    }
    }
    }
    //Se atrapa como cualquier otra excepción. try/catch


  • Resumen

  • Las excepciones son el mecanismo de detección de errores en tiempo de ejecución en Java.


    Existen varios tipos de excepciones, los Error son
    excepciones irrecuperables. Las RunTimeException son excepciones que no es necesario atrapar.


    El resto de excepciones es necesario atraparlas y
    gestionarlas, o indicar explícitamente que no se van a atrapar con el uso de throws.



C3, 11/02/11: Bloque I.6: Herencia

  • Introducción

  • El comportamiento de una clase se puede modificar y extender para crear nuevas clases a partir de clases ya existentes


    A la clase original se le llama clase base o padre, mientras que a la que modifica y extiende las características se le llama clase heredada o hija. A este mecanismo se le conoce como el nombre de Herencia


    En Java, existe una nueva construcción que permite especificar qué métodos debe implementar una clase. Esta nueva construcción se llama <<interface>>.


    Además introduciremos las enumeraciones, nueva construcción en Java desde la versión 5.


    Finalmente veremos como agrupar las clases que están lógicamente relacionadas a través de los paquetes.



  1. Herencia


  2. public class Punto3D extends Punto { //"Punto3D" se extiende a la clase "Punto"
    protected float z; //Los nuevos atributos de la clase "Punto3D"
    public Punto3D() {
    super();
    this.z = 0.0f;
    }

    public Punto3D(float x, float y) {
    super(x, y);
    this.z = 0.0f;
    }

    public Punto3D(Punto unPunto) {
    super(unPunto.getX(), unPunto.getY());
    this.z = 0.0f;
    }
    // Como vemos en los 3 métodos siempre utilizamos "super()" al principio.



    public Punto3D(float x, float y, float z) {
    super(x, y);
    this.z = z;
    }

    public float getZ() { //Este método es nuevo
    return z;
    }
    //El resto de métodos se han sobrescrito
    public Punto inverso() {
    return new Punto3D(-x, -y, -z);
    }

    public String toString() {
    return "("+x+", "+y+", "+z+")";
    }

    public void print() {
    System.out.println("Coordenadas del punto "+this);
    }

    A una variable referencia a una clase A, siempre que se le puede asignar un objeto de cualquier clase hija.


    Al conrario nunca es posible y generará un error.




    //En es te código no hay errores ¿Qué se imprime?
    public class herenciaPunto3D {

    public static void main(String args[]) {
    Punto3D punto3D = new Punto3D(1.0f, 2.0f, 3.0f);
    Punto punto = unPunto3D;
    punto.print();
    punto.inverso().print();
    }
    }
    //Vinculación dinámica
    Coordenadas del punto (1.0, 2.0, 3.0)
    Coordenadas del punto (-1.0, -2.0, -3.0)


    Punto punto = new Punto(1.0f, 2.0f);
    Punto3D punto3D = unPunto;
    //¿Es esto posible?


  3. Sobrescritura de variables y métodos


  4. Los atributos y métodos de la clase padre siempre serán accesibles desde la hija a través de super.



    class Entero {
    public int dato;
    public void metodo() {};
    }
    class Real extends Entero {
    public float dato; //Sobrescribe a "dato" de la clase padre "Entero".
    public void metodo() {}; //Sobrescribe a "metodo" de la clase padre "Entero".
    }


  5. Sobrescritura de constructores


  6. //Error
    public class A {
    private int a;
    public A(int a) {
    this.a = a;
    }
    }

    public class B extends A {
    private int b;
    public B(int b) {
    this.b = b;
    }
    }

    public static void main (String args[]) {
    B b = new B(2);
    }

  7. Vinculación dinámica


  8. public class A {
    public A() {};
    public void metodo() {
    System.out.println("Clase A");
    }
    }
    class B extends A {
    public B() {};
    public void metodo() {
    System.out.println("Clase B");
    }
    }


    public static void main(String args[]) {
    System.out.println("Dame un numero:");
    int entero = Teclado.leeEntero();
    A a;
    if(entero > 100) a = new A();
    else a = new B();
    a.metodo();
    }


  9. El operador instanceof

  10. Como ya sabemos, a través de la herencia podemos utilizar referencias de una clase base sobre objetos de sus clases hijas, y al llamar a los métodos se vincularán los del objeto instanciado y no los que indique la referencia.


    Con el operador instanceof, podemos saber el tipo de objeto a través de una referencia.


    Este operador será de mucha utilidad cuando veamos las Colecciones



    public static void main(String args[]) {
    A a = new A();
    B b = new B();
    System.out.println("Es a instancia de A: "+(a instanceof A));
    System.out.println("Es b instancia de B: "+(b instanceof B));
    System.out.println("Es a instancia de B: "+(a instanceof B));
    System.out.println("Es b instancia de A: "+(b instanceof A));
    a = b;
    System.out.println("-----------------");
    System.out.println("Es a instancia de A: "+(a instanceof A));
    System.out.println("Es b instancia de B: "+(b instanceof B));
    System.out.println("Es a instancia de B: "+(a instanceof B));
    System.out.println("Es b instancia de A: "+(b instanceof A));
    }

  11. Clases abstractas


  12. public abstract class ClaseAbstracta {
    int a;
    public ClaseAbstracta() {};
    public abstract void metodo(); //Un método abstracto no se define
    public void noAbstracto() { // La clase puede tener otros métodos NO abstractos
    System.out.println(“Hola”);
    }
    }
    // No se pueden crear instancias de una clase abstracta

  13. Interfaces

  14. Como Java sólo permite herencia simple no podremos modelar el comportamiento de una clase mediante varias clases abstractas.


    Para poder añadir varios "comportamientis" a nuestra clase lo haremos a través de interfaces.


    Una clase sólo tiene una línea de herencia, pero puede implementar varios interfaces.


    Los interfaces son una generalización de las clases abstractas.



    interface SeDibuja {
    static final Color rojo = Color.RED;
    //No se implementa ningún método
    void dibujate();
    void ponColor(Color unColor);
    Color dameColor();
    }
    public class PuntoVisible implements SeDibuja {
    private Color color;
    // La clase implementa el interface, debe definir el método dibujate()
    public void dibujate() {
    System.out.println("Se dibuja el punto");
    }
    }



    public class CirculoVisible implements SeDibuja {
    public void dibujate() {
    System.out.println("Se dibuja el circulo");
    }
    }
    // En el programa principal
    PuntoVisible pv = new PuntoVisible();
    CirculoVisible cv = new CirculoVisible();
    SeDibuja spd = pv; //Utilizamos una referencia al interfaz
    spd.dibujate();
    spd = cv;
    spd.dibujate();

    Los interfaces también se pueden extender



    interface Vehiculo {
    public float getVelocidadMaxima();
    }
    interface Furgoneta extends Vehiculo { // <--- public float getCilindrada(); public int getPlazas; }

    Incluso un interfaz puede extender más de un padre.




    interface Vehiculo {
    interface Vehiculo {
    public float getVelocidadMaxima();
    }
    interface Imposiciones {
    public float getImpuestoCirculacion();
    }
    interface Furgoneta extends Vehiculo, Imposiciones {
    public float getCilindrada();
    public int getPlazas;
    }


  15. Enumeraciones

  16. Desde la Versión 5, se ha introducido en el lenguaje las enumeraciones


    Las enumeraciones son tipos de datos que permiten ser enumerados (se les puede asignar valores enteros)


    La definición de una enumeración es muy sencilla:



    enum Semana {LUNES, MARTES, MIERCOLES,
    JUEVES, VIERNES, SABADO, DOMINGO};
    Semana dia = Semana.LUNES

    Características:


    Las enumeraciones extienden implicitamente a clase "java.lang.Enum", por lo que no pueden extender a ninguna otra clase


    Sí que pueden implementar interfaces.


    Pueden implementar métodos como cualquier otra clase.


    No se pueden extender.


    Poseen dos métodos interesantes:


    • values(); que devuelve un array con los elementos de la enumeración.

    • ordinal(); que nos devuelve el orden del elemento dentro del array, empezando desde 0.


    Semana dia = Semana.LUNES;
    System.out.println("Día: " + dia + " orden: " + dia.ordinal());
    // Día: LUNES orden: 0


    public enum Semana {
    LUNES("Los lunes no me puedo levantar"),
    MARTES("Ni te cases ni te embarques"),
    MIERCOLES("Sin comentarios"),
    JUEVES("Siempre en medio"),
    VIERNES("Quedamos para salir"),
    SABADO("Volvemos a quedar"),
    DOMINGO("Mañana a clase de nuevo");
    private String comentario;

    // Constructor acceso de paquete o private.
    Semana(String comentario) {
    this.comentario = comentario;
    }
    public String getComentario() {
    return comentario;
    }
    public static void main(String args[]) {
    for(Semana dia: Semana.values())
    System.out.println(dia + " : " +
    dia.getComentario());
    }
    }

  17. Paquetes

  18. Los paquetes sirven para organizar jerárquicamente las clases


    Una clase se asigna a un paquete con la siguiente línea antes de la definición de la clase:



    package directorio.del.paquete;
    public class A {//...

    El fichero con los bytecodes de la clase A debe estar en un directorio directorio/del/paquete.


    Otra clase, la importa de este modo:



    import directorio.del.paquete.*;

    Puede acceder a...?
    misma claseSISISISI
    subclase del paqueteNOSISISI
    clase del paqueteNOSINOSI
    Subclase otro paqueteNONOSISI
    clase otro paqueteNONONOSI



  • Resumen

  • La herencia es el mecanismo utilizado en POO para crear nuevas clases a partir de clases ya existentes. En Java sólo existe herencia simple.


    Las clases hijas añaden nuevos atributos y métodos. Asimismo, pueden “ocultar” o sobrescribir atributos y métodos de la clase base.


    Una referencia a una clase base puede contener un objeto de cualquier clase hija, pero nunca al revés.


    La sobrescritura se resuelve en tiempo de ejecución mediante vinculación dinámica.


    Una clase base puede forzar que sus hijas definan algún método declarándolos como abstract. No se pueden crear instancias de una clase abstracta.


    La generalización de las clases abstractas son los interface. Un interface es una plantilla, declara todos los métodos que una clase que implemente el interface debe definir. Una clase puede implementar cuantos interfaces haga falta.


    Los paquetes son de utilidad para estructurar de un modo jerárquico las clase. Los paquetes imponen restricciones de acceso a sus clases.


C2, 05/02/11: Ejemplos


  1. Ejemplo 1:

  2. En este ejemplo se define la clase Circulo.java y se utiliza en este sencillo programa Figuras.java.


    ¿Funciona como esperabas?.


    Prueba a jugar con el ejemplo para crear nuevos círculos.



    • Código "circulo.java"


    • //
      // Circulo.java
      // Figuras
      //
      // Created by Oscarin on 11/07/06.
      //

      public class Circulo {
      private final static float PI = 3.141592f;
      private float radio = 0.0f; // Radio por defecto

      // Constructor por defecto
      public Circulo() {};

      /**
      * Devuelve el valor de PI.
      * Se declara static porque accede a un atributo static
      */
      public static float getPI() {
      return PI;
      }

      /**
      * Método static que intercambia dos referencias
      * Las referencias se pasan por valor
      * @param Circulo uno El primer círculo
      * @param Circulo dos El segundo círculo
      */
      public static void intercambia(Circulo uno, Circulo dos) {
      Circulo tmp; // Referencia temporal
      tmp = uno;
      uno = dos;
      dos = tmp;
      }

      /**
      * Función get para leer el radio
      * @return Devuelve el radio del círculo
      */
      public float getRadio() {
      return radio;
      }

      /**
      * Método que cambia el valor del radio.
      * Antes de cambiar el radio comprobamos que no es
      * un valor negativo.
      * @param float radio El nuevo valor para el radio
      */
      public void setRadio(float radio) {
      if(radio >= 0) this.radio = radio;
      }

      /**
      * Devuelve el área del círculo.
      * @return El valor del área.
      */
      public float getArea() {
      return PI*radio*radio;
      }
      }

    • Código "Figuras.java":


    • //
      // Figuras.java
      // Figuras
      //
      // Created by Oscarin on 11/07/06.
      //

      public class Figuras {

      public static void main (String args[]) {
      // No necesitamos crear una instancia para acceder
      // a un método static
      System.out.println("El valor de PI es: " + Circulo.getPI());

      // Creamos una instancia
      Circulo circulo = new Circulo();
      // Cambiamos el valor del radio
      circulo.setRadio(1.0f);
      // Calculamos el valor del area del círculo
      System.out.println("El radio del circulo es: " + circulo.getRadio() + ", y su area es: " + circulo.getArea());

      Circulo otroCirculo = new Circulo();
      otroCirculo.setRadio(2.0f);

      // Mostramos información de los dos círculos
      System.out.println("El primer circulo tiene radio: " + circulo.getRadio());
      System.out.println("Y el segundo circulo tiene radio: " + otroCirculo.getRadio());

      // Ahora intercambiamos las referencias
      Circulo.intercambia(circulo, otroCirculo);

      // Mostramos información de los dos círculos
      System.out.println("El primer circulo tiene radio: " + circulo.getRadio());
      System.out.println("Y el segundo circulo tiene radio: " + otroCirculo.getRadio());

      // !!!!QUE FALLÓ
      }
      }


  3. Ejemplo 2:

  4. Aquí tienes una posible solución al ejercicio de la Agenda telefónica. Descarga el código, construye un proyecto con él, ejecútalo, estúdialo y compáralo con tu propio código.


    • Persona.java

    • Mismo código que en el ejercicio resuelto anteriormente solo que utiliza una sola variable para guardar la información "apellidos".


    • Agenda.java


    • package agenda;

      public class Agenda {
      private static final int MAX_ENTRADAS = 100;
      private Persona entradas[] = new Persona[MAX_ENTRADAS];
      private int cnt = 0;

      public Agenda() {}

      public void nuevaEntrada(Persona nueva) {
      // TODO Aquí debería comprobar si queda espacio en la agenda.
      //MI SOLUCIÓN
      if(cnt== MAX_ENTRADAS){
      System.out.println("No queda espacio en la agenda");
      }
      else{
      entradas[cnt++] = nueva;
      }

      }

      public Persona buscaEntrada(String nombre) {
      Persona encontrado = new Persona("No encontrado", "", "");
      boolean seEncontro = false;
      int cnt = 0;
      while(!seEncontro && cnt < this.cnt) {
      if(entradas[cnt].getNombre().equals(nombre) == true) {
      encontrado = entradas[cnt];
      seEncontro = true;
      }
      cnt++;
      }
      return encontrado;
      }

      public Persona getEntrada(int posicion) {
      // TODO Debería comprobar que la posición está dentro de rango.
      //MI SOLUCIÓN
      Persona overRange = new Persona("La posición a la que intentas acceder está fuera de rango","","");
      if(posicion > MAX_ENTRADAS){
      return overRange;
      }
      else{
      return entradas[posicion];
      }

      }

      public int getNumeroEntradas() {
      return cnt;
      }
      }

    • Juega.java


    • package agenda;


      public class Juega {
      private Agenda agenda = new Agenda();
      private Juega(){}

      private void ejecuta() {
      agenda.nuevaEntrada(new Persona("Oscar", "Belmonte", "1"));
      System.out.println("Numero entradas: " + agenda.getNumeroEntradas());
      Persona tmp = agenda.buscaEntrada("Oscar");
      System.out.println("Nombre: " + tmp.getNombre());
      System.out.println("Apellidos: " + tmp.getApellidos());
      System.out.println("Telefono: " + tmp.getTelefono());
      }

      public static void main(String[] args) {
      new Juega().ejecuta();
      }

      }


  5. Ejemplo 3:

  6. Esta biblioteca de utilidades generadorNombres.jar te permite generar nombres, apellidos y otros datos de manera aleatoria para que no tengas que introducirlos por teclado.



    Su uso es muy sencillo, una vez que has añadido la biblioteca a tu proyecto, sólo tienes que crear una instancia de la clase GeneradorDatosINE quien es la que te proporcionará los métodos de utilidad tales como:


    • public String getNombre();

    • public String getApellidos();

    • ...


lunes, 14 de febrero de 2011

C2, 05/02/11: Ejercicios

  1. Ejercicio 1

  2. En tu aplicación, una Persona va a estar caracterizada por los siguientes atributos:


    • Nombre.

    • Apellidos.

    • Número de teléfono.

    Crea una clase que contenga estos datos. Crea, además el constructor por defecto para esta clase, un constructor que reciba el valor de todos los atributos como parámetros, y finalmente los métodos para acceder (setters y getters) a cada uno de los atributos de la clase.



    Solución:




    package agenda;

    /**
    * Esta clase define una persona
    * @author Luis Peris Gil
    * @version 1.0, 5 de Febrero de 2011
    */


    public class Persona {

    private String nombre;
    private String apellido1;
    private String apellido2;
    private String telefono;

    /**
    * Constructor por defecto
    */
    public Persona(){
    nombre = "";
    apellido1 = "";
    apellido2 = "";
    telefono = "";
    }

    /**
    * Constructor con argumentos
    */
    public Persona(String nombre, String apellido1, String apellido2, String telefono){
    this.nombre = nombre;
    this.apellido1 = apellido1;
    this.apellido2 = apellido2;
    this.telefono = telefono;

    }

    /**
    * Devuelve el nombre de la persona
    * @return nombre de la persona
    */
    public String getNombre(){
    return nombre;
    }

    /**
    * Devuelve el primer apellido de la persona
    * @return apellido1 de la persona
    */
    public String getApellido1(){
    return apellido1;
    }

    /**
    * Devuelve el segundo apellido de la persona
    * @return apellido2 de la persona
    */
    public String getApellido2(){
    return apellido2;
    }
    /**
    * Devuelve el teléfono de la persona
    * @return telefono de la persona
    */
    public String getTelefono(){
    return telefono;
    }

    /**
    * Actualiza el nombre de la persona
    * @param nombre Nombre de la persona
    */
    public void setNombre(String nombre){
    this.nombre = nombre;
    }

    /**
    * Actualiza el primer apellido de la persona
    * @param apellido1 El primer apellido de la persona
    */
    public void setApellido1(String apellido1){
    this.apellido1 = apellido1;
    }

    /**
    * Actualiza el segundo apellido de la persona
    * @param apellido2 El segundo apellido de la persona
    */
    public void setApellido2(String apellido2){
    this.apellido2 = apellido2;
    }

    /**
    * Actualiza el telefono de la persona
    * @param apellido1 El telefono de la persona
    */
    public void setTelefono(String telefono){
    this.telefono = telefono;
    }
    }

  3. Ejercicio 2

  4. Escribe un programa en Java para gestionar una agenda telefónica (class Agenda). La agenda está constituída por una serie de entradas (class Persona) que representan personas en la agenda, con la siguiente información: nombre, apellidos y número de teléfono, todos ellos de tipo String. El número de entradas en la agenda es fijo, por ejemplo 100.



    En la agenda se puede:


    • Introducir una nueva entrada.

    • Buscar una entrada a partir del nombre.

    • Listar todas las entradas de la agenda.

    Para leer datos de entrada desde el teclado utiliza la siguiente clase: Teclado.java



    Código "Teclado.java":



    package agenda;

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

    public class Teclado {
    private static final BufferedReader teclado =
    new BufferedReader(new InputStreamReader(System.in));

    public static String leeString() {
    String linea = null;

    try {
    linea = teclado.readLine();
    }
    catch(IOException e) {
    muestra("Error leyendo una cadena de entrada.");
    }

    return linea;
    }

    public static int leeEntero() {
    int entero = 0;
    String linea = leeString();

    if(linea != null) entero = Integer.parseInt(linea);

    return entero;
    }

    public static float leeFloat() {
    float real = 0.0f;
    String linea = leeString();

    if(linea != null) real = Float.parseFloat(linea);

    return real;
    }

    public static double leeDouble() {
    double real = 0.0;
    String linea = leeString();

    if(linea != null) real = Double.parseDouble(linea);

    return real;
    }

    private static void muestra(String linea) {
    System.err.println(linea);
    }
    }

    Solución:


    • Agenda.java


    • package agenda;


      /**
      * Esta clase implementa una agenda de personas
      * @author Luis Peris Gil
      * @version 1.0, 5 de Febrero de 2011
      */

      public class Agenda {

      private Persona personas[]= new Persona[100];
      private int numeroPersonas = 0;

      public Agenda(){
      super();
      }

      /**
      * Método que añade una persona a la agenda
      * @param nuevaPersona Persona que se añade
      */
      public void nuevaPersona(Persona nuevaPersona){
      personas[numeroPersonas++] = nuevaPersona;
      }

      /**
      * Método que busca una persona en la agenda a partir del nombre
      * @param nombre El nombre de la persona a buscar
      * @return Persona encontrada o persona vacía
      */
      public Persona buscaPorNombre(String nombre){

      for(int i = 0; i< numeroPersonas; i++){
      if(personas[i].getNombre().equals(nombre))
      return personas[i];
      }
      return new Persona("No existe nadie con el nombre: "+ nombre,"","","");

      }

      /**
      * Método que devuelve una Persona dada una posición
      * @param posicion
      * @return Persona de la posición suministrada
      */
      public Persona getPersonaPosicion(int posicion){
      return personas[posicion];
      }

      /**
      * Método que devuelve cuantas personas hay en la agenda
      * @return numeroPersonas
      */
      public int getNumeroPersonas(){
      return numeroPersonas;
      }
      }

    • Menu.java


    • package agenda;
      /**
      * Esta clase implementa el Menú Principal de la agenda de Personas
      * @author Luis Peris Gil
      * @version 1.0, 5 de Febrero de 2011
      */
      public class Menu {
      Agenda agenda = new Agenda();

      private Menu(){
      super();
      }
      /**
      * Método que añade una persona a la agenda
      */
      public void introduceContacto(){
      System.out.println("Nombre: ");
      String nombre = Teclado.leeString();
      System.out.println("Primer Apellido: ");
      String apellido1= Teclado.leeString();
      System.out.println("Segundo Apellido: ");
      String apellido2 = Teclado.leeString();
      System.out.println("Teléfono: ");
      String telefono = Teclado.leeString();

      Persona persona = new Persona(nombre, apellido1, apellido2, telefono);
      agenda.nuevaPersona(persona);
      System.out.println("Contacto almacenado");
      }
      /**
      * Método que busca una persona en la agenda
      */
      public void buscaContacto(){
      if(agenda.getNumeroPersonas()== 0)
      System.out.println("Todavia no has registrado a nadie en la agenda");
      else{
      System.out.println("Nombre: ");
      String nombre = Teclado.leeString();
      Persona encontrada = new Persona();
      encontrada = agenda.buscaPorNombre(nombre);
      System.out.println("Nombre:" + encontrada.getNombre());
      System.out.println("Primer Apellido: " + encontrada.getApellido1());
      System.out.println("Segundo Apellido: " + encontrada.getApellido2());
      System.out.println("Teléfono: "+ encontrada.getTelefono());

      }
      }
      /**
      * Método que lista las personas que hay en la agenda
      */
      public void listaAgenda(){
      if(agenda.getNumeroPersonas()== 0)
      System.out.println("Todavia no has registrado a nadie en la agenda");
      else{
      int numeroPersonas = agenda.getNumeroPersonas();
      for(int i = 0; i<numeroPersonas;i++){
      Persona actual = agenda.getPersonaPosicion(i);
      System.out.println("Nombre: " + actual.getNombre());
      System.out.println("Primer Apellido: " + actual.getApellido1());
      System.out.println("Segundo Apellido: " + actual.getApellido2());
      System.out.println("Teléfono: " + actual.getTelefono());
      }
      }
      }

      /**
      * Método imprime texto de despedida
      */
      public void adios(){
      System.out.println("Hasta la próxima");
      }
      /**
      * Método que ejecuta la acción introducida por el usuario.
      */
      private void ejecuta(){
      int opcion = 0;

      do{

      System.out.println("Por favor elige una de las siguientes opciones:");
      System.out.println("1 - Contacto Nuevo");
      System.out.println("2 - Buscar Contacto");
      System.out.println("3 - Mostrar Todos los Contactos");
      System.out.println("4 - Salir de la aplicación");
      opcion = Teclado.leeEntero();

      switch (opcion) {
      case 1:
      introduceContacto();
      break;
      case 2:
      buscaContacto();
      break;
      case 3:
      listaAgenda();
      break;
      case 4:
      adios();
      break;
      default:
      System.out.println("La opción introducida no es valida. Vuelva a intentarlo");
      break;
      }
      }while(opcion!=5);

      }
      /**
      * Método Principal de la aplicación
      */
      public static void main(String[] args) {
      new Menu().ejecuta();
      }
      }

    • Ejercicio 3

    • Amplía tu proyecto para que muestre los datos de la agenda en formato XML
      utilizando las etiquetas del siguiente ejemplo: miAgenda.xml. Y aquí tienes el fichero para aplicar estilo de tabla al xml agenda.xsl.


      "agenda.xml":







      Oscar
      Belmonte Fernandez
      1234567


      James
      Gosling
      7654321


      Bill
      Joy
      24680



      Código "agenda.xsl":














      Agenda





      NombreApellido 1 Apellido 2Telefono















      Respecto al ejercicio anterior tan solo modificaremos el fichero "Menu.java", donde crearemos un método para generar el código XML, y la llamada a este método.

      Menu.java



      package agenda;
      /**
      * Esta clase implementa el Menú Principal de la agenda de Personas
      * @author Luis Peris Gil
      * @version 1.0, 5 de Febrero de 2011
      */
      public class Menu {
      Agenda agenda = new Agenda();

      private Menu(){
      super();
      }
      /**
      * Método que añade una persona a la agenda
      */
      public void introduceContacto(){
      System.out.println("Nombre: ");
      String nombre = Teclado.leeString();
      System.out.println("Primer Apellido: ");
      String apellido1= Teclado.leeString();
      System.out.println("Segundo Apellido: ");
      String apellido2 = Teclado.leeString();
      System.out.println("Teléfono: ");
      String telefono = Teclado.leeString();

      Persona persona = new Persona(nombre, apellido1, apellido2, telefono);
      agenda.nuevaPersona(persona);
      System.out.println("Contacto almacenado");
      }
      /**
      * Método que busca una persona en la agenda
      */
      public void buscaContacto(){
      if(agenda.getNumeroPersonas()== 0)
      System.out.println("Todavia no has registrado a nadie en la agenda");
      else{
      System.out.println("Nombre: ");
      String nombre = Teclado.leeString();
      Persona encontrada = new Persona();
      encontrada = agenda.buscaPorNombre(nombre);
      System.out.println("Nombre:" + encontrada.getNombre());
      System.out.println("Primer Apellido: " + encontrada.getApellido1());
      System.out.println("Segundo Apellido: " + encontrada.getApellido2());
      System.out.println("Teléfono: "+ encontrada.getTelefono());

      }
      }
      /**
      * Método que lista las personas que hay en la agenda
      */
      public void listaAgenda(){
      if(agenda.getNumeroPersonas()== 0)
      System.out.println("Todavia no has registrado a nadie en la agenda");
      else{
      int numeroPersonas = agenda.getNumeroPersonas();
      for(int i = 0; i Persona actual = agenda.getPersonaPosicion(i);
      System.out.println("Nombre: " + actual.getNombre());
      System.out.println("Primer Apellido: " + actual.getApellido1());
      System.out.println("Segundo Apellido: " + actual.getApellido2());
      System.out.println("Teléfono: " + actual.getTelefono());
      }
      }
      }

      /**
      * Método que muestra la lista de personas que hay en la agenda codificado en XML
      */
      public void muestraXML(){
      if(agenda.getNumeroPersonas()== 0)
      System.out.println("Todavia no has registrado a nadie en la agenda");
      else{
      System.out.println("");
      System.out.println("");
      System.out.println("");
      int numeroPersonas = agenda.getNumeroPersonas();
      for (int i = 0; i Persona actual = agenda.getPersonaPosicion(i);
      System.out.println("");
      System.out.println("");
      System.out.println(actual.getNombre());
      System.out.println("
      ");
      System.out.println("");
      System.out.println(actual.getApellido1());
      System.out.println("
      ");
      System.out.println("");
      System.out.println(actual.getApellido2());
      System.out.println("
      ");
      System.out.println("");
      System.out.println(actual.getTelefono());
      System.out.println("
      ");
      System.out.println("
      ");
      }
      System.out.println("
      ");
      }
      }

      /**
      * Método imprime texto de despedida
      */
      public void adios(){
      System.out.println("Hasta la próxima");
      }
      /**
      * Método que ejecuta la acción introducida por el usuario.
      */
      private void ejecuta(){
      int opcion = 0;

      do{

      System.out.println("Por favor elige una de las siguientes opciones:");
      System.out.println("1 - Contacto Nuevo");
      System.out.println("2 - Buscar Contacto");
      System.out.println("3 - Mostrar Todos los Contactos");
      System.out.println("4 - Salir de la aplicación");
      opcion = Teclado.leeEntero();

      switch (opcion) {
      case 1:
      introduceContacto();
      break;
      case 2:
      buscaContacto();
      break;
      case 3:
      listaAgenda();
      break;
      case 5:
      muestraXML();
      break;
      case 4:
      adios();
      break;
      default:
      System.out.println("La opción introducida no es valida. Vuelva a intentarlo");
      break;
      }
      }while(opcion!=5);

      }
      /**
      * Método Principal de la aplicación
      */
      public static void main(String[] args) {
      new Menu().ejecuta();
      }
      }

      Ahora solo copiaremos el código generado en un fichero al que le daremos la extensión ".xml", lo guardaremos en la misma carpeta que el fichero "agenda.xsl" y lo ejecutaremos desde un navegador para ver el resultado.




C2, 05/02/11: Bloque I.5: Clases


  • Introducción

  • Java es un lenguaje de programación orientado a objetos.


    Un objeto encapsula:

    1. atributos

    2. métodos


    En la programación orientada a objetos estos colaboran entre sí para alcanzar un objetivo


    La colaboración se establece mediante el paso de mensajes (llamadas a métodos).




  1. Definición de una clase


  2. public class Punto{ //"public" es el modificador de acceso; "Punto" es el nombre de la clase
    private float x;//Atributos
    private float y;//Atributos

    public Punto(){ //método (en este caso es el constructor)
    x=0.0f;
    y=0.0f;
    }
    //...

    public float getX(){//método
    return x;
    }


  3. Atributos. Atributos estáticos


  4. public class Punt{
    private float x; // Modificador de acceso; Tipo; Nombre
    private float y; // Modificador de acceso; Tipo; Nombre
    //...
    }

    Modificadores pueden ser de tipo:


    • private --> Ámbito: La clase

    • ""--> Ámbito --> El paquete

    • protected --> Ámbito: La clase e hijas

    • public --> Ámbito: El resto de clases




    class UnaClase{
    private static int nInstancias = 0; // Atributo de clase
    public static final float E = 2.8182f; // Constante; Normalmente utilizamos "final" para variables que no van a ser modificadas en un futuro --> constantes.
    }
    //...
    UnaClase.E;
    new UnaClase().E;


  5. Métodos. Métodos estáticos


  6. public class Punto{
    //...
    public Punto(){ //Modificador de acceso; Nombre; Lista de argumentos (en este caso no hay)
    x=0.0f;
    y=0.0f;
    }

    public float getX(){//Modificador de acceso; Tipo de retorno; Nombre; Lista de argumentos (en este caso no hay)
    return x;
    }
    public void setX (float x){ //Modificador de acceso; Nombre; Lista de argumentos
    this.x=x;
    }
    }


    Class UnaClase{
    private static int nInstancias =0;
    public static float E = 2.8182f;
    private int entero;
    public UnaClase(){
    nInstancias++;
    }

    public static int cuantasInstancias(){
    return nInstancias; //No hay problema
    }

    private static void intentaAcceso(){
    entero = 0; // Error
    }


  7. Creación de Objetos


  8. public class Punto{

    public Punto(){ //constructor por defecto
    x=0.0f;
    y=0.0f;
    }

    public Punto(float x, float y){ //constructor con parámetros
    this.x = x; //"this" se refiere a "este objeto"
    this.y = y;
    }
    }


    public class bloqueStatic{
    static double tablaSeno[] = new double[360];
    static{
    for(int i=0; i=360; i++)
    tablaSeno[i] = Math.sin(Math.PI*i/180.0);
    }
    public static void main (String args[]){
    for(int i=0; i<360; i++)
    System.out.println("Angulo: "+i+" Seno= "+tablaSeno[i]);
    }
    }


  9. Paso por valor y por referencia


  10. public class pasoPorReferencia{
    private static void cambiaReferencia(Punto puntoLocal){
    puntoLocal = nre Punto(1.0f, 2.0f);
    System.out.println("Estoy dentro del método.");
    puntoLocal.print();
    }
    public static void main(String args[]){
    Punto unPunto = nre Punto();
    System.out.println("Estoy fuera del método.");
    unPunto.print();
    cambiaReferencia(unPunto);
    System.out.println("Estoy fuera del método.");
    unPunto.print();
    }
    }


  11. Sobrecarga de métodos


  12. public class Punto { //Esta clase tiene métodos con el mismo nombre pero con distintos argumentos. El tipo del valor devuelto no sirve para distinguir.

    public Punto() {
    x = 0.0f;
    y = 0.0f;
    }
    public Punto(float x, float y) {
    this.x = x;
    this.y = y;
    }
    //…
    }


  13. Finalización

Antes de que el recolector de basura elimine un objeto de memoria, siempre se llama a su método "finalize".
La utilidad puede ser, por ejemplo, cerrar un fichero que el objeto mantenga abierto; o cerrar una conexión mediante un socket; o detener los posibles hilos (threads) que se mantengan activos...

miércoles, 9 de febrero de 2011

C1, 04/02/11: Ejercicios


Tipos de datos: Problema con referencias.

¿Qué mostrará por pantalla el siguiente programa?

Solución:




Tipos de datos: Otro problema con referencias.

¿Qué mostrará por pantalla el siguiente programa?

Solución:



Tipos de datos: Di si hay algún problema con el siguiente código

Averigua si existe algún error en la ejecución del siguiente código y por qué:

Solución:

Buscando...



Estructuras de datos:Argumentos del método main

Escribe un programa en Java que ejecutes pasándole una serie de parámetros en línea de instrucciones. El programa debe mostrar el número de parámetros pasado en linea de instrucciones, y cada uno de los parámetros.


Solución:

Buscando....



Estructuras de datos: Tabla de conversión de temperaturas

Escribe un programa que muestre las equivalencias entre grados centígrados o Celsius(C), Reamur(R) y Fahrenheit(F), sabiendo que las equivalencias entre las escalas son:

R = 4/5 C

F = 9/5 C + 32

mostrar la tabla de cinco en cinco grados Celsius.


Consola:

C1, 04/02/11: Bloque I.4: Estructuras de Control


  1. Estructuras condicionales

  2. Bifurcación


  3. if(condición){
    BLOQUE;
    }
    else{
    BLOQUE;
    }

    Ejemplo:

    if(n % 2 == 0)
    System.out.println(“El número ”+n+” es par.”);
    else
    System.out.println(“El número “+n+” es impar.”);


  4. Selección múltiple


  5. switch(expr) {
    case val1:
    Bloque;
    break;
    case val2:
    //…
    break
    default
    Bloque;
    }


    Ejemplo:

    switch(mes) {
    case 2:
    System.out.println(“El mes tiene 28 días”);
    break;
    case 4:
    case 6:
    case 9:
    case 11:
    System.out.println(“El mes tiene 30 días”);
    break;
    default:
    System.out.println(“El mes tiene 31 días”);


  6. Estructuras de repetición


  7. while(condición) {
    Bloque;
    }


    do {
    Bloque;
    } while(condición);


  8. Sobre un rango


  9. for(cnt = inicio; condición; incremento) {
    Bloque;
    }


    Ejemplo:

    for(a=0, b=0; a <10,>
    //Bloque de código
    }

    // Cuando veamos genericos
    for(Integer i: al) {
    System.out.println(i);
    }

  10. Repeticiones condicionales


  11. break y continue

  12. break sirve para forzar la salida de una estructura de control, como en el caso de switch.continue sirve para forzar la comprobación de la condición.

    for( n = 0; n <>
    //…
    if(n == 5) continue;

    }

  13. Recursividad

  14. Un algoritmo recursivo:
    1. Se llama a si mismo y reduce la talla del problema.
    2. Debe tener un caso base o condición de parada.

--- FIN CLASE 1 ---

C1, 04/02/11: Bloque I.3: Tipos de datos

  • Introducción

Existen dos tipos de datos en Java, los tipos primitivos (int, float, char,...) y los tipos referencia con los que accedemos a los objetos.


La declaración y ámbito de las variables es similar a las de C/C++.


Debido a las mejoras introducidas con Java ciertos operadores han desaparecido dando lugar a otros.


De igual modo, uso de arrays de objeto es distinto.



  1. Tipos de datos primitivos











  2. TipoDefinición
    booleantrue o false
    charCarácter Unicode de 16 bits
    byteEntero en complemento a dos con signo de 8 bits
    shortEntero en complemento a dos con signo de 16 bits
    int Entero en complemento a dos con signo de 32 bits
    long Entero en complemento a dos con signo de 64 bits
    float Real en punto flotante según la norma IEEE 754 de 32 bits
    double Real en punto flotante según la norma IEEE 754 de 64 bits


  3. Tipos de datos referencia

  4. Veamos este apartado con un ejemplo:



    Punto unPunto = new Punto(); // "unPunto" apunta/referencia a un objeto de tipo "Punto"
    unPunto.print(); //Imprime por pantalla el objeto "Punto" desde la referencia "unPunto"
    Punto otroPunto = unPunto; //"otroPunto" apunta al mismo objeto que "unPunto", es decir, apunta al objeto "Punto"
    otroPunto.setX(1.0f); //Se modifica el objeto "Punto" a partir de su referencia "otroPunto". Como "unPunto" también apunta al mismo objeto si accedemos a "unPunto" obtendremos el mismo resultado.
    otroPunto.setY(2.0f); //Se modifica el objeto "Punto" a partir de su referencia "otroPunto". Como "unPunto" también apunta al mismo objeto si accedemos a "unPunto" obtendremos el mismo resultado.
    unPunto.print(); //Imprimimos por pantalla "unPunto" para comprobar que efectivamente está apuntando al mis objeto que "otroPunto".


    Ejemplo del recolector de basura que utiliza Java. De este modo no tenemos que preocuparnos de eliminar los objetos que pierdan la referencia, internamente Java lo hará por nosotros:



    Ejemplo 1:



    Punto unPunto = new Punto(1.0f, 2.0f);
    Punto otroPunto = new Punto(1.0f, -1.0f);
    unPunto = new Punto(2.0, 2.0f);
    // El punto (1.0f, 2.0f) se pierde
    otroPunto = null;
    // El punto (1.0f, -1.0f) se pierde



    Ejemplo 2:



    Punto unPunto = new Punto(1.0f, 2.0f);
    Punto otroPunto = new Punto(1.0f, -1.0f);
    unPunto = new Punto(2.0, 2.0f);
    // El punto (1.0f, 2.0f) se pierde
    otroPunto = null;
    // El punto (1.0f, -1.0f) se pierde Todos los "puntos" perdidos se encargará el recolector de basura de eliminarlos.


  5. Declaración de variables. Convenciones


  6. Bien



    int entero = 0;
    Punto punto = new Punto();


    Mal



    float 3reales;
    Punto índigo;


  7. Ámbito de las variables


  8. El ámbito al igual que en C/C++ va de dentro a afuera, es decir, se puede acceder a variables desde bloques internos a otros externos, pero no al revés.



    Operadores. Precedencia


    El conjunto de operadores es similar a C++.


    Los () cambian la precedencia.


    No hay operadores sobre punteros:


    Dirección / Referencia.


    Contenido.


    Sizeof().



    Asignación: =


    Aritméticos:


    Unarios: +, -, ++, --


    Binarios: +, -, *, / %


    Ternarios: ?, ejemplo: a = (x


    Abreviaturas: +=, -=, *=, /=, %=


    Relacionales: ==, !=, <, <=, >, >=


    Lógicos: !, &&, ||, ^, & |


    Conversión: ().



  9. Arrays

    • Unidemensionales:


    int arrayDeEnteros[] = null;
    // Declara un array de enteros
    Punto arrayDePuntos[] = null;
    // Declara un array de referencias a Puntos
    arrayDeEnteros = new int[100];
    // Crea el array con espacio para 100 enteros
    arrayDePuntos = new Punto[100];
    /* Crea el array con espacio para
    100 referencias a Punto */
    for(int i = 0; i <>
    arrayDePuntos[i] = new Punto();


    El atributo length de un array monodimensional,nos devuelve su tamaño:



    int array[] = new int[10];
    System.out.println(“Longitud del array:” +
    array.length);
    // Muestra Longitud del array: 10

    • Multidimensionales:


    // Declaramos una matriz
    Punto matriz[][] = new Punto[3][3];
    // Declaramos e iniciamos una fila
    Punto fila[] = {new Punto(), new Punto(1.0f, 1.0f),
    new Punto(2.0f, 2.0f)};
    matriz[0] = fila[];
    // matriz[0] y fila hacen referencia al
    // mismo array


  10. Cadenas de caracteres


  11. Las cadenas de caracteres se pueden manejar como en C++. Pero es más cómodo utilizar la clase especializada String.



    String frase = "Esta cadena es una frase ";
    String larga =frase + "que se puede convertir en una frase larga.";
    System.out.println(larga); //Para sacar por pantalla

C1, 04/02/11: Bloque I.2: Sintaxis de Java

      1. Introducción

La sintaxis de Java es prácticamente igual a la de C/C++. Una nueva característica de la sintaxis de Java con respecto a C/C++ es el uso de comentarios de documentación mediante la potente aplicación Javadocs.

Además gran número de las palabras reservadas también son las mismas que las de C/C++, así como el uso y significado de los separadores.


      1. Comentarios

Para una linea utilizaremos: // Comentario de una linea

Para un bloque de texto utilizaremos: /* Bloque de texto */

Comentarios de documentación: /** Comentario de documentación */

@author[Nombre del autor]

@versión[Versión]

@param[parámetro][Descripción]

@return[Descripción]

@exception[Excepción lanzada]

@see[Referencia cruzada]

@deprecated[Comentario]


      1. Documentación

Para generar comentarios de documentación seguiremos los siguientes pasos:

javadoc -d Documentación "Programa.java"

Project -> Generate Javadoc


Nota: si por ejemplo en un método añadimos la documentación de tipo "deprecated", es decir que ese método ya esta desfasado, el propio eclipse no hará un pequeño tachón en el nombre de la declaración de dicho método para que el programador ya sepa en que estado se encuentra.


      1. Identificadores

En Java los identificadores comienzan por una letra del alfabeto inglés, un subrayado «_» o el símbolo de dolar «$», los siguientes caracteres del identificador pueden ser letras o dígitos.
  • Identificadores Válidos:
  • contador
  • _temporal
  • $variableEntorno

No válidos:
  • 3Tres
  • (parentesis)
  • Óscar


      1. Palabras reservadas

Basicamente los mismos que para C/C++ con algunos añadidos:

http://trevinca.ei.uvigo.es/~formella/doc/cd04/node25.html


      1. Separadores

Basicamente los mismos que en C/C++.

Nombraré el punto <<.>>:

Acceden a los atribtos y métodos de una clase. Ejemplo:

Puntp p = new Punto(1,2);

p.getX();

Acceden a un subpquete de un paquete. Ejemplo:

import.java.io.File:


C1, 04/02/11:: Bloque I.1: Introducción a Java.

      1. Historia.Perfil de Java

Todo empezó cuando dos personas (James Gosling y Bill Joy) diseñaron el lenguaje de programación llamado Oak. Este lenguaje se diferenciaba entre entre otras cosas por ser:

    • Pequeño

    • Robusto

    • Independiente de la máquina

    • Orientado a objetos.


Con el paso del tiempo este lenguaje de programación fue adquiriendo transformaciones hasta convertirse en el actual Java que, además de las características que posee Oak, destacaba por:

    • Seguridad y

    • Potencia


      1. Características

Las características de Java son pues:

    • Orientado a Objetos

    • Sintaxis muy parecida a C++

    • Seguro:

        • desde el punto de vista del programador: Comprobación estricta de tipos, gestión de excecpciones, punteros eliminados,...

        • desde el punto de vista del usuario: Recolector de basura, espacio de nombre, programación concurrente,...


Java es además un lenguaje de programación compilado e interpretado. Esto quiere decir que se compilará una vez se programe y cuando un usuario lo quiere ejecutar será interpretado en local por una máquina virtual Java. La ventaja que tiene respecto a otros lenguajes de programación es, por lo tanto, que el mismo programa podrá funcionar tanto en un sistema operativo como en otro, ya sea Windows, MacOS, Linux,....



      1. Herramientas de desarrollo

Herramientas de desarrollo que necesitaremos para realizar este primer bloque:

Descargar JDK desde la página de sun e instalar (java.sun.com).

Descargar Eclipse IDE JEE desde www.eclipse.org.


Vídeos de ayuda:

Instalación y primeros pasos (por Oscar Belmonte Fernández):

http://vimeo.com/17495170


Introduction to the Eclipse IDEpart1:

http://www.youtube.com/watch?v=vbKiFIzQukc&feature=player_embedded


Introduction to the Eclipse IDEpart2:

http://www.youtube.com/watch?v=rH7G3-Uf-rs&feature=player_embedded



Como colofón a este primer apartado decir que Java no solo es un lenguaje de programación, sino también un conjunto de aplicaciones que dan soporte aun gran número de tecnologías: redes, gráficos, multimedia, XML,...

C1, 04/02/11: Presentación y puesta en marcha.

Buenas a todos! La verdad es que en la primera clase ya hemos aprendido muchas más cosas de las que me esperaba... todas ellas muy interesantes.


Para empezar nos presentamos los distintos alumnos para que más o menos nos fueramos conociendo un poco y a continuación el profesor, al cuál me referiré a partir de ahora por su nombre, es decir Oscar, nos explicó los distintos bloques de que consta el curso. Veámoslo:


Bloque I: Introducción al lenguaje de programación Java

Bloque II: Java Avanzado

Bloque III: Java y XML

Bloque IV: Java2 Enterprise Edition

Bloque V: Java para dispositivos móviles.


Empieza la primera Clase!!!

Modus Operandi

Estaba pensando el modo de dividir cada uno de mis posts. Al final lo haré tal que así: Cada post estará compuesto por un tema que se haya dado en clase, de tal modo que si para el primer día de clase dimos hasta el 4º punto del primer tema dividiré la clase en 4 posts.

Además me gustaría tener una sección de atajos y trucos para operar con el eclipse. Bueno todo se verá a medida que transcurran las clases...

Bienvenidos a mi Blog de Java!

Hola compañeros!

Os doy la Bienvenida a mi blog de desarrollo de proyectos con Java. A partir de ahora iré posteando todos mis conocimientos adquiridos para compartirlos con todos vosotros. Creo que va a ser una experiencia muy enriquecedora.
De momento el disño de la página no es que sea muy allá, pero bueno, prefiero centrarme primero en el contenido de la misma y cuando todo esté un poco más avanzado ya veremos que se puede hacer...

Sin más me voy a poner manos a la obra.

Un saludo,
Luis Peris