CLASE 4.1 - Constructores

12
Algoritmos y Estructuras de Datos 2015 – Taller de JAVA Prof: Laura Fava – Jorge Rosso Clase 4 Constructores Inicialización de Objetos – Constructores - ¿Qué son los Constructores? - Constructor default. - Constructores con argumentos - Sobrecarga de constructores - Cadena de invocación a constructores Usos y diferencias entre: - this y this() - super y super()

description

java, poo

Transcript of CLASE 4.1 - Constructores

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    Clase 4Constructores

    Inicializacin de Objetos Constructores- Qu son los Constructores?- Constructor default.- Constructores con argumentos- Sobrecarga de constructores- Cadena de invocacin a constructores

    Usos y diferencias entre:- this y this()- super y super()

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    ConstructoresPara crear un objeto se utiliza el operador new. La creacin e inicializacin deun objeto involucra los siguientes pasos:

    a) Se aloca espacio para la variableb) Se aloca espacio para el objeto en la HEAP y se inicializan los atributos con valores por defecto.c) Se inicializan explcitamente los atributos del objeto.d) Se ejecuta el constructor (parecido a un mtodo y tiene el mismo nombre de la clase)f) Se asigna la referencia del nuevo objeto a la variable.

    nullMemoria STACK

    0x99f311

    Memoria STACK Memoria HEAP

    auto

    000

    marcaprecio

    null0.0

    a) b),c),d),e) Objeto Vehiculo

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

    Vehiculo auto;auto = new Vehiculo();

    }}

    public class Vehiculo {private String marca;private double precio;. . .}

    auto

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    public class Vehiculo {private String marca;private double precio;public Vehiculo() {}}

    Qu son los Constructores?Los constructores son piezas de cdigo -sintcticamente similares a los mtodos- quepermiten definir un estado inicial especfico de un objeto en el momento de su creacin.Se diferencian de los mtodos tradicionales porque:

    Deben tener el mismo nombre que la clase. La regla de que el nombre de losmtodos debe comenzar con minscula, no se aplica a los constructores.

    No retornan un valor. Son invocados automticamente.

    La inicializacin est garantizada: cuando un objeto es creado, se aloca almacenamientoen la memoria HEAP y se invoca al constructor.

    Vehiculo v = new Vehiculo(); El operador new() se puede utilizar en cualquier lugar del cdigo.

    NO retorna valor

    - La expresin new retorna una referencia al objeto creado recientemente, pero el constructor noretorna un valor.- Java siempre llama automticamente a un constructor cuando crea un objeto (antes de que el objetosea usado). De esta forma la inicializacin del objeto est garantizada.

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    public class Vehiculo {private String marca;private double precio;//mtodos

    }

    Constructor sin argumentos

    Si una clase NO tiene constructores, el compilador inserta automticamente unconstructor default, con cuerpo vaco:

    Cuando se compilapublic Vehiculo(){}

    Cuando se crea un objeto de la clase Vehiculo, con new Vehiculo(), se invocar elconstructor por defecto, an cuando no se encuentre explcitamente en la clase.

    Si la clase tiene al menos un constructor, con o sin argumentos, el compilador NOinsertar nada.

    Un constructor sin argumento o constructor Default, es usado para crear un objeto bsico.

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    Constructores con argumentosEn general los constructores son usados para inicializar los valores del objeto que se estcreando. Cmo especificar los valores para la inicializacin? Los constructores puedentener parmetros para la inicializacin de un objeto.

    Si este constructor es el nico de la clase, el compilador no permitir crear un objetoVehiculo de otra manera que no sea usando este constructor .

    public class Automotores {public static void main(String[] args){ Vehiculo auto1 = new Vehiculo(CITROEN, 13500.00);Vehiculo auto2 = new Vehiculo(HONDA,12400.50);

    }}

    public class Vehiculo {private String marca;private double precio;public Vehiculo(String mar, double pre){marca = mar;precio = pre;}}

    public Vehiculo(String marca, double precio) {

    this.marca = marca;this.precio = precio;

    }

    Codificaciones equivalentes

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    Sobrecarga de ConstructoresQu pasa si se quiere construir un objeto Vehiculo de distintas maneras?Se escriben en la clase ms de un constructor sobrecarga de constructores.public class Vehiculo {private String nroPatente=;private String propietario=SinDueo;public Vehiculo(){}public Vehiculo(String marca){

    this.marca = marca;}public Vehiculo(String marca,double precio){this.marca = marca;this.precio = precio;}} public class Botanico {public static void main(String[] args){

    Vehciulo a1=new Vehiculo();Vehiculo a2=new Vehiculo(HONDA);Vehiculo a3=new Vehiculo(HONDA,12300.50);

    }}

    La sobrecarga de mtodos permite que el mismo nombre de mtodo sea

    usado con distintos tipos y cantidad de argumentos.

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    this() y this

    Cuando dentro de una clase, hay ms deun constructor, puede surgir la necesidadde llamarse entre ellos para evitar duplicarcdigo. Para hacer esto puede usarsethis(), el cual hace una llamada alconstructor de la misma clase que coincidacon al lista de argumentos.

    this() public class Vehiculo {private String marca;private double precio;public Vehiculo(String marca){this.marca = marca;

    }public Vehiculo(String marca,

    double precio){this(marca);this.precio = precio;

    }

    Si tenemos 2 objetos de la clase Vehiculo, llamados a1 y a2 e invocamos al mtodosetNroPatente() sobre ambos objetos, cmo sabe el mtodo para que objetos sellama?

    Vehiculo a1 = new Vehiculo();Vehiculo a2 = new Vehiculo();. . . a1.setMarca( CITROEN);a2.setMarca( HONDA);

    El compilador agrega como 1 argumento de cada mtodo una referencia al objeto que est siendo

    manipulado.

    a1a2

    this

    // debe estar en la 1 lnea

    public class Vehiculo {private String marca;private String precio;. . .public setMarca(String marca){this.marca = marca;

    }}

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    Cmo se construye un objeto?Recorriendo la jerarqua de herencia en forma ascendente e invocando alconstructor de la superclase desde cada constructor, en cada nivel de lajerarqua de clases:

    Cadena de invocacin a constructores

    crear un objeto de tipo Object

    crear un objeto de tipo Vertebrado

    crear un objeto de tipo Mamifero

    crear un objeto de tipo Perro

    La clase Object

    La clase Vertebrado

    La clase Mamifero

    La clase Perro

    new Perro()

    Constructor de Mamfero()

    En cada constructor de una clase derivada, debe existir una llamada a un constructor de la superclase.

    Constructor de Vertebrado()

    Constructor de Object()

    Estoy listo!

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    public class Perro extends Mamifero{. . public Perro(){System.out.println(Constructor de Perro);

    }public void comer(){ }}

    super()public class Mamifero extends Vertebrado {

    public Mamifero(){System.out.println(Constructor de Mamifero);

    }public void comer(){}

    }

    super()

    El compilador Java, automticamente invoca en cada constructor de unaclase derivada, al constructor nulo de su clase base, si no se invocninguno explcitamente.

    La clase Object

    La clase Vertebrado

    La clase Mamifero

    La clase Perro

    super()

    super()

    super()

    new Perro()

    public class Vertebrado {public Vertebrado (){System.out.println(Constructor de Vertebrado);

    }}

    Cul sera la salida de la ejecucin de new Perro()?

    super()

    Cadena de invocacin a constructores

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    public class Perro extends Mamifero{. . public Perro(){System.out.println(Constructor de Perro);

    }public void comer(){ }}

    super()public class Mamifero extends Vertebrado {

    public Mamifero(){System.out.println(Constructor de Mamifero);

    }public void comer(){}

    }

    super()

    Error!!

    Qu pasa si Vertebrado tiene un constructor con argumentos y no tiene el constructor sin argumentos (default)?

    La clase Object

    La clase Vertebrado

    La clase Mamifero

    La clase Perronew Perro()

    public class Vertebrado {public Vertebrado (int i){System.out.println(Constructor de Vertebrado);

    }}

    super()

    Desde el constructor de Mamifero se debe invocar a alguno de los constructoresexistentes en la superclase Vertebrado usando la palabra clave super() y la lista deargumentos apropiada.

    Cmo hacemos?

    super()

    super()

    super()

    Cadena de invocacin a constructores

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    public class Vertebrado {private int cantpatas;public Vertebrado(int c){

    cantpatas = c; System.out.println(Constructor de Vertebrado);

    }public void comer(){}

    }

    public class Perro extends Mamifero{. . public Perro(){System.out.println(Constructor de Perro);

    }public void comer(){ }}

    super()public class Mamifero extends Vertebrado {

    public Mamifero(){super(4);System.out.println(Constructor de Mamifero);

    }public void comer(){}

    }

    super()

    Si un constructor no invoca a ningn constructor de la clase base, el compilador inserta lainvocacin al constructor nulo (super()).Si un constructor invoca explcitamente a un constructor de la superclase, debe hacerloen la primera lnea de dicho constructor.

    La clase Object

    La clase Vertebrado

    La clase Mamifero

    La clase Perro

    super(4)

    super()

    super()

    Perro p = new Perro()

    Qu pasa si Vertebrado tiene un constructor con argumentos y no tiene el constructor sin argumentos (default)? continuacin

    Cadena de invocacin a constructores

  • Algoritmos y Estructuras de Datos 2015 Taller de JAVA Prof: Laura Fava Jorge Rosso

    super() y super

    Super() invoca a un constructor de lasuperclase y debe estar en la primer lneade cdigo del constructor.JAVA garantiza la correcta creacin de losobjetos ya que los constructores siempreinvocan a los constructores de lasuperclase. De esta manera todo objetocontiene una referencia al objeto de lasuperclase habilitando la herencia deestado y comportamiento.

    super()

    Todos los mtodos de instancia disponen de la variable super (adems de this), lacual contiene una referencia al objeto padre. La palabra clave super, permite invocardesde la subclase un mtodo de la superclase.

    super

    public class Perro extends Mamifero {private String sonido;

    public Perro(){super(4);sonido=new String(guau);

    }. . .

    }

    se invoca al constructor de Mamifero con argumento entero.

    En este ejemplo, el cdigo del constructorPerro() espera hasta que el padre se inicialicepara continuar con su cdigo.