Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: paulamhr en 19 de Octubre 2016, 12:14

Título: Java desde cero.Clases con campos, constructor y métodos. La palabra clave this
Publicado por: paulamhr en 19 de Octubre 2016, 12:14

Hola,
es mi primer post en el foro y lo primero es agradeceros este curso, nunca me ha gustado mucho Java y lo estoy disfrutando. 
La duda que tengo es esta, en el ejercicio de crear la clase Depositos y GrupoDepositos,  cuando llamo a la clase Deposito dentro del constructor de GrupoDepositos, no le paso ningún parámetro al constructor de la clase Depósito, ¿por qué no usa el constructor del this y le pone valores a cero sino que usa el constructor que tiene parámetros y le pone los valores por defecto?
 
Este es el constructor de la clase GrupoDepositos:
//class constructor
   public GrupoDepositos(int numeroDeDepositosGrupo, String valor_idGrupo)
   {
       idGrupo= valor_idGrupo;
       switch(numeroDeDepositosGrupo)
       {
           case 1:
            System.out.println("El grupo debe tener más de un depósito");
            break;
           case 2:
            deposito1 = new Deposito();
            deposito2 = new Deposito();
            numeroDepositosGrupo = 2;
            break;
           case 3:
            deposito1 = new Deposito();
            deposito2 = new Deposito();
            deposito3 = new Deposito();
            numeroDepositosGrupo = 3;
            break;
        }
    }//end of consructor

Y estos son los constructores de la clase Deposito:
//class constructor 1
    public Deposito()
    {
        this(0,0,"");
    }//end of constructor 1
   
    //class constructor 2
    public Deposito(float valor_diametro, float valor_altura, String valor_idDeposito)
    {
        if (valor_diametro > 0 && valor_altura > 0)
        {
            diametro   = valor_diametro;
            altura     = valor_altura;
            idDeposito = valor_idDeposito;
        }else
        {
            diametro   = 10;
            altura     = 5;
            idDeposito = "000";
            System.out.println("Depósito creado con valores por defecto, diámetro 10, altura 5 e identificador 000");
        }
    }//end of constructor 2

Gracias por vuestra ayuda.
Un saludo,
Paula
Título: Re:Java desde cero.Clases con campos, constructor y métodos. La palabra clave this
Publicado por: nia en 19 de Octubre 2016, 12:37
Buenas,

Para poder entender mejor y así poder ayudar, podría pasar los códigos de las dos clases enteros?

También recomiendo leer el siguiente enlace para aplicar correctamente los mensajes en el foro:
https://www.aprenderaprogramar.com/foros/index.php?topic=1460.msg7784#msg7784


Saludos,

nia
Título: Re:Java desde cero.Clases con campos, constructor y métodos. La palabra clave this
Publicado por: paulamhr en 19 de Octubre 2016, 13:08
Código para clase GrupoDepositos:
Código: [Seleccionar]
public class GrupoDepositos
{
   private Deposito deposito1;
   private Deposito deposito2;
   private Deposito deposito3;
   private String   idGrupo;
   private int      numeroDepositosGrupo;
   
   //class constructor
   public GrupoDepositos(int numeroDeDepositosGrupo, String valor_idGrupo)
   {
       idGrupo= valor_idGrupo;
       switch(numeroDeDepositosGrupo)
       {
           case 1:
            System.out.println("El grupo debe tener más de un depósito");
            break;
           case 2:
            deposito1 = new Deposito();
            deposito2 = new Deposito();
            numeroDepositosGrupo = 2;
            break;
           case 3:
            deposito1 = new Deposito();
            deposito2 = new Deposito();
            deposito3 = new Deposito();
            numeroDepositosGrupo = 3;
            break;
        }
    }//end of consructor
   
    //methods to get the attributes of the class
    public int getNumeroDepositosGrupo() { return numeroDepositosGrupo;}
    public String getIdGrupo() { return idGrupo;}
   
    public float capacidadDelGrupo()
    {
        if (numeroDepositosGrupo == 2 )
        {
            return (deposito1.valorCapacidad() + deposito2.valorCapacidad());
        }else
        {
            return (deposito1.valorCapacidad() + deposito2.valorCapacidad() + deposito3.valorCapacidad());
        }
    }         
           
}

código para la clase Depositos:
Código: [Seleccionar]
public class Deposito
{
   
    private float  diametro;
    private float  altura;
    private String idDeposito;
   
    //class constructor 1
    public Deposito()
    {
        this(0,0,"");
    }//end of constructor 1
   
    //class constructor 2
    public Deposito(float valor_diametro, float valor_altura, String valor_idDeposito)
    {
        if (valor_diametro > 0 && valor_altura > 0)
        {
            diametro   = valor_diametro;
            altura     = valor_altura;
            idDeposito = valor_idDeposito;
        }else
        {
            diametro   = 10;
            altura     = 5;
            idDeposito = "000";
            System.out.println("Depósito creado con valores por defecto, diámetro 10, altura 5 e identificador 000");
        }
    }//end of constructor 2
       
    public void setValoresDeposito (String valor_idDeposito, float valor_diametro, float valor_altura)
    {
        idDeposito = valor_idDeposito;
        diametro   = valor_diametro;
        altura     = valor_altura;
        if (idDeposito != "" && valor_diametro > 0 && valor_altura > 0)
        {
        }else
        {
            System.out.println("Valores no admisibles. No se han establecido valores para el deposito");
            idDeposito = "";
            diametro   = 0;
            altura     = 0;
        }
    }
    //methods to get the class attributes
    public float getDiametro () { return diametro; }
    public float getAltura () { return altura; }
    public String getIdDeposito () { return idDeposito;}
   
    //method to calculate capacity
    public float valorCapacidad ()
    {
        float capacidad;
        float pi  = 3.1416f;
       
        capacidad = pi*(diametro/2)*(diametro/2)*altura;
        return capacidad;
    }

}

Título: Re:Java desde cero.Clases con campos, constructor y métodos. La palabra clave this
Publicado por: nia en 19 de Octubre 2016, 13:32
Gracias,

A la pregunta que has realizado:

Citar
cuando llamo a la clase Deposito dentro del constructor de GrupoDepositos, no le paso ningún parámetro al constructor de la clase Depósito, ¿por qué no usa el constructor del this y le pone valores a cero sino que usa el constructor que tiene parámetros y le pone los valores por defecto?

Mi opinión es que al llamar al constructor sin parámetros de Deposito (constructor 1), éste con la línea 
Código: [Seleccionar]
this(0,0,""); llama al constructor con parámetros de Deposito (constructor 2).
Dentro de el constructor 2 pasando por parámetros variables en cero no entra en el if (ya que no cumple las condiciones), así que se ejecutan las instrucciones del else poniendo las variables en valores por defecto.

Espero que responda a tu pregunta.

Un saludo,

nia
Título: Re:Java desde cero.Clases con campos, constructor y métodos. La palabra clave this
Publicado por: paulamhr en 20 de Octubre 2016, 17:22
Gracias Nia por tu respuesta,
la verdad es que no estaba segura de si eso era lo que pasaba. Acabo de ver que Blue J te permite crear breakpoints, supongo que con eso puedo ver lo que pasa realmente en la ejecución. Lo probaré.

Un saludo,
Paula