Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Herencia y Polimorfismo
Fundamentos de Programación II 1
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 1
¿Qué tipos de relación hay entre las siguientes clases?
Personal de la Universidad
Herencia Herencia
1 n
PAS Profesor Estudiante
Asociación
a) herencia y asociación
b) herencia y dependencia
c) dependencia y asociación
d) transposición y bifuncionalismo
Fundamentos de Programación II 2
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 2 (I)
class Programa {
public static void main(String [ ] args){
Clase1 obj1=new Clase1();
obj1.imprimir(4);
Clase2 obj2=new Clase2();
obj2.imprimir(3);
14 8 7 1
}
}
class Clase1 {
protected int prop1=10,prop2=4; Se hereda el valor
public void imprimir(int i){ inicial de prop1 y
prop1=prop1+i;
prop2=prop2+i; prop2, pero no su
System.out.print(prop1+" "+prop2+" "); valor tras haber sido
} modificado en el
} objeto obj1 de la
class Clase2 extends Clase1 {
public void imprimir(int i){ Clase1.
prop1=prop1-i;
prop2=prop2-i;
System.out.print(prop1+" "+prop2); Nota:
}
} El método imprimir está
sobrescrito en la Clase 2
Fundamentos de Programación II 3
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 2 (II)
¿Y si prop 1 y prop 2 se definen como static?
class Programa {
public static void main(String [ ] args){
Clase1 obj1=new Clase1();
obj1.imprimir(4); 14 8
Clase2 obj2=new Clase2(); prop1 y prop2 se heredan
obj2.imprimir(3);
} 11 5 igual que en el caso
} anterior. Sin embargo al
ser estáticas las
class Clase1 { comparten todos los
static protected int prop1=10,prop2=4;
public void imprimir(int i){ objetos. Por tanto, cuando
prop1=prop1+i; se modifican a través de
prop2=prop2+i; obj1 valen lo mismo que en
System.out.print(prop1+" "+prop2+" "); el caso anterior, pero no
}
} cuando se modifican
class Clase2 extends Clase1 { posteriormente con obj2.
public void imprimir(int i){ Al ser estáticas las
prop1=prop1-i; variables son las mismas
prop2=prop2-i;
System.out.print(prop1+" "+prop2); en las dos clases (se
} comparten)
}
Fundamentos de Programación II 4
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 2 (III)
¿y si en lugar de ser prop1 y prop2 protected son private?
class Programa {
public static void main(String [ ] args){
Clase1 obj1=new Clase1();
obj1.imprimir(4);
Clase2 obj2=new Clase2();
obj2.imprimir(3);
}
}
Fundamentos de Programación II 6
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 4
abstract class Uno { Clase abstracta que NO implementa frase.
protected int i=2;
abstract public void frase();
}
class Dos extends Uno { i localDos
Clase prevalece
hereda sobre
de la edeimplementa
Uno ejemplar frase.
public void frase() { heredada de class Uno. i=3
int i=3;
System.out.println("Estoy en un objeto de clase Dos con i:“ + i);
}
}
class Tres extends Dos { Clase Tres hereda de Dos y sobrescribe frase
public void frase() { i de ejemplar heredada de class Uno. i=2
System.out.println("Estoy en un objeto de clase Tres con i:"+i);
}
}
class Driver {
public static void main(String[] args) {
Uno [] lista =new Uno [2];
lista [0]= new Dos(); lista: referencia polimórfica
lista [1]= new Tres();
for (int i=0; i<2; i++){
lista[i].frase();
} Estoy en un objeto de clase Dos con i:3
} Estoy en un objeto de clase Tres con i:2
}
Fundamentos de Programación II 7
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 5 (I)
En una tienda se venden 2 tipos de ordenadores: portátiles y de sobremesa.
- Otros atributos:
- portátil: atributo peso
- sobremesa: atributo descripción del tipo de torre
Realice un diseño indicando las clases que hay que tener en cuenta
(incluyendo atributos y métodos) y su relación.
Fundamentos de Programación II 8
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 5 (II)
O rde nador
Portatil Sobre me sa
O rdenador {abstract}
#pre cio:double
#codigo:int
Fundamentos de Programación II 9
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 5 (III)
Portatil
-pe so:double
Sobre me sa
-tipotorre :String
Fundamentos de Programación II 10
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 5 (IV)
abstract class Ordenador {
protected double precio;
protected int codigo;
Fundamentos de Programación II 11
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 5 (V)
class Portatil extends Ordenador {
private double peso;
Fundamentos de Programación II 12
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 5 (VI)
class Sobremesa extends Ordenador {
private String tipotorre;
Fundamentos de Programación II 14
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 5 (VIII)
En el main: System.out.println(orde[i].toString());
- En estas condiciones:
a) Construir un diagrama de clases usando UML, incluyendo los atributos y métodos
en cada clase. Incluya también las relaciones entre las distintas clases
b) Programar las clases resultantes
c) Construir un programa ejemplo que use las clases del apartado a). En el programa
deben crearse objetos de cada una de las clases, inicializando las cuentas con unos
valores iniciales. Además se retiraran fondos de cada uno de los tipos de cuenta, se
actualizarán los intereses de la libreta 2000 y se depositará una determinada
cantidad en la libreta 2000.
Fundamentos de Programación II 16
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (II)
Este programa es un claro ejemplo de jerarquía de clases
Cuenta_bancaria
Herencia
Cuenta_corriente 1 1 Libreta_de_ahorro
Asociación
Herencia
Libreta_2000
Fundamentos de Programación II 17
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (III)
C u e n ta _ ba n ca ria
# num e ro :int
# s aldo :do uble
+ L ibre ta_ de _ aho rro (num e ro :int,s aldo _ inic ial:do uble ,inte re s :do uble )
+ c alc ular_ inte re s e s ():v o id
+ c o ns ultar_ inte re s e s ():do uble
Fundamentos de Programación II 18
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (IV)
L ibre ta _ 2 0 0 0 e x te n ds L ibre ta _ de _ a h o rro
+ L ib re ta_ 2 0 0 0 (n um e ro :int,s aldo _ inic ial:do uble , inte re s :d o uble , pe nalizac io n:do uble )
+ re tirar(c antidad:do uble ):int
+ c o ns ultar_ pe nalizac io n():do uble
C u e n ta _ co rrie n te e x te n ds C u e n ta _ ba n ca ria
+ C ue nta_ c o rrie nte (num e ro :int,s aldo _ inic ial:do uble , libre ta:L ibre ta_ de _ aho rro )
+ re tirar (c antidad:do uble ):int
+ c o ns ultar_ c ue nta_ as o c iada ( ):L ibre ta_ de _ aho rro
Fundamentos de Programación II 19
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (V)
Comentarios:
- Los métodos y atributos que incorporemos en las clases dependen de los
requisitos que nos exijan, aunque es mejor planificar para el cambio:
- Por ejemplo, si nos indicaran que las cuentas se abren con saldo inicial de
cero y que después se hacen los ingresos, no tendríamos que usar una
variable saldo_inicial en los constructores. Sin embargo, poniéndola cubrimos
un futuro cambio consistente en abrir una cuenta con un saldo inicial. Para el
caso actual bastaría con introducir valor cero para la variable saldo_inicial.
- Por la misma razón, se introducen los intereses y la penalización a través del
constructor.
- El método retirar devuelve un entero para que pueda saberse si hay saldo o no en la
cuenta en el método main e imprimir la información necesaria
Fundamentos de Programación II 22
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (VIII)
class Libreta_2000 extends Libreta_de_ahorro {
private double penalizacion; // Penalizacion por retirada
Fundamentos de Programación II 23
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (IX)
class Cuenta_corriente extends Cuenta_bancaria {
private Libreta_de_ahorro cuenta_asociada;
public Cuenta_corriente(int numero, double saldo_inicial,
Libreta_de_ahorro libreta) {
super(numero, saldo_inicial);
cuenta_asociada=libreta;
}
public Libreta_de_ahorro consultar_cuenta_asociada(){
return cuenta_asociada;
}
public int retirar(double cantidad) {
int control=1;
if (saldo < cantidad){
if (cuenta_asociada.consultar_saldo() < (cantidad-saldo) )
control=0;
else {
cuenta_asociada.retirar(cantidad-saldo);
saldo=0.0;
control=2;
}
}
else {
saldo-=cantidad;
}
return control;
}
} // Fin Cuenta_corriente
Fundamentos de Programación II 24
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (X)
class Herencia {
public static void main(String [] args) {
int control=0;
Libreta_de_ahorro libreta =
new Libreta_de_ahorro(12345, 2000, 4);
Libreta_2000 libreton = new Libreta_2000(23456, 2000, 8, 2);
Cuenta_corriente cuenta =
new Cuenta_corriente(34567, 2000, libreta);
control=libreta.retirar(100);
System.out.println("Ha solicitado retirar 100 euros de su
libreta");
if (control==0) {
System.out.println("No hay fondos suficientes en su libreta");
}
else {
System.out.println("Saldo en su libreta despues de la retirada:
"+libreta.consultar_saldo());
}
System.out.println();
Fundamentos de Programación II 25
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (XI)
control=cuenta.retirar(3000);
System.out.println("Ha solicitado retirar 3000 euros de su cuenta");
if (control==0) {
System.out.println("No hay fondos suficientes");
}
else {
if (control==1) {
System.out.println("Saldo despues de la retirada: "+
cuenta.consultar_saldo());
}
else {
System.out.println("No tiene saldo en la cuenta.\n
Retirando fondos de la cuenta asociada...");
System.out.println("Saldo en su cuenta después de la
retirada: "+ cuenta.consultar_saldo());
System.out.println("Saldo en su libreta asociada después de la
retirada: "+ libreta.consultar_saldo());
}
}
System.out.println();
Fundamentos de Programación II 26
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (XII)
System.out.println("Ha solicitado retirar 200 euros de su Libreta
2000");
System.out.println("Recuerde que la retirada le supone una
penalizacion del 2%");
control=libreton.retirar(200);
if (control==0) {
System.out.println("No hay fondos suficientes");
}
else {
System.out.println("Saldo despues de la retirada de su Libreta
2000: "+libreton.consultar_saldo());
}
System.out.println();
Fundamentos de Programación II 27
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (XIII)
libreton.calcular_intereses();
System.out.println("Actualizando intereses....");
System.out.println("Saldo después de actualizar intereses: "+
libreton.consultar_saldo());
System.out.println();
libreton.depositar(100);
}//fin main
} //fin clase
Fundamentos de Programación II 28
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 6 (XIV)
Ha solicitado retirar 100 euros de su libreta
Saldo en su libreta despues de la retirada: 1900.0
Actualizando intereses....
Saldo después de actualizar intereses: 1939.68
Fundamentos de Programación II 29
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 7
class Padre {
protected int aa=0;
public int aa() {
return aa;
}
}
class Hija extends Padre {
public Hija (int bb) {
this.aa=bb+1; //this no haría falta
}
}
class Nieta extends Hija {
public Nieta (int cc) {
super(cc+2);
}
}
class Familia {
public static void main(String [] args){
Hija h= new Hija(4); h= new Hija (4) bb=4 aa=bb+1=5
h=f(h);
System.out.println (h.aa()); 8
}
private static Nieta f (Padre h) {
Nieta n=new Nieta (h.aa());
N=new Nieta (5) cc=5
return n;
} super(5+2) bb=7 this.aa=7+1=8
}
Fundamentos de Programación II 30
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 8
Publicación
Tesis Revista
¿Qué métodos podrían ser invocados usando una variable polimórfica de tipo publicación?
Fundamentos de Programación II 31
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 9
¿Cuál de las siguientes afirmaciones es la única correcta?
a) Para que una clase sea abstract debe tener al menos un método
abstract
b) Se pueden crear objetos de una clase abstract
c) Se pueden crear referencias de una clase abstract
d) Un atributo private en una clase abstract puede ser heredado por una
subclase y modificado en esa subclase
Fundamentos de Programación II 32
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 10
Naturaleza Naturaleza n;
Animal a;
Herbívoro h;
Elefante e;
Rinoceronte r;
Animal
Hervíboro
Elefante Rinoceronte
Fundamentos de Programación II 33
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 11
Cuerda c;
In stru m en to Viento v;
{ a bs tra cta } Arpa a;
Instrumento i;
V ie n to C u e rda
A rpa
Fundamentos de Programación II 34
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 12 (I)
- Implemente el código de una interfaz llamada Primera que contenga dos
métodos A y B.
//Primera interfaz
interface Primera{
void A();
void B();
}
//Segunda interfaz
interface Segunda extends Primera{
void C();
}
Fundamentos de Programación II 35
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 12 (II)
- Escriba el código de otra clase llamada Objetos que use la segunda
interfaz. ¿Cuántos métodos debe implementar esta clase? Implemente
dichos métodos de forma que cada método imprima una línea indicando el
nombre del método.
Fundamentos de Programación II 36
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 12 (III)
- Cree un programa que utilice los métodos definidos.
class Ejercicio {
public static void main(String [ ] args){
Objetos objeto1= new Objetos();
objeto1.A();
objeto1.B();
objeto1.C();
}
}//Fin clase Ejercicio
El programa imprimirá:
Método A
Método B
Método C
Fundamentos de Programación II 37
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 13 (I)
Construya un programa que calcule el volumen molar de una sustancia a una presión y
temperatura dadas usando la ecuación de estado de un gas ideal:
pV=nNakT
donde p es la presión, V el volumen, n el número de moles, N a la constante de
Avogadro, k la constante de Boltzmann y T la temperatura.
Fundamentos de Programación II 38
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 13 (II)
import java.util.Scanner;
import java.util.Locale;
interface Constantes_fisicas {
double Na=6.023e23; // Cte de Avogadro en (partículas/mol)
double k=1.38066e-23; // Constante de Boltzmann en J/K
}
Fundamentos de Programación II 39
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 13 (III)
class Herencia implements Constantes_fisicas {
public static void main(String[] args) {
Scanner leer=new Scanner (System.in);
leer.useLocale(Locale.US);
double p, T, v;
System.out.println("Introduzca la presion en atmósferas y
la temperatura en grados Kelvin");
System.out.print ("p(atm)= ");
p=leer.nextDouble(); // 1Pa= 1 Newton/(m*m); 1atm = 101325 Pa
T=leer.nextDouble();
p=p*101325; //Conversión de atm a Pascales
Salida:
Volumen molar= 24.47 litros
Fundamentos de Programación II 41
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 14 (I)
class Ejercicio {
public static void main (String [] args) {
Vehiculo v= new Vehiculo("AAA", 1000);
Coche c = new Coche("BBB", 1000);
v.incrementar_precio(100);
System.out.print(v.devolver_marca()+” “);
System.out.println(v.devolver_precio());
c.incrementar_precio(100);
System.out.print(c.devolver_marca()+” “);
System.out.println(c.devolver_precio());
v=c;
v.incrementar_precio(100);
System.out.print(v.devolver_marca()+” “);
System.out.println(v.devolver_precio());
}
}
Fundamentos de Programación II 42
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 14 (II)
class Vehiculo {
protected String marca;
protected double precio;
public Vehiculo (String marca, double precio) {
this.marca=marca;
this.precio=precio;
}
public void incrementar_precio(double p) {
precio=precio+p;
}
public double devolver_precio(){
return precio;
}
public String devolver_marca(){
return marca;
}
}
class Coche extends Vehiculo {
public Coche (String marca, double precio){
super (marca,precio);
}
public void incrementar_precio(double p) {
precio=precio+2*p;
}
}
Fundamentos de Programación II 43
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 14 (III)
class Ejercicio {
public static void main (String [] args) {
Vehiculo v= new Vehiculo("AAA", 1000);
Coche c = new Coche("BBB", 1000);
v.incrementar_precio(100);
System.out.print(v.devolver_marca()+” “);
System.out.println(v.devolver_precio()); AAA 1100.0
c.incrementar_precio(100);
System.out.print(c.devolver_marca()+” “);
System.out.println(c.devolver_precio()); BBB 1200.0
v=c;
v.incrementar_precio(100);
System.out.print(v.devolver_marca()+” “);
System.out.println(v.devolver_precio()); BBB 1400.0
}
}
Fundamentos de Programación II 44
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 15 (I)
¿Cuál es el error del siguiente programa?
interface A {
double a=2.3;
void imprimeresultadoA () {
System.out.println ("valor de a"+ a);
}
}
interface B {
int b=435;
void imprimeresultadoB () ;
}
class AA implements A, B {
double aa=324.32;
public void imprimeresultadoA () {
System.out.println ("valor de a "+ a+ “ valor de aa "+ aa);
}
public void imprimeresultadoB () {
System.out.println ("valor de b "+ b+ “ valor de aa "+ aa);
}
}
Fundamentos de Programación II 45
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 15 (II)
class Principal {
public static void main (String [] args) {
AA ob1=new AA();
ob1.imprimeresultadoA();
ob1.imprimeresultadoB();
}
}
interface A {
double a=2.3;
void imprimeresultadoA ();
}
Fundamentos de Programación II 46
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (I)
Una tienda de informática vende dos tipos de artículos (software y hardware) ambos
caracterizados por su código (de tipo char) y su descripción.
En los productos software hay que indicar el tipo de producto (con una cadena)
En los hardware se debe indicar si es un periférico o no.
Para saber el precio de un artículo utilice una interface que indique que para un
artículo cuyo código es A el precio es 100.0 euros, si el código es B el precio es 50.3;
para un artículo con código C el precio es 150.50 euros.
a) Dibuje en UML los diagramas de las clases y las relaciones entre ellas. Para cada
clase debe indicar los atributos y métodos teniendo en cuenta que se puede consultar
y modificar cada atributo.
b) Implemente las clases y la interfaz.
c) Realice un programa principal donde cree un objeto software y otro hardware y
muestre el precio y demás características del objeto.
Fundamentos de Programación II 47
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (II)
a) Relación entre clases
Primera opción
H a rdwa re S o ftwa re
Fundamentos de Programación II 48
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (III)
a) Relación entre clases
Segunda opción
En este caso son directamente las clases Hardware y Software las que implementan la
interfaz, por tanto, la clase Producto no tendrá las constantes ni el método de la
interfaz y no debe ser abstracta.
Desventaja: Al no estar definido el método de la interfaz en la clase Producto no se
puede usar polimorfismo para acceder a ese método.
Pro du cto
H a rdwa re S o ftwa re
Fundamentos de Programación II 49
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (IV)
Escogemos la primera opción
<<interface>>
Precios
+A:double=100.0
+B:double=50.3
+C:double=150.5
+calcularPrecio():double
Producto {abstract}
#codigo:char
#descripcion:String
+ Producto(codigo:char,descripcion:String)
+ getCodigo():char
+ cambiarCodigo(nuevoCodigo:char):void
+ getDescripcion():String
+ cambiarDescripcion(nuevaDescripcion:String):void
Fundamentos de Programación II 50
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (V)
El método calcularPrecio() lo implementan Hardware y Software por eso aparece en el
diagrama UML de ambas clases
Hardware
-periferico:boolean
Hardware(codigo:char,descripcion:String,perifierico:boolean)
+ getPeriferico():boolean
+cambiarPeriferico(nuevoPeriferico:boolean):void
+calcularPrecio():double
Software
- tipo:String
Software(codigo:char,descripcion:String,tipo:Strin
g)
+ getTipo():String
+cambiarTipo(nuevoTipo:String):void
+calcularPrecio():double
Fundamentos de Programación II 51
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (VI)
b) Implementación de las clases y la interfaz
interface Precios{
double A=100.0;
double B=50.3;
double C=150.5;
double calcularPrecio();
}//fin interface
Recordatorio:
En una interfaz todas las “variables” son constantes (final) y públicas(public) por lo
que no hay que especificarlo en la interfaz.
Todos los métodos son públicos y abstractos por lo que tampoco se especifica.
Fundamentos de Programación II 52
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (VII)
abstract class Producto implements Precios{
protected char codigo;
protected String descripcion;
public Producto (char codigo, String descripcion){
this.codigo=codigo;
this.descripcion=descripcion;
}
public void cambiarCodigo(char nuevoCodigo){
codigo=nuevoCodigo;
}
public void cambiarDescripcion(String nuevaDescripcion){
descripcion=nuevaDescripcion;
}
public char getCodigo( ){
return codigo;
}
public String getDescripcion( ){
return descripcion;
}
}//fin Producto
Fundamentos de Programación II 53
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (VIII)
class Software extends Producto {
private String tipo;
public Software (char codigo, String descripcion, String tipo){
super(codigo, descripcion);
this.tipo=tipo;
}
public String getTipo(){
return tipo;
}
public void cambiarTipo(String nuevoTipo){
tipo=nuevoTipo;
}
public double calcularPrecio(){
double resultado;
if (codigo=='B') Método heredado de Producto que a
resultado=B; su vez lo heredó de la interfaz
else
resultado=C;
if (tipo=="ProgramaJuegos") //mejor tipo.equals("ProgramaJuegos")
resultado=resultado*1.05;
return resultado;
}
Fundamentos de Programación II 54
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (IX)
}//fin Software
Fundamentos de Programación II 55
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (X)
class Hardware extends Producto {
private boolean periferico;
public Hardware (char codigo, String descripcion,
boolean periferico){
super(codigo, descripcion);
this.periferico=periferico;
}
public boolean getPeriferico(){
return periferico;
}
public void cambiaPeriferico(boolean nuevoPeriferico){
periferico=nuevoPeriferico;
}
public double calcularPrecio(){
double resultado;
if (codigo=='A') Método heredado de Producto que a
resultado=A; su vez lo heredó de la interfaz
else
resultado=B;
if (periferico==true)
resultado=resultado*1.10;
return resultado;
}
Fundamentos de Programación II 56
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (XI)
public String toString(){
return "Hardware";
}
}//fin Hardware
Fundamentos de Programación II 57
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (XII)
c) Programa Principal: Creación de objetos
class Principal{
public static void main (String [] args){
Software obj1=new Software('C',"Juego de Rol", "ProgramaJuegos");
Hardware obj2=new Hardware('A', "ordenador“,false);
System.out.printf("El precio del producto %c es %.2f."
+ "\nEl producto es de tipo %s y su descripcion %s",
obj1.getCodigo(), obj1.calcularPrecio(),
obj1.getTipo(),obj1.getDescripcion());
Fundamentos de Programación II 58
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (XIII)
c) Programa Principal: Creación de objetos. Uso de polimorfismo
class Principal{
public static void main (String [] args){
Producto [] producto=new Producto [2];
producto[0]=obj0;
producto[1]=obj1;
Fundamentos de Programación II 59
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (XIV)
for (int i=0; i<producto.length;i++){
System.out.printf("\nEl precio del producto %c es %.2f"
+ " y su descripcion %s",
producto[i].getCodigo(),
producto[i].calcularPrecio(),
producto[i].getDescripcion());
if (producto[i].toString().equals("Software")) {
Fundamentos de Programación II 60
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 16 (XV)
Explicación:
En lugar de usar el método toString para averiguar de qué clase es el objeto que
estamos tratando se puede usar el operador de Java instanceof.
Fundamentos de Programación II 61
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (I)
Se pretende automatizar el sistema de una empresa dedicada al alquiler de viviendas.
Los tipos de viviendas que la empresa ofrece son pisos y chalets. De todas las
viviendas se registra su identificador (un valor entero), metros cuadrados y precio
mensual de alquiler. De los pisos se debe saber si están amueblados y el año de
construcción. Por otra parte, de los chalets se debe saber si tienen piscina. Para cada
tipo de vivienda también se desea conocer el nombre y DNI de los tres últimos
inquilinos. Se pide:
a) Dibujar el diagrama de clases indicando qué clases hay, la relación entre ellas y los
miembros (atributos y métodos) de cada clase usando notación UML. Considere
Inquilino como una clase
b) Implementar en Java todas las clases resultantes del diagrama. Todas las clases
deben implementar métodos de consulta para cada variable de ejemplar.
c) Escribir un programa principal en Java donde en una única matriz se guarde un
objeto piso y uno chalet. Posteriormente, se debe consultar usando esa matriz el
nombre y DNI de cada uno de los tres últimos inquilinos que ha tenido esa vivienda.
Fundamentos de Programación II 62
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (II)
a)Dibujar el diagrama de clases indicando qué clases hay, la relación entre ellas y los
miembros (atributos y métodos) de cada clase usando notación UML. Considere
Inquilino como una clase.
Fundamentos de Programación II 63
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (III)
- Atributos y métodos de las 4 clases
Fundamentos de Programación II 64
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (IV)
- Atributos y métodos de las 4 clases
Fundamentos de Programación II 65
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (V)
b) Implementación de las clases
class Inquilino{
private String nombre;
private String DNI;
Fundamentos de Programación II 66
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (VI)
class Vivienda{
protected int identificador;
protected double metros;
protected double precio;
protected Inquilino [] Inquilinos;
Fundamentos de Programación II 68
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (VIII)
class Piso extends Vivienda{
private boolean amueblado;
private int anio;
Fundamentos de Programación II 69
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (XI)
class Chalet extends Vivienda{
private boolean piscina;
public Chalet (int id, double m, double p,
Inquilino [] matriz, boolean pisci){
Fundamentos de Programación II 70
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (X)
c) Principal
class Principal{
public static void main( String args[]){
Inquilino [] matriz1= new Inquilino[3];
Inquilino [] matriz2= new Inquilino[3];
Fundamentos de Programación II 71
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 17 (XII)
Vivienda [] viviendas= new Vivienda[2];
viviendas[0]= new Piso (3, 95.5, 10000.0, matriz1,
true, 1990);
viviendas[1]= new Chalet (4, 100.6, 10000, matriz2,
true);
for (int i=0; i<=viviendas.length-1; i++){
for (int j=0; j<=2; j++){
System.out.print(
viviendas[i].get_nombre_inquilino(j) + " ");
System.out.print(
viviendas [i].get_DNI_inquilino (j)+ " " );
System.out.println();
}
System.out.println();
}
}// fin main
Fundamentos de Programación II 72
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 18 (I)
¿Qué imprime el siguiente programa?
Fundamentos de Programación II 73
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 18 (II)
class Principal {
public static void main(String [] args) {
int c=0,d=0;
Uno []lista=new Uno[2]; Matriz con referencias
lista [0]= new Dos(); polimórficas de clase Uno
lista [1]= new Tres();
for (int i=0; i<2; i++){
d=lista[i].devolver_suma(10,10);
System.out.printf("d=%d \n",d);
c=lista[i].devolver_suma(10,10,5,5);
System.out.printf("c=%d \n",c);
}
}
}
Fundamentos de Programación II 75
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 18 (IV)
a) Usar un molde de tipo(clase) Tres sobre lista[1] que es de clase Uno
d=26
d=14
c=10
Fundamentos de Programación II 76
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 19 (I)
¿Por qué da error el siguiente programa?
class A {
private
protected intint
l=2;l=2;
public int get_l(){ Solución: Cambiar el
return l; modificador de l de private
} a protected
}
class B extends A {
public int calcular_m(int x) { ¡Error! La variable l es
int m=l+x;
return m; privada, no se hereda. Por
} tanto, no se puede usar en
} la clase B
class Principal {
public static void main(String [] args) {
int l,m;
B o1=new B();
¿Existe otra solución sin modificar el modificador de
l=o1.get_l();
visibilidad de l?
System.out.printf("l=%d \n",l);
m=o1.calcular_m(2);
System.out.printf("m=%d \n",m);
} SI
}
Usar en la clase B, el método get_l() que se hereda al
ser público.
Fundamentos de Programación II 77
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 19 (II)
class A {
private int l=2;
public int get_l(){
return l;
}
}
class B extends A {
public int calcular_m(int x) {
int m=get_l()+x;
return m;
}
}
class Principal {
public static void main(String [] args) {
int l,m;
B o1=new B();
l=o1.get_l();
System.out.printf("l=%d \n",l);
m=o1.calcular_m(2);
System.out.printf("m=%d \n",m); Solucionado el
}
} problema, el
programa imprimiría:
l=2
m=4
Fundamentos de Programación II 78
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 20 (I)
¿Qué imprime el siguiente programa?
class Uno {
protected int d1,d2;
public int get_suma(){
return d1+d2;
}
}
class Dos extends Uno {
public void cambiar_ds(int x,int y) {
d1=x+3;
d2=y+3;
}
}
class Tres extends Dos {
public void cambiar_ds(int x,int y, int i, int j) {
d1=d1+x-i;
d2=d2+y-j;
}
}
Fundamentos de Programación II 79
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 20 (II)
class Principal {
public static void main(String [] args) {
int c,d;
Dos obj2=new Dos();
Tres obj3=new Tres();
d1=x+3=5; d2=y+3=5
Invocamos al método de la clase
obj2.cambiar_ds(2,2); Dos
Invocamos al método en la clase
d1=x+3=6;d2=y+3=6
obj3.cambiar_ds(3,3); Tres heredado de la clase Dos
Invocamos al método sobrecargado
d1=d1+x-i=6+10-7=9
obj3.cambiar_ds(10,9,7,8);
en la clase Tres
d2=d2+y-j=6+9-8=7
d=obj2.get_suma();
c=obj3.get_suma(); d1+d2=10 d1+d2=16
System.out.printf("d=%d \nc=%d\n",d,c);
}
}
d=10
c=16
Fundamentos de Programación II 80
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 21 (I)
¿Cuál es el resultado del siguiente programa?
class Principal {
public static void main(String [] args) {
double cantidad_ini,cantidad_inc;
Coche c1=new Coche();
cantidad_ini=c1.devolver_cantidad();
cantidad_inc=c1.cambiar_cantidad(20.17);
System.out.printf("%.1f %.1f",cantidad_ini,
cantidad_inc);
}
}
class Vehiculo {
private double c=10.11;
public double devolver_cantidad(){
return c;
}
}
class Coche extends Vehiculo {
public double cambiar_cantidad(double p){
return devolver_cantidad()+p;
}
}
Fundamentos de Programación II 81
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 21 (II)
a) 10,1 30,3
b) 10,1 30,2
c) Error: No se puede usar el método devolver_cantidad en la clase Coche
porque la variable c es private
d) Error: No se puede invocar directamente en el return de la clase Coche al
método devolver_cantidad
Fundamentos de Programación II 82
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 22
¿Cuál es el error del siguiente programa?
interface Constantes {
double PI=3.141593;
double e=2.718282;
double FI=1.618034;
}
interface Metodos {
void metodoA () ;
double metodoB ();
}
class Calculos implements Metodos, Constantes {
public double metodoB () {
return PI*e*FI;
}
}
class Ejercicio {
public static void main (String [] args) {
A a1= new A(7);
A a2= new B(9);
B b1= new B(10);
System.out.print(a1.get_p1()+" ");
System.out.print(a2.get_p1()+" ");
System.out.print(b1.get_p1()+" ");
a1=b1;
System.out.print(b1.get_p2()+" ");
}//fin main
}
Fundamentos de Programación II 84
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 23 (II)
final class A{ Nota: Las variables de ejemplar deben
static int p1=0; llevar el atributo de visibilidad. En
public A (int v){ este caso no lo llevan, Esto implica
p1=v; que son vistas en clases que estén en
} el mismo paquete, pero no implica
public int get_p1(){ que las vean las clases hijas (si éstas
return p1; no están en el mismo paquete). En el
} caso de la clase B debe ser private
}
class B extends A {
int p2=0;
a) 10 10 10 20
public B(int p){
b) 7 9 10 20
super(p);
c) Se produce un error porque las
p2=p;
variables de las clases no tienen
}
visibilidad declarada
public int get_p2(){
d) Se produce un error porque una
return p2+p1;
clase declarada como final no se
}
puede heredar
}
Si se elimina final: 10 10 10 20
Fundamentos de Programación II 85
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 24 (I)
¿Cuál es el resultado del siguiente programa?
class Principal {
public static void main (String [] args){
Ordenador orde=new Portatil (34,870.12, 2.3);;
System.out.printf("Codigo: %d \nPrecio_total: %.2f",
orde.devuelvecodigo(),
orde.calcula_preciototal(5));
}
}//fin clase Principal
Fundamentos de Programación II 86
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 24 (II) Variables privadas. No
class Ordenador { se heredan. Son
private int codigo; visibles a través de los
private double precio; métodos de consulta
public Ordenador (int codigo,double precio){
this.codigo=codigo;
this.precio=precio;
}
public int devuelvecodigo(){
return codigo;
}
public double devuelveprecio(){
return precio;
}
final public double calcula_preciototal(int unidades){
return precio*unidades;
}
}//fin clase Ordenador
Fundamentos de Programación II 87
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 24 (III)
class Portatil extends Ordenador {
private double peso;
public Portatil(int codigo, double precio,double peso) {
super (codigo,precio);
this.peso=peso;
}
public double devuelvepeso(){
return peso;
}
public double calcula_preciototal(int unidades){
return devuelveprecio()*unidades*.90;
}
}//clase Portatil
¡ERROR!
Fundamentos de Programación II 88
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (I)
Una empresa de envío de paquetes tiene varias sucursales en todo el país.
Cada sucursal está definida por su número de sucursal, dirección y ciudad.
Además, conviene distinguir si la sucursal es Principal o Secundaria. En
caso de ser sucursal Principal se debe saber el número de sucursales
secundarias que dependen de ella y en el caso de la Secundaria es necesario
saber el nombre de la sucursal de la que depende. Para calcular el precio que
cuesta enviar cada paquete, las sucursales tienen en cuenta el peso del
paquete y la prioridad, sabiendo que se cobra 1 euro por kilo, 10 euros más
si la prioridad es alta y 20 si es Express. Cada paquete enviado tendrá un
número de referencia.
Fundamentos de Programación II 89
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (II)
-Construya un diagrama UML que indique la relación entre las clases.
-Cree un diagrama UML para cada clase que incluya todos sus miembros.
-Implemente las clases correspondientes añadiendo métodos para consultar
todos los atributos y para modificar el peso y la prioridad de los paquetes.
-Método main donde se cree un objeto sucursal Secundaria que dependa de
una sucursal Principal. El objeto Sucursal Secundaria deberá crearse
mediante una referencia polimórfica.
-Imprimir el precio y el peso de los paquetes que se reciban en dicha
sucursal.
-La información de los paquetes deberá guardarse en una matriz.
-Controlar que la prioridad del paquete sea 0, 1 ó 2.
- Tanto los datos de la sucursal como los de los paquetes deberán
introducirse por teclado.
Nota: No considere que paquete es un atributo de sucursal.
Fundamentos de Programación II 90
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (III)
1.Diagrama UML de relaciones entre clases
2.Diagrama UML de cada clase con atributos y métodos
Paquete
-referencia:int
-peso:double
-DNI:String
-prioridad:int
+Paquete (referencia:int, peso:double, DNI:String,
pri:int)
+devolver_referencia():int
+devolver_peso ():double
+devolver_DNI():String
+devolver_prioridad():int
+cambiar_peso(peso:double):void
+cambiar_prioridad(pri:int):void
Fundamentos de Programación II 91
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (IV)
Sucursal
-numero:int
-direccion:String
-ciudad: String
+Sucursal (num:int, dire:String, ciudad:String)
+devolver_numero ():int
+devolver_direccion():String
+devolver_ciudad():String
+calcular_precio(t:Paquete):double
Principal
-numeroS:int
+Principal (num:int, dire:String, ciudad:String, nS:int)
+devolver_numeroS ():int
Secundaria
-nombreP:String
+Secundaria (num:int, dire:String, ciudad:String, nP:String)
+devolver_nombreP ():String
Fundamentos de Programación II 92
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (V)
3. Implementación de las clases
class Paquete{
Fundamentos de Programación II 93
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (VI)
public double get_peso (){
return peso;
}
public int get_prioridad (){
return prioridad;
}
public void set_peso (double p){
peso=p;
}
Fundamentos de Programación II 94
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (VII)
class Sucursal{
private int numero;
private String direccion;
private String ciudad;
Fundamentos de Programación II 95
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (VIII)
public double calcula_precio (Paquete t){
double precio;
precio= t.get_peso();
return precio;
}
}//fin clase Sucursal
Fundamentos de Programación II 96
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (IX)
class SPrincipal extends Sucursal{
Fundamentos de Programación II 97
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (X)
class Secundaria extends Sucursal{
super(n, d,c);
nombrePrincipal=nombre;
}
Fundamentos de Programación II 98
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (XI)
class Ejecicio {
public static void main (String [] args){
Scanner lectura=new Scanner (System.in);
Sucursal s1;
Paquete [] paquetes;
boolean logica;
System.out.println ("Introduzca los datos de la sucursal
Secundaria");
System.out.println("Numero?");
int n=lectura.nextInt();
System.out.println("Direccion?");
String dir=lectura.next();
System.out.println("Ciudad?");
String ciu=lectura.next();
System.out.println("SucursalPrincipal?");
String sp=lectura.next();
s1=new Secundaria (n,dir,ciu,sp);
Fundamentos de Programación II 99
© A. Niño-Universidad de Castilla-La Mancha
Ejercicio 25 (XII)
0..n
Documento
#fecha:String
#titulo:String
#valor:double
#prestado:boolean
+Documento (fecha:String, titulo:String, valor:double)
+devolverFecha():String
+devolverTtitulo():String
+devolverValor():double
+devolverPrestado():boolean
+cambiarPrestado():void
+penalizacion():double
Libro
-autor:String
DVD
-director:String
- Si la clase padre tiene un constructor para inicializar sus variable, siempre se usa
super para inicializar las variables del constructor de la clase hija
-No tiene sentido que penalización sea una variable de ejemplar de socio. No es una
característica de socio.
interface Prestable {
void prestar();
void devolver();
boolean prestado();
}
System.out.println("Publicaciones en la biblioteca\n");
for (Publicacion p: pub){
System.out.println(p.toString());
}
npres=calcularprestados(pub);
System.out.println(“\nEl numero de publicaciones prestadas
es de: "+npres);
}//fin main
class Principal {
public static void main (String [] args){
Rueda r1=new Rueda (16, "R1");
Rueda r2=new Rueda (16, "R1");
Rueda r3=new Rueda (17, "R2");
System.out.println(r1.equals(r3));
System.out.println(r1.equals(r2));
r1=r3;
System.out.println(r1.equals(r3));
}
}//fin clase Principal
class Rueda {
private int dimension;
private String ID;
public Rueda (int dimension,String ID){
this.dimension=dimension;
this.ID=ID;
}
public int get_dimension(){
return dimension;
}
public String get_ID(){
return ID;
}
logica=true;
}
}
return logica;
}//finMétodo
método equals
equals() sobrescrito de la clase Object.
CuandoRueda
}//fin clase se comparan dos objetos que contienen la misma información
pero son objetos distintos hay que escribir el método equals comparando
todos los atributos.
false Sin embargo cuando dos objetos son el mismo (distintas referencias para
true el mismo objeto) es suficiente con hacer la comparación de la forma
true this==o.
burbuja(productos);
Ordenados por ID
4: Teclado 500.2 euros
8: Tarjeta gráfica 139.15 euros
12: Monitor 149.0 euros
13: Impresora 105.45 euros
21: Portátil 488.9 euros
Existen varios algoritmos más eficientes que esté. Los más básicos son el de
selección y el de insercción. Hay varios otros más eficientes que daréis en 2º
(Quicksort por ejemplo)
for(Producto p : productos){
System.out.println(p.toString());
}
Se debe usar
Se imprimiría:
Para ordenar por nombre basta sustituir el método compareTo() del programa
anterior por: