Está en la página 1de 51

Programación

Orientada a Objetos
(con Java)
Dra. Maria Lucia Barrón Estrada

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
3. Herencia.
Competencia
• Implementar la herencia en clases
derivadas para reutilizar los miembros
de una clase base.
• Productos:
– Programas en Java
– Trabajos de investigación
– Ejemplos
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
3. Herencia.
3.1 Definición: clase base, clase derivada
3.2 Clasificación: herencia simple, herencia múltiple
3.3 Reutilización de miembros heredados
3.4 Referencia al objeto de la clase base
3.5 Constructores y destructores en clases derivadas
3.6 Redefinición de métodos en clases derivadas

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Introducción a la Herencia.

• Herencia es el acto de derivar una nueva


clase de una ya existente.
• La herencia es un mecanismo de la POO
que se utiliza para organizar y crear
clases.
• Incrementa la reutilización de código
• Facilita desarrollar nuevos programas.
• Se pueden crear referencias polimórficas a
partir de una jerarquía de clases definida con
herencia.
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Herencia
• Reutilización de software
• Organización jerárquica
– Superclase (clase padre)
– Subclase (clase derivada)
• Ejecución dinámica a través de mensajes
• Acceso protegido para especializadores
• Sobreescritura (especialización de comportamiento)

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
3.2 Clasificación: herencia simple,
herencia múltiple
• Herencia Simple o Múltiple
Define el numero de clases/interfaces padre
– Simple. Una sola clase/interfaz padre
– Múltiple. Mas de una clase/interfaz padre

• Herencia de implementación o de interfaz


– Implementación. Hereda comportamiento
– interfaz. Hereda solo la estructura

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Herencia simple.

• Solo existe una clase padre.


Object

Point

ColorPoint D3Point

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Herencia múltiple.
• Existen muchas entidades padre.
Java NO tiene Object La herencia Múltiple
herencia múltiple de Implementación
de clases, pero (clases) puede
tiene herencia generar el
Point Color
múltiple de “Problema Diamante”
interfaces

ColorPoint

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Herencia en Java
La herencia ocurre cuando una clase adopta y/o
adapta las estructuras y métodos de una clase base
(clase padre) e implementa los métodos de una o
mas interfaces.

• Herencia Simple de Implementación


• Una clase solo puede tener una clase padre

• Herencia Múltiple de Interfaces


• Una clase puede tener muchas interfaces padre

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
• Object es la clase mas general.
• La clase Object definida en el paquete java.lang define e
implementa el comportamiento que todas las clases requieren.
• Las clases se derivan de Object o de otras clases lo que forma una
jerarquía de clases.
• Las clases de los niveles bajos de la jerarquía definen un
comportamiento mas especializado.
• Una subclase se deriva de otra clase.
• La superclase es la clase que es el ancestro directo de otra clase.
• Cada clase tiene solo una superclase inmediata.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
3.1 Definición: clase base, clase
derivada
• Clase base (padre). Es aquella que se usa para
definir una nueva clase (usando la parte extends del
encabezado de definición de clase derivada).
• Clase derivada (hijo). Es la clase que agrega y/o
especializa elementos a una clase base.
Vehículo

Terrestre Aéreo Acuático

Auto Moto Tren Jet Yate Banana Barco


Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Interfaces and Inheritance describes interfaces—
what they are, why you would want to write one, and
how to write one.
This section also describes the way in which you can
derive one class from another. That is, how
a subclass can inherit fields and methods from
a superclass.
You will learn that all classes are derived from
the Object class, and how to modify the methods
that a subclass inherits from superclasses.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Declaración de la clase
(Encabezado)
Modificadores class Identificador HERENCIA

extends ClasePadre implements ListaDeInterfaces


Herencia simple de clase
Por default todas las
clases heredan de Object
Herencia múltiple de interfaces
Lista las interfaces que se usan para definir
la estructura de la clase

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
package java.awt;

public class Window ….{


Ejemplo

public Window(Frame owner) {

} (superclase de WarningWindow)
} Clase base

public class WarningWindow extends java.awt.Window{



}

Clase derivada
(subclase de Window)

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Ejemplo
Clase base

Clases derivadas

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
3.3 Reutilización de miembros
heredados

• La clase derivada hereda a todos los


