Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La clase de la cual se deriva otra clase se denomina La subclases heredan propiedades de su súperclase.
clase base, súperclase o clase padre. Una subclase, respecto de su súperclase:
Agrega nuevas propiedades
Una clase derivada de una súperclase recibe también Modifica propiedades heredadas.
el nombre de subclase o clase hija.
Patente
Marca
Súperclase -----
Vehículo Clase base Avanza
Clase padre Vehículo
Subclase
Camión Clase derivada Patente
Clase hija Camión Marca
Carga máxima
-----
La herencia aplica en relaciones de naturaleza B es un Avanza
tipo de A Activa tolva
Una clase es subclase de una única súperclase. Una clase es subclase de más de una súperclase.
Vehículos Vehículos
terrestres acuáticos
Vehículo
Vehículos
anfibios
Camión
Java no soporta la herencia múltiple.
La herencia organiza clases bases y derivadas en Determinar si en las siguientes situaciones existe una
jerarquías de clases. relación de herencia entre las clases (indicadas en negrita):
+ Carrera
+ set y get Carrera
7
Electrodoméstico
Horno Microondas
Negocio X 8
Ejemplo (2/2) Implementación de jerarquías de herencia
Determinar si en las siguientes situaciones existe una Para crear una subclase a partir de una superclase, en
relación de herencia entre las clases (indicadas en negrita): Java la subclase debe declararse:
Caso 4 Caso 5 Caso 6
Los Archivos Un Avión tiene Una Gaviota vuela.
Multimediales pueden Fuselaje, Alas y Una Abeja vuela y
public class NombreSubclase extends NombreSuperclase
ser Imágenes o Motores. además tiene aguijón.
Música. Las imágenes
pueden ser a Color o
Blanco y Negro. Ejemplo:
X X
Multimedia
Persona
public class Alumno extends Persona
Música Imagen
Presentación Ejercicio
Implementación Implementación
Autobús Camión:
public class Autobus extends Vehiculo{ public class Camion extends Vehiculo{
Entonces una aplicación podría realizar lo Suponga que se desea agregar al sistema un
siguiente: Camión con compartimientos, el cual posee
public class Ejemplo {
patente, marca, carga máxima y una cantidad de
public static void main( String arg[]){ compartimientos. Este camión es capaz de calcular
…
Autobus bus1 = new Autobus();
la capacidad de carga por compartimiento
bus1.setPatente( “AX1313” ); Métodos heredados (equivalente a la carga total, dividida por la
bus1.setMarca( “Mercedes” ); de Vehículo
bus1.setAsientos( 40 ); cantidad de compartimientos). Además provee un
… método que retorna un String de descripción,
Camion cam1 = new Camion();
cam1.setPatente( “BX1515” ); Métodos heredados compuesto por Marca + Cantidad de
cam1.setMarca( “Iveco” ); de Vehículo
compartimientos
cam1.setCarga( 2000 );
…
}
} ¿Qué se debe hacer?
Franco Guidi Polanco 21 Franco Guidi Polanco 22
Análisis Implementación
La implementación de subclases en Java, cuando la nombre = ""; } public void setRolUCV(String r){
public void setRut(String r){ rolUCV = r;
súperclase posee variables de instancia privadas. rut = r; } }
public String getRut(){ public String getRolUCV(){
La relación entre constructores de súperclases y return rut; } return rolUCV;
subclases. public void setNombre(String n){
nombre = n; }
}
public String quiénSoy(){
La relación de las clases con la clase Object. public String getNombre(){
}
return rut + nombre + rolUCV;
return nombre; }
} }
Súperclase Subclase
Franco Guidi Polanco 27 Franco Guidi Polanco 28
Miembros heredados (verdad parcial) Miembros no heredados
Ejemplo 1: Ejemplo 2:
public class Persona { public class Alumno extends Persona { public class Persona { public class Alumno extends Persona {
private String rut; private String rolUCV; private String rut; private String rolUCV;
private String nombre; private String nombre;
public Alumno() { public Alumno(String r, String n,
public Persona(String r, String n) { super( 000000-0 , N/A ); public Persona(String r, String n) { String l) {
rut = r; rolUCV = 000000-0"; rut = r; super( r, n );
nombre = n; } nombre = n; rolUCV = l;
} } }
public void setRolUCV(String r){ public void setRolUCV(String r){
public void setRut(String r){ rolUCV = r; } public void setRut(String r){ rolUCV = r;
rut = r; } public String getRolUCV(){ rut = r; } }
public String getRut(){ return rolUCV; } public String getRut(){ public String getRolUCV(){
return rut; } return rut; } return rolUCV;
public void setNombre(String n){ public String quiénSoy(){ public void setNombre(String n){ }
nombre = n; } return getRut() + getNombre() nombre = n; } public String quiénSoy(){
public String getNombre(){ + rolUCV; public String getNombre(){ return getRut() + getNombre()
return nombre; } } return nombre; } + rolUCV;
} } } }
}
Todo subclase debe incluir una referencia super a algún Dos clases equivalentes:
constructor de la superclase.
public class Alumno extends public class Alumno extends
Persona { Persona {
Si no se incluye la referencia super, Java incluye private String rolUCV; private String rolUCV;
automáticamente una referencia al constructor sin
public Alumno() { public Alumno() {
parámetros de la superclase. Es decir incluye: super(); rolUCV = 000000-0";
super() }
rolUCV = 000000-0"; }
¿Qué pasa en el siguiente caso? En Java toda clase extiende otra clase.
public class Persona { public class Alumno extends
Las clases que no declaran extender a otras,
Persona { extienden a la clase Object (del package
private String rut;
private String nombre; private String rolUCV; java.lang).
public Persona(String r, String n) {
rut = r;
public Alumno() {
rolUCV = 000000-0";
Object es la superclase (directa o indirecta) de
nombre = n; } todas las clases.
}
public void setRut(String r){
rut = r; } No compila
public void setRolUCV(String r){
rolUCV = r; }
Todas las clases son subclases de Object o de otra
public String getRut(){
Java incluyerut;
return automáticamente
} public public String getRolUCV(){
Alumno() { subclase.
return rolUCV; }
public
una super(), pero a n){ super();
void setNombre(String
referencia
nombre = n; } public String quiénSoy(){
un constructor inexistente en la rolUCV = 000000-0";
public String getNombre(){
súperclase.
return getRut() + getNombre() Por lo tanto: todos los constructores incluyen
return nombre; } } + rolUCV;
(explícitamente o no) una referencia al constructor de su
}
} } superclase.
Franco Guidi Polanco 39 Franco Guidi Polanco 40
Herencia y constructores: la verdad total
Object
Personaje clase!
+getNombre(): String
+getEnergia(): int
Visibilidad
+alimentarse(energiaNueva:int)
privada (-)! - nombre: String Variables de +consumirEnergia(gastoEnergia:int)
- energía: int instancia! +Personaje(nombre:String, energia:int)
Visibilidad
pública (+)! +getNombre(): String Métodos y
+getEnergia(): int constructores!
+alimentarse(energiaNueva:int)
+consumirEnergia(gastoEnergia:int) Guerrero Mago
+Personaje(nombre:String, energia:int) -arma: String -poder: String
+combatir(energ:int):String
+encantar():String
+Guerrero(nombre:String, energía:int,
+Mago(nombre:String, poder:String)
arma:String)
Los constructores van subrayados!
Personaje
Implementación Personaje Implementación
- nombre: String
Clase Personaje: - energía: int
Clase Guerrero:
+getNombre(): String Guerrero
public class Personaje{ +getEnergia(): int
+alimentarse(energiaNueva:int) -arma: String
private String nombre; +consumirEnergia(gastoEnergia:int)
+Personaje(nombre:String, energia:int) +combatir(energ:int):String
private int energia; +Guerrero(nombre:String,
energía:int, arma:String)
public Personaje(String nombre, int energia){ public class Guerrero extends Personaje{
this.nombre = nombre;
private String arma;
this.energia = energia; }
public String getNombre(){ public Guerrero(String nombre, int energia, String arma){
return nombre; } super(nombre, energia);
this.arma = arma;
public int getEnergia(){ }
return energia; } public String combatir(int energ){
public void alimentarse(int energiaNueva){ actualizaEnergia( -1*energ );
energia = energia + energiaNueva; } return arma + energ;
}
public void consumirEnergia(int gastoEnerg){
energia = energia - gastoEnerg; } }
}
Franco Guidi Polanco 47 Franco Guidi Polanco 48
Personaje
Implementación Uso de las clases
Presentación
Hemos visto:
Implementación de jerarquías de herencia con variables de
instancia públicas y privadas e invocación de constructores de
súperclases mediante super.
La clase Object como la súperclase de toda jerarquía de herencia
POO en Java IV: Herencia en Java.
(Parte 5) La notación del Diagrama de Clases de UML para clases y relaciones
de herencia.
Una variable de referencia puede Dado que toda clase es subclase directa o indirecta de la
Persona referenciar objetos del mismo tipo de clase Object, una variable de este tipo puede referenciar
la variable (esto ya lo sabíamos). objetos de cualquier tipo. Ejemplos:
Ejemplo:
Object o = new Persona();
Alumno Object o = new Tesista();
Persona p = new Persona();
Object o = new Lavadora();
Tesista Una variable de referencia puede En consecuencia, un arreglo de tipo Object puede
referenciar objetos de cualquier almacenar cualquier tipo de objeto en sus posiciones:
subtipo de la variable. Ejemplos:
Object[] arr = new Object[10];
Persona p = new Alumno(); arr[1] = new Persona();
Persona p = new Tesista(); arr[2] = new Tesista();
arr[3] = new Lavadora();
Consideremos estas clases en los siguientes Persona a = new Persona( 100 , Matías );
System.out.println( a.identificarse() ); 100Matías
ejemplos:
public class Persona { public class Alumno extends 100 Matías public String identificarse(){
Persona { return rut + nombre;
private String rut, nombre; getRut() }
private String carrera;
public Persona(String r, String n){ getNombre()
a
rut = r; public Alumno(String r, String
nombre = n; n, String c){
identificarse()
} super(r,n);
carrera = c;
Alumno b = new Alumno( 100 , Matías , Ind );
public String getRut(){
return rut;
}
System.out.println( b.identificarse() ); 100MatíasInd
} public String identificarse(){
public String getNombre(){ return getRut() + getNombre() public String identificarse(){
return nombre; + carrera; 100 Matías Ind return getRut() +
} } getNombre() +
public String identificarse(){ getRut() carrera;
}
return rut + nombre; }
getNombre()
b
}
}
identificarse()
Franco Guidi Polanco 61 Franco Guidi Polanco 62
a identificarse()
la variable. } }
El casting no convierte objetos, simplemente El modificador de visibilidad protected, permite
explicita el tipo de objeto referenciado en una declarar visibilidad “protegida” en variables de
variable. instancia y métodos.
Persona a = new Profesor();
Profesor b = a; // ERROR Los miembros de una clase con visibilidad
Persona Persona a = new Profesor(); protegida son sólo accesibles desde la misma clase
Profesor b = (Profesor) a;
Alumno c = (Alumno) a;
// OK
// ERROR
o desde cualquier subclase de ella (no son
accesibles desde otras clases).
Profesor Alumno Persona a = new Persona();
Profesor b = (Profesor) a; // ERROR
Alumno c = (Alumno) a; // ERROR
En el ejemplo anterior la clase ProductoMusical es abstracta (no Otro ejemplo: un software trabaja con distintas
representa entidades presentes en el dominio).
figuras geométricas, todas ellas polígonos, con
Esta condición se explicita en el diseño, declarando la clase como
abstracta. algunas propiedades en común (ej. cantidad de
lados).
public abstract class ProductoMusical {
ProductoMusical
{abstract} private int código;
código
private String sello;
Polígono
sello ...
autor
}
CD DVD Vinilo