API de Java. Métodos y objetos. Modificador static. Herencia.
Vamos a comenzar con un ejercicio para aprender a consultar el API de Java (y algunas cosas más).
java.util.zip
. Consultando
la página HTML que describe el paquete, contesta en el fichero respuestas.txt
las siguientes preguntas:
Stack
. Contesta en el fichero respuestas.txt
las siguientes preguntas:Stack
?
¿Qué instrucción import
tendrías
que definir para usar la clase Stack
?Stack
?int i = 10; Stack pila = new Stack(); pila.add(i);Nota: en la versión 1.5 de Java y en BeanShell el código de arriba es correcto ya que usan una técnica denominada autoboxing.
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.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.
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:
Contador
? ¿Por qué? 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)
"?Contador
:
nContadores
que contenga
el número de contadores creadosvalores
que contenga
un array con los valores de los contadores creados.getValores
que devuelva un array
con los valores de los contadores creados.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()); } } }
Figura
? ¿Por
qué?Rectangulo
y Circulo
, siendo tipos diferentes?public void draw(Figura fig);¿Podría pasar un objeto de la clase
Circulo
como parámetro
del método? ¿Y un objeto de la clase Rectangulo
?
¿Y un objeto de la clase plj.geom.Rect
?getArea()
no fuera abstracto, sino que tuviera
la implementación definida en la clase Figura
(y funcione
correctamente, claro).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: