Documente Academic
Documente Profesional
Documente Cultură
PROGRAMACIN ORIENTADA A
OBJETOS USANDO HERENCIA
5.1 HERENCIA
5.1.1 Funcionamiento bsico
La herencia es un mecanismo muy importante en la programacin orientada
a objetos. Gracias a la herencia podemos crear clases que especializan a otras
previamente definidas.
Pongamos como ejemplo una clase Publicacion en la que se determinan
propiedades bsicas comunes a todas las publicaciones (libros, revistas, peridicos,
etc.). Entre estas propiedades pueden definirse el nmero de pginas y el precio de la
publicacin:
1
2
3
4
class Publicacion {
public int NumeroDePaginas;
public float Precio;
}
Libro
Periodico
BOBADILLA
1 class Publicacion2 {
2
private int NumeroDePaginas;
3
private float Precio;
4
5
public int DimeNumeroDePaginas(){
6
return NumeroDePaginas;
7
}
8
9
public void PonNumeroDePaginas(int NumeroDePaginas){
10
this.NumeroDePaginas = NumeroDePaginas;
11
}
12
13
public float DimePrecio(){
14
return Precio;
15
}
16
17
public void PonPrecio(float Precio){
18
this.Precio = Precio;
19
}
20 }
1 class Periodico2 extends Publicacion2 {
2
private String Nombre;
3
private String Fecha;
4
5
public String DimeNombre() {
6
return Nombre;
7
}
8
9
public void PonNombre(String Nombre) {
10
this.Nombre = Nombre;
11
}
12
13
public String DimeFecha() {
14
return Fecha;
15
}
16
17
public void PonFecha(String Fecha) {
18
this.Fecha = Fecha;
19
}
20 }
1
2
3
4
5
6
7
8
9
class PruebaPeriodico2 {
public static void main(String[] args) {
Periodico2 MiPeriodico = new Periodico2();
MiPeriodico.PonNumeroDePaginas(65);
MiPeriodico.PonPrecio(0.9f);
MiPeriodico.PonFecha("22/02/2003");
System.out.println(MiPeriodico.DimeNumeroDePaginas());
}
}
Palabra
reservada
private
Ejemplo
BOBADILLA
1 class Publicacion3 {
2
private int NumeroDePaginas;
3
private float Precio;
4
5
Publicacion3() {
6
NumeroDePaginas = 0;
7
Precio = 0f;
8
}
9
10
Publicacion3(int NumeroDePaginas) {
11
PonNumeroDePaginas(NumeroDePaginas);
12
}
13
14
Publicacion3(float Precio) {
15
PonPrecio(Precio);
16
}
17
18
Publicacion3(int NumeroDePaginas, float Precio) {
19
this(NumeroDePaginas);
20
PonPrecio(Precio);
21
}
22
23
Publicacion3(float Precio, int NumeroDePaginas) {
24
this(NumeroDePaginas,Precio);
25
}
26
27
public int DimeNumeroDePaginas(){
28
return NumeroDePaginas;
29
}
30
31
public void PonNumeroDePaginas(int NumeroDePaginas){
32
this.NumeroDePaginas = NumeroDePaginas;
33
}
34
35
public float DimePrecio(){
36
return Precio;
37
}
38
39
public void PonPrecio(float Precio){
40
this.Precio = Precio;
41
}
42 }
BOBADILLA
39
return Fecha;
40
}
41
42
public void PonFecha(String Fecha) {
43
this.Fecha = Fecha;
44
}
45 }
class PruebaPeriodico3 {
public static void main(String[] args) {
Periodico3 PeriodicoA = new Periodico3();
Periodico3 PeriodicoB = new Periodico3("El Mundo",
"12/08/2003");
5
Periodico3 PeriodicoC = new Periodico3(64, 0.9f);
6
Periodico3 PeriodicoD = new
Periodico3("El Pais","7/6/2003",45,0.9f);
7
Imprimir(PeriodicoA);
8
Imprimir(PeriodicoB);
9
Imprimir(PeriodicoC);
10
Imprimir(PeriodicoD);
11
}
12
13
private static void Imprimir(Periodico3 Periodico) {
14
String Nombre, Fecha;
15
int NumeroDePaginas;
16
float Precio;
17
Nombre = Periodico.DimeNombre();
18
Fecha = Periodico.DimeFecha();
19
NumeroDePaginas = Periodico.DimeNumeroDePaginas();
20
Precio = Periodico.DimePrecio();
21
System.out.println(Nombre+", "+Fecha+",
"+NumeroDePaginas+", "+Precio);
22
}
23 }
BOBADILLA
5.2 EJEMPLOS
En este apartado se muestran dos ejemplos sencillos de herencia. Los
ejemplos son muy parecidos entre s, con la intencin de que el lector pueda realizar
el segundo tomando como referencia el primero de ellos.
Circulo
Rectngulo
BOBADILLA
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 }
Figura(Color color) {
EstableceColor(color);
}
Figura(Color color, int[] Posicion) {
EstableceColor(color);
EstableceCentro(Posicion);
}
public void EstableceColor(Color color) {
ColorFigura = color;
}
public Color DimeColor() {
return ColorFigura;
}
public void EstableceCentro(int[] Posicion) {
this.Posicion[0] = Posicion[0];
this.Posicion[1] = Posicion[1];
}
public int[] DimeCentro() {
return Posicion;
}
import java.awt.Color;
public class Circulo extends Figura
private double Radio;
Circulo(double Radio) {
EstableceRadio(Radio);
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 }
}
Circulo(double Radio,Color color) {
super(color);
EstableceRadio(Radio);
}
Circulo(double Radio, Color color, int[] Posicion) {
super(color, Posicion);
EstableceRadio(Radio);
}
public void EstableceRadio(double Radio) {
this.Radio = Radio;
}
public double DimeRadio() {
return Radio;
}
Circulo es una clase derivada de Figura (lnea 3) que incorpora una nueva
propiedad Radio (lnea 4) a las heredadas de su superclase (ColorFigura y
Posicion). Los mtodos pblicos EstableceRadio y DimeRadio permiten la
actualizacin y acceso a la propiedad privada Radio .
Se ha definido un constructor que permite instanciar un crculo con un radio
determinado, dejando la posicin central y color a sus valores por defecto (lnea 6).
El siguiente constructor (lnea 10) permite establecer el radio y el color, mientras
que el ltimo constructor (lnea 15) nos ofrece la posibilidad de asignar valores a
todas las propiedades accesibles en la clase Circulo .
La ltima clase de este ejemplo especializa a Figura, definiendo objetos de
tipo Rectangulo. Esta clase es similar a Circulo , aunque aqu se establece la longitud
de los lados de un rectngulo en lugar del radio de un crculo. El cdigo de la
subclase es:
1
2
3
4
5
6
7
8
9
import java.awt.Color;
public class Rectangulo extends Figura {
private double[] Lados = new double[2];
Rectangulo(double[] Lados) {
EstableceLados(Lados);
}
BOBADILLA
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 }
import java.awt.Color;
public class PruebaFiguras {
public static void main(String[] args) {
int[] Posicion = {10,20};
double[] Lados = {50d,100d};
Circulo MiCirculo = new Circulo(3d,Color.red,Posicion);
Rectangulo MiRectangulo = new
Rectangulo(Lados,Color.blue,Posicion);
System.out.println(MiCirculo.DimeRadio());
int[] Centro = MiCirculo.DimeCentro();
System.out.println(Centro[0]);
System.out.println(Centro[1]);
15
System.out.println(MiRectangulo.DimeColor());
16
17
}
18 }
5.2.2 Vehculos
En este ejemplo se pretende definir clases que implementen algunas
caractersticas de diferentes tipos de vehculos. Crearemos una clase Vehiculo que
contendr propiedades bsicas comunes a todos los vehculos y actuar de
superclase de las distintas clases derivadas (Camion, Motocicleta , etc.).
La superclase Vehiculo contendr propiedades que establezcan el color del
vehculo, el nmero de ruedas que utiliza, la cilindrada que tiene y la potencia que
ofrece. Adems contar con los mtodos y constructores que se considere
necesarios.
La clase derivada Camion establecer una nueva propiedad que indique el
nmero de ejes que posee el camin, junto a los constructores y mtodos que se
consideren adecuados.
La clase derivada Motocicleta contendr una propiedad que albergue el
nmero de ocupantes permitido que puede transportar cada motocicleta.
BOBADILLA
Vehiculo
Camion
Motocicleta
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 }
}
public void EstableceColor(Color color) {
ColorVehiculo = color;
}
public Color DimeColor() {
return ColorVehiculo;
}
public byte DimeNumRuedas() {
return NumRuedas;
}
public short DimeCilindrada() {
return Cilindrada;
}
public short DimePotencia() {
return Potencia;
}
BOBADILLA
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 }
}
Camion(Color color, byte NumeroDeRuedas,
byte NumeroDeEjes, short Cilindrada,
short Potencia) {
super(color,NumeroDeRuedas,Cilindrada,Potencia);
EstableceNumeroDeEjes(NumeroDeEjes);
}
public byte DimeNumeroDeEjes() {
return NumeroDeEjes;
}
public void EstableceNumeroDeEjes(byte NumeroDeEjes) {
this.NumeroDeEjes = NumeroDeEjes;
}
28
29
public byte DimeNumeroDePlazas() {
30
return NumeroDePlazas;
31
}
32
33 public void EstableceNumeroDePlazas(byte NumeroDePlazas) {
34
this.NumeroDePlazas = NumeroDePlazas;
35
}
36
37 }
Resultado:
BOBADILLA
5.3 POLIMORFISMO
5.3.1 Conceptos
El polimorfismo, desde un punto de vista de orientacin a objetos, permite
que clases de diferentes tipos puedan ser referenciadas por una misma variable. En
el siguiente ejemplo, una instancia de la clase Figura (MiFigura) podr referenciar a
propiedades y mtodos implementados en las clases Circulo y Rectngulo.
BOBADILLA
5.3.2 Ejemplo
Para acabar de ilustrar la forma de utilizacin del polimorfismo, vamos a
ampliar las clases Figura, Circulo y Rectangulo implementadas en la leccin
anterior, de manera que contengan un mtodo Perimetro que calcule el permetro de
cada tipo de figura (crculos y rectngulos):
La clase Figura debe contener un mtodo Perimetro para satisfacer las
reglas de utilizacin del polimorfismo en Java. Ntese que nunca se va a ejecutar el
cdigo de este mtodo, se ejecutar el cdigo de los mtodos Perimetro de las
subclases. Cuando expliquemos clases abstractas mejoraremos este aspecto.
1 import java.awt.Color;
2
3 public class PolimorfismoFigura {
4
5
// Los mismos miembros que en la clase Figura,
6
// modificando el nombre de los constructores
7
8
public double Perimetro() {
9
return 0d;
10
}
11
12 }
import java.awt.Color;
public class PolimorfismoCirculo extends PolimorfismoFigura
{
4
5
6
7
8
9
10
11
12 }
import java.awt.Color;
public class PolimorfismoRectangulo extends
PolimorfismoFigura {
4
5
6
7
8
9
10
11
12 }
BOBADILLA
BOBADILLA
import java.awt.Color;
abstract public class AbstractoVehiculo {
// Los mismos constructores y metodos que en la clase
// Vehiculo
// Tambien cambiamos el nombre de los constructores
6
7
8
abstract public float Impuesto();
9
10 }
import java.awt.Color;
public class ACamion extends AbstractoVehiculo {
6
7
8
9
10
11
12
13
14 }
BOBADILLA
import java.awt.Color;
public class AMotocicleta extends AbstractoVehiculo {
// Los mismos constructores y metodos que en la clase
// Motocicleta
// Tambien cambiamos el nombre de los constructores
6
7
8
9
10
11
12 }
Para
probar
las
clases
anteriores
empleamos
el
fichero
APruebaVehiculos.java que contiene declaraciones e instanciaciones de diversos
objetos camin y motocicleta. Obsrvese como en la lnea 5 se declara una variable
de tipo AbstractoVehiculo (clase abstracta) y se instancia como tipo Amotocicleta
(clase no abstracta), con el fin de poder utilizar posteriormente el mtodo Impuesto
de manera polimrfica. En las lneas 7, 9, 11 y 14 se realizan acciones similares a la
descrita.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.awt.Color;
public class APruebaVehiculos {
public static void main(String[] args) {
AbstractoVehiculo MotoBarata =
new AMotocicleta(Color.red,(short)125,(short)25);
AMotocicleta MotoBarata2 =
new AMotocicleta(Color.red,(short)125,(short)25);
AbstractoVehiculo MotoCara = new
AMotocicleta(Color.yellow,(short)1000,(short)90);
AbstractoVehiculo CamionNormal = new
ACamion(Color.red,(byte)4,(byte)2,
(short)4000,(short)300);
AbstractoVehiculo CamionEnorme = new
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
}
34 }
ACamion(Color.red,(byte)24,(byte)6,
(short)15000,(short)800);
AMotocicleta InstanciaMotoBarata =
(AMotocicleta) MotoBarata;
InstanciaMotoBarata.EstableceNumeroDePlazas((byte)1);
System.out.println(InstanciaMotoBarata.
DimeNumeroDePlazas());
MotoBarata2.EstableceNumeroDePlazas((byte)1);
System.out.println(MotoBarata2.DimeNumeroDePlazas());
System.out.println(((ACamion)CamionEnorme).
DimeNumeroDeEjes());
System.out.println(MotoBarata.Impuesto());
System.out.println(MotoCara.Impuesto());
System.out.println(CamionNormal.Impuesto());
System.out.println(CamionEnorme.Impuesto());
System.out.println(InstanciaMotoBarata.Impuesto());
5.4.3 Interfaces
Los interfaces son colecciones de constantes y mtodos abstractos. Los
mtodos son siempre pblicos y abstractos (no es necesario definirlos como tal) y las
constantes son siempre pblicas, estticas y, por supuesto, final (tampoco es
necesario especificar sus atributos de acceso y modificadores).
Los interfaces proporcionan un mecanismo de herencia mltiple que no
puede ser utilizado empleando nicamente clases. Es necesario saber que este
mecanismo proporcionado por Java es muy limitado respecto a las posibilidades que
ofrece la herencia mltiple de la programacin orientada o objetos; sin embargo,
permite afrontar de manera elegante diferentes situaciones de diseo y
programacin.
La sintaxis de definicin de un interfaz es:
public interface Nombre {
// constantes y metodos abstractos
}
BOBADILLA
BOBADILLA
31
32
33
}
34
35 }
5.4.4 Ejercicio
Vamos a definir dos interfaces (ItfImpresion e ItfImpresion2)
extremadamente sencillos. Cada uno de ellos consta de un solo mtodo, diseado
para imprimir un texto: (Imprimir e ImprimirBonito). Despus crearemos una serie
de clases para practicar con el mecanismo de implementacin de interfaces. El
diagrama de clases e interfaces presenta el siguiente aspecto:
1
2
3
1
2
3
4
5
BOBADILLA
2
3
4
5
6
7
8
9
10
11
12
13 }