Autor Tema: Java error cannot find symbol - class Taxi al compilar código ejercicio CU00641B  (Leído 2422 veces)

danizeppelin

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Clases que utilizan objetos. Relación de uso entre clases Java. Concepto de diagrama de clases (CU00641B)

Hola! Hasta ahora no me ha hecho falta publicar en el foro porque todo iba contestándose sobre la marcha. Sin embargo me encuentro con un error que no entiendo relacionado con el contenido del curso java desde cero de aprenderaprogramar, no con el ejercicio de la lección.

En el código propuesto para su uso me da error y no entiendo por qué.

Clase TAXI bien compilada
Código: [Seleccionar]

public class Taxi {

    private String ciudad;
    private String matricula;
    private String distrito;
    private int tipoMotor;


    public Taxi (String valorCiudad, String valorMatricula, String valorDistrito, int valorTipoMotor) {

        ciudad = "";       
        matricula = "";
        distrito = "";
        tipoMotor = 0;

    }

//Métodos SET 
    public void setCiudad(String valorNombre){
        ciudad = valorNombre;}
       
    public void setMatricula (String valorMatricula){
        matricula = valorMatricula;}
   
    public void setDistrito (String valorDistrito){
        distrito = valorDistrito;}
       
    public void setTipoMotor (int valorTipoMotor){
        tipoMotor = valorTipoMotor;}
       

 //Métodos GET 
    public String getCiudad () { return ciudad; }

    public String getMatricula () { return matricula; }

    public String getDistrito () { return distrito; }

    public int getTipoMotor () { return tipoMotor; }

}

Clase propuesta en el contenido que me da un error

Código: [Seleccionar]
public class TaxiCond {

    private Taxi vehiculoTaxi;
    private Persona conductorTaxi;

    //Constructor
    public TaxiCond () {
        vehiculoTaxi = new Taxi (); //Creamos un objeto Taxi con el constructor general de Taxi. AQUÍ ME DA EL ERROR.
        conductorTaxi = new Persona (); //Creamos un objeto Persona con el constructor general de Persona
    }

    public void setMatricula (String valorMatricula) { vehiculoTaxi.setMatricula(valorMatricula); }

    //Método que devuelve la información sobre el objeto TaxiCond
    public String getDatosTaxiCond () {
        String matricula = vehiculoTaxi.getMatricula();
        String distrito = vehiculoTaxi.getDistrito();
        int tipoMotor = vehiculoTaxi.getTipoMotor();
        String cadenaTipoMotor = "";

        if (tipoMotor ==0) { cadenaTipoMotor = "Desconocido"; }
        else if (tipoMotor == 1) { cadenaTipoMotor = "Gasolina"; }
        else if (tipoMotor == 2) { cadenaTipoMotor = "Diesel"; }

        String datosTaxiCond = "El objeto TaxiCond presenta estos datos. Matrícula: " + matricula +
            " Distrito: " + distrito + " Tipo de motor: " + cadenaTipoMotor;

        System.out.println (datosTaxiCond);
        return datosTaxiCond;
    } //Cierre del método

} //Cierre de la clase

Aprovecho para daros miles de gracias por vuestra labor.

Saludos.
« Última modificación: 24 de Febrero 2019, 17:58 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:error en código (CU00641B) Java desde cero
« Respuesta #1 en: 30 de Agosto 2018, 01:30 »
Hola.

El error está en el constructor de la clase Taxi

En la clase TaxiCond estás inicializando un objeto Taxi con un constructor sin parametros:

Citar
  public TaxiCond () {
      vehiculoTaxi = new Taxi(); //Creamos un objeto Taxi con el constructor general de Taxi
      conductorTaxi = new Persona (); //Creamos un objeto Persona con el constructor general de Persona
  }

Pero resulta la clase Taxi solo tiene un constructor definido, y está definido con parametros:

Citar
    public Taxi (String valorCiudad, String valorMatricula, String valorDistrito, int valorTipoMotor) {

        ciudad = "";       
        matricula = "";
        distrito = "";
        tipoMotor = 0;
    }

Que por cierto, este constructor de Taxi no tiene ningún sentido, ya que pide parámetros pero luego dentro del constructor no los está usando. Inicializa los atributos con valores 0 y cadenas vacías, tal y como haríamos en un constructor sin parametros

Par corregir el error, hay que modificar el constructor para que no pida parametros, total no los está usando.

O ya puestos podemos definir dos constructores para Taxi, uno sin parametros y otro con parametros, aunque este último no se va a utilizar, al menos no en este ejercicio..
Obviamente el que pide parametros, luego ha de usarlos convenientemente para la inicialización de los atributos:

Código: [Seleccionar]
    //Constructor SIN parametros
    public Taxi() {
   
    ciudad = "";       
        matricula = "";
        distrito = "";
        tipoMotor = 0;
    }

  //Constructor CON parametros
    public Taxi (String valorCiudad, String valorMatricula, String valorDistrito, int valorTipoMotor) {

        ciudad = valorCiudad;       
        matricula = valorMatricula;
        distrito = valorDistrito;
        tipoMotor = valorTipoMotor;
    }

Con esto ya desaparece el error y puedes compilar bien.

Confirmanos que has entendido bién a que se debe el error, si no te queda claro intentamos explicarlo de otra forma.

No se si en este punto del curso de Java, se ha visto ya por qué un constructor pide parametros y cómo se inicializa un objeto con parametros.

Por si acaso, lo intento explicar de forma muy resumida.

Al inicializar un objeto, podemos elegir si queremos hacerlo pasandole o no parametros.

Si no le pasamos parametros, tendremos un objeto creado pero seguramente sus atributos no tendrán ningún valor asignado. Así que posteriormente tendremos que usar los "setters" para establecer el valor de esos atributos.
Por ejemplo:
Código: [Seleccionar]
Persona persona1 = new Persona();
persona1.setNombre("Kabuto");
persona1.setGenero("Hombre");
persona1.setEdad(38);

Ahora bien, podemos hacer eso mismo en una sola linea, usando un constructor al que le podamos pasar parametros.
Código: [Seleccionar]
Persona persona1 = new Persona("Kabuto", "Hombre", 38);
Por esto es común que las clases tengan al menos dos constructores, uno sin parametros y otro con parametros.
Si ya tenemos los datos de los atributos, por ejemplo porque los estamos leyendo de una base de datos o de un fichero de texto, preferiremos utilizar el constructor con atributos.

Si todavía no tenemos los datos de los atributos, porque tenemos que pedirle al usuario que los introduzca por teclado, seguramente preferiremos utilizar el constructor sin parametros. Luego, tras crear el objeto, pediremos datos por teclado al usuario y los iremos asignando a los atr
iobutos mediante los "setters"

Como ves, elegir uno u otro dependerá de las necesidades de nuestro programa.
« Última modificación: 30 de Agosto 2018, 01:35 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

danizeppelin

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:error en código (CU00641B) Java desde cero
« Respuesta #2 en: 12 de Septiembre 2018, 16:32 »
 ;D ;D Mil gracias kabuto por la explicación.

Veo perfectamente el error y es de cajón, me esmeré mucho por saber qué estaba fallando y no caía en la cuenta de la mecánica a la hora de definir constructores con o sin parámetros porque no llego a alcanzar la utilidad del mismo en su conjunto, no sé si me explico, es difícil verbalizar el momento en el que estoy de aprendizaje.

Gracias por contestar pronto y hacerlo constructivamente.

Saludos.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:error en código (CU00641B) Java desde cero
« Respuesta #3 en: 13 de Septiembre 2018, 01:40 »
Al principio es fácil no tener clara la función y mecánica de los constructores.

Como su nombre indica, se encarga de "construir" el objeto, cuya clase estamos definiendo.

Así que pedirá parametros al usuario, si es que los necesita.
Y pasará valores a los atributos, si es que necesita hacerlo.

Subrayo esto porque solemos caer en el error de pensar que los constructores tienen unas estructuras digamos... "obligadas".
Creemos que hay que poner un constructor sin parametros y otro que pida todos los parámetros.
Y en ambos casos lo unico que va a hacer el constructor es inicializar los atributos.

Y no es así, tenemos total flexibilidad para estructurar nuestros constructores y estos pueden hacer lo que queramos.

Podemos hacer tantos constructores como queramos, o no poner ninguno.
Y escribir dentro de ellos todo el código que necesitemos para "construir" nuestro objeto.

Una clase puede tener muchos atributos, pero a lo mejor a la hora de construir el objeto solo necesitamos pedir un único atributo al usuario.
Pues haremos un constructor que pida un único dato.

Hace poco ayudando a otro forero, desarrollamos una clase con varios atributos, pero que solo necesitamos pedir uno por el constructor:

Código: [Seleccionar]
public class Sala {

//Atributos
private String nombrePelicula;
private int asientosLibres = 20;
private int contJubilados = 0;
private int contAdultos = 0;
private int contMenores = 0;
private double recaudacion = 0;

//Constructor
public Sala(String nombre) {
nombrePelicula = nombre;
}


En estos ejemplos de aprendizaje, las clases son sencillas y los cosntructores son también simples. Básicamente pasan el parámetro recibido al atributo correspondiente.

Pero en realidad un constructor puede tener código mucho más complejo. Todo depende de lo que se necesite.


Con el tiempo irás viendo mejor cuál es la función de un constructor y tu mismo te irás dando cuenta de que ciertas clases pueden necesitar varios constructores, que otras solo necesitan pedir determinados parámetros para los atributos, que algunas van a tener que pedir ciertos parámetros que no serán para los atributos si no para otra tareas..

Conforme avanza la complejidad de los ejercicios, también aumenta la variedad y versatilidad de lo que necesitamos que hagan los constructores
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

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