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 - Dimitar Stefanov

Páginas: 1 ... 13 14 15 16 17 [18] 19 20 21 22 23 ... 30
341
Hola, Mario.

Gracias por corregirme el ejercicio y ayudarme sobre el método "setLargo()" en la subclase "EdificioOficinas". Ahora sí que el compilador reconoce el método.

También he corregido el método "toString()" según tus indicaciones. Lo había hecho así, porque pensaba que obligatoriamente las variables tenían que salir con tipo "String" para una futura utilización en una base de datos o lo que fuere.

Un saludo.

342
Buenas tardes, Mario.

Dudo que te hayas equivocado tú, será que no me he explicado yo con propiedad.

Mira, el código de la clase "Legislador" es ese:

Código: [Seleccionar]
//Creamos una clase de tipo "abstract"
public abstract class Legislador extends Persona{
    private String provinciaQueRepresenta;
    private int anyosParlamento;
    protected String camara;
   
    public Legislador(String nombre, String apellidos, int edad, String provinciaQueRepresenta, int anyosParlamento, String camara){
        super(nombre, apellidos, edad);
        this.anyosParlamento = anyosParlamento;
        this.provinciaQueRepresenta = provinciaQueRepresenta;
        this.camara = camara;
    }
   
    public String getProvinciaQueRepresenta(){return provinciaQueRepresenta;}
    public int getAnyosParlamento(){return anyosParlamento;}
   
    //Creamos un método "abstract" el que no podremos invocar si no lo sobreescribamos en las subclases
    abstract public String getCamaraEnQueTrabaja();
   
    public String toString(){
        Integer datoAnyosParlamento = anyosParlamento;
        return super.toString()+"\nProvincia que representa: "+getProvinciaQueRepresenta()+", años que lleva en el parlamento: "+datoAnyosParlamento.toString()+", cámara en la que trabaja: "+camara;
    }
   
    public void mostrarCamara(Legislador legislador){
        String tmp = "";
        if(legislador instanceof Senador){
            tmp = "Senador ";
        }else{tmp = "Diputado ";}
        System.out.println("El "+tmp+getApellidos()+" trabaja en la cámara: "+camara);
    }
}

Y con el método "mostrarCamara" lo que quiero hacer es si le entre un objeto "Senador" cambie la variable temporal "tmp" a "Senador" y si no, que la cambie a "Diputado". Por eso especifico que entrará, en este método, un parámetro de tipo objeto de la clase abstracta "Legislador".

Sí, la variable "camara" es de esta clase, pero quería llegar un poquito más lejos. A lo mejor no era necesario.

Gracias.

343
Buenas noches.

Procedo a la exposición de la solución del ejercicio CU01158E del curso JavaScript desde cero.

Citar
EJERCICIO

Crea un documento HTML donde dentro del elemento body tengamos un div con id “principal”, dentro de principal otro div denominado “secundario”, y dentro de secundario otro div con id “terciario”. Dentro de terciario debe existir un párrafo con el texto: Ejemplo de bubbling (burbujeo). Añade eventListeners con el evento click para los párrafos y todos los elementos div, document y window, y una función de respuesta común para todos ellos que emita el mensaje de alerta <<Soy un nodo tipo NombreDelNodo y estoy burbujeando>>.

Ejemplo: al hacer click sobre el texto <<Ejemplo de bubbling (burbujeo)>> deberán empezar a aparecernos mensajes como: Soy un nodo tipo P y estoy burbujenado. Soy un nodo tipo DIV y estoy burbujeando. Soy un nodo tipo DIV y estoy burbujeando…

El código JavaScript:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">
window.onload = function(){
var parrafo = document.getElementsByTagName('p');
var divTerciario = document.getElementById('terciario');
var divSecundario = document.getElementById('secundario');
var divPrincipal = document.getElementById('principal');
var body = document.getElementsByTagName('body');
var html = document.getElementsByTagName('html');

for(var i=0;i<parrafo.length;i++){
window.addEventListener("click",mensaje);
document.addEventListener("click",mensaje);
body[i].addEventListener("click",mensaje);
divPrincipal.addEventListener("click",mensaje);
divSecundario.addEventListener("click",mensaje);
divTerciario.addEventListener("click",mensaje);
parrafo[i].addEventListener("click",mensaje);
}

var contador = 1;
function mensaje(){
alert("Mensaje: "+contador+"\nSoy un nodo tipo: "+this.nodeName+" y estoy burbujeando");
contador++;
}
}
</script>
</head>
<body>
<div id="principal">
<div id="secundario">
<div id="terciario">
<p>Ejemplo de bubbling (burbujeo).</p>
</div>
</div>
</div>
</body>
</html>

He construido de tal forma el código para demostrar que aunque la primera instrucción es que se ejecute el evento referenciado a "window" realmente la ejecución del burbojeo (bubble) empieza desde dentro y acaba con el elemento más "exterior" que pueda alcanzar el navegador.

En la entrega CU01158E del curso JavaScript desde cero se dice:

Citar
Algunos eventos tienen un burbujeo especial, por ejemplo el evento load (onload, carga de un elemento) burbujea hasta el elemento document, pero no alcanza al elemento window.

pero si realmente es así, por qué cuando añadimos el evento al elemento "window"
también nos salta el mensaje? Es decir, si no puede alcanzar el elemento "window" por qué burbujea? (estoy utilizando en navegador de Firefox, versión: 44.0.2)

Graicas.

344
Bueans noches. Aqui dejo una posible solución del ejercicio CU01157E del curso JavaScript desde cero.

Citar
EJERCICIO

A partir del siguiente código HTML, crea un script que cumpla los requisitos indicados más abajo:

Código: [Seleccionar]
<!DOCTYPE html>

<html> <head><title>Portal web - aprenderaprogramar.com</title>

<meta name="description" content="Portal web aprenderaprogramar.com">

<meta name="keywords" content="aprender, programar, cursos, libros"><meta charset="utf-8">

</head>

 <body> <p><a href="principal.html" title="Página principal" >Ir a la pagina principal</a></p>

<h1>Novedades</h1>

<p>Aquí presentamos las novedades del sitio.</p>

<h3>Lanzamos el producto X-FASHION</h3>

<p>Este producto permite estirar la piel hasta dejarla como la de un bebé.</p>

<p><img src="http://i.imgur.com/tq5Bs.png" title="Imagen del producto" alt="imagen producto x-fashion" /></p>

<h3>Mejoramos el producto T-MOTION</h3>

<p>Hemos lanzado una nueva versión del producto T-MOTION</p>

<p><img src="http://i.imgur.com/SpZyc.png" title="Imagen del proudcto tmotion" alt="imagen producto tmotion" /></p>

</body>
</html>

Citar
a) Mediante el control de los eventos onmouseover y onmouseout, debemos hacer que cuando el usuario pase el ratón sobre las etiquetas h1 y h3, el color del texto pase a ser orange y cuando deje de pasarlo el texto quede en marrón.

b) Mediante el control del evento onmouseover, debemos hacer que cuando el usuario pase el ratón sobre un párrafo, el color de fondo del párrafo sea amarillo y cuando deje de pasarlo no haya color de fondo.

c) El código JavaScript debe estar situado entre las etiquetas <head> … </head

El código de la solución:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Portal web - aprenderaprogramar.com</title>
<meta name="description" content="Portal web aprenderaprogramar.com">
<meta name="keywords" content="aprender, programar, cursos, libros">
<script type="text/javascript">

window.onload = function(){

var parrafo = document.getElementsByTagName('p');
var titulos = document.getElementsByClassName('titulo');

//Un bucle con las funciones anidadas
for(var i=0;i<parrafo.length;i++){
parrafo[i].onmouseover = function cambiarAAmarillo(){
this.style.background = "yellow";
}
parrafo[i].onmouseout = function eleminarColor(){
this.style.background = "none";
}
}

//Bucle con asignación a las funciones
for(var i=0;i<titulos.length;i++){
titulos[i].onmouseover = cambiarANaranja;
titulos[i].onmouseout = cambiarAMarron;
}

function cambiarANaranja(){
this.style.color = "orange";
}

function cambiarAMarron(){
this.style.color = "brown";
}

}
</script>
</head>
<body>
<p><a href="principal.html" title="Página principal">Ir a la página principal</a></p>
<h1 class="titulo">Novedades</h1>
<p>Aquí presentamos las novedades del sitio.</p>
<h3 class="titulo">Lanzamos el producto X-FASHION</h3>
<p>Este producto permite estirar la piel hasta dejarla como la de un bebé.</p>
<p><img src="http://i.imgur.com/tq5Bs.png" alt="imagen producto x-fashion" title="Imagen del producto"></p>
<h3 class="titulo">Mejoramos el producto T-MOTION</h3>
<p>Hemos lanzado una nueva versión del producto T-MOTION</p>
<p><img src="http://i.imgur.com/SpZyc.png" alt="imagen producto tmotion" title="Imagen del producto tmotion"></p>
</body>
</html>

Gracias.

345
Buenas tardes, Mario.

Gracias por corregirme el ejercicio.

Perdón, me he equivocado en escribir el código, quería escribir:

Código: [Seleccionar]
diputado1.mostrarCamara(diputado1);
        diputado2.mostrarCamara(diputado2);
        diputado3.mostrarCamara(diputado3);
        senador1.mostrarCamara(senador1);
        senador2.mostrarCamara(senador2);
        senador3.mostrarCamara(senador3);

fue un error al utilizar la funcion "ctrl+v" y no modificar después los objetos.

Sobre la explicación del código:

Código: [Seleccionar]
public void mostrarCamara(Legislador legislador){
        String tmp = "";
        if(legislador instanceof Senador){
            tmp = "Senador ";
        }else{tmp = "Diputado ";}
        System.out.println("El "+tmp+getApellidos()+" trabaja en la cámara: "+camara);
    }

no entiendo cómo funcionaría sólo con:

Código: [Seleccionar]
public void mostrarCamara(){
       System.out.println(camara);
    }

porque lo que quiero es que si se trata de un objeto perteneciente al tipo "Diputado" que imprima Diputado y si perteneciera al tipo "Senador" que imprima Senador.

No se me ocurre otro cosa que comprobar que según que objeto pasamos a la función que cambie la variable temporal auxiliar "tmp" de Senador a Diputado y viceversa. Perdona, pero a veces no veo lo más obvio.

Un saludo.

346
Buenas, Mario.

Gracias por revisar otro código más.

Sí entiendo porque funcinará igual si escribes:

Código: [Seleccionar]
Figura cuadrado1 = new Cuadrado(20);
que

Código: [Seleccionar]
Cuadrado cuadrado1 = new Cuadrado(20);
porque el compilador esperará un objeto de la clase abstracta "Figura", y que el tipo "Cuadrado" dinámicamente es "Figura" también.

Sobre la segunda parte de la explicación, no lo sabía. Pensaba que si no escribías "getDimensionPrincipal().toString" en un método que devuelve "String" te devolvería el tipo del que era "getDimensionPrincipal()". Por eso antes convertía lo que devuelve el método "getDimensionPrincipal()" en un objeto. Ahora veo que no es necesario y que si la función que devuelve un tipo primitivo si la metes en una función que devuelve "String" lo devolverá sin invocar sobre el método anidado el método ".toString()".

Saludos.

347
Hola, Mario.

Gracias por corregirme el ejercicio.

Totalmente de acuerdo. No podemos acceder directamente a los campos de una superclase, pero sí lo podemos hacer de forma indirecta mediante sus métodos "get´s".

Un saludo.

348
Buenas tardes, Mario.

Tienes razón. En mi cabeza tenía entendido que "Profesor" no es lo mismo que "ProfesorEmerito", pero no es así. Es decir, todas las subclases engloban en sí sus superclases, o sea que, "ProfesorEmerito" es un profesor emerito y también es un profesor a la vez.

Y también entiendo sobre lo que me explicas de no repetir información. Si una vez hemos hecho un método toString() en la superclase, en la subclase sólo tenemos que añadir los campos de esa misma clase.

Sí, requiere tiempo y compensión todo el tema de los objetos y su lógica, pero espero con poco a poco se me aclaren las cosas.

Un saludo.

PD: Voy a corregir el código de acuerdo con tus indicaciones, pero no voy a subir el código corregido porque creo que ha quedado aclarado el tema.

349
Buenas tardes. Procede a exponer una posible solución del ejercicio CU01156E del curso JavaScript desde cero.

Citar
EJERCICIO

Crea un script donde:

a) Se pida al usuario que introduzca un número superior a 10000000 y se muestre por pantalla ese número con tres dígitos significativos. Si el número introducido no cumple la condición, se volverá a solicitar que se introduzca.

b) Se pida al usuario que introzca un número con 4 decimales y se muestre por pantalla ese número redondeado a dos decimales. Si el número introducido no cumple la condición, se volverá a solicitar que se introduzca (para ello habrá que analizar que la cadena introducida cuente con cuatro dígitos después del carácter de punto decimal).

c) Se pida al usuario que introduzca una frase que comience por un número que puede ser entero o decimal. Para dicha frase, se devolverá el número entero que se pueda extraer, y el número decimal que se pueda extraer. Deberá analizarse la entrada con una expresión regular, de modo que si no cumple la condición, se vuelva a solicitar la introducción de la frase.

El código del JavaScript:

Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript">
function ejemplo(){

var entrada01 = 0; //Establecemos un valor menos a 100000000, para poder entrar en el bucle "while"
while(entrada01<10000000 || isNaN(entrada01)==true){
entrada01 = Number(prompt("Introduce un número superio a: 10.000.000"));
};
alert(entrada01.toPrecision(3));

var pattern01 = /^\d{1,}\.\d{4,4}/;
do{ //Hacemos uso de un bucle "while" en el cual, si no se cumple la condición, por lo menos una vez entre en él
var entrada02 = Number(prompt("Introduce un número con 4 decimales"));
    }while(pattern01.test(entrada02)==false);
alert(entrada02.toFixed(2));

var pattern02 = /^(\d{1,}|\d{1,}\.\d{1,})\w*/;
do{
var entrada03 = prompt("Introduce una frase que comience por un número que puede ser entero o decimal. ");
}while(entrada03.match(pattern02)==null);
alert("El número entero extraido es: "+parseInt(entrada03)+"\nEl número decimal extraido es: "+parseFloat(entrada03));
}
</script>
</head>
<body>
<div id="cabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplos JavaScript</h3>
</div>
<div style="color: blue;" id="pulsador" onclick="ejemplo()">Probar Ejercicio</div>
</body>
</html>

Gracias.

350
Graicas, Mario.

Corrección del código de la clase "Taxi":

Código: [Seleccionar]
public class Taxi extends Vehiculo{
    private String nombreDelConductor;
    private int numeroDePlazas;
   
    public Taxi(String matricula, int numeroDeRuedas, String nombreDelConductor, int numeroDePlazas){
        super(matricula, numeroDeRuedas);
        this.nombreDelConductor = nombreDelConductor;
        this.numeroDePlazas = numeroDePlazas;
    }
   
    public void setNombreDelConductor(String nombreDelConductor){
        this.nombreDelConductor = nombreDelConductor;
    }
   
    public void setNumeroDePlazas(int numeroDePlzas){
        this.numeroDePlazas = numeroDePlazas;
    }
   
    public String getNombreDelConductor(){return nombreDelConductor;}
    public int getNumeroDePlazas(){return numeroDePlazas;}
   
    public String toString(){
        return super.toString()+". El nombre del conductor es: "+getNombreDelConductor()+". El taxi dispone de: "+getNumeroDePlazas()+" plazas.";
    }
}

Saludos.

351
Buenas tardes, Mario.

Tienes razón, había creado 5 listas en vez de 1.

Y tampoco había recorrido los objetos mediante iterator, sino con un for each.

Procedo a colgar, de nuevo, los códigos.

El código de la clase "Producto":

Código: [Seleccionar]
public class Producto{
    private String fechaCaducidad;
    private int numeroLote;
    private String fechaEnvase;
    private String paisOrigen;
   
    public Producto(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen){
        this.fechaCaducidad = fechaCaducidad;
        this.numeroLote = numeroLote;
        this.fechaEnvase = fechaEnvase;
        this.paisOrigen = paisOrigen;
    }
   
    public void setFechaCaducidad(String fechaCaducidad){
        this.fechaCaducidad = fechaCaducidad;
    }
   
    public void setNumeroLote(int numeroLote){
        this.numeroLote = numeroLote;
    }
   
    public void setFechaEnvase(String fechaEnvase){
        this.fechaEnvase = fechaEnvase;
    }
   
    public void setPaisOrigen(String paisOrigen){
        this.paisOrigen = paisOrigen;
    }
   
    public String getFechaCaducidad(){return fechaCaducidad;}
    public int getNumeroLote(){return numeroLote;}
    public String getFechaEnvase(){return fechaEnvase;}
    public String getPaisOrigen(){return paisOrigen;}
   
    public void mostrarInfoProducto(){
        System.out.print("El producto: "+getNumeroLote()+" con fecha de envase: "+getFechaEnvase()+" y fecha de caducidad: "+getFechaCaducidad()+" proviene de: "+getPaisOrigen());
    }
}

El código de la clase "ProductoFresco":

Código: [Seleccionar]
public class ProductoFresco extends Producto{
   
    public ProductoFresco(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen);
    }
   
    public void mostrarInfoProducto(){
         System.out.println("PRODUCTO FRESCO:");
         super.mostrarInfoProducto();
         System.out.println();
    }
}

El código de la clase "ProductoRefrigeradoOCongelado":

Código: [Seleccionar]
public class ProductoRefrigeradoOCongelado extends Producto{
    private float temperaturaMantenemientoRecom;
   
    public ProductoRefrigeradoOCongelado(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen);
        this.temperaturaMantenemientoRecom = temperaturaMantenemientoRecom;
    }
   
    public void setTemperaturaMantenemientoRecom(float temperaturaMantenemientoRecom){
        this.temperaturaMantenemientoRecom = temperaturaMantenemientoRecom;
    }

    public float getTemperaturaMantenemientoRecom(){return temperaturaMantenemientoRecom;}
   
    public void mostrarInfoProducto(){
        super.mostrarInfoProducto();
        System.out.print(" y tiene una temperatura de mantenemiento recomendad de: "+getTemperaturaMantenemientoRecom()+"C");
    }
}

El código de la clase "ProductoRefrigerado":

Código: [Seleccionar]
public class ProductoRefrigerado extends ProductoRefrigeradoOCongelado{
    private int codigoOrganismoSupervision;
   
    public ProductoRefrigerado(String fechaCaducidad, int numeroLote, String fechaEnvase,  String paisOrigen, float temperaturaMantenemientoRecom, int codigoOrganismoSupervision){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.codigoOrganismoSupervision = codigoOrganismoSupervision;
    }
   
    public void setCodigoOrganismoSupervision(int codigoOrganismoSupervision){
        this.codigoOrganismoSupervision = codigoOrganismoSupervision;
    }
   
    public int getCodigoOrganismoSupervision(){return codigoOrganismoSupervision;}
   
    public void mostrarInfoProducto(){
        System.out.println("PRODUCTO REFRIGERADO:");
        super.mostrarInfoProducto();
        System.out.print(" y un código de Organismo de Supervisión: "+getCodigoOrganismoSupervision()+"\n");
    }
}

El código de la clase "ProductoCongelado":

Código: [Seleccionar]
public class ProductoCongelado extends ProductoRefrigeradoOCongelado{
   
    public ProductoCongelado(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
    }
   
    public void mostrarInfoProducto(){
        super.mostrarInfoProducto();
        System.out.println();
    }
}

El código de la clase "ProductoCongeladoPorAire":

Código: [Seleccionar]
public class ProductoCongeladoPorAire extends ProductoCongelado{
    private float nitrogeno;
    private float oxigeno;
    private float co2;
    private float vaporAgua;
   
    public ProductoCongeladoPorAire(String fechaCaducidad, int numeroLote,  String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom, float nitrogeno, float oxigeno, float co2, float vaporAgua){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.nitrogeno = nitrogeno;
        this.oxigeno = oxigeno;
        this.co2 = co2;
        this.vaporAgua = vaporAgua;
    }
   
    public void setNitrogeno(float nitrogeno){
        this.nitrogeno = nitrogeno;
    }
   
    public void setOxigeno(float oxigeno){
        this.oxigeno = oxigeno;
    }
   
    public void setCo2(float co2){
        this.co2 = co2;
    }
   
    public void setVaporAgua(float vaporAgua){
        this.vaporAgua = vaporAgua;
    }
   
    public float getNitrogeno(){return nitrogeno;}
    public float getOxigeno(){return oxigeno;}
    public float getCo2(){return co2;}
    public float getVaporAgua(){return vaporAgua;}
   
    public void mostrarInfoProducto(){
        System.out.println("PRODUCTO CONGELADO POR AIRE:");
        super.mostrarInfoProducto();
        System.out.print(" y tiene una composición de aire como sigue: ");
        System.out.println("Nitrógeno: "+getNitrogeno()+"%");
        System.out.println("Oxígeno: "+getOxigeno()+"%");
        System.out.println("Dióxido de carbono: "+getCo2()+"%");
        System.out.println("Vapor de agua: "+getVaporAgua()+"%");
    }
}

El código de la clase "ProductoCongeladoPorAgua":

Código: [Seleccionar]
public class ProductoCongeladoPorAgua extends ProductoCongelado{
    private float salinidadAgua;
   
    public ProductoCongeladoPorAgua(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom ,float salinidadAgua){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.salinidadAgua = salinidadAgua;
    }
   
    public void setSalinidadAgua(float salinidadAgua){
        this.salinidadAgua = salinidadAgua;
    }
   
    public float getSalinidadAgua(){return salinidadAgua;}
   
    public void mostrarInfoProducto(){
        System.out.println("PRODUCTO CONGELADO POR AGUA:");
        super.mostrarInfoProducto();
        System.out.print(" y tiene un porcentaje de salinidad: "+getSalinidadAgua()+"gr sal por litro de agua\n");
    }
}

El código de la clase "ProductoCongeladoPorNitrogeno":

Código: [Seleccionar]
public class ProductoCongeladoPorNitrogeno extends ProductoCongelado{
    private String metodoCongelacion;
    private int tiempoExposicion;
   
    public ProductoCongeladoPorNitrogeno(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom, String metodoCongelacion, int tiempoExposicion){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.metodoCongelacion = metodoCongelacion;
        this.tiempoExposicion = tiempoExposicion;
    }
   
    public void setMetodoCongelacion(String metodoCongelacion){
        this.metodoCongelacion = metodoCongelacion;
    }
   
    public void setTiempoExposicion(int tiempoExposicion){
        this.tiempoExposicion = tiempoExposicion;
    }
   
    public String getMetodoCongelacion(){return metodoCongelacion;}
    public int getTiempoExposicion(){return tiempoExposicion;}
   
    public void mostrarInfoProducto(){
        System.out.println("PRODUCTO CONGELADO POR NITROGENO:");
        super.mostrarInfoProducto();
        System.out.print(" y tuvo un método de congelación: "+getMetodoCongelacion()+" y estuvo expuesto al nitrógeno: "+getTiempoExposicion()+"s\n");
    }
}

El código de la clase "EnvioDeProductos":

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

public class EnvioDeProductos{
    //Definimos una variable de clase "ArrayList" de tipo "Producto"
    private ArrayList<Producto> listaPedido;
   
    //Inicializamos la variable como un objeto nuevo de clase "ArrayList" de tipo "Producto"
    public EnvioDeProductos(){
        listaPedido = new ArrayList<Producto>();
    }
   
    //Creación y inclusión de los objetos objetos
    public void crearPedido(){
        listaPedido.add(new ProductoFresco("23-06-2016",1234, "05-01-2016","Argentina"));
        listaPedido.add(new ProductoFresco("22-06-2016",987,"09-10-2016","España"));
        listaPedido.add(new ProductoRefrigerado("10-10-2016",345,"01-03-2016","Ecuador",5, 3452));
        listaPedido.add(new ProductoRefrigerado("11-10-2016",346,"02-03-2016","Colombia",5, 5421));
        listaPedido.add(new ProductoRefrigerado("12-10-2016",347,"03-03-2016","Marruecos",5, 1231));
        listaPedido.add(new ProductoCongeladoPorAgua("13-06-2016",908,"12-05-2016","Argentina",-18,40));
        listaPedido.add(new ProductoCongeladoPorAgua("13-08-2016",988,"11-06-2016","España",-15,35));
        listaPedido.add(new ProductoCongeladoPorAire("11-08-2016",354,"02-03-2016","Puerto Rico",-22,20,20,30,30));
        listaPedido.add(new ProductoCongeladoPorAire("11-11-2016",428,"08-08-2016","Francia",-10,10,20,30,40));
        listaPedido.add(new ProductoCongeladoPorNitrogeno("10-08-2016",846,"05-05-2016","Suiza",-20,"Tradicional",200));
    }
   
    //Invocación de los métodos de cada objeto.
    public void imprimirPedido(){
        Iterator<Producto> it = listaPedido.iterator();
        while(it.hasNext()){
            it.next().mostrarInfoProducto();
        }
    }
}

El código de la clase "TestHerencia4":

Código: [Seleccionar]
import java.util.Calendar;
import java.util.GregorianCalendar;

public class TestHerencia4{
    public static void main(String []Args){
       
        //Creamos un objeto de tipo "EnvioDeProductos"
        EnvioDeProductos envioDeProductos = new EnvioDeProductos();
       
        //Creamos el pedido (los objetos) mediante la invocación del método crearPedido() del objeto "envioDeProductos" de tipo "EnvioDeProductos"
        envioDeProductos.crearPedido();
       
        //Invocamos el método "imprimirPedido()" para mostrar por pantalla el pedido completo
        envioDeProductos.imprimirPedido();
       
        //Mediante el objeto "Calendar" de Java y con el método "getTime()" hacemos visible la hora actual.
        Calendar hora = GregorianCalendar.getInstance();
        System.out.println();
        System.out.println("La hora y el día en el cual fue hecho el pedido: "+hora.getTime());
    }
}

Miré la solución de "pedro,," que me recomendaste.

Gracias.

352
Buenas tardes, Mario.

Gracias por revisar el ejercicio (otra vez más :)) y comentar hasta el último detalle, jeje.

Me alegro que, por fin, podemos dar este ejercicio como "bueno" :)

Sí, sobre la reutilización de información ya entrada en el programa tienes razón. Debería haber utilizado más lo que estaba en las superclases para no repetir tanto código en las subclases.

Sobre lo de cuando declaro una variable como estática y luego su declaración dinámica, sí, con los ejercicios vinientes me aclaro más las ideas.

Un saludo.

353
Buenas noches. Aquí dejo el ejercicio CU00697B del curso Java desde cero.

Citar
EJERCICIO

Se plantea desarrollar un programa Java que permita representar la siguiente situación. Una instalación deportiva es un recinto delimitado donde se practican deportes, en Java interesa disponer de un método int getTipoDeInstalacion(). Un edificio es una construcción cubierta y en Java interesa disponer de un método double getSuperficieEdificio(). Un polideportivo es al mismo tiempo una instalación deportiva y un edificio; en Java interesa conocer la superficie que tiene y el nombre que tiene. Un edificio de oficinas es un edificio; en Java interesa conocer el número de oficinas que tiene.

Definir dos interfaces y una clase que implemente ambas interfaces para representar la situación anterior. En una clase test con el método main, crear un ArrayList que contenga tres polideportivos y dos edificios de oficinas y utilizando un iterator, recorrer la colección y mostrar los atributos de cada elemento.

El código de la interfaz "InstalacionDeport":

Código: [Seleccionar]
public interface InstalacionDeport{
   
    int getTipoDeInstalacion();
}

El código de la inteface "Edificio":

Código: [Seleccionar]
public interface Edificio{
   
    double getSuperficieEdificio();
}