miembros de la clase base y puede
usar directamente todos aquellos que
tienen acceso public o protected.
• Los constructores NO son miembros,
por lo tanto no se heredan.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
public class Point {
/* Los objetos de la clase ColorPoint
private int x = 0;
heredan todos los miembros
private int y = 0;
de la clase Point
public static int totalPuntos = 0;
*/
// a constructor
public class ColorPoint extends Point {
public Point (){
private String color = "rojo";
totalPuntos++;
public void setColor (String c){
}
color = c;
public Point(int x, int y) {
}

public String getColor(){
}
return color;
public Point(Point p) {
}

public String toString(){
}
return super.toString()+","+color;
public void setX(int _x) {
}
x= _x;
public static void main(String[] args){
}
ColorPoint c1 = new ColorPoint();
public Point medio (Point p) {
System.out.println(c1);
return new Point((p.x+x)/2, (p.y+y)/2);
c1.setX(5); // heredado
}
c1.setColor("blanco");
public String toString () {
System.out.println(c1);
return "("+x+","+y+")";
Point p1 = new ColorPoint();
}
p1.move(2,3);
public void move(int _x, int _y) {
System.out.println(p1);

}
}
}
}
Usando la herencia en Java:
1. Declara las clases que representen la
jerarquía, incluye atributos protegidos
Ejercicio
y métodos (get/set) públicos.
2. Compila todas tus clases
Persona
3. Incluye un constructor SIN parámetros
(que contenga la impresión de un mensaje
con el nombre de la clase).
4. Escribe un programa UsaHerencia con
un método main que cree objetos de las
Alumno Profesor Cliente
diferentes clases y DEMUESTRA que
puedes acceder a los atributos y métodos
de la clase base (Persona).
5. Escribe un reporte de tu actividad:
• ¿Qué errores de compilación encontraste?
• ¿Qué sucede cuando creas objetos?
• ¿Cómo demuestras que estas usando un
atributo o método heredado?
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
public class Persona {
// atrubutos
Agrega a la clase Alumno private String nombre;
los elementos necesarios private char sexo;
para su funcionamiento private int edad;

// constructores
public class Alumno extends Persona{ public Persona(String n){
// atributos nombre = n;
}

// métodos nuevos // métodos



public String toString(){
// métodos sobreescritos return nombre;
}
} }

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Persona
Ejercicio
1. Escribe y compila las clases de la
jerarquía
2. Incluye en cada clase un constructor
SIN parámetros que contenga un S.o.p
(Nombre de la clase)
Empleado 3. Escribe una clase que use la jerarquía y
cree diferentes objetos de cada clase
almacenándolos en un arreglo
4. Imprime el contenido del arreglo
5. Escribe un reporte de lo que sucede

Comisión Horas Base

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Cuantas diferentes jerarquias se
pueden crear?
Animal
Animal

Herbívoro Carnívoro
Doméstico Salvaje Corral

Animal

Reptil Ave Mamífero


Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
3.4 Referencia al objeto de la
clase base
super es una variable especial que sirve para
referirse a los elementos de la clase base
(superclase) de la misma forma que this se utiliza
para referirse a los elementos del objeto que esta
en ejecución.
super.nombreMetodo(lista de parámetros);
Ejemplo: public String toString(){
return super.toString() + ",“ + color;
}

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
public class ColorPoint extends Point {
private String color = "rojo";
public void setColor (String c){
color = c;
}
public String getColor(){
return color; Redefinición del método
}
public String toString(){
return super.toString()+","+color;
} Llama al método de la superclase
public static void main(String[] args){
ColorPoint c1 = new ColorPoint();
System.out.println(c1);
c1.setX(5); // heredado Llama al método de la superclase
c1.setColor("blanco");
System.out.println(c1);
Point p1 = new ColorPoint();
p1.move(2,3);
System.out.println(p1);
}
}

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Ejemplo 1
// clase Base public class Hijo1 extends Padre {
public class Padre { int valor = 200;
int valor = 100; public void printValor() {
… System.out.println(valor);
} System.out.println(valor);
}
}
Resultado ?
public static void main(String[] args) {
Hijo1 h =new Hijo1();
h.printValor();
}
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Ejemplo 2
// clase Base //clase derivada
public class Padre { public class Hijo2 extends Padre {
int valor = 100; int valor = 200;
… public void printValor() {
} System.out.println(super.valor);
System.out.println(valor);
}
}
Resultado ?
public static void main(String[] args) {
Hijo2 h =new Hijo2();
h.printValor();
}
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Ejemplo 3
// clase Base // clase derivada
public class Padre { public class Hijo3 extends Padre {
int valor = 100; int valor = 200;
public void printValor() { public void printValor() {
System.out.println(valor); super.printValor();
} System.out.println(valor);
… }
} }

