Autor Tema: Java desde cero.Clases con campos, constructor y métodos. La palabra clave this  (Leído 2955 veces)

paulamhr

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil

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

nia

  • Sin experiencia
  • *
  • Mensajes: 6
    • Ver Perfil
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

paulamhr

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
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;
    }

}


nia

  • Sin experiencia
  • *
  • Mensajes: 6
    • Ver Perfil
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

paulamhr

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
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

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".