El código de la clase "Polideportivo":

Código: [Seleccionar]
public class Polideportivo implements InstalacionDeport, Edificio{
    private String nombre;
    private int tipoDeInstalacion;
    private double largo;
    private double ancho;
   
    public Polideportivo(String nombre, int tipoDeInstalacion, double largo, double ancho){
        this.nombre = nombre;
        this.tipoDeInstalacion = tipoDeInstalacion;
        this.largo = largo;
        this.ancho = ancho;
    }
   
    public String getNombre(){return nombre;}
    public int getTipoDeInstalacion(){return tipoDeInstalacion;} //Sobreescribir el método abstracto de la interface
    public double getLargo(){return largo;}
    public double getAncho(){return ancho;}
   
    public double getSuperficieEdificio(){ //Sobreescribir el método abrastracto de la interface
        double area = 0;
        area = largo*ancho;
        return area;
    }
   
    public String toString(){ //Sobreescribimos el método "toStirng" de la superclase "Object"
        Integer tmp01 = tipoDeInstalacion;
        Double tmp02 = getSuperficieEdificio();
        return "El polideportivo: "+nombre+" es de tipo de instalacion: "+tmp01.toString()+" y una superficie de: "+tmp02.toString();
    }
}   

El código de la clase "EdificioOficinas":

Código: [Seleccionar]
public class EdificioOficinas implements Edificio{
    private int numeroOficinas;
    private double largo;
    private double ancho;
   
    public EdificioOficinas(int numeroOficinas){
        this.numeroOficinas = numeroOficinas;
        largo = 0;
        ancho = 0;
    }
   
    public void setLargo(double largo){
        this.largo = largo;
    }
   
    public void setAncho(double ancho){
        this.ancho = ancho;
    }
   
    public int getNumeroOficinas(){return numeroOficinas;}
   
    public double getSuperficieEdificio(){ //Implementamos el método "getSuperficieEdificio()"
        double area = 0;
        area = largo*ancho;
        return area;
    }
   
    public String toString(){ //Sobreescribimos el método "toString()"
        Double tmp = getSuperficieEdificio();
        return "El edificio tiene: "+numeroOficinas+" oficinas.";
    }
}

El código de la clase main "TestInterface":

Código: [Seleccionar]
import java.util.Iterator;
import java.util.ArrayList;

public class TestInteface{
    public static void main(String []Args){
    Edificio polideportivo1 = new Polideportivo("Marbella",2,250,125);
    Edificio polideportivo2 = new Polideportivo("Sant Josep",1,200,90);
    Edificio polideportivo3 = new Polideportivo("Argentina",4,370,190);
    Edificio edificioOficinas1 = new EdificioOficinas(10);
    Edificio edificioOficinas2 = new EdificioOficinas(420);
    ArrayList<Edificio> listaEdificios = new ArrayList<Edificio>();
    listaEdificios.add(polideportivo1);
    listaEdificios.add(polideportivo2);
    listaEdificios.add(polideportivo3);
    listaEdificios.add(edificioOficinas1);
    listaEdificios.add(edificioOficinas2);
    Iterator<Edificio> it = listaEdificios.iterator();
    while(it.hasNext()){
        System.out.println(it.next().toString());
    }
}
}

Citar
¿Entre qué clases existe una relación que se asemeja a la herencia múltiple?

Entre la clase "Polideportivo" con las interfeces "InstalacionDeport" y "Edificio".

Tenía una duda, por qué no puedo acceder desde la clase "TestInterface" a los métodos de los objetos creados? Es decir, añadiendo esta línea en la clase "TestInterface":

Código: [Seleccionar]
edificioOficinas1.setLargo(29);
y el código se quedaría así:

Código: [Seleccionar]
import java.util.Iterator;
import java.util.ArrayList;

public class TestInteface{
    public static void main(String []Args){
    Edificio polideportivo1 = new Polideportivo("Marbella",2,250,125);
    Edificio polideportivo2 = new Polideportivo("Sant Josep",1,200,90);
    Edificio polideportivo3 = new Polideportivo("Argentina",4,370,190);
    Edificio edificioOficinas1 = new EdificioOficinas(10);
    edificioOficinas1.setLargo(29);
    Edificio edificioOficinas2 = new EdificioOficinas(420);
    ArrayList<Edificio> listaEdificios = new ArrayList<Edificio>();
    listaEdificios.add(polideportivo1);
    listaEdificios.add(polideportivo2);
    listaEdificios.add(polideportivo3);
    listaEdificios.add(edificioOficinas1);
    listaEdificios.add(edificioOficinas2);
    Iterator<Edificio> it = listaEdificios.iterator();
    while(it.hasNext()){
        System.out.println(it.next().toString());
    }
}
}

no me reconoce el método. Será porque el método main es "static" y por eso?

Gracias.

354
Buenas tardes. A continuación procedo a la exposición de una posible solución del ejercicio CU00695B del curso Java.

Citar
EJERCICIO

Declara una clase abstracta Legislador que herede de la clase Persona, con un atributo provinciaQueRepresenta (tipo String) y otros atributos. Declara un método abstracto getCamaraEnQueTrabaja. Crea dos clases concretas que hereden de Legislador: la clase Diputado y la clase Senador que sobreescriban los métodos abstractos necesarios. Crea una lista de legisladores y muestra por pantalla la cámara en que trabajan haciendo uso del polimorfismo.

El código de la clase "Persona":

Código: [Seleccionar]
public class Persona{
    private String nombre;
    private String apellidos;
    private int edad;

    public Persona(String nombre, String apellidos, int edad){
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.edad = edad;
    }
   
    public Persona(){
   
    }
   
    public String getNombre(){return nombre;}
    public String getApellidos(){return apellidos;}
    public int getEdad(){return edad;}
   
    //Sobreescribimos el método toString()
    public String toString(){
        Integer datoEdad = edad;
        return "Nombre: "+nombre+" "+apellidos+". Edad: "+datoEdad.toString();
    }
}

El código de la clase "Legislador":

Código: [Seleccionar]
//Creamos una clase de tipo "abstract"
public abstract class Legislador extends Persona{
    private String provinciaQueRepresenta;
    private int anyosParlamento;
    protected String camara;
   
    public Legislador(String nombre, String apellidos, int edad, String provinciaQueRepresenta, int anyosParlamento, String camara){
        super(nombre, apellidos, edad);
        this.anyosParlamento = anyosParlamento;
        this.provinciaQueRepresenta = provinciaQueRepresenta;
        this.camara = camara;
    }
   
    public String getProvinciaQueRepresenta(){return provinciaQueRepresenta;}
    public int getAnyosParlamento(){return anyosParlamento;}
   
    //Creamos un método "abstract" el que no podremos invocar si no lo sobreescribamos en las subclases
    abstract public String getCamaraEnQueTrabaja();
   
    public String toString(){
        Integer datoAnyosParlamento = anyosParlamento;
        return super.toString()+"\nProvincia que representa: "+getProvinciaQueRepresenta()+", años que lleva en el parlamento: "+datoAnyosParlamento.toString()+", cámara en la que trabaja: "+camara;
    }

}

El código de la clase "Diputado":

Código: [Seleccionar]
public class Diputado extends Legislador{
   
    public Diputado(String nombre, String apellidos, int edad, String provinciaQueRepresenta, int anyosParlamento, String camara){
        super(nombre, apellidos, edad, provinciaQueRepresenta, anyosParlamento, camara);
    }
   
    public String getCamaraEnQueTrabaja(){return camara;} //Método abstracto sobreescrito en la clase
}

El código de la clase "Senador":

Código: [Seleccionar]
public class Senador extends Legislador{
   
    public Senador(String nombre, String apellidos, int edad, String provinciaQueRepresenta, int anyosParlamento, String camara){
        super(nombre, apellidos, edad, provinciaQueRepresenta, anyosParlamento, camara);
    }
   
    public String getCamaraEnQueTrabaja(){return camara;}
}

El código de la clase "ListinLegisladores":

Código: [Seleccionar]
import java.util.ArrayList;

public class ListinLegisladores{
   
    private ArrayList<Legislador> listinLegisladores;
   
    public ListinLegisladores(){
        listinLegisladores = new ArrayList<Legislador>();
    }
   
    public void addLegislador(Legislador legislador){
        listinLegisladores.add(legislador);
    }
   
    public void imprimirListinLegisladores(){
        System.out.println("VAMOS A PROCEDER A LA IMPRESION DE LA LISTA DE LOS LEGISLADORES: ");
        for(Legislador tmp: listinLegisladores){
            System.out.println(tmp.toString());
        }
        System.out.println("\nAHORA MOSTRAREMOS SOLO LAS CAMARAS EN LAS QUE TRABAJAN LOS SEÑORES LEGISLADORES:");
        for(Legislador tmp: listinLegisladores){
            System.out.println("El legislador: "+tmp.getApellidos()+" trabaja en cámara: "+tmp.getCamaraEnQueTrabaja());
        }
    }
}

El código de la clase "TestClasesYMetodosAbstractos":

