Sesión 3

API de Java. Métodos y objetos. Modificador static. Herencia.

1. El API de Java

Vamos a comenzar con un ejercicio para aprender a consultar el API de Java (y algunas cosas más).

  1. Repasa la sección API de Java del apartado 1.1.1 de los apuntes.
  2. Busca en el API de Java el paquete java.util.zip. Consultando la página HTML que describe el paquete, contesta en el fichero respuestas.txt las siguientes preguntas:
  3. Busca en el API la clase Stack. Contesta en el fichero respuestas.txt las siguientes preguntas:
  4. Ejecuta en BeanShell un conjunto instrucciones que trabajen con un Stack. Recuerda que para visualizar el valor de un objeto o en BeanShell debes usar el comando print(o). Copia la sesión de interacción con BeanShell en el fichero respuestas.txt.

2. Métodos y objetos

Vamos a hacer un ejercicio más elaborado en el que se definan clases y objetos. Puedes usar el entorno de desarrollo que desees. Si tu ordenador no tiene la potencia (memoria sobre todo) suficiente para que Eclipse funcione con fluidez usa algún editor de texto para editar las clases.

Todas las clases las vamos a definir en el paquete modulo1.sesion3. Se encuentran en la plantilla de ejercicios de la sesión 3.

  1. Supongamos las siguientes clases Contador y ContadorTest
    package modulo1.sesion3;
    public class Contador {
        static int acumulador = 0;
        int valor;
        
        static public int acumulador() {
            return acumulador;
        }
    
        public Contador(int valor) {
            this.valor = valor;
            acumulador += valor;
            // no es valido this.acumulador
            // es valido Contador.acumulador
        }    
        
        public void inc() {
           valor++;
           acumulador++;
        }
        
        public int getValor(){
            return valor;
        }
    }
    package modulo1.sesion3;
    
    public class ContadorTest {
    
        public static void main(String[] args) {
            Contador c1, c2;
            
            System.out.println(Contador.acumulador());     
            c1 = new Contador(3);
            c2 = new Contador(10);
            c1.inc();
            c1.inc();
            c2.inc();
            System.out.println(c1.getValor());
            System.out.println(c2.getValor());
            System.out.println(Contador.acumulador);        
        }
    }
    
    Compila las clases y pruébalas. Responde a las siguientes preguntas en el fichero respuestas.txt:
  2. Vamos a complicar un poco más el código de Contador, añadiendo una constante (VALOR_INICIAL) a la clase y otro nuevo constructor. El código es el que sigue (en negrita lo que se ha añadido). El modificador final indica que el valor asignado a VALOR_INICIAL no puede modificarse.
    package modulo1.sesion3;
    
    public class Contador {
        static int acumulador;
        final static int VALOR_INICIAL=10;
        int valor;
        
        static public int acumulador() {
            return acumulador;
        }
    
        public Contador(int valor) {
            this.valor = valor;
            acumulador += valor;
        }    
        
        public Contador(){
            this(Contador.VALOR_INICIAL);
        }
    
        public void inc() {
           this.valor++;
           acumulador++;
        }
        
        public int getValor(){
            return this.valor;
        }
    }
    
    Fíjate en la llamada "this(Contador.VALOR_INICIAL)". ¿Qué hace? Escribe un programa ejemplo ContadorTest2 que compruebe el funcionamiento de la clase modificada. Por último, una pregunta algo complicada: ¿Qué sucede si cambiamos la línea "this(Contador.VALOR_INICIAL)" por "new Contador(Contador.VALOR_INICIAL)"?
  3. Por último, realiza las siguientes modificaciones en la clase Contador:

3. Un ejemplo de herencia

  1. En el fichero de plantillas de esta sesión encontrarás los ficheros Figura.java, Circulo.java, Rectangulo.java y FiguraTest.java, que contienen el siguiente código:
    package modulo1.sesion3;
    
    public abstract class Figura {
        double area;
    
        public abstract double getArea();
    }
    
    package modulo1.sesion3;
    
    class Circulo extends Figura {
        double radio;
    
        public Circulo(double radio) {
            this.radio = radio;
        }
    
        public double getArea() {
            area = 3.14 * (radio * radio);
            return (area);
        };
    }
    
    package modulo1.sesion3;
    
    class Rectangulo extends Figura {
        double lado;
        double altura;
    
        public Rectangulo(double lado, double altura) {
            this.lado = lado;
            this.altura = altura;
        }
    
        public double getArea() {
            area = lado * altura;
            return (area);
        };
    
    }
    package modulo1.sesion3;
    
    import java.util.Stack;
    
    public class FiguraTest {
        public static void main(String args[]) {
            Figura f;
    
            Rectangulo rect = new Rectangulo(10, 15);
            System.out.println("El area del rectangulo es: " + rect.getArea());
    
            Circulo circ = new Circulo(3);
            System.out.println("El area del circulo es: " + circ.getArea());
    
            Stack pila = new Stack();
            pila.push(rect);
            pila.push(circ);
    
            while (!pila.isEmpty()) {
                f = (Figura) pila.pop();
                System.out.println("El area de la figura es: " + f.getArea());
            }
        }
    }
  2. Compila las clases y ejecuta el ejemplo. Contesta las siguientes preguntas en el fichero respuestas.txt:

4. Crea una jerarquía de clases

Define e implementa un ejemplo de jerarquía de clases. Recuerda algunas reglas básicas sobre herencia de clases:

PARA ENTREGAR

Debes crear un ZIP llamado sesion3.zip con: