Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - toni_apr

Páginas: 1 ... 17 18 19 20 21 [22] 23 24 25
421
Hola dongo. Gracias por tus comentarios.

Cuando el ejercicio incluya muchas clases, haré lo que me dices. Poner también en un adjunto los ficheros.

Y en cuanto al uso del comentario '@Override': OK, ningún problema, lo voy a usar cada vez que sobreescriba un método de la clase padre.
He leido que si no se pone, la compilación va igual, pero que al programador le sirve de banderita diciendo (¡he, este método se sobreescribe de la clase padre!) y hace más facil seguir el código.

Gracias otra vez y Salud.

422
Gracias Alex por revisar mi ejercicio.

En cuanto al uso de la palabra clave 'super', estoy acostumbrándome a usarla.
Todavía no la tengo interiorizada, espero superar eso a fuerza de utilizarla.

Saludos

423
Citar
Define una clase Figura de la que hereden otras dos clases denominadas Cuadrado y Círculo. La clase figura debe tener al menos el campo dimensionPrincipal. Las clases Cuadrado y Círculo deben tener al menos un método calcularArea que permita calcular el área a partir de la dimensión principal, utilizando la fórmula matemática correspondiente. Además, sobreescribe el método equals para que dos cuadrados sean iguales si tienen igual dimensión principal, y dos círculos idem. A continuación crea un programa test donde crees varios círculos y cuadrados y hagas comprobaciones de igualdad usando el método equals.

En la clase TestFiguras con main se realizan comparaciones de identidad e igualdad.

Incluyo clases
Figura
Cuadrado
Circulo
TestFiguras
Centrar
Mensa
Enmarcar

Clase Figura
Código: [Seleccionar]
public class Figura {             // Atributos de la clase Figura
    protected float dimensionPrincipal;
    //Constructor para objetos de la clase Figura
    public Figura(float dimensionPrincipal) {            // Inicializa atributos
        this.dimensionPrincipal = dimensionPrincipal;
    } // Fin del constructor Figura

    // Siguen los setters para los atributos de la clase Figura
    public void setDimensionPrincipal (float dimensionPrincipal) { this.dimensionPrincipal = dimensionPrincipal; }
    // Ahora los getters para los atributos de la clase Figura
    public float getDimensionPrincipal () { return dimensionPrincipal; }
    // Y seguidamente, metodos varios.
    public String toString() {
        return "Dimension principal: " + dimensionPrincipal;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Figura) {
            Figura tmpFigura = (Figura) obj;
            if (this.dimensionPrincipal == tmpFigura.dimensionPrincipal) { return true; }
            else                                                         { return false; }
        } else                                                           { return false; }
    }
} // Fin de la clase Figura
Clase Cuadrado
Código: [Seleccionar]
public class Cuadrado extends Figura{           

    //Constructor para objetos de la clase Cuadrado
    public Cuadrado(float dimensionPrincipal) {         
        super(dimensionPrincipal);
    } // Fin del constructor Cuadrado
    public float calcularArea() {
        float lado = super.dimensionPrincipal;
        return lado * lado;
    }
    // No se sobreescribe el método toString(), se usará el de la clase padre.
    public float getLado() { return super.dimensionPrincipal; }
    // El atributo 'dimensionPrincipal' es accesible por declararse 'protected' en la clase padre
    public String mostrarDatos() {
        return  super.toString() + " Area: " + calcularArea();
    }
    public boolean equals(Object obj) {
        if (obj instanceof Cuadrado) {
            Cuadrado tmpCuadrado = (Cuadrado)obj;
            if (super.dimensionPrincipal == tmpCuadrado.dimensionPrincipal) { return true; }
            else                                                            { return false; }
        } else                                                              { return false; }
    }
} // Fin de la clase Cuadrado
Clase Circulo
Código: [Seleccionar]
public class Circulo extends Figura{             

    //Constructor para objetos de la clase Circulo
    public Circulo(float dimensionPrincipal) {           
        super(dimensionPrincipal);
    } // Fin del constructor Circulo
    public float calcularArea() {
        float radio = super.dimensionPrincipal;
        return radio * radio * (float)Math.PI;
    }
    // No se sobreescribe el método toString(), se usará el de la clase padre.

    // El atributo 'dimensionPrincipal' es accesible por declararse 'protected' en la clase padre
    public String mostrarDatos() {
        return super.toString() + " Area: " + calcularArea();
    }
    public boolean equals(Object obj) {
        if (obj instanceof Circulo) {
            Circulo tmpCirculo = (Circulo)obj;
            if (super.dimensionPrincipal == tmpCirculo.dimensionPrincipal) { return true; }
            else                                                           { return false; }
        } else                                                             { return false; }
    }
} // Fin de la clase Circulo
Clase TestFiguras
Código: [Seleccionar]
public class TestFiguras {
    private static boolean mostrarInfo; // Ocultar/mostrar informacion del Area del objeto.

    public TestFiguras() {
        mostrarInfo = false;
    }

    public static void main (String [] args) {
        Cuadrado [] cuad = new Cuadrado[4];
        Circulo [] cir = new Circulo[4];
        for (int i = 0; i < 4; i++) {
            cuad[i] = new Cuadrado((i+1)*10);

            cir[i] = new Circulo((i+.5f)*10);
        }
        System.out.print("\f");
        Centrar.texto("Se presentaran comparaciones de objetos.");
        Centrar.texto("La condicion verdadera se representa con '@' y la falsa con '-'");
        String respuesta = Mensa.responde("\nEsta desactivada la presentacion del area de los objetos.\n" +
                "Si desea activarla, pulse [S]i, cualquier otra tecla mantiene oculta el Area.");
        if (respuesta.length() == 0) { // continua igual
        } else if (respuesta.substring(0,1).equalsIgnoreCase("S")) { mostrarInfo = true; }
        else {  // continua igual
        }
        Enmarcar.texto("Creados 4 cuadrados");
        if (mostrarInfo) {
            for (int i=0;i<4;i++) {
                System.out.println ("Del cuad[" + i + "] tenemos esta información: " + cuad[i].mostrarDatos()); }
        }
        cuadriculaComparacion(cuad);
        Mensa.responde("\nPulsar ENTER para continuar");
        Centrar.texto("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");

        Enmarcar.texto("Se modifica el objeto cuad[2], su atributo 'dimensionPrincipal' se iguala con el del objeto cuad[0]");
        cuad[2].setDimensionPrincipal(10f);
        if (mostrarInfo) {
            for (int i=0;i<4;i++) {
                System.out.println ("Del cuad[" + i + "] tenemos esta información: " + cuad[i].mostrarDatos()); }
        }
        cuadriculaComparacion(cuad);
        Mensa.responde("\nPulsar ENTER para continuar");
        Centrar.texto("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");

        Enmarcar.texto("El objeto cuad[1] es asignado al cuad[3]");
        cuad[3] = cuad[1];
        if (mostrarInfo) {
            for (int i=0;i<4;i++) {
                System.out.println ("Del cuad[" + i + "] tenemos esta información: " + cuad[i].mostrarDatos()); }
        }
        cuadriculaComparacion(cuad);
        Mensa.responde("\nPulsar ENTER para continuar");
        Centrar.texto("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");

        Enmarcar.texto("Creados 4 circulos");
        if (mostrarInfo) {
            for (int i=0;i<4;i++) {
                System.out.println ("Del cir[" + i + "] tenemos esta información: " + cir[i].mostrarDatos()); }
        }
        cuadriculaComparacion(cir);
        Mensa.responde("\nPulsar ENTER para continuar");
        Centrar.texto("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");

        Enmarcar.texto("Se modifica cir[0] su atributo 'dimensionPrincipal' se iguala con el del objeto cir[1]");
        cir[0].setDimensionPrincipal(cir[1].getDimensionPrincipal());
        if (mostrarInfo) {
            for (int i=0;i<4;i++) {
                System.out.println ("Del cir[" + i + "] tenemos esta información: " + cir[i].mostrarDatos()); }
        }
        cuadriculaComparacion(cir);
        Mensa.responde("\nPulsar ENTER para continuar");
        Centrar.texto("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");

        Enmarcar.texto("El objeto cir[2] es asignado al cir[3]");
        cir[3] = cir[2];
        if (mostrarInfo) {
            for (int i=0;i<4;i++) {
                System.out.println ("Del cir[" + i + "] tenemos esta información: " + cir[i].mostrarDatos()); }
        }
        cuadriculaComparacion(cir);
        System.out.println();
        Centrar.texto("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");
        Centrar.texto("Fin de las comparaciones");
    } // fin del main
    private static void cuadriculaComparacion(Figura [] fig) {
        String msg = "",nombre = "";
        if (fig.getClass().toString().contains("Cuadrado")) { 
            nombre = "cuad";
        } else {
            nombre = "cir";
        }

        System.out.println();
        System.out.println("                          Identidad:                               Igualdad:");
        System.out.println("                    " + nombre + "Fila == " + nombre + "Columna              " +
            nombre + "Fila.equals(" + nombre + "Columna)");
        System.out.print("\t");
        for (int i=0; i < 4;i++) { System.out.print("\t " + fig[i].getDimensionPrincipal()); }
        System.out.print("\t");
        for (int i=0; i < 4;i++) { System.out.print("\t " + fig[i].getDimensionPrincipal()); }
        System.out.print("\n\t");
        for (int i=0; i < 4;i++) { System.out.print("\t" + nombre + "[" + i + "]"); }
        System.out.print("\t");
        for (int i=0; i < 4;i++) { System.out.print("\t" + nombre + "[" + i + "]"); }
        System.out.println("\n");

        for (int j=0; j<4; j++) {
            System.out.print( fig[j].getDimensionPrincipal() + "  " + nombre + "[" + j + "]");
            for (int i=0;i<4;i++) {
                if (fig[i] == fig[j]) { msg = "  @"; } else { msg = "  -"; }
                System.out.print ("\t" + msg);
            }
            System.out.print ("\t");
            for (int i=0;i<4;i++) {
                if (fig[i].equals(fig[j])) { msg="  @"; } else { msg="  -"; }
                System.out.print ("\t" + msg);
            }
            System.out.println();
        }
    }
} // Fin de la clase TestFiguras
Clase Centrar
Código: [Seleccionar]
public class Centrar {   
    /**
     * Centra el texto recibido en un ancho de consola de 80 caracteres (valor por defecto)
     */
    public static void texto(String texto) {
        texto(texto,80);
    }

    /**
     * Centra el texto recibido en un ancho de consola especificado en el parametro 'anchoConsola'
     */
    public static void texto(String texto, int anchoConsola) {
        int largo = texto.length();
        System.out.println (espacios((anchoConsola - largo)/2) + texto);
    }

    private static String espacios(int espacio) {
        String salida = "";
        for (int i = 0; i < espacio; i++) {
            salida = salida + " ";
        }
        return salida;
    }
} // Fin de la claseCentrar
Clase Mensa
Código: [Seleccionar]
import java.util.Scanner;

public class Mensa { // Atributos de la clase Mensa

    // Y seguidamente, procedimientos y funciones varios.
    /**
     * Mostrar el texto con salto de línea (sin segundo parámetro)
     */   
    public static void muestra (String frase) {
        muestra (frase, 1);
    }// fin de muestra 1 parámetro

    /**
     * Valores param:
     * 0 = Sin salto de línea.
     * 1, u otro valor = Con salto de línea.
     */   
    public static void muestra (String frase, int param) {
        if (param == 0) { System.out.print (frase + " ");
        }          else { System.out.println (frase); }
    }// fin de muestra 2 parámetros

    /**
     * Sin segundo parámetro el mensaje incluirá salto de línea. Devuelve entrada de teclado
     */
    public static String responde (String frase) {
        return responde (frase, 1);
    }// fin de responde 1 parámetro

    /**
     * Valores param:
     * 0 = Sin salto de línea + entrada por teclado.
     * 1, u otro valor = Con salto de línea + entrada por teclado.
     */
    public static String responde (String frase, int param) {
        muestra (frase, param);
        Scanner entradaEscaner = new Scanner(System.in);
        return entradaEscaner.nextLine();
    }// fin de responde 2 parámetros
} // Fin de la clase Mensa
Clase Enmarcar
Código: [Seleccionar]
public class Enmarcar {         
    /**
     * @param texto String a mostrar centrado en un ancho de consola de 80 caracteres
     */
    public static void texto(String texto) {
        texto(texto, 80);
    }

    /**
     * @param texto String a mostrar centrado en un ancho de consola especificado en el siguiente parametro
     * @param anchoConsola Especifica el ancho deseado de consola
     */
    public static void texto(String texto, int anchoConsola) {
        int largo = texto.length();
        int sangria = (anchoConsola - largo)/2 - 2;
        String arriba = "_", abajo = "¯",salida = "";

        //         if (anchoConsola == 0) { sangria = 0; }
        if (sangria < 0) { sangria = 0; }
        salida =                repite(" ",sangria +1) + repite(arriba,largo+2) + "\n";
        salida = salida +       repite(" ",sangria) + "| " + texto + " |\n";
        salida = salida +  repite(" ",sangria ) +"°"  + repite(abajo,largo+2) + "°";
        System.out.println(salida);
    }

    private static String repite(String c, int n) {
        String salida = "";
        for (int i = 0; i< n; i++) {
            salida = salida + c;
        }
        return salida;
    }
} // Fin de la clase Enmarcar

424
Hola
Citar
Considera que estás desarrollando un programa Java donde trabajas con la superclase Profesor y la subclase ProfesorEmerito. Crea el código para estas clases que cumpla los requisitos que indicamos.

Como atributos de la superclase tendremos nombre (String), edad (int) y añosConsolidados (int) declarados como protected.

En la subclase se trabajará con el campo adicional añosEmerito declarado como private.

Un método de la subclase será double obtenerSalarioBase () que obtendrá el salario base como (925 + añosConsolidados * 33.25 + 47.80 * añosEmerito).

Intenta acceder directamente al campo añosConsolidados desde la subclase (como si fuera un campo más de la subclase) para implementar este método. ¿Es posible sin utilizar una invocación a super ni un método get? ¿Qué ocurre si el atributo en la superclase lo declaras private?
Clase Profesor
Código: [Seleccionar]
/**
 * Detalles de la clase.
 * @author (Toni)
 * @version (0)
 */
public class Profesor {             // Atributos de la clase Profesor
    protected String nombre;
    protected int edad;
    protected int añosConsolidados;
    //Constructor para objetos de la clase Profesor
    public Profesor(String nombre,int edad,int añosConsolidados) {            // Inicializa atributos
        this.nombre = nombre;
        this.edad = edad;
        this.añosConsolidados = añosConsolidados;
    } // Fin del constructor Profesor

    // Siguen los setters para los atributos de la clase Profesor
    public void setNombre (String nombre)                  { this.nombre = nombre; }

    public void setEdad (int edad)                         { this.edad = edad; }

    public void setAñosConsolidados (int añosConsolidados) { this.añosConsolidados = añosConsolidados; }
    // Ahora los getters para los atributos de la clase Profesor
    public String getNombre ()                             { return nombre; }

    public int getEdad ()                                  { return edad; }

    public int getAñosConsolidados ()                      { return añosConsolidados; }
    // Y seguidamente, metodos varios.

} // Fin de la clase Profesor
Clase ProfesorEmerito
Código: [Seleccionar]
/**
 * Detalles de la clase.
 * @author (Toni)
 * @version (0)
 */
public class ProfesorEmerito extends Profesor {             // Atributos de la clase ProfesorEmerito
    private int añosEmerito;
    //Constructor para objetos de la clase ProfesorEmerito
    public ProfesorEmerito(String nombre,int edad,int añosConsolidados, int añosEmerito) {            // Inicializa atributos
        super(nombre, edad, añosConsolidados);
        this.añosEmerito = añosEmerito;
    } // Fin del constructor ProfesorEmerito

    // Siguen los setters para los atributos de la clase ProfesorEmerito
    public void setAñosEmerito (int añosEmerito)         { this.añosEmerito = añosEmerito; }
    // Ahora los getters para los atributos de la clase ProfesorEmerito
    public int getAñosEmerito ()                         { return añosEmerito; }
    // Y seguidamente, metodos varios.
    public double obtenerSalarioBase()      { return 925 + super.añosConsolidados * 33.25d + 47.80d * añosEmerito; }
} // Fin de la clase ProfesorEmerito
En la clase ProfesorEmerito, podemos acceder al atributo 'añosConsolidados' de la clase Profesor como si fuera uno propio, debido a que se declaró como 'protected'.
Este modificador se utiliza para que la subclase acceda al atributo de la superclase de la misma forma que accede a sus propios atributos.
Si este atributo se hubiera declarado 'private', para acceder a él desde la subclase, solo se podría hacer con el método 'getAñosConsolidados ()'

Clase Test
Código: [Seleccionar]
/**
 * Detalles de la clase.
 * @author (Toni)
 * @version (0)
 */
public class Test {         
        public static void main (String [] args) {
            ProfesorEmerito pe = new ProfesorEmerito("Eduardo",33,10,5);
            System.out.println("Salario base: " + pe.obtenerSalarioBase());
        } // fin del main
} // Fin de la clase Test

425
Aprender a programar desde cero / Re:Ejercicio CU00690B
« en: 12 de Agosto 2014, 22:18 »
Hola javi
Gracias por revisar mi ejercicio.
Seguramente más de una vez me habreis de poner los puntos, las comas y lo que haga falta.
Tu observación sobre hacer código compacto, que siempre es positiva sin dudarlo, yo me la he saltado aquí, por una razón más estética que no técnica.
Mi asignación de valores a las variables es rimbombante, escandalosa si quieres.
Doy muchas voces para una cosa que tu haces en una línea.

Este programa era tan escuálido que tenía que rellenarlo. Y así ha quedado.

Saludos

426
Preguntas y respuestas. Diferencia entre Tipo estático y dinámico java. Ejercicio CU00690B del tutorial de programación POO de aprenderaprogramar.

Citar
a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?

Respuesta: SI. en tiempo de ejecución el objeto puede apuntar a un objeto de su clase padre o Superclase haciendo una conversión de tipo (casting) a la superclase

Ejemplo

Persona p1 = new Persona();
Medico m1 = new Medico()

La clase Persona es superclase de la clase Medico

La asignación m1 = p1; (poner en el objeto de una clase un objeto de la superclase)
da error.

Se puede conseguir la asignación haciendo 'casting'

m1 = (Medico) p1;



Citar
b) ¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?

Respuesta: Si, siempre. Sin ningún género de duda.


Citar
c) Escribe el código de una clase Vehiculo con los atributos matricula (String) y numeroDeRuedas (int), constructor, métodos getters y setters y método toString() para mostrar la información de un vehículo.


Clase Vehiculo

Código: [Seleccionar]
public class Vehiculo {             // Atributos de la clase Vehiculo
    private String matricula;
    private int numeroDeRuedas;
    //Constructor para objetos de la clase Vehiculo
   
    public Vehiculo(String matricula, int numeroDeRuedas) {            // Inicializa atributos
        this.matricula = matricula;
        this.numeroDeRuedas = numeroDeRuedas;
    } // Fin del constructor Vehiculo
   
    // Siguen los setters para los atributos de la clase Vehiculo
    public void setMatricula (String matricula)        { this.matricula = matricula; }
    public void setNumeroDeRuedas (int numeroDeRuedas) { this.numeroDeRuedas = numeroDeRuedas; }
   
    // Ahora los getters para los atributos de la clase Vehiculo
    public String getMatricula ()                      { return matricula; }
    public int getNumeroDeRuedas ()                    { return numeroDeRuedas; }
   
    // Y seguidamente, metodos varios.
    public String toString() {
        return "       Matricula: " + matricula + "\n" +
               "Numero de ruedas: " + numeroDeRuedas + "\n";
    }
} // Fin de la clase Vehiculo



Citar
d) Escribe el código de una clase Taxi que herede de vehículo y que además de los atributos de Vehiculo lleve un atributo adicional nombreDelConductor (String) y numeroDePlazas (int), constructor, métodos getters y setters y método toString() para mostrar la información de un Taxi.


Clase Taxi

Código: [Seleccionar]
public class Taxi extends Vehiculo {             // Atributos de la clase Taxi
    private String nombreDelConductor;
    private int numeroDePlazas;
    //Constructor para objetos de la clase Taxi
    public Taxi(
   
    String matricula,
    int numeroDeRuedas,
    String nombreDelConductor,
    int numeroDePlazas) {            // Inicializa atributos
        super(matricula, numeroDeRuedas);
        this.nombreDelConductor = nombreDelConductor;
        this.numeroDePlazas = numeroDePlazas;
    } // Fin del constructor Taxi

    // Siguen los setters para los atributos de la clase Taxi
    public void setNombreDelConductor (String nombreDelConductor) { this.nombreDelConductor = nombreDelConductor; }
    public void setNumeroDePlazas (int numeroDePlazas)            { this.numeroDePlazas = numeroDePlazas; }
    // Ahora los getters para los atributos de la clase Taxi
    public String getNombreDelConductor ()                        { return nombreDelConductor; }
    public int getNumeroDePlazas ()                               { return numeroDePlazas; }
    // Y seguidamente, metodos varios.
    public String toString() {
        return super.toString() +
        "Nombre del conductor: " + nombreDelConductor + "\n" +
        "    Numero de plazas: " + numeroDePlazas;
    }
} // Fin de la clase Taxi



Citar
e) Escribe el código de una clase test con el método main que cree un objeto cuyo tipo es Vehiculo, instanciado como Taxi. Establece valores para sus atributos y usa el método toString(). ¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi? ¿Por qué?


Clase Test

Código: [Seleccionar]
public class Test { 
    public static void main (String [] args) {
        String matricula = "AS-4567";
        int numeroDeRuedas = 3;
        String nombreDelConductor = "Ramiro";
        int numeroDePlazas = 3;
        Vehiculo v1 = new Taxi(matricula,numeroDeRuedas,nombreDelConductor,numeroDePlazas);
        System.out.println ("\nEl vehiculo v1 presenta estos atributos:\n" + v1.toString());
    } // fin del main
} // Fin de la clase Test


Respuesta: Se ejecuta el método toString() del tipo contenido en el objeto (Taxi) aunque se declarara como tipo Vehiculo

Porque en tiempo de ejecución, el compilador verifica el tipo que contiene el objeto y ejecuta sus métodos, solo si no los encuentra en el tipo instanciado los busca el la clase padre.


427
Si dongo
Me dije. ¡Vamos a poner toda la carne en el asador!
Ahora, solo me falta hacer rótulos finos para que quede todo bien plus.
Y también me faltan: excepciones, eventos, y cosas de las que todavía ni conozco el nombre.

Gracias por tus ánimos. :D

428
En este ejercicio se pide ampliar el código del ejercicio anterior añadiendo una clase de nombre 'EnvioDeProductos'.

Esperando no contravenir las directrices del curso, en mi ejercicio hay una clase que permite gestionar un envío de productos además de otras cosas. Por ese motivo la he llamado 'ListaDeProductos' un nombre más genérico.
Si mi diseño en conjunto está fuera del propósito del ejercicio, no tengo inconveniente en modificarlo.

Este ejercicio lo envio comprimido en archivo adjunto CU00688B0.rar.
Todas las clases pertenecen al paquete CU00688B0 como se especifica en la cabecera de los archivos.

Las clases incluidas son:
Fecha
ListaDeProductos
Mensa
ProductoCongelado
ProductoCPAgua
ProductoCPAire
ProductoCPNitrogeno
ProductoFresco
ProductoRefrigerado
TestHerencia3
TestHerencia4
Validador

Saludos.

429
Sí Alex. Tu postura respecto al papel que juega el IDE Bluej en este curso de java, es más que correcta.
No me compete a mí tomar decisiones al respecto. Estoy dando mi opinión fundada en lo que he aprendido en este foro.

A saber, y muy importante.
Bluej dejando a parte las deficiencias que pueda tener, es un entorno donde el que está aprendiendo, puede probar la consistencia del método creado desligándolo de cualquier otro código.
Puede crear objetos (a partir de sus clases) probando que son funcionales al 100% y que no contienen errores.
Ah, me olvidaba. Parece ser que Bluej es el único IDE que permite hacer eso. Otro punto a su favor.

Son dos cosas muy sencillas, pero evitan tener que construir una casa para comprobar si las baldosas son adecuadas para ella.

Otro símil: En Bluej podemos hacer como en la empresa que fabrica componentes.
Una vez creado un componente, pasa al control de calidad donde es modificado, rechazado o aceptado según cada caso.
El componente aceptado se unirá a otros componetes para crear un producto terminado, que a su vez será testeado por el control de calidad para ver que todos ellos interaccionan bien y realizan su cometido.

Para mí, este tema está cerrado y no tiene discusión.

Saludos.

430
Vaya dongo eres un fiera.
Yo con tu explicación del 'conque' ya me daba por satisfecho, me quitaba la espina del porque no iba eso.
Así pues, estaba abandonando ese código -ya te dije que tenía un método sustituto-.
Pero veo, que como otras veces que me proponen una solución, en este caso la tuya.
De sencilla que es me desarma.
Añadiendo a la condición del if ' && tipoProducto.equals("ProductoFresco")'
Que dicho a la pata llana sería 'Y además que coincida con ProductoFresco'.
Es que tal como lo veo, más secillo sería acompañarlo de la mano.

No hay como disfrutar de la sabuduría de la experiencia (la tuya) para, como digo yo: Conectar las neuronas por el camino más corto.

Respecto al IDE para trabajar con java. He oído mencionar a otros usuarios del foro tanto de Eclipse como de NetBeans. Tú me dices que usas los dos a conveniencia.
Yo, cuando vea o me parezca que Bluej se me queda corto, probaré NetBeans (es una decisión intuitiva, influenciada por el nombre que me parece más moderno que Eclipse), no conozco ni uno ni otro, y no puedo decidir por comparación.

Saludos y gracias por tus aportaciones. :)

431
Si dongo
Ahora lo he visto claro.
El parámetro 'tipoProducto' que pongo dentro de la condición del if siempre tendrá el mismo valor para cada una de las condiciones del if else if
if (tmpP.getClass().toString().contains(tipoProducto))

Si acierta coincidir el parámetro con la primera condición, vale, funciona bien.
Pero si no coincide intenta hacer una conversión que no procede, y da el error

Viéndolo de otra manera, o tal vez también lo ves tu así.
Las tres condiciones del if buscan la coincidencia con la misma cadena 'tipoProducto'
Una puede ser cierta, las otras dos no.

Necesitaba que alguien me lo señalara desde fuera, yo no sabia verlo, estaba emperrado en que tenía que funcionar.

Gracias por señalarmelo en tu cita
Citar
Ahora vamonos al siguiente, en este caso else if, Si te fijas, la condición es exactamente la misma que la del primer if, por lo tanto en lugar de entrar en el else if que le correspondía, a entrado en el primer if, porque claro, el nombre de la clase claro que se corresponde con el que viene por el parámetro,  entonces en lugar de entrar en el else if, a entrado en el if, y lo que esta haciendo es intentar convertir un producto  refrigerado a un producto fresco.

Respecto a lo de los comentarios, en Bluej las teclas F8 y F7 ponen y quitan el comentario de doble barra. Para mi es muy cómodo.
Para varias líneas, las selecciono y pulso F7 o F8
Y para una línea pongo el cursor en la línea (no hace falta seleccionar) y pulso la tecla de función

Yo he buscado un automatismo (como la pulsación de teclas de función) para el comentario \* y no lo he encontrado.
Si alguien lo conoce no tengo inconveniente en cambiar una forma por otra de hacer comentarios.

Saludos

432
Hola dongo
Lo del package que te da problemas, es culpa mía. :-[

Te cuento. Yo tengo mis clases en mi package del ejercicio CU00... y en un package aparte las que yo llamo clases accesorias que importo según las necesito

En un ejercicio anterior, el de los packages, envié varias clases en sus packages según pedía el ejercicio. Como a la hora de comprobar desde el foro que esas clases estaban bien formateadas en su package había que crear todos esos packages, se quedó que en ejercicios posteriores, todas las clases estarían en el package por defecto (todos en la misma carpeta).
Para hacerlo así, cada vez que envío clases al foro, elimino en la misma ventana del mensaje/asunto la cabecera de la clase que incluye el package, así, cuando descarga alguien las clases, todas están en el package por defecto.

Continúo.
Como esta vez por la extensión del código, no me dejaba enviarlo como mensaje, opté por enviar el código en un archivo adjunto.
Yo tomé cuiado de eliminar la cabecera de las clases con su package. Eso lo hice con el bloc de notas de windows. Y aquí no se si al tener Bluej (por cierto mi IDE es Bluej) abierto, detectaba que perdía la referencia del package y la volvía a escribir, o no se que cosa pasa.
Comprueba, yo lo he hecho, que dentro del archivo comprimido que envié, todos los archivos empiezan con los comentarios, no aparece ningún package.

Lo del guión que comentas, supongo que debe ser un caracter especial que habrá metido el bloc de notas o Bluej, no sé, que al igual que el tabulador empuja el cursor varios espacios adelante, este lo que hace el saltar al principio de línea (sin cambiar de línea) y continuar escribiendo a partir de allí. ???

Resumiendo. Si pones todas las clases en la misma carpeta/package y eliminas el package incorrecto que aparece, todo debe ir bien.
Aunque como me has demostrado con tu respuesta, eso lo has solucionado por tu cuenta.

Si otra vez debo enviar las clases por un adjunto, dejaré que todas tengan el mismo package y así funcionará sin hacer demasiados cambios. ¿Estoy en lo cierto?

Me quedo con la nota de: las llamadas a los métodos de la clase padre precederlas de 'super'. Y así el compilador no tiene que hacer suposiciones, al igual que con 'this'

Gracias por tu respuesta, extensa y surtida con imágenes.  :)

Quiero aprovechar para pedirte le eches un ojo al método que tengo convertido en comentario en la clase ListaDeProductos
public void muestraLista(String tipoProducto)
si funcionara bien tendría que ir donde aparece el siguiente código del main entre las líneas 70-74

           if (respuesta3.equals("1")) {      listaProductos.muestraLista(1);   }
                else if (respuesta3.equals("2")) { listaProductos.muestraLista(2);   }
                else if (respuesta3.equals("3")) { listaProductos.muestraLista(3);   }

     
y en su lugar pondría

           if (respuesta3.equals("1")) {      listaProductos.muestraLista("ProductoFresco");   }
                else if (respuesta3.equals("2")) { listaProductos.muestraLista("ProductoRefrigerado");   }
                else if (respuesta3.equals("3")) { listaProductos.muestraLista("ProductoCongelado");   }

     
Como decía en el primer mensaje, tengo un método sustituto.
Pero tenía interés en saber si este método hace algo incongruente, que debe hacerlo pues da error. Y saber donde está el tapón que bloquea este método.

Gracias otra vez.

433
Hola
En un archivo adjunto (ParaEnviar.rar) envío 6 clases del ejercicio +  2 clases accesorias con métodos estáticos.
Me daba error (demasiado texto para enviar) en esta ventana.

Clases:
Producto
ProductoFresco
ProductoRefrigerado
ProductoCongelado
ListaDeProductos
TestHerencia2  con main

Clases accesorias:
Validador
Mensa

Nota: En la clase ListaDeProductos hay un método convertido a comentario llamado public void muestraLista(String tipoProducto) que he sustituido por el public void muestraLista(int valor)
Este segundo método funcional recibe un entero que en un switch dirige el código
En el primer método que me daba errores, quería hacer lo mismo, pero nada, por muchas vueltas que le he dado no he sabido deshacer el entuerto.

¿Podeis hecharle un vistazo?
Y decirme, donde está la chinita o el predrusco si es el caso. :-[

Gracias

434
Si César. Sin detenerme demasiado como  tú dices.
Últimamente aunque no lo parezca, a la hora de poner nombres me pongo a pensar.
¿Qué nombre le iria bien?.
Veo que no es suficiente un nombre según la función o contenido. Hay otros matices a tener en cuenta.

Una de mis prioridades en programación era comprender o seguir la lógica del lenguaje y su codificación. Nunca hubiera imaginado que poner nombres adecuadamente formara parte del 'paquete'.

Pero, como tú dices en el ejemplo, el 'Productos p1' suena mal.

Así que, manos a la obra y adelante. :)

Saludos.

435
Hola.
Adjunto pdf con esquema de las clases
En la clase TestProductos, se puede acceder a los métodos de las clases padres como preconiza la herencia.

Saludos.

436
Aprender a programar desde cero / Re:Ayuda! CU00670B curso java
« en: 04 de Agosto 2014, 07:08 »
Hola Sniper.

A mi me pasaba algo parecido.
Si tenía muchas ventanas abiertas en el escritorio, o cubrían el centro, la ventana que muestra el código queda detrás de las otras, sobre todo si haces clic en cualquiera de ellas.

Solución: despeja la parte central de la pantalla.

Nota: En el código de este ejercicio falta una línea
Citar
System.out.println ("El doble del número introducido es: " + 2*entradaUsuario);
que da el resultado por la ventana de Bluej

Sal U2

437
Hola dongo.
En primer lugar, gracias por tu post, y sobre todo por su extensión. No se desaprovecha nada. No se si es así, pero me parece que escribes como hablas.
Lo dices de una forma llana sin demasiados tencnicismos que es fácil de entender.

Ahora si he pillado el asunto. (crear un objeto dentro del main)
La verdad, una vez lo ves te parace fácil. Como no se me ha ocurrido a mi.

Cada vez que me dais una lección en el foro, me doy cuenta de las cosas que no veía, los rincones que no me olía...
En fin que sois una buena escuela. :)

Salud y gracias.

438
Aprender a programar desde cero / Re:Ayuda!
« en: 03 de Agosto 2014, 08:38 »
Hola Sniper

Para ver el error del bucle infinito deberás poner el resto del código ???
En el que envías solo se muestra un mensaje.

Sal U2

439
Hola dongo. Gracias por tus comentarios.

Entiendo parte de lo que dices. Lo que no entiendo es:
Citar
Establecer los atributos y métodos también como estáticos
O crear un objeto de esa clase y a través de este ya puedes llamar a los métodos y atributos
El segundo párrafo, lo de crear un objeto de esa clase.
He intentado crear ese objeto de la clase Test y todo lo que hago me da error.
No puedo crearlo dentro del main de Test
En una clase nueva intento crear un objeto de la clase Test y también me da error.
No sé como crear ese objeto de la clase Test.

¿Puedes mostrarme un ejemplo?

Salud y gracias.

440
Hola. Esta es mi respuesta al enunciado del ejercicio.

El error dado, es: Cita 1
Citar
Non-static variable this cannot be referenced from a static context

Que la variable o método no es estático y no puede referenciarse desde un contexto estático (el main)


¿Por qué lo da?: Cita 2
Citar
a) No pueden acceder a campos de instancia (lógico, pues los campos van asociados a objetos).
b) No pueden invocar a un método de instancia de la misma clase (lógico pues los métodos de instancia van asociados a objetos).


Solución:
Cambiando el método 'getAtrib1()' a estático, también es necesario cambiar a estático el atributo de la clase 'atributo1'. Y dentro del main hay que quitar el 'this' de la llamada getAtrib1()

Estos cambios los he hecho después que el compilador me diera error en cada uno de estos nombres. Y serán razones lógicas para el compilador, pero para mí están ocultas.
Pues, si no se puede (ver Cita 2), ¿como es que después de añadir 'static' se si puede acceder a campos y métodos de la instancia?

Entiendo más el porqué, viendo el ERROR (ver Cita 1) que da el compilador, si hacemos los atributos y métodos estáticos se podrán llamar desde el main (estático).
Es como si al ser todos estáticos, se pudieran comunicar entre ellos.

Saludos.

Páginas: 1 ... 17 18 19 20 21 [22] 23 24 25

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