Código: [Seleccionar]
public class TestClasesYMetodosAbstractos{
    public static void main(String []Args){
        Diputado diputado1 = new Diputado("Juan","Bigotes",45,"Tarragona",10,"baja");
        Diputado diputado2 = new Diputado("Antonio","Riopérez",40,"Valencia",5,"baja");
        Diputado diputado3 = new Diputado("Eusebio","Tiritón",56,"Castellón",27,"baja");
        Senador senador1 = new Senador("Jose","Trigolimpio",50,"Madrid",15,"alta");
        Senador senador2 = new Senador("Jorge","Lupiañez",67,"Badajóz",40,"alta");
        Senador senador3 = new Senador("Alberto","Pascual",53,"Murcia",19,"alta");
        ListinLegisladores listinLegisladores = new ListinLegisladores();
        listinLegisladores.addLegislador(diputado1);
        listinLegisladores.addLegislador(diputado2);
        listinLegisladores.addLegislador(diputado3);
        listinLegisladores.addLegislador(senador1);
        listinLegisladores.addLegislador(senador2);
        listinLegisladores.addLegislador(senador3);
        listinLegisladores.imprimirListinLegisladores();
    }
}

Tenía una duda. Quería crear un método llamado mostrarCamara() en la clase "Legislador" e invocarlo desde la clase "TestClasesYMetodosAbstractos", pero no funciona del todo bien.

Los dos mencionados códigos anteriormente quedarían así modificados:

El código de la clase "Legislador":

Código: [Seleccionar]
//Creamos una clase de tipo "abstract"
public abstract class Legislador extends Persona{
    private String provinciaQueRepresenta;
    private int anyosParlamento;
    protected String camara;
   
    public Legislador(String nombre, String apellidos, int edad, String provinciaQueRepresenta, int anyosParlamento, String camara){
        super(nombre, apellidos, edad);
        this.anyosParlamento = anyosParlamento;
        this.provinciaQueRepresenta = provinciaQueRepresenta;
        this.camara = camara;
    }
   
    public String getProvinciaQueRepresenta(){return provinciaQueRepresenta;}
    public int getAnyosParlamento(){return anyosParlamento;}
   
    //Creamos un método "abstract" el que no podremos invocar si no lo sobreescribamos en las subclases
    abstract public String getCamaraEnQueTrabaja();
   
    public String toString(){
        Integer datoAnyosParlamento = anyosParlamento;
        return super.toString()+"\nProvincia que representa: "+getProvinciaQueRepresenta()+", años que lleva en el parlamento: "+datoAnyosParlamento.toString()+", cámara en la que trabaja: "+camara;
    }
   
    public void mostrarCamara(Legislador legislador){
        String tmp = "";
        if(legislador instanceof Senador){
            tmp = "Senador ";
        }else{tmp = "Diputado ";}
        System.out.println("El "+tmp+getApellidos()+" trabaja en la cámara: "+camara);
    }
}

en añadido sólo:

Código: [Seleccionar]
public void mostrarCamara(Legislador legislador){
        String tmp = "";
        if(legislador instanceof Senador){
            tmp = "Senador ";
        }else{tmp = "Diputado ";}
        System.out.println("El "+tmp+getApellidos()+" trabaja en la cámara: "+camara);
    }

del código "ListinLegisladores" modificaríamos la parte del método "imprimirListinLegisladores()" de modo que se quedaría así:

Código: [Seleccionar]
import java.util.ArrayList;

public class ListinLegisladores{
   
    private ArrayList<Legislador> listinLegisladores;
   
    public ListinLegisladores(){
        listinLegisladores = new ArrayList<Legislador>();
    }
   
    public void addLegislador(Legislador legislador){
        listinLegisladores.add(legislador);
    }
   
    public void imprimirListinLegisladores(){
        System.out.println("VAMOS A PROCEDER A LA IMPRESION DE LA LISTA DE LOS LEGISLADORES: ");
        for(Legislador tmp: listinLegisladores){
            System.out.println(tmp.toString());
        }
        System.out.println("\nAHORA MOSTRAREMOS SOLO LAS CAMARAS EN LAS QUE TRABAJAN LOS SEÑORES LEGISLADORES:");
    }
}

y el código de la clase "TestClasesYMetodosAbstractos" sería así:

Código: [Seleccionar]
public class TestClasesYMetodosAbstractos{
    public static void main(String []Args){
        Diputado diputado1 = new Diputado("Juan","Bigotes",45,"Tarragona",10,"baja");
        Diputado diputado2 = new Diputado("Antonio","Riopérez",40,"Valencia",5,"baja");
        Diputado diputado3 = new Diputado("Eusebio","Tiritón",56,"Castellón",27,"baja");
        Senador senador1 = new Senador("Jose","Trigolimpio",50,"Madrid",15,"alta");
        Senador senador2 = new Senador("Jorge","Lupiañez",67,"Badajóz",40,"alta");
        Senador senador3 = new Senador("Alberto","Pascual",53,"Murcia",19,"alta");
        ListinLegisladores listinLegisladores = new ListinLegisladores();
        listinLegisladores.addLegislador(diputado1);
        listinLegisladores.addLegislador(diputado2);
        listinLegisladores.addLegislador(diputado3);
        listinLegisladores.addLegislador(senador1);
        listinLegisladores.addLegislador(senador2);
        listinLegisladores.addLegislador(senador3);
        listinLegisladores.imprimirListinLegisladores();
        diputado1.mostrarCamara(diputado1);
        diputado1.mostrarCamara(diputado2);
        diputado1.mostrarCamara(diputado3);
        diputado1.mostrarCamara(senador1);
        diputado1.mostrarCamara(senador2);
        diputado1.mostrarCamara(senador3);
    }
}

Pero el resultado no es el que yo esperaba. A la hora de imprimir por pantalla la variable "camara" cojo sólo el valor del primer objeto creado (de los objetos "Diputado" y "Senador"). No entiendo por qué la variable no cambia de valor. Es como si no funcionara, como si fuera una constante.

Gracias

355
Misterio resuelt, chicos y chicas.

Sobre lo del método "toString()" se tenía que reinscribir así:

Código: [Seleccionar]
public String toString(){
        Float datosDimension = getDimensionPrincipal();
        return datosDimension.toString();
    }

intuyo que el método "toString" sólo se puede invocar sobre objetos y no sobre tipos primitivos.

356
Buenas tardes. Aquí propongo una solución del ejercicio CU00694B del curso Java desde cero.

Citar
EJERCICIO

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.

El código de la clase "Figura":

Código: [Seleccionar]
public class Figura{
   
    private float dimensionPrincipal;
   
    public Figura(){
        this.dimensionPrincipal = 0;
    }
   
    public Figura(float dimensionPrincipal){
        this.dimensionPrincipal = dimensionPrincipal;
    }
   
    public void setDimensionPrincipal(float dimensionPrincipal){
        this.dimensionPrincipal = dimensionPrincipal;
    }
   
    public float getDimensionPrincipal(){return dimensionPrincipal;}
   
}

El código de la clase "Cuadrado":

Código: [Seleccionar]
public class Cuadrado extends Figura{
   
    public Cuadrado(float dimensionPrincipal){
        super(dimensionPrincipal);
    }
   
    public float calcularArea(){
        float area;
        area = getDimensionPrincipal()*getDimensionPrincipal();
        return area;
    }
   
    public boolean equals(Object obj){
        if(obj instanceof Cuadrado){
            Cuadrado tmpCuadrado = (Cuadrado) obj;
            if(getDimensionPrincipal()==tmpCuadrado.getDimensionPrincipal()){
            return true;}else{return false;}
        }else{return false;}
    }
}

El código de la clase "Circulo":

Código: [Seleccionar]
public class Circulo extends Figura{
       
    private final float Pi = 3.14f;
   
    public Circulo(float dimensionPrincipal){
        super(dimensionPrincipal);
    }
   
    public float calcularArea(){
        float area;
        area = Pi*((getDimensionPrincipal()/2)*(getDimensionPrincipal()/2));
        return area;
    }
   
    public boolean equals(Object obj){
        if(obj instanceof Circulo){
            Circulo tmpCirculo = (Circulo) obj;
            if(getDimensionPrincipal()==tmpCirculo.getDimensionPrincipal()){
            return true;}else{return false;}
        }else{return false;}
    }
}

El código de la clase "TestSobreescribirMetodos":

Código: [Seleccionar]
public class TestSobreescribirMetodos{
    public static void main(String []Args){
        //Crear los objetos
        Cuadrado cuadrado1 = new Cuadrado(20);
        Cuadrado cuadrado2 = new Cuadrado(30);
        Cuadrado cuadrado3 = new Cuadrado(20);
        Circulo circulo1 = new Circulo(40);
        Circulo circulo2 = new Circulo(40);
        Circulo circulo3 = new Circulo(50);
        //Comparar los objetos
        System.out.println("Son iguales el objeto cuadrado1 y el objeto cuadrado3: "+(cuadrado1.equals(cuadrado3)));
        System.out.println("Son iguales el objeto cuadrado1 y el objeto cuadrado2: "+(cuadrado1.equals(cuadrado2)));
        System.out.println("Son iguales el objeto cuadrado2 y el objeto cuadrado3: "+(cuadrado2.equals(cuadrado3)));
        System.out.println("Son idénticos el objeto cuadrado1 y el objeto cuadrado3: "+(cuadrado1==cuadrado3));
        System.out.println();
        System.out.println("Son iguales el objeto circulo1 y el objeto circulo3: "+(circulo1.equals(circulo3)));
        System.out.println("Son iguales el objeto circulo1 y el objeto circulo2: "+(circulo1.equals(circulo2)));
        System.out.println("Son iguales el objeto circulo2 y el objeto circulo3: "+(circulo2.equals(circulo3)));
        System.out.println("Son idénticos el objeto circulo1 y el objeto circulo2: "+(circulo1==circulo2));
    }
}

