Autor Tema: Java. Paso de objetos como parámetros a método o constructor public CU00642B  (Leído 5064 veces)

Agente_007

  • Sin experiencia
  • *
  • Mensajes: 14
    • Ver Perfil
Clase CocinaCasa....

Código: [Seleccionar]

public class CocinaCasa{
    private boolean esIndependiente;
    private int numeroDeFuegos;
   
    public CocinaCasa(){
        esIndependiente=false;
        numeroDeFuegos=0;
    }
   
    public void setEsIndependiente(boolean valorEsIndependiente){esIndependiente=valorEsIndependiente;}
    public void setNumeroDeFuegos(int valorNumeroDeFuegos){numeroDeFuegos=valorNumeroDeFuegos;}
   
    public boolean getEsIndependiente(){return esIndependiente;}
    public int getNumeroDeFuegos(){return numeroDeFuegos;}
}



Clase SalonCasa....


Código: [Seleccionar]

public class SalonCasa{
    private int numeroDeTelevisores;
    private String tipoSalon;
   
    public SalonCasa(){
        numeroDeTelevisores=0;
        tipoSalon="";
    }
   
    public void setNumeroDeTelevisores(int valorNumeroDeTelevisores){numeroDeTelevisores=valorNumeroDeTelevisores;}
    public void setTipoSalon(String valorTipoSalon){tipoSalon=valorTipoSalon;}
   
    public int getNumeroDeTelevisores(){return numeroDeTelevisores;}
    public String getTipoSalon(){return tipoSalon;}
}


Clase Casa.... Esta clase la hice de 2 formas...
1ºForma....

Código: [Seleccionar]

public class Casa{
    private double superficie;
    private String dirección;
    private SalonCasa salonCasa;
    private CocinaCasa cocina;
   
    public Casa(){
        superficie=0;
        dirección="";
        salonCasa=new SalonCasa();
        cocina=new CocinaCasa();
    }
   
    public Casa(double valorSuperficie,String valorDirección,SalonCasa valorSalonCasa,CocinaCasa valorCocina){
        superficie=valorSuperficie;
        dirección=valorDirección;
        salonCasa=valorSalonCasa;
        cocina=valorCocina;
    }
   
    public void setSuperficie(double valorSuperficie){superficie=valorSuperficie;}
    public void setDirección(String valorDirección){dirección=valorDirección;}
    public void setSalonCasa(SalonCasa valorSalonCasa){salonCasa=valorSalonCasa;}
    public void setCocina(CocinaCasa valorCocina){cocina=valorCocina;}
   
    public double getSuperficie(){return superficie;}
    public String getDirección(){return dirección;}
    public SalonCasa getSalonCasa(){return salonCasa;}
    public CocinaCasa getCocina(){return cocina;}
   
}


2da Forma...

Código: [Seleccionar]

public class Casa{
    private double superficie;
    private String dirección;
    private SalonCasa salonCasa;
    private CocinaCasa cocina;
   
    public Casa(){
        superficie=0.0;
        dirección="";
        salonCasa=new SalonCasa();
        cocina=new CocinaCasa();
    }
   
    public Casa(double valorSuperficie,String valorDirección,SalonCasa valorSalonCasa,CocinaCasa valorCocina){
        superficie=valorSuperficie;
        dirección=valorDirección;
        salonCasa=new SalonCasa(valorSalonCasa.getNumeroDeTelevisores(),valorSalonCasa.getTipoSalon());// Me arroja error
        cocina=new CocinaCasa(valorCocina.getEsIndependiente(),valorCocina.getNumeroDeFuegos());//Me imagino q si acomodo arriba me arrojara de aquí otro error
    }
   
    public void setSuperficie(double valorSuperficie){superficie=valorSuperficie;}
    public void setDirección(String valorDirección){dirección=valorDirección;}
    public void setSalonCasa(SalonCasa valorSalonCasa){salonCasa=valorSalonCasa;}
    public void setCocinaCasa(CocinaCasa valorCocina){cocina=valorCocinaCasa;}
   
    public double getSuperficie(){return superficie;}
    public String getDirección(){return dirección;}
    public SalonCasa getSalonCasa(){return salonCasa;}
    public CocinaCasa getCocinaCasa(){return cocina;}
}


Esta 2º Forma traté de hacerlo como el ejemplo del constructor que ponen de TaxiCond en la entrega 42º, pero me arroja un error como lo señalé en el código. El error es..."constructor SalonCasa in class SalonCasa can't be applied to given types"...

Este error me aparece igualmente en el ejercicio que ponen de ejemplo, donde piden q cree una clase taxi con el ejemplo q ponen allí junto con otra clase Persona, el mismo visto entregas atrás y otra clase TaxiCond vista en la entrega 41º pero cambiando el constructor a...

Código: [Seleccionar]

//Constructor
    public TaxiCond (Taxi objetoTaxi, Persona objetoPersona) {
         //Creamos un objeto Taxi con los mismos datos del Taxi recibido como parámetro
         vehiculoTaxi = new Taxi (objetoTaxi.getMatricula(), objetoTaxi.getDistrito(), objetoTaxi.getTipoMotor() );
         //Creamos un objeto Persona con los mismos datos de la Persona recibidos como parámetro
        conductorTaxi = new Persona (objetoPersona.getNombre() );// Aquí me arroja el error     }


El error q señalé en el código, me dice: ""constructor Persona in class Persona can't be applied to given types"...
 :-\
Agradezco su ayuda. Y Gracias. 8)
« Última modificación: 10 de Mayo 2016, 10:41 por Alex Rodríguez »

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Re:Ejercicio (CU00642B). Aprendiendo Java desde 0.
« Respuesta #1 en: 06 de Mayo 2016, 12:08 »
Buenos días, Agente_007.

El ejercicio lo veo bien resuelto. Me gustaría comentarte unas cositas.

En la clase "Casa" en la segunda forma como lo tienes definido te da error, porque en el constructor del objeto "Casa" intentas crear unos nuevos objetos utilizando constructores pasándole unos parámetros, pero para que esto te funcione tienes que haber creado, primero, en los objetos "CocinaCasa" y "SalonCasa" este tipo de constructores.

Es decir, para que te funcione la segunda forma de definir el objeto "Casa" los objetos "CocinaCasa" y "SalonCasa" se tienen que haber definido así:

objeto "CocinaCasa":

Código: [Seleccionar]
public class CocinaCasa{
    private boolean esIndependiente;
    private int numeroDeFuegos;
   
    public CocinaCasa(){
        esIndependiente=false;
        numeroDeFuegos=0;
    }
   
    public CocinaCasa(boolean valorEsIndependiente, int valorNumeroDeFuegos){
        esIndependiente = valorEsIndependiente;
        numeroDeFuegos = valorNumeroDeFuegos;
    }
   
    public void setEsIndependiente(boolean valorEsIndependiente){esIndependiente=valorEsIndependiente;}
    public void setNumeroDeFuegos(int valorNumeroDeFuegos){numeroDeFuegos=valorNumeroDeFuegos;}
   
    public boolean getEsIndependiente(){return esIndependiente;}
    public int getNumeroDeFuegos(){return numeroDeFuegos;}
}


Y objeto "SalonCasa":

Código: [Seleccionar]
public class SalonCasa{
    private int numeroDeTelevisores;
    private String tipoSalon;
   
    public SalonCasa(){
        numeroDeTelevisores=0;
        tipoSalon="";
    }
   
    public SalonCasa(int valorNumeroDeTelevisores, String valorTipoSalon){
        numeroDeTelevisores = valorNumeroDeTelevisores;
        tipoSalon = valorTipoSalon;
    }
   
    public void setNumeroDeTelevisores(int valorNumeroDeTelevisores){
        numeroDeTelevisores=valorNumeroDeTelevisores;
    }
   
    public void setTipoSalon(String valorTipoSalon){
        tipoSalon=valorTipoSalon;
    }
   
    public int getNumeroDeTelevisores(){return numeroDeTelevisores;}
    public String getTipoSalon(){return tipoSalon;}
}


Ten cuidado cuando escribes los nombres de las propiedades, en la segunda forma, en el método "setCocinaCasa", lo tienes así:

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocina){cocina=valorCocinaCasa;}
y deberías de tenerlo así:

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocinaCasa){cocina=valorCocinaCasa;}
pero supongo que eso ha sido un error por descuido y no por no saberlo.

Supongo que también te aparecían los demás errores en los otros códigos porque no tenías los constructes adecuados en los objetos.

A mí también me costó bastante entender este tema.

Saludos :)
« Última modificación: 10 de Mayo 2016, 10:40 por Alex Rodríguez »

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Re:Ejercicio (CU00642B). Aprendiendo Java desde 0.
« Respuesta #2 en: 06 de Mayo 2016, 12:10 »
Podrías mirara este método de solucionar el mismo ejercicio, entre otros,:

https://www.aprenderaprogramar.com/foros/index.php?topic=1238.0

Los moderadores lo han calificado como "ejercicio ejemplo".

Agente_007

  • Sin experiencia
  • *
  • Mensajes: 14
    • Ver Perfil
Hola dimiste... Ya entendí porq el error y todo, corrí el código, creando los objetos de las clases con o sin parámetros y todo bien. Gracias! 8)...
Con respecto a.....

Citar

Ten cuidado cuando escribes los nombres de las propiedades, en la segunda forma, en el método "setCocinaCasa", lo tienes así:

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocina){cocina=valorCocinaCasa;}

y deberías de tenerlo así:

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocinaCasa){cocina=valorCocinaCasa;}

pero supongo que eso ha sido un error por descuido y no por no saberlo.

Lo acomodé pero colocándolo así...

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocina){cocina=valorCocina;}

Ya que llevo un orden q es colocando el mismo nombre del atributo solo agregándole el "valor.." q este caso es valorCocina y no colocándolo como dices "valorCocinaCasa" ya q no quiero enredarme agregando nuevas variables locales y q se parezcan al tipoObjeto como tal.


De todas formas, dejo el código ya arreglado...

Código: [Seleccionar]
public class SalonCasa{
    private int numeroDeTelevisores;
    private String tipoSalon;
   
    public SalonCasa(){
        numeroDeTelevisores=0;
        tipoSalon="desconocido";
    }
   
    public SalonCasa(int valorNumeroDeTelevisores,String valorTipoSalon){
        numeroDeTelevisores=valorNumeroDeTelevisores;
        tipoSalon=valorTipoSalon;
    }
   
    public void setNumeroDeTelevisores(int valorNumeroDeTelevisores){numeroDeTelevisores=valorNumeroDeTelevisores;}
    public void setTipoSalon(String valorTipoSalon){tipoSalon=valorTipoSalon;}
   
    public int getNumeroDeTelevisores(){return numeroDeTelevisores;}
    public String getTipoSalon(){return tipoSalon;}
}

Código: [Seleccionar]
public class CocinaCasa{
    private boolean esIndependiente;
    private int numeroDeFuegos;
   
    public CocinaCasa(){
        esIndependiente=false;
        numeroDeFuegos=0;
    }
   
    public CocinaCasa(boolean valorEsIndependiente,int valorNumeroDeFuegos){
        esIndependiente=valorEsIndependiente;
        numeroDeFuegos=valorNumeroDeFuegos;
    }
   
    public void setEsIndependiente(boolean valorEsIndependiente){esIndependiente=valorEsIndependiente;}
    public void setNumeroDeFuegos(int valorNumeroDeFuegos){numeroDeFuegos=valorNumeroDeFuegos;}
   
    public boolean getEsIndependiente(){return esIndependiente;}
    public int getNumeroDeFuegos(){return numeroDeFuegos;}
}

