Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Viky30 en 24 Noviembre 2011, 15:29 pm



Título: Constructores en Java
Publicado por: Viky30 en 24 Noviembre 2011, 15:29 pm
Hola, soy nueva en el forum, estoy aprendiendo a programear ytengo un problema para entender la funcion que cumplen los constructores en una clase,se como se crean pero para que sirven? como veran abajo tengo una clase Test y un main metodo y mas abajo mi clase Perro,en clase test he creado dos perros nuevos, en clase perro  un metodo mostrarenlaconsola, dentro de este metodo utilizo el this que hace referencia a la variable de instancia, mi programa hasta ahora funciona bien. Pero si creo constructores en que cambiaria mi programa?   


public class Test {
   public static void main (String[] args){
      
      Perro perro1 = new Perro();
                perro1.name="tuki";
      perro1.alt=12;
      perro1.mostrarenlaconsole(perro1);

      Perro perro2 =new Perro();
                perro1.name="tuki";
      perro1.alt=12;                          
                perro2.mostrarenlaconsole(perro2);
      
   }
      
      

public class Perro {
   public String name;
   public int alt;
   
   
   
   public void mostrarenlaconsole(){
       System.out.println("name="+ this.name);
   System.out.println("alt=" + this.alt);

}
   
 }   

   Muchas gracias por las rptas  ;)

   


Título: Re: Constructores en Java
Publicado por: RyogiShiki en 24 Noviembre 2011, 15:58 pm
Hola Bienvenida al Foro.

Bueno, la funcionalidad de un constructor básicamente es la de construir el objeto y que dependiendo de los parámetro que se pasen este se cree de una u otra forma.

Por ejemplo una clase perro:

Código
  1. public class Perro {
  2. private String name;
  3. private int height;
  4. }
  5.  

Los atributos de la clase son las propiedades que el objeto posee, en este caso el nombre y la altura. Estos se suelen declarar de manera privada para dar un acceso limitado a ellos, es lo que se conoce como encapsulación, y para editar sus valores se suele hacer lo que se llama métodos accesores (accesors) también conocidos como setters y getters, los setters asignan un valor al atributo, y getters obtienen dicho valor. Entonces digamos que le quieres poner un nombre al perro, añades un setter de la siguiente manera:

Código
  1. public class Perro {
  2. private String name;
  3. private int height;
  4.  
  5. public void setName(String n) {
  6. this.name = n;
  7. }
  8. }
  9.  

y si quieres obtener el nombre del perro añades un método getter:

Código
  1. public class Perro {
  2. private String name;
  3. private int height;
  4.  
  5. public void setName(String n) {
  6. this.name = n;
  7. }
  8.  
  9. public String getName() {
  10. return this.name;
  11. }
  12. }
  13.  

Ahora digamos que a la hora de instanciar o crear el objeto quieres de una vez inicializar el nombre de Perro, entonces en ese momento creas un constructor con parámetros el constructor se llamará cada vez que un objeto de tipo Perro (en este caso) sea creado o instanciado. Agregamos el constructor, que no tiene tipo y lleva el mismo nombre de la clase, y suele ser público:

Código
  1. public class Perro {
  2. private String name;
  3. private int height;
  4.  
  5. public Perro (String n) {
  6. this.setName(n);
  7. }
  8.  
  9. public void setName(String n) {
  10. this.name = n;
  11. }
  12.  
  13. public String getName() {
  14. return this.name;
  15. }
  16. }
  17.  

Ahora cuando vallas a crear un nuevo objeto de tipo Perro entonces puedes inicializar el atributo nombre de na vez:

Código
  1. public class MainApp {
  2.  
  3. public static void main(String args[]) {
  4. Perro perro = new Perro("Otto");
  5. }
  6. }
  7.  

Pero eso quiere decir que todos los objetos de tipo Perro que crees han de llevar el el valor de atributo nombre a la hora de instanciar, si quieres evitar esto, entonces los constructores se pueden sobrecargar, lo que quiere decir que vas a tener varios constructores que reciben distintos parámetros, así puedes tener los siguientes:

Código
  1. public class Perro {
  2. private String name;
  3. private int height;
  4.  
  5. public Perro () {
  6. }
  7.  
  8. public Perro (String n) {
  9. this.setName(n);
  10. }
  11.  
  12. public Perro(String n, int a) {
  13. this.setName(n);
  14. this.setHeight(a);
  15.  
  16. }
  17.  
  18. public void setName(String n) {
  19. this.name = n;
  20. }
  21.  
  22. public String getName() {
  23. return this.name;
  24. }
  25.  
  26. public void setHeight(int n) {
  27. this.height = n;
  28. }
  29.  
  30.        public int getHeight() {
  31.                return this.height;
  32.        }
  33. }

Como verás he agregado un setter y un getter también para la altura, además de un constructor vacío para crear el Objeto sin inicializar ninguno de sus atributos. El anterior código nos permite entonces crear Objetos de tipo Perro de la siguiente forma:

Código
  1. public class MainApp {
  2.  
  3. public static void main(String args[]) {
  4. Perro perro = new Perro();
  5. Perro perro1 = new Perro("Otto");
  6. Perro perro2 = new Perro("Otto", 30);
  7. }
  8. }
  9.  

Como verás entonces los constructores se usan para ejecutar los procesos de inicialización de un objeto, que en principio para objetos simples suele ser la inicialización de sus atributos

Si no especificas un constructor Java agregara un constructor vacío que recibe el nombre de constructor por defecto.

Por último tienes un pequeño error al usar el método mostrar por consola, donde le pasas un parámetro de tipo perro, pero como ves este no recibe parámetros:

Código
  1. public void mostrarenlaconsole()

así que la forma correcta de usarlo es simplemente:

Código
  1. perro.mostrarenlaconsole();

Te darás cuenta que a medida que avanzas en el Lenguaje el tema de los constructores se va haciendo cada vez un poco más complejo, esto a la hora de usar Interfaces, Enums, o construir Objetos con constructores de clases heredadas usando el tipo de mayor rango (esto es en todo caso conceptos propios de la POO)

Saludos


Título: Re: Constructores en Java
Publicado por: Viky30 en 24 Noviembre 2011, 22:32 pm

HOla muchas gracias por tu rapida respuesta, me kedo una duda y es la sgte

 kiere decir que por cada nuevo objeto, se debe crear un nuevo constructor no? pero que pasaria si agregro una nueva variable de instancia privada "patas",luego le agrego getters y setters, luego armo un nuevo tercer constructor con los parametros string name , int patas y me muesta un error...

"Esta es la clase Perros"

public class Perro {
   private String name;
   private int alt;
   private int patas;
   
   
   
   public Perro(String name){
      this.name = name;
      
   }   
   public Perro(String name,int alt){        // aqui me hace problema"int alt"
      this.name = name;
      this.alt = alt;
   }
   public Perro(String name,int patas) {     // y aqui tambien "int patas"
      this.name = name;
      this.patas= patas-1;
      
   }
   
   public void setName (String asignarnombre){
      this.name = asignarnombre;
   }
   public String getName(){
      return this.name;
   }
   
   public void setAlt (int asignaredad){
      this.alt=asignaredad;
   }
   public int getAlt (){
      return this.alt;
   }
   public void setPatas (int asignarnumerodepatas){
      int asignarnumerosdepatas = 0;
      this.patas = asignarnumerosdepatas;
   }
   public int getPatas (){
      return this.patas;
   }
   public void mostrarenlaconsole(){
      System.out.println("name="+ name);
      System.out.println("alt=" + alt);
      System.out.println("patas="+ patas);
}


"Esta es la clase test, con mi metodo main"
   public class Test {

   public static void main (String[] args){
      
      Perro perro1 = new Perro("tuki");
      perro1.mostrarenlaconsole();
      
      Perro perro2 =new Perro("zenzi",12);
      perro2.mostrarenlaconsole();
      
      Perro perro3=new Perro("cheroke",4);
      perro3.mostrarenlaconsole();
      


Título: Re: Constructores en Java
Publicado por: RyogiShiki en 24 Noviembre 2011, 22:58 pm
Hola que tal.

Bueno creo que se me olvido mencionarlo en el primer post. El problema esta en que no puedes repetir dos constructores exactamente iguales osea que reciben los mismos parametros. Mira:

Este constructor:

Código
  1. public Perro(String name,int alt){        // aqui me hace problema"int alt"
  2.      this.name = name;
  3.      this.alt = alt;
  4.   }
  5.  

Y este otro:

Código
  1. public Perro(String name,int patas) {     // y aqui tambien "int patas"
  2.      this.name = name;
  3.      this.patas= patas-1;
  4.  
  5.   }
  6.  

Los dos reciben como Parámetros un String y un entero, entonces si instanciamos dos Objeto:

Código
  1. Perro perro = new Perro("zenzi", 12);
  2. Perro perro = new Perro("cheroke", 4);  
  3.  

Entonces Java no sabrá a cual de los dos constructores te estas refiriendo, si al que setea las patas o al que setea la altura. Java no tiene manera de saber cual de los dos constructores usar. Te sugiero que solo hagas dos constructores que seteen los atributos más importantes, y el resto de atributos sean seteados con los setters.

Ahora en esta parte:
Código
  1. public void setPatas (int asignarnumerodepatas){
  2.      int asignarnumerosdepatas = 0;
  3.      this.patas = asignarnumerosdepatas;
  4.   }
  5.  

Fíjate que le pasas un parámetro que es el número de patas, pero justo antes de asignarlo le pones un valor de 0, esto hará que el número de patas siempre sea 0 es suficiente haciendolo así:
Código
  1. public void setPatas (int asignarnumerodepatas){
  2.      this.patas = asignarnumerosdepatas;
  3.   }
  4.  

Por ultimo recuerda poner el código dentro de las etiquetas GeSHi para que se vea mejor:
(http://i56.tinypic.com/34erlw6.png)
Saludos


Título: Re: Constructores en Java
Publicado por: rub'n en 27 Noviembre 2011, 17:37 pm
@RyogiShiki  gracias que buen tutorial, de verdad, para que me queden mas claro cosas así  ;)


@Viky30     ;)
(http://i.elhacker.net/i?i=QUskpaVYi8StM-NLutvDO2Vo) (http://i.elhacker.net/d?i=QUskpaVYi8StM-NLutvDO2Vo)


Título: Re: Constructores en Java
Publicado por: satu en 27 Noviembre 2011, 18:27 pm
@RyogiShiki explicas muy bien, de verdad que así explicado uno se entera mejor. Ojalá los profesores lo hicieran así.

Saludos