He intentado sobreescribir también el método "toString" de la siguiente manera:

Código: [Seleccionar]
public String toString(){
        return getDimensionPrincipal();
    }

Pero me da el siguiente error:

Citar
incompatible types: float cannot be converted to java.lang.String

vamos, que no puede convertir un tipo "float" en un objeto "String". Pero en el tutorial ponía de ejemplo:

Citar
Supongamos que en nuestra clase Persona redefinimos toString() de la siguiente manera:

public String toString() { return nombre.concat(" "). concat(apellidos); }

 

En la clase profesor, que hereda de Persona, podríamos tener:

public String toString() { return super.toString().concat(" con Id de profesor: ").concat ( getIdProfesor() ); }

public void mostrarDatos() { System.out.println ("Los datos disponibles son: " + this.toString() ); }

y el método "getIdprofesor()" devuelve tipo "int". No entiendo por qué en el ejemplo funciona con "int" y en mi código con "float" no.

Gracias.

357
Buenas. Hago entrega del ejericicio CU00693B del curso Java desde cero.

Citar
EJERCICIO

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?

Código de la clase "Profesor":

Código: [Seleccionar]
public class Profesor{
    protected String nombre;
    protected int edad;
    protected int anyosConsolidados;
   
    public Profesor(String nombre, int edad, int anyosConsolidados){
        this.nombre = nombre;
        this.edad = edad;
        this.anyosConsolidados = anyosConsolidados;
    }
   
    public Profesor(){
        nombre = "";
        edad = 0;
        anyosConsolidados = 0;
    }
   
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
   
    public void setEdad(int edad){
        this.edad = edad;
    }
   
    public void setAnyosConsolidados(int anyosConsolidados){
        this.anyosConsolidados = anyosConsolidados;
    }
   
    public String getNombre(){return nombre;}
    public int getEdad(){return edad;}
    public int getAnyosConsolidados(){return anyosConsolidados;}
   
    public double obtenerSalarioBase(){
        double salarioBase;
        salarioBase = 725+(anyosConsolidados*33.25);
        return salarioBase;
    }
   
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" y años consolidados y no tiene años de emérito.\nPor lo tanto le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }
   
}

Código de la clase "ProfesorEmerito":

Código: [Seleccionar]
public class ProfesorEmerito extends Profesor{
    private int anyosEmerito;
   
    public ProfesorEmerito(String nombre, int edad, int anyosConsolidados, int anyosEmerito){
        super(nombre, edad, anyosConsolidados);
        this.anyosEmerito = anyosEmerito;
    }
   
    public ProfesorEmerito(){
        super();
        anyosEmerito = 0;
    }
   
    public void setAnyosEmerito(int anyosEmerito){
        this.anyosEmerito = anyosEmerito;
    }
   
    public int getAnyosEmerito(){return anyosEmerito;}
   
    public double obtenerSalarioBase(){
        double salarioBase;
        salarioBase = 925+(anyosConsolidados*33.25)+(47.80*anyosEmerito);
        return salarioBase;
    }
   
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" años consolidados y "+getAnyosEmerito()+" años de emérito.\nPor lo tanto le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }
}

Código de la clase "TestDeclaracionProtected":

Código: [Seleccionar]
public class TestDeclaracionProtected{
    public static void main(String []Args){
        ProfesorEmerito profesorEmerito = new ProfesorEmerito("Juan",65,45,5);
        profesorEmerito.mostrarInfoProfesor();
    }
}

Si en la superclase "Profesor" los campos a los que queremos acceder desde la subclase están declaradas como "protected" podríamos hacerlo como si de un campo propio de la clase "ProfesorEmerito" se tratase.

En caso contrario, si estuvieran declaradas como "private" no podríamos acceder desde las subclases.

Gracias.

358
Buenas tardes.

Os dejo una posible solución del ejercicio CU00692B del curso Java desde cero.

Citar
EJERCICIO

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). Un método de la superclase será double obtenerSalarioBase () que obtendrá el salario base como (725 + el número de años consolidados multiplicado por 33.25).

En la subclase se trabajará con el campo adicional añosEmerito. Queremos hacer lo siguiente: sobreescribir el método obtenerSalarioBase () en la subclase para calcular el salario base del profesor emérito invocando mediante la palabra clave super al cálculo del salario base de Profesor y añadiéndole la cantidad de (47.80 * añosEmerito).

Código de la clase "Profesor":

Código: [Seleccionar]
public class Profesor{
    private String nombre;
    private int edad;
    private int anyosConsolidados;
   
    public Profesor(String nombre, int edad, int anyosConsolidados){
        this.nombre = nombre;
        this.edad = edad;
        this.anyosConsolidados = anyosConsolidados;
    }
   
    public Profesor(){
        nombre = "";
        edad = 0;
        anyosConsolidados = 0;
    }
   
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
   
    public void setEdad(int edad){
        this.edad = edad;
    }
   
    public void setAnyosConsolidados(int anyosConsolidados){
        this.anyosConsolidados = anyosConsolidados;
    }
   
    public String getNombre(){return nombre;}
    public int getEdad(){return edad;}
    public int getAnyosConsolidados(){return anyosConsolidados;}
   
    public double obtenerSalarioBase(){
        double salarioBase;
        salarioBase = 725+(anyosConsolidados*33.25);
        return salarioBase;
    }
   
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" y años consolidados y no tiene años de emérito.\nPor lo tanto le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }
   
}

Código de la clase "ProfesorEmerito":

Código: [Seleccionar]
public class ProfesorEmerito extends Profesor{
    private int anyosEmerito;
   
    public ProfesorEmerito(String nombre, int edad, int anyosConsolidados, int anyosEmerito){
        super(nombre, edad, anyosConsolidados);
        this.anyosEmerito = anyosEmerito;
    }
   
    public ProfesorEmerito(){
        super();
        anyosEmerito = 0;
    }
   
    public void setAnyosEmerito(int anyosEmerito){
        this.anyosEmerito = anyosEmerito;
    }
   
    public int getAnyosEmerito(){return anyosEmerito;}
   
    public double obtenerSalarioBase(){
        double salarioBase;
        salarioBase = super.obtenerSalarioBase()+(47.80*anyosEmerito);
        return salarioBase;
    }
   
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" años consolidados y "+getAnyosEmerito()+" años de emérito.\nPor lo tanto le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }
}

Código de la clase "TestPalabraClaveSuper":

Código: [Seleccionar]
import java.util.ArrayList;

public class TestPalabraClaveSuper{
    public static void main(String []Args){
       
        //Creamos dos objetos de tipo "Profesor" y de tipo "ProfesorEmerito"
        Profesor profesor = new Profesor("José",65,45);
        ProfesorEmerito profesorEmerito = new ProfesorEmerito("Juan",65,45,5);
       
        //Creamos una lista de los objetos(profesores) creados.
        ArrayList<Profesor> listadoProfesores = new ArrayList<Profesor>();
        listadoProfesores.add(profesor);
        listadoProfesores.add(profesorEmerito);
       
        /*Invocamos sus métodos "mostrarInfoProfesor()".
        Como el objeot "ProfesorEmerito" también dispone de dicho método se ejecuta éste. En caso contrario se ejecutaría de su padre, es decir, del objeto "Profesor".
        Pero como también esté sobreescrito el método "obtenerSalarioBase()" el salario base del ojbeto "profesorEmerito" no varia.
        Podéis hacer la prueba eleminando de la clase "ProfesorEmerito" el método "mostrarInfoProfesor()".*/
        for(Profesor tmp: listadoProfesores){
            tmp.mostrarInfoProfesor();
        }
    }
}

Gracias.

359
Buenas tardes, compañeros.

Aquí dejo una posible solución del ejercicio CU00690B del curso Java desde cero.

Citar
EJERCICIO

Responde a las siguientes preguntas:

Supongamos la superclase Vehiculo que representa a cualquier tipo de vehículo y la subclase Taxi que representa a un tipo de vehículo concreto.

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.

Código de la clase "Vehiculo":

Código: [Seleccionar]
public class Vehiculo{
    private String matricula;
    private int numeroDeRuedas;
   
    public Vehiculo(String matricula, int numeroDeRuedas){
        this.matricula = matricula;
        this.numeroDeRuedas = numeroDeRuedas;
    }
   
    public void setMatricula(String matricula){
        this.matricula = matricula;
    }
   
    public void setNumeroDeRuedas(int numeroDeRuedas){
        this.numeroDeRuedas = numeroDeRuedas;
    }
   
    public String getMatricula(){return matricula;}
    public int getNumeroDeRuedas(){return numeroDeRuedas;}
   
    public String toString(){
        return "El vehículo dispone de: "+getNumeroDeRuedas()+" ruedas y tiene una matrícula: "+getMatricula();
    }
}

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.

Código de la clase "Taxi":

Código: [Seleccionar]
public class Taxi extends Vehiculo{
    private String nombreDelConductor;
    private int numeroDePlazas;
   
    public Taxi(String matricula, int numeroDeRuedas, String nombreDelConductor, int numeroDePlazas){
        super(matricula, numeroDeRuedas);
        this.nombreDelConductor = nombreDelConductor;
        this.numeroDePlazas = numeroDePlazas;
    }
   
    public void setNombreDelConductor(String nombreDelConductor){
        this.nombreDelConductor = nombreDelConductor;
    }
   
    public void setNumeroDePlazas(int numeroDePlzas){
        this.numeroDePlazas = numeroDePlazas;
    }
   
    public String getNombreDelConductor(){return nombreDelConductor;}
    public int getNumeroDePlazas(){return numeroDePlazas;}
   
    public String toString(){
        return "El vehículo dispone de: "+getNumeroDeRuedas()+" ruedas, tiene una matrícula: "+getMatricula()+
        " y el conductor se llama: "+getNombreDelConductor()+". El taxi dispone de: "+getNumeroDePlazas()+" plazas.";
    }
}

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

Este código no funcina:

Código: [Seleccionar]
public class TestEnmascaramiento01{
    public static void main(String []Args){
        Vehiculo vehiculo1 = new Vehiculo("8379 DRT",4);
        Taxi taxi1 = new Taxi("2039 DWQ",9,"Jose",20);
        taxi1 = vehiculo1;
    }
}

Y este, en cambio, sí:

Código: [Seleccionar]
public class TestEnmascaramiento01{
    public static void main(String []Args){
        Vehiculo vehiculo1 = new Vehiculo("8379 DRT",4);
        Taxi taxi1 = new Taxi("2039 DWQ",9,"Jose",20);
        taxi1 = (Taxi) vehiculo1;
    }
}

La explicación de esto la encontramos en la entrega CU00689B y precisamente aquí:

Citar
2. Conversión hacia abajo

Se trataría de poner lo que está arriba abajo, por ejemplo poner un Profesor como ProfesorInterino. Esto no siempre es posible. El supertipo admite cualquier forma (es polimórfico) de los subtipos: si el supertipo almacena el subtipo al que queremos realizar la conversión, será posible usando lo que se denomina “Enmascaramiento de tipos” o “Hacer Casting” (cast significa “moldear”). Si el supertipo no almacena el subtipo al que queremos convertirlo, la operación no es posible y saltará un error. Ejemplo:

Profesor p1; //p1 es tipo Profesor. Admite ser Profesor, ProfesorTitular o ProfesorInterino.

ProfesorInterino p44 = new ProfesorInterino(); //p44 es ProfesorInterino.

p1 = p44; // Conversión hacia arriba: sin problema. Ahora p1 que es tipo profesor, almacena un profesor interino

p44 = p1 // ERROR en la conversión hacia abajo. El compilador no llega tan lejos como para saber si p1 almacena un profesor interino u otro tipo de profesor y ante la incertidumbre salta un error. La forma de forzar al compilador a que “comprenda” que p1 está almacenando un profesor interino y por tanto puede asignarse a una variable que apunta a un profesor interino se llama “hacer casting”. Escribiríamos lo siguiente: p44 = (ProfesorInterino) p1;

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

Código: [Seleccionar]
public class TestEnmascaramiento02{
    public static void main(String []Args){
        Vehiculo vehiculo1 = new Vehiculo("8379 DRT",4);
        Taxi taxi1 = new Taxi("2039 DWQ",9,"Jose",20);
        vehiculo1 = taxi1;
    }
}

Vemos que el código compila.

Citar
1. Conversión hacia arriba

Se trataría por ejemplo de poner lo que está a un nivel inferior en un nivel superior, por ejemplo poner un profesor interino como profesor. Posible código: profesor43 = profesorinterino67;

Ponemos lo que está abajo (el profesor interino) arriba (como profesor). Esto es posible, pero dado que lo que está abajo generalmente contiene más campos y métodos que lo que está arriba, perderemos parte de la información. Sobre el objeto profesor43 ya no podremos invocar los métodos propios de los profesores interinos.

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é?

Código de la clase "Test":

Código: [Seleccionar]
public class Test{
    public static void main(String []Args){
        Vehiculo vehiculo = new Taxi("4389 BTN",4,"Juan",8);
        System.out.println(vehiculo.toString());
    }
}

La respuesta a la pregunta "e" la encontramos al final de la entrega CU00690B y precisamente aquí:

Citar
el compilador se basa en el tipo estático para su trabajo, podríamos pensar que si invocamos a un objeto de tipo estático “superclase” y tipo dinámico “subclase” con un método sobreescrito, el método que se utilice sería el propio de la superclase. Pero sin embargo, esto no es así: el control de tipos del compilador se basa en los tipos estáticos pero en tiempo de ejecución los métodos que se ejecutan dan preferencia al tipo dinámico. Es decir, en tiempo de ejecución Java está constantemente “buscando” (“ligando” o “despachando”) el método que corresponda en función del tipo dinámico al que apunta una variable.

Ampliación de la información:

Citar
Si el método invocado no se encuentra definido en el tipo dinámico de que se trate, Java busca el método en la superclase para tratar de ejecutarlo. Si no lo encuentra en la superclase, continúa subiendo niveles de clase hasta alcanzar a la clase Object. Si en la clase Object tampoco se encontrara un método con ese nombre, el programa no llegaría a compilar. Decimos que los métodos en Java son polimórficos porque una misma llamada en un programa puede dar lugar a la ejecución de distintos métodos según el tipo dinámico de una variable.

Gracias.

360
Buenas noches.

Mediante la siguiente respuesta autocorrigo mi ejercicio.

Quiero decir que me ha servido de gran ayuda el siguiente hilo:

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

El ejercicio pedía:

Citar
EJERCICIO

Amplía el código del programa Java que planteamos como ejercicio en la entrega CU00687 de este curso, relativo a la gestión de una empresa agroalimentaria, teniendo en cuenta que la empresa gestiona envíos a través de diferentes medios, y un envío puede contener cierto número de productos frescos, refrigerados o congelados. Añade al código:

a) Una clase EnvioDeProductos que represente un envío de productos como colección de objetos que admite el polimorfismo.

b) Crear una clase testHerencia4 con el método main donde se creen: dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados por agua, otros 2 por aire y 1 por nitrógeno). Crear un envío que represente la agrupación de los anteriores productos. Mostrar por pantalla la información del número de productos que componen el envío y recorrer los productos del envío usando iterator para mostrar la información (valor de los atributos) de cada uno de ellos.

A continuación los códigos de las clases necesarias para poder funcionar el programa.

El código de la clase "Producto":

Código: [Seleccionar]
public class Producto{
    private String fechaCaducidad;
    private int numeroLote;
    private String fechaEnvase;
    private String paisOrigen;
   
    public Producto(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen){
        this.fechaCaducidad = fechaCaducidad;
        this.numeroLote = numeroLote;
        this.fechaEnvase = fechaEnvase;
        this.paisOrigen = paisOrigen;
    }
   
    public void setFechaCaducidad(String fechaCaducidad){
        this.fechaCaducidad = fechaCaducidad;
    }
   
    public void setNumeroLote(int numeroLote){
        this.numeroLote = numeroLote;
    }
   
    public void setFechaEnvase(String fechaEnvase){
        this.fechaEnvase = fechaEnvase;
    }
   
    public void setPaisOrigen(String paisOrigen){
        this.paisOrigen = paisOrigen;
    }
   
    public String getFechaCaducidad(){return fechaCaducidad;}
    public int getNumeroLote(){return numeroLote;}
    public String getFechaEnvase(){return fechaEnvase;}
    public String getPaisOrigen(){return paisOrigen;}
   
    public void mostrarInfoProducto(){
        System.out.print("El producto: "+getNumeroLote()+" con fecha de envase: "+getFechaEnvase()+" y fecha de caducidad: "+getFechaCaducidad()+" proviene de: "+getPaisOrigen());
    }
}

El código de la clase "ProductoFresco":

Código: [Seleccionar]
public class ProductoFresco extends Producto{
   
    public ProductoFresco(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen);
    }
   
    public void mostrarInfoProductoFresco(){
         mostrarInfoProducto();
         System.out.println();
    }
}

El código de la clase "ProductoRefrigeradoYCongelado" (es una clase "intermedia"):

Código: [Seleccionar]
public class ProductoRefrigeradoYCongelado extends Producto{
    private float temperaturaMantenemientoRecom;
   
    public ProductoRefrigeradoYCongelado(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen);
        this.temperaturaMantenemientoRecom = temperaturaMantenemientoRecom;
    }
   
    public void setTemperaturaMantenemientoRecom(float temperaturaMantenemientoRecom){
        this.temperaturaMantenemientoRecom = temperaturaMantenemientoRecom;
    }

    public float getTemperaturaMantenemientoRecom(){return temperaturaMantenemientoRecom;}
   
    public void mostrarInfoProductoRefrigeradoYCongelado(){
        mostrarInfoProducto();
        System.out.print(" y tiene una temperatura de mantenemiento recomendad de: "+getTemperaturaMantenemientoRecom()+"C");
    }
}

El código de la clase "ProductoRefrigerado":

Código: [Seleccionar]
public class ProductoRefrigerado extends ProductoRefrigeradoYCongelado{
    private int codigoOrganismoSupervision;
   
    public ProductoRefrigerado(String fechaCaducidad, int numeroLote, String fechaEnvase,  String paisOrigen, float temperaturaMantenemientoRecom, int codigoOrganismoSupervision){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.codigoOrganismoSupervision = codigoOrganismoSupervision;
    }
   
    public void setCodigoOrganismoSupervision(int codigoOrganismoSupervision){
        this.codigoOrganismoSupervision = codigoOrganismoSupervision;
    }
   
    public int getCodigoOrganismoSupervision(){return codigoOrganismoSupervision;}
   
    public void mostrarInfoProductoRefrigerado(){
        mostrarInfoProductoRefrigeradoYCongelado();
        System.out.print(" y un código de Organismo de Supervisión: "+getCodigoOrganismoSupervision()+"\n");
    }
}

El código de la clase "ProductoCongelado":

Código: [Seleccionar]
public class ProductoCongelado extends ProductoRefrigeradoYCongelado{
   
    public ProductoCongelado(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
    }
   
    public void mostrarInfoProductoCongelado(){
        mostrarInfoProductoRefrigeradoYCongelado();
        System.out.println();
    }
}

El código de la clase "ProductoCongeladoPorAire":

Código: [Seleccionar]
public class ProductoCongeladoPorAire extends ProductoCongelado{
    private float nitrogeno;
    private float oxigeno;
    private float co2;
    private float vaporAgua;
   
    public ProductoCongeladoPorAire(String fechaCaducidad, int numeroLote,  String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom, float nitrogeno, float oxigeno, float co2, float vaporAgua){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.nitrogeno = nitrogeno;
        this.oxigeno = oxigeno;
        this.co2 = co2;
        this.vaporAgua = vaporAgua;
    }
   
    public void setNitrogeno(float nitrogeno){
        this.nitrogeno = nitrogeno;
    }
   
    public void setOxigeno(float oxigeno){
        this.oxigeno = oxigeno;
    }
   
    public void setCo2(float co2){
        this.co2 = co2;
    }
   
    public void setVaporAgua(float vaporAgua){
        this.vaporAgua = vaporAgua;
    }
   
    public float getNitrogeno(){return nitrogeno;}
    public float getOxigeno(){return oxigeno;}
    public float getCo2(){return co2;}
    public float getVaporAgua(){return vaporAgua;}
   
    public void mostrarInfoProductoCongeladoPorAire(){
        mostrarInfoProductoRefrigeradoYCongelado();
        System.out.print(" y tiene una composición de aire como sigue: ");
        System.out.println("Nitrógeno: "+getNitrogeno()+"%");
        System.out.println("Oxígeno: "+getOxigeno()+"%");
        System.out.println("Dióxido de carbono: "+getCo2()+"%");
        System.out.println("Vapor de agua: "+getVaporAgua()+"%");
    }
}

El código de la clase "ProductoCongeladoPorAgua":

Código: [Seleccionar]
public class ProductoCongeladoPorAgua extends ProductoCongelado{
    private float salinidadAgua;
   
    public ProductoCongeladoPorAgua(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom ,float salinidadAgua){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.salinidadAgua = salinidadAgua;
    }
   
    public void setSalinidadAgua(float salinidadAgua){
        this.salinidadAgua = salinidadAgua;
    }
   
    public float getSalinidadAgua(){return salinidadAgua;}
   
    public void mostrarInfoProductoCongeladoPorAgua(){
        mostrarInfoProductoRefrigeradoYCongelado();
        System.out.print(" y tiene un porcentaje de salinidad: "+getSalinidadAgua()+"gr sal por litro de agua\n");
    }
}

El código de la clase "ProductoCongeladoPorNitrogeno":

Código: [Seleccionar]
public class ProductoCongeladoPorNitrogeno extends ProductoCongelado{
    private String metodoCongelacion;
    private int tiempoExposicion;
   
    public ProductoCongeladoPorNitrogeno(String fechaCaducidad, int numeroLote, String fechaEnvase, String paisOrigen, float temperaturaMantenemientoRecom, String metodoCongelacion, int tiempoExposicion){
        super(fechaCaducidad, numeroLote, fechaEnvase, paisOrigen, temperaturaMantenemientoRecom);
        this.metodoCongelacion = metodoCongelacion;
        this.tiempoExposicion = tiempoExposicion;
    }
   
    public void setMetodoCongelacion(String metodoCongelacion){
        this.metodoCongelacion = metodoCongelacion;
    }
   
    public void setTiempoExposicion(int tiempoExposicion){
        this.tiempoExposicion = tiempoExposicion;
    }
   
    public String getMetodoCongelacion(){return metodoCongelacion;}
    public int getTiempoExposicion(){return tiempoExposicion;}
   
    public void mostrarInfoProductoCongeladoPorNitrogeno(){
        mostrarInfoProductoRefrigeradoYCongelado();
        System.out.print(" y tuvo un método de congelación: "+getMetodoCongelacion()+" y estuvo expuesto al nitrógeno: "+getTiempoExposicion()+"s\n");
    }
}

El código de la clase "EnvioDeProductos":

Código: [Seleccionar]
import java.util.ArrayList;

public class EnvioDeProductos{
    //Definimos una variable de clase "ArrayList" de tipo "Producto"
    private ArrayList<ProductoFresco> productosFrescos;
    private ArrayList<ProductoRefrigerado> productosRefrigerados;
    private ArrayList<ProductoCongeladoPorAgua> productosCongeladosPorAgua;
    private ArrayList<ProductoCongeladoPorAire> productosCongeladosPorAire;
    private ArrayList<ProductoCongeladoPorNitrogeno> productosCongeladosPorNitrogeno;
   
    //Inicializamos la variable como un objeto nuevo de clase "ArrayList" de tipo "Producto"
    public EnvioDeProductos(){
        productosFrescos = new ArrayList<ProductoFresco>();
        productosRefrigerados = new ArrayList<ProductoRefrigerado>();
        productosCongeladosPorAgua = new ArrayList<ProductoCongeladoPorAgua>();
        productosCongeladosPorAire = new ArrayList<ProductoCongeladoPorAire>();
        productosCongeladosPorNitrogeno = new ArrayList<ProductoCongeladoPorNitrogeno>();
    }
   
    //Creación y inclusión de los objetos objetos
    public void crearPedido(){
        productosFrescos.add(new ProductoFresco("23-06-2016",1234, "05-01-2016","Argentina"));
        productosFrescos.add(new ProductoFresco("22-06-2016",987,"09-10-2016","España"));
        productosRefrigerados.add(new ProductoRefrigerado("10-10-2016",345,"01-03-2016","Ecuador",5, 3452));
        productosRefrigerados.add(new ProductoRefrigerado("11-10-2016",346,"02-03-2016","Colombia",5, 5421));
        productosRefrigerados.add(new ProductoRefrigerado("12-10-2016",347,"03-03-2016","Marruecos",5, 1231));
        productosCongeladosPorAgua.add(new ProductoCongeladoPorAgua("13-06-2016",908,"12-05-2016","Argentina",-18,40));
        productosCongeladosPorAgua.add(new ProductoCongeladoPorAgua("13-08-2016",988,"11-06-2016","España",-15,35));
        productosCongeladosPorAire.add(new ProductoCongeladoPorAire("11-08-2016",354,"02-03-2016","Puerto Rico",-22,20,20,30,30));
        productosCongeladosPorAire.add(new ProductoCongeladoPorAire("11-11-2016",428,"08-08-2016","Francia",-10,10,20,30,40));
        productosCongeladosPorNitrogeno.add(new ProductoCongeladoPorNitrogeno("10-08-2016",846,"05-05-2016","Suiza",-20,"Tradicional",200));
    }
   
    //Invocación de los métodos de cada objeto.
    public void imprimirPedido(){
        System.out.println("Productos Frescos:");
        for(ProductoFresco producto: productosFrescos){
            producto.mostrarInfoProductoFresco();
        }
        System.out.println("Productos Refrigerados:");
        for(ProductoRefrigerado producto: productosRefrigerados){
            producto.mostrarInfoProductoRefrigerado();
        }
        System.out.println("Productos Congelados por Agua:");
        for(ProductoCongeladoPorAgua producto: productosCongeladosPorAgua){
            producto.mostrarInfoProductoCongeladoPorAgua();
        }
        System.out.println("Productos Congelados por Aire:");
        for(ProductoCongeladoPorAire producto: productosCongeladosPorAire){
            producto.mostrarInfoProductoCongeladoPorAire();
        }
        System.out.println("Productos Congelados por Nitrógeno:");
        for(ProductoCongeladoPorNitrogeno producto: productosCongeladosPorNitrogeno){
            producto.mostrarInfoProductoCongeladoPorNitrogeno();
        }
    }
}

El código de la clase main  "TestHerencia4":

Código: [Seleccionar]
import java.util.Calendar;
import java.util.GregorianCalendar;

public class TestHerencia4{
    public static void main(String []Args){
       
        //Creamos un objeto de tipo "EnvioDeProductos"
        EnvioDeProductos envioDeProductos = new EnvioDeProductos();
       
        //Creamos el pedido (los objetos) mediante la invocación del método crearPedido() del objeto "envioDeProductos" de tipo "EnvioDeProductos"
        envioDeProductos.crearPedido();
       
        //Invocamos el método "imprimirPedido()" para mostrar por pantalla el pedido completo
        envioDeProductos.imprimirPedido();
       
        //Mediante el objeto "Calendar" de Java y con el método "getTime()" hacemos visible la hora actual.
        Calendar hora = GregorianCalendar.getInstance();
        System.out.println("La hora y el día en el cual fue hecho el pedido: "+hora.getTime());
    }
}

Espero que se entienda todo y que esté en lo acierto :)

Recomiendo, de verdad, el estudio detallado del programa del hilo: (a mí me ayudo bastante)

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

Gracias

PD: Incluyo el esquema como foto.

Páginas: 1 ... 13 14 15 16 17 [18] 19 20 21 22 23 ... 30

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