Código: [Seleccionar]
public class Casa{
    private double superficie;
    private String dirección;
    private SalonCasa salonCasa;
    private CocinaCasa cocina;
   
    public Casa(){
        superficie=0.0;
        dirección="";
        salonCasa=new SalonCasa();
        cocina=new CocinaCasa();
    }
   
    public Casa(double valorSuperficie,String valorDirección,SalonCasa valorSalonCasa,CocinaCasa valorCocina){
        superficie=valorSuperficie;
        dirección=valorDirección;
        salonCasa=new SalonCasa(valorSalonCasa.getNumeroDeTelevisores(),valorSalonCasa.getTipoSalon());
        cocina=new CocinaCasa(valorCocina.getEsIndependiente(),valorCocina.getNumeroDeFuegos());
    }
   
    public void setSuperficie(double valorSuperficie){superficie=valorSuperficie;}
    public void setDirección(String valorDirección){dirección=valorDirección;}
    public void setSalonCasa(SalonCasa valorSalonCasa){salonCasa=valorSalonCasa;}
    public void setCocinaCasa(CocinaCasa valorCocina){cocina=valorCocina;}
   
    public double getSuperficie(){return superficie;}
    public String getDirección(){return dirección;}
    public SalonCasa getSalonCasa(){return salonCasa;}
    public CocinaCasa getCocinaCasa(){return cocina;}
}

Otra cosa, está forma de hacer el constructor (con parámetros) trabajando a los tipoObjeto de esa forma, es lo correcto verdad? Y esa forma se llama notación punto?.. Ya q leí en el curso q estos tipos de objetos no pueden ser tratados como los tipos primitivos, aunque por allí vi soluciones de este mismo ejercicio q lo trabajaban como tipos primitivos y pienso yo q no debería ser o estoy mal??  ??? ... Y Gracias de nuevo.

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Te lo decía, más que nada, que si pasas un parámetro al método que no lo cambies luego porque no te funcionará.

Da lo mismo poner:

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocina){cocina=valorCocina;}
o poner:

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocinaCasa){cocina=valorCocinaCasa;}
de las dos formas creas una variable nueva. Pero si te va mejor poner:

Código: [Seleccionar]
public void setCocinaCasa(CocinaCasa valorCocina){cocina=valorCocina;}
no hay ningún problema.

Sobre si es correcto, tu puedes definir el constructor de un objeto como quieras (pasándole o no parámetros). Pero después, haciendo el constructor de un objeto que utiliza como propiedades otros objetos, ese nuevo objeto lo tienes que crear de acuerdo con su contructor. Es decir, cuando defines el constructor del objeto "Casa", si incluyes en él un objeto de tipo "SalonCasa", ese objeto lo tienes que hacer igual como lo tienes es ese objeto (en este caso, como lo tienes en el objeto "SalonCasa"). Y si para contruir el objeto "SalonCasa" necesitas pasarle 2 parámetros (porque tienes así definido su contructor), se los pasas.

Sobre la "notación de puntos" tienes la definición en la entrega CU00632B del curso Java desde cero. Aquí te la dejo:

Citar
En el caso de un objeto Taxi, una invocación de un método podría ser taxi1.getDistrito(). Esta invocación devuelve una cadena, por lo que podríamos escribir: System.out.println (“El distrito del taxi 1 es “ + taxi1.getDistrito() );

 

Esta forma de invocar los métodos se denomina “notación de punto” porque se basa en escribir el nombre del objeto seguido de un punto y el nombre del método con los parámetros que procedan. La notación de punto es un aspecto básico de Java y otros lenguajes de programación.

Aplicado al nuestro caso, cuando hacemos el contructor del objeto "Casa" así:

Código: [Seleccionar]
public Casa(double valorSuperficie,String valorDirección,SalonCasa valorSalonCasa,CocinaCasa valorCocina){
        superficie=valorSuperficie;
        dirección=valorDirección;
        salonCasa=new SalonCasa(valorSalonCasa.getNumeroDeTelevisores(),valorSalonCasa.getTipoSalon());
        cocina=new CocinaCasa(valorCocina.getEsIndependiente(),valorCocina.getNumeroDeFuegos());
    }

Lo que hacemos realmente aquí es decir que la variable "salonCasa" referenciará a un nuevo objeto de tipo "SalonCasa" y que ese objeto lo haremos mediante su constructor que necesita 2 parámetros. El primer parámetro lo haces invocando el método "getNumeroDeTelevisores()" sobre la variable "valorSalonCasa" que es de tipo "SalonCasa" y el segundo lo haces invocando "getTipoSalon()" sobre la variable "valorSalonCasa" que es de tipo "SalonCasa". Estos dos métodos lo que hacen es recuperar los valores de las propiedades del objeto "SalonCasa" cuando lo creaste. Por lo tanto, si pones en práctica esos objetos, antes de crear el objeto "Casa" tenías que haber creado el objeto "SalonCasa", porque si no, no podrás crear el objeto "Casa" porque no podrás crear el objeto "SalonCasa" dentro del objeto "Casa" puesto que no podrás pasarle los parámetros que necesita el objeto "SalonCasa" para su creación.

No te entiendo con lo qué quieres decir si un objeto se puede tratar como si fuera un tipo primitivo. En qué caso? Allí, por donde has visto la solución de este ejercicio habrá una constestación de algún moderador o un usuario colaborador que habrá comentado si hay errores.

No sé si te ha quedado claro. Cualquier duda, pregunta y con mucho gusto te contestaré (si lo sé, jejeje).

Saludos :)

Agente_007

  • Sin experiencia
  • *
  • Mensajes: 14
    • Ver Perfil
Muchas gracias hermano, todo aclarado!!, a la perfección! jeje...
He pensado en parar el curso hasta aquí y empezar con Pseudocódigo y luego Prog.Modular mejor, pq es lo q me han recomendado y he leído antes de proseguir con java, por q lanzarme de unas con esto creo q es heavy!.. o tu q me recomiendas?... He entendido lo q he visto en Java, quizás sea algo tonto y más adelante me pida conocimientos básicos... Por q creo q teniendo esos conocimientos será todo un poco más fácil o tu q me dices brother?...

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas, Agente_007.

Yo no te recomendaría que dajaras el curso aquí, puesto que ya que has llegado hasta aquí vale la pena seguirlo. Pero, también, es cierto que si te sientes inseguro en tus conocimientos mejor es repasar conceptos básicos anes de continuar con ese curso.

Yo empecé por el principio, primero hice el curso HTML desde cero, luego CSS desde cero, luego JavaScript desde cero y Java desde cero a la vez y ahora estoy haciendo PHP desde cero. Cuando lo acabe pienso hacer el Java I nivel avanzado. Pero cada uno decide por su mismo conforme vaya avanzando con sus conocimientos.

Sí te podría recomendar que cada entrega que hagas que la entiendas del todo antes de pasar a la siguiente, más que nada porque cada siguiente tiene que ver algo con la anterior. Además, así estarás seguro que lo que has estudiado y lo has entendido.

También, es verdad que a veces algún concepto no lo acabamos de entender del todo, pero mirando ejemplos de otros compañeros y con preguntar a los moderadores o a los usuarios, se nos aclara.

Si quieres, puedes visitar este enlace de aprenderaprogramar.com y desde allí podrás obtener una idea de qué pasos tienes que seguir:

https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=38&Itemid=78

Un saludo.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola aquí dejo otro enlace con orientaciones: https://www.aprenderaprogramar.com/foros/index.php?topic=1313.0

Saludos

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenos días, Alex.

Gracias por la aportación, un artículo muy bueno. Lo acabo de leer :)

Agente_007, te recomiendo la lectura del artículo que nos ha facilitado Alex.

Saludos :)

 

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".