Foros del Web » Programación para mayores de 30 ;) » Java »

Objeto derivado de una clase

Estas en el tema de Objeto derivado de una clase en el foro de Java en Foros del Web. Muy buenas a todos, a ver si alguien me puede ayudar. Tengo una clase, Botella, y tengo que crear un objeto de esa clase, pero ...
  #1 (permalink)  
Antiguo 26/04/2013, 09:37
Avatar de dafnemartinezs  
Fecha de Ingreso: febrero-2013
Ubicación: Murcia
Mensajes: 23
Antigüedad: 11 años, 2 meses
Puntos: 1
Pregunta Objeto derivado de una clase

Muy buenas a todos, a ver si alguien me puede ayudar.

Tengo una clase, Botella, y tengo que crear un objeto de esa clase, pero añadiéndole un par de propiedades más.

El problema es que cuando me creo otra clase "Vaso" que deriva de Botella
para poder crearme ahí un objeto "v", me sale un error tal que así : Unreported exception Exception in default constructor

El error me sale al principio de todo cuando creo la clase Vaso:
public class Vaso extends Botella1{ }

Aqui dejo el código de la clase principal ("Botella1"):
Código:
public class Botella1 extends Thread{
    public enum Material {
        PLASTICO, VIDRIO, METAL;
    };
    
    private float capacidad, contenido;
    private Material material;
    

    public Botella1(float capacidad, float contenido,  Material material) throws Exception {
        this.setBotella(capacidad, contenido, material);
    }
    
    public Botella1(float capacidad) throws Exception{
        this.setBotella(capacidad, contenido, material);
    }
    
    public Botella1(float capacidad, float contenido) throws Exception{
        this.setBotella(capacidad,contenido,Material.PLASTICO);
    }
    
    public Botella1(Botella1 b) throws Exception{
        this.setBotella(b.capacidad,b.contenido,b.material);
    }
    
    public Botella1()  throws Exception{
        this.setBotella(0);
    }    
    
    
    /*GETTER's & SETTER's*/  
    public Material getMaterial() {
        return material;
    }

    public void setMaterial(Material material) {
        this.material = material;
    }

    public float getCapacidad() {
        return capacidad;
    }

    public void setCapacidad(float capacidad) {
        this.capacidad = capacidad;
    }

    public synchronized float getContenido() {
        return contenido;
    }

    public synchronized void setContenido(float contenido) throws Exception {
            if(contenido>capacidad || contenido<0){
                throw new Exception("Se supera la capacidad");
            }
            this.contenido = contenido;
    }   
    
     public final synchronized void setBotella(float capacidad, float contenido,  Material material) throws Exception {
        if(capacidad<0){
            throw new Exception("Error:Botella(float, float, Material) Capacidad negativa (" + capacidad + ")");
        }
        
        this.capacidad = capacidad;
        
         if(contenido<0 || contenido>capacidad){
            throw new Exception("Error:Botella(float, float, Material) Contenido negativa (" + contenido + ")");
        }
        this.contenido = contenido;
        
        this.material = material;
    }
    
     public final synchronized void setBotella(float capacidad) throws Exception{
             setBotella(capacidad,0,Material.PLASTICO);
    }
     
     public final synchronized void setBotella(float capacidad, float contenido) throws Exception{
        setBotella(capacidad,contenido,Material.PLASTICO);
    }
    
     public final synchronized void Botella(Botella1 b) throws Exception{
        setBotella(b.capacidad,b.contenido,b.material);
    }
    
    public final synchronized void Botella() throws Exception{
        setBotella(0);
    }   
    
    
    public void  rellenar(){
        try{
            setContenido(capacidad);
        }catch(Exception e){
            System.out.println("Error: rellenar(): Contenido incorrecto (" + capacidad+ ")");
        }
    }
    
    public synchronized void rellenar( float litros) throws Exception{
        setContenido(getContenido() + litros);
    }
    

    public void vaciar() throws Exception{
        setContenido(0);
    }
    
    
    public void vaciar( float litros) throws Exception{
        //No es sincronizado xq llama al rellenar que si lo es
        rellenar(-litros); 
    }
    
    
    public void contenido(){
        System.out.println("El contenido actual de la botella es de " + getContenido() + " litros");
    }
     
    
     public static void main(String[] args) throws Exception{
        
        int hilos=100;
        Thread []miBotellaLL= new Thread[hilos];
        Thread []miBotellaV= new Thread[hilos];
        
        float capacidad= 100, contenido = 50;
        
        int posicion=1;
        
        
        Botella1 b = new Botella1(capacidad, contenido);       
        
        float Cr= (float)0.2;
        float Cv= (float)0.2;
         for (int i = 0; i < hilos; i++) {
             System.out.println(posicion + ")");
             miBotellaLL[i]=new Thread(b);
             miBotellaLL[i].start();
             b.rellenar(Cr);
             
             miBotellaV[i]=new Thread(b);
             miBotellaV[i].start();
             b.vaciar(Cv);
             
             posicion+=1;
         }
        
         for (int i = 0; i < hilos; i++) {
             miBotellaLL[i].join();
             miBotellaV[i].join();
         }
        
         //Comprobacion final
         b.contenido();
    }
     
}

Este es el enunciado del ejercicio:
Crear un objeto "Vaso" derivado de "Botella", con las siguientes características adicionales:
propiedades (acceso privado):
boolean agitado (true / false). Representa si hemos agitado nuestra bebida o no.
métodos (acceso público). REUTILIZAR TODO LO QUE SE PUEDA DE LA SUPERCLASE
agitar(): setAgitado(true). Agitar debe dormir el hilo durante 3 segundos. No tiene sentido agitar un vaso vacio (Excepción)
reposar(): setAgitado(false). Reposar debe dormir el hilo durante 10 segundos.
beber(): Debe poder beberse cuando la bebida no esté agitada, y debe poder beberse cualquier cantidad existente en el vaso.
constructores:
Con todos los argumentos (capacidad, contenido, material, agitado)
Pasando como argumento solamente la capacidad: reutiliza el constructor anterior, pero deja el vaso vacio, de PLÁSTICO, y sin agitar
Pasando como argumento solamente la capacidad y el contenido inicial, creará un vaso de plástico con el contenido indicado, sin agitar.
Constructor por copia: recibe un vaso y crea otro con las mismas propiedades.



Un saludo y gracias por adelantado.
  #2 (permalink)  
Antiguo 26/04/2013, 09:48
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Objeto derivado de una clase

Hola:

No estaría de más ver cómo haces la clase Vaso y su constructor, que el que dices que falla.

De todas formas, viendo el código, el constructor Botella1() sin parámertros lanza una excepción, así que el constructor por defecto debe o bien lanzar la misma exception, o bien capturarla (no estoy seguro si es posible, tendría que probar).

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 26/04/2013, 09:52
Avatar de dafnemartinezs  
Fecha de Ingreso: febrero-2013
Ubicación: Murcia
Mensajes: 23
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Objeto derivado de una clase

Pero para hacer la clase debo hacer también el constructor?
  #4 (permalink)  
Antiguo 26/04/2013, 12:56
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Objeto derivado de una clase

Si el constructor padre sin parámetros lanza una excepción, sí, tienes que hacerlo para relanzar a su vez la excepción o capturarla. Si el padre no la lanzara, no haría falta.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: clase, objeto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:21.