Resultado ?
public static void main(String[] args) {
Hijo3 h =new Hijo3();
h.printValor();
}
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
3.5 Constructores y destructores
en clases derivadas
• Java no tiene destructores
Vehículo
explícitos.
• Los constructores de la clase
deben tener el mismo nombre
de la clase. Aéreo Terrestre Acuático

• No es obligatorio definir un
constructor para la clase. Si
no se hace, el Java Runtime Motriz Manual
System provee uno por
“default”, el cual crea la
instancia de la clase. Automóvil Motocicleta Bicicleta Patín

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Características de los Constructores

• No tienen valores de retorno explícitos,


se usan para crear objetos.
• Una clase puede tener varios
constructores sobrecargados, los
cuales permiten a los objetos de esa
misma clase inicializarse de distinta
manera.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Constructores y destructores en
clases derivadas.
• Un constructor de una clase derivada, SIEMPRE va a
llamar al constructor de la clase padre (esta debe ser la
primera instrucción).
• La llamada del constructor padre puede ser:
– Explícita usando super(parámetros)
– Implícita, se hace automáticamente cuando no existe la
llamada explícita.
• Los modificadores de acceso, también pueden ser
usados en los constructores para controlar cuales
otras clases podrán llamar al constructor.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Ejercicio
• Escribe una clase Padre con un atributo, sus
métodos get/set/toString y UN CONSTRUCTOR con
parámetro.
• Prueba la clase creando objetos e imprimiéndolos.
• Escribe una clase Hijo (herede de Padre) que
agregue un atributo, sus métodos get/set/toString y
NO tenga constructores.
• Prueba la clase Hijo creando objetos, explica que
sucede??

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Parte protegida

• Los miembros o constructores protegidos


pueden ser accedidos desde fuera del
paquete en el cual se declararon solo
por el código que es responsable de
la implementación del objeto que
realiza el acceso.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Ejemplo
http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html

package algunPaquete;
public class Padre { package otroPaquete;
protected int a; public class Hijo extends Padre {
… public boolean iguales(Hijo p){
} return a == p.a; // Ok!
}
public int getPadre(Padre p){
return p.a; // ERROR
// p debe ser Hijo o subclase de Hijo
}

}

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Ejemplo
http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#62587
package threePoint;
import points.Point;
public class Point3d extends Point {
package points; protected int z;
public class Point { public void delta(Point p) {
protected int x, y; p.x += this.x; // compile-time error: cannot access p.x
public void move(int dx, int dy) { p.y += this.y; // compile-time error: cannot access p.y
x += dx; }
y += dy; public void delta3d(Point3d q) {
q.x += this.x; // q.x OK
}
q.y += this.y;
… q.z += this.z;
} }
}

Cuando la clase Point3D se coloca en el mismo paquete


que la clase Point no existen errores de compilacion
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
3.6 Redefinición de los miembros de
las clases derivadas.
• La redefinicion de un método se da
cuando una subclase contiene un método
con la misma firma (mismo nombre y
numero, tipo y orden de los parámetros) que
la clase base.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
public class MyClass {
private int anInt = 4;
//Overrides toString in Object class.
public String toString() {
return "Instance of MyClass. anInt = " + anInt;
}
}

public class MyClass {


private int anInt = 4;
//Overrides toString in Object class.
public String toString() {
return "Instance of MyClass. anInt = " + anInt;
}

//Overloads toString method name to provide additional functionality.


public String toString(String prefix) {
return prefix + ": " + toString();
}
}

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
public class Animal {
public static void hide() {
System.out.println("The hide method in Animal.");
} public static void main(String[] args) {
public void override() { Cat myCat = new Cat();
System.out.println("The override method in Animal.");
Animal myAnimal = (Animal) myCat;
}
} myAnimal.hide();
myAnimal.override();
}
public class Cat extends Animal {
public static void hide() {
System.out.println("The hide method in Cat."); //The output from this program
} // is as follows:
public void override() {
System.out.println("The override method in Cat."); The hide method in Animal.
} The override method in Cat.
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = (Animal) myCat;
myAnimal.hide();
myAnimal.override();
}
}

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Visibilidad de atributos
• Los modificadores de acceso son:
– public
– private
– protected
– package

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Especificadores de acceso

• public: Cualquier clase en cualquier


paquete, tiene acceso a los miembros
públicos.
• private: Un miembro privado es
accesible solo en la clase donde fue
definido. Usa este tipo de especificador
para miembros que solo deben ser
utilizados por la clase.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Ejemplo private:
class Alpha {
private int iamPrivate;
public int iamPublic;
}
class Beta {
void accessMethod() {
Alpha a = new Alpha();
a.iamPrivate = 10; // illegal
a.iamPublic; // legal }
}
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Especificadores de acceso

• protected: Los miembros protegidos


pueden ser accedidos por las subclases
y todas las clases del mismo paquete.
• Usa los miembros protegidos cuando
deseas que los miembros sean usados
por subclases, pero no por clases no
relacionadas.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Clases Example y Foo
están en en el mismo paquetes y NO hay herencia

package A; package A;
public class Example{ public class Foo{
public int i; int x;
int j; void bar(){
protected int k; Example e=new Example();
private int l; x=e.i;
x= e.j;
X x=e.k;
x=e.l;
Que pasa si cambiamos }
de paquete a la clase }
Example?
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Especificadores de acceso

• Si no se define ningún especificador


de acceso, “package” es el que se
establece.
• En este nivel se permite a todas las
clases del mismo paquete de la clase
actual, acceder a sus miembros.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Clases Example y Foo
están en diferentes paquetes y NO hay herencia
package B;
package A;
import A.*;
public class Example{
public class Foo{
public int i;
int x;
void bar() {
int j; //package
Example e=new Example();
x=e.i;
protected int k;
x= e.j;
x=e.k;
private int l;
x=e.l; }
}

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Clases Example y Foo
están en diferentes paquetes y hay herencia
package B;
import A.Example;
public class Foo extends A.Example{ package A;
int x; public class Example{
void bar() { public int i;
Example e=new Example();
x=e.i; int j; //package
x= e.j;
x=e.k; protected int k;
x=e.l;
x=this.k; //ok private int l;
}
}

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Package y Protected
• Podemos referenciar nuestra propia
variable protected (variable k) que se
heredo de la clase Example, es por eso
que se permite: x=this.k;
• Pero no se puede referenciar las
variables “protected” del objeto padre
de manera directa, solo se puede hacer
esto a través de la herencia.
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Resumen de Modificadores de acceso

Especificador class subclass package world

private X

protected X X X

public X X X X

package X X

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
Trabajo de investigación 15pts
https://docs.oracle.com/javase/tutorial/java/index.html

• Investiga los conceptos de clases siguientes:


– Clases anidadas (Nested Classes)
• Estáticas
• No estáticas (Inner classes)
– Clases locales (Local Classes)
– Clases anónimas (Anonymous Classes)
• Explica cada concepto y presenta un
ejemplo usando cada concepto.
• Debes usar las fuentes oficiales de Java
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Evaluación unidad 3
• Para derecho de evaluación
– Asistencia: mínima 80%
– Portafolio de evidencias 100%
• Trabajo individual 25% (Portafolio)
– Tareas/Investigación
– Actividades de aprendizaje
– Programas
– Notas de clase, etc
• Trabajo en equipo 25%
• Examen 50%
Instituto Tecnológico de Culiacán
Ing. En Sistemas Computacionales
Actividades de aprendizaje
1. Analizar analogías taxonómicas de los seres vivos que compartan rasgos
comunes por estar relacionados mediante una herencia genética e identificar
la especie a la que pertenecen.
2. Identificar los atributos y comportamientos propios de una especie que
comparten los animales pertenecientes a ella.
3. Analizar objetos reales que compartan características comunes por
pertenecer a una misma categoría de objetos.
4. Identificar los atributos y comportamientos propios de una categoría de
objetos que compartan todos sus miembros.
5. Investigar en fuentes de información los conceptos relacionados con la
herencia y su implementación en un lenguaje de programación orientado a
objetos.
6. Programar una clase base para una especie de animales con los atributos y
comportamientos comunes a todos los animales pertenecientes a ella.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales
7. Implementar clases derivadas para animales pertenecientes a la
misma especie de la cual se programó la clase base anteriormente.
8. Especializar cada clase derivada con comportamientos y atributos
específicos de un tipo de animal para identificarlo y distinguirlo de los
demás.
9. Crear varias instancias de clases derivadas diferentes para verificar la
existencia de los miembros heredados comunes en todas ellas, y la
diversidad de sus especializaciones.
10. Repetir las mismas actividades pero utilizando objetos y categorías de
objetos reales.
11. Sobrecargar los constructores de las clases base y derivadas para
analizar y experimentar el comportamiento y uso de los constructores
en combinación con la herencia.
12. Analizar qué animales u objetos de la vida real rompen algún
comportamiento heredado para reinventar el suyo propio por sobre el
resto de sus parientes que siguen respetando el heredado.
13. Redefinir un método en una clase derivada para sobrescribir el de su
clase base e introducirse al polimorfismo.

Instituto Tecnológico de Culiacán


Ing. En Sistemas Computacionales

También podría gustarte