Está en la página 1de 64

Fundamentos de

Programacin 2
Ing. Marco Aedo Lpez

EPIS 2015

maedol@unsa.edu.pe

marcoaedo@hotmail.com

Herencia, Polimorfismo y Tpicos


Avanzados
Captulo 6

EPIS UNSA - 2008

marcoaedo@hotmail.com

Objetivos

Comprender el rol de la clase Object


Redefinir los mtodos toString y equals
Comprender como el polimorfismo y el enlace dinmico
mejoran la versatilidad del programa
Entender las restricciones de asignar un objeto de una
clase a la variable de referencia de otra clase
Comprender cmo usar un arreglo de variables de
referencia de un ancestro para implementar el
polimorfismo
Verificar cmo una declaracin abstract en la
superclase elimina la necesidad de definir mtodos tontos
Comprender cmo se crean y usan las interfaces
Entender el modificador de acceso protected

Contenidos

La clase Object
El mtodo equals
El mtodo toString
Polimorfismo y enlazamiento dinmico
Asignaciones entre objetos en una jerarqua de clases
Polimorfismo con arreglos
Mtodos y clases Abstract
Interfaces
Modificador de acceso protected

1. La clase Object

La clase Object es una superclase para


todas las otras clases en Java
Cuando declaramos nuestras propias clases,
no tenemos que especificar que heredarn de
Object, lo hace automticamente
Veremos 2 mtodos de Object: equals y
toString

1. La clase Object

Object
equals()
toString()

Clase1

Clase2

ClaseN

2. El mtodo equals

Para clases que no tienen su propio mtodo equals


Si objetos de dichas clases son comparados con
equals, ellos ya heredan y usarn el mtodo
equals de la clase Object
Dicho mtodo retorna true si las 2 variables de
referencia que estn siendo comparadas apuntan al
mismo objeto (contienen la misma direccin)

2. El mtodo equals

Asumiendo que la clase Car no tiene su mtodo propio


equals, qu se imprimir?
Car car1 = new Car("Honda", 2008, "red");
Car car2 = car1;
Car car3 = new Car("Honda", 2008, "red");
System.out.println(car2 == car1);
System.out.println(car2.equals(car1));
System.out.println(car3 == car1);
System.out.println(car3.equals(car1));

Trabaja exactamente igual que el operador ==

true
true
false
false

2. El mtodo equals

Generalmente el mtodo equals de la clase Object


no es tan til
Casi siempre necesitamos comparar el contenido de 2
objetos en lugar de verificar que dos variables de
referencia apuntan al mismo objeto
Para lograrlo deberamos sobreescribir el mtodo
equals en nuestras clases, de tal forma que
compare el contenido de los objetos

2. El mtodo equals: definiendo el


nuestro

Ejemplo: usar lo siguiente


public class Car
{
private String marca;
private int anio;
private String color;
<equals method goes here>
}
public class CarDriver
{
public static void main(String[] args)
{
Car car1 = new Car();
Car car2 = new Car();
if (car1.equals(car2))
System.out.println("cars have identical features");
...

2. El mtodo equals: definiendo el


nuestro
public class Car
{
private String marca;
private int anio;
private String color;
public Car(String make, int year, String color)
{
}
public boolean equals(Car otherCar)
{
return otherCar != null && marca.equals(otherCar.marca) &&
anio == otherCar.anio && color.equals(otherCar.color);
}
}

2. El mtodo equals

El mtodo equals est implementado en muchas


clases de la Java API
Por ejemplo en la clase String y en las clases
Wrapper
Esos mtodos equals prueban si los contenidos de
los 2 objetos comparados son los mismos
Qu se imprimir?
String s1 = "hello", s2 = "he";
s2 += "llo";
if (s1 == s2)
System.out.println(mismo objeto);
if (s1.equals(s2))
System.out.println(mismo contenido");

2. El mtodo equals

Qu se imprimir?
String s1 = "hello", s2 = "hello";
if (s1 == s2)
System.out.println(mismo objeto);
if (s1.equals(s2))
System.out.println(mismo contenido");

Slo para Strings

3. El mtodo toString

Retorna cadena que describe al objeto


El mtodo toString de la clase Object retorna
una cadena que es una concatenacin del nombre
completo de la clase del objeto (incluye nombre del
paquete de la clase), el signo @ y una secuencia
hexadecimal llamada hashcode
Considerar el cdigo:
Object obj = new Object();
System.out.println(obj.toString());
Car car = new Car();
System.out.println(car.toString());

Salida:
java.lang.Object@601bb1
Car@1ba34f2

La clase Object est en


el paquete java.lang
hashcode

3. El mtodo toString

Lo anterior no es tan til, por lo que llamar al mtodo


toString de la clase Object tampoco lo es
Debemos reescribir el mtodo toString en nuestras clases
En general el mtodo toString debera retornar un String que
describe el contenido del objeto llamado
Se encuentran muchos mtodos toString sobreescritos en las
clases del Java API

La clase Date tiene un mtodo toString que retorna los


valores concatenados en un String del mes, da y ao

Ya que recuperar los contenidos de un objeto es una tarea muy


comn, deberamos tener el hbito de proveer un mtodo
toString para la mayora o todas las clases propias

Tpicamente el mtodo toString debera simplemente concatenar


los datos del objeto y devolver un String
Notar que el mtodo toString no debera imprimir el String
concatenado

3. El mtodo toString

Escribir el mtodo toString para la clase Car.


public class Car
{
private String marca;
private int anio;
private String color;
...

<toString method goes here>


}
public class CarDriver
{
public static void main(String[] args)
{
Car car1 = new Car("Honda", 1998, "silver");
System.out.println(car1);
...

3. El mtodo toString: definiendo


el nuestro
public class Car
{
private String marca;
private int anio;
private String color;
public Car(String make, int year, String color)
{
}
public String toString()
{
return marca= " + marca+ ", anio= " + anio + ", color = "
+ color;
}

3. El mtodo toString

El mtodo toString de un objeto es llamado


automticamente cuando la variable de referencia del
objeto es un argumento en un:
System.out.println() o System.out.print()
Ejemplo:

System.out.println(car1);

Tambin es llamado automticamente cuando una


variable de referencia es concatenada a un String
(operador +)
String carInfo = "Car data: " + car1;

3. El mtodo toString

Se puede seguir usando el mtodo toString usando


la sintaxis de llamada a mtodos estndar:
System.out.println(car1.toString());
String carInfo = "Car data: " +
car1.toString();

3. El mtodo toString
EJERCICIO:
Completar la clase Counter que corresponda al
siguiente cdigo:
public class Counter
{
private int count;
...
}
public class CounterDriver
{
public static void main(String[] args)
{
Counter co = new Counter(100);
String message = Cuenta actual = " + co;
...

3. El mtodo toString
public class Counter
{
private int count;
public Counter(int c)
{
count = c;
}
public String toString()
{
return Integer.toString(count);
}
}

4. Mtodos toString de las clases


Wrapper

Todas las clases wrapper tienen mtodos toString que


retornan un valor String del valor primitivo dado

String s1=Integer.toString(22); //convierte a string "22"


String s2=Double.toString(123.45);//convierte a string "123.45
System.out.println(s1+" "+s2);

Tenemos la opcin de usar el mtodo valueOf de la clase


String

String s3=String.valueOf(22);
String s4=String.valueOf(123.45);
String s5=String.valueOf('S');
char[] vocales = {'a','e', 'i', 'o', 'u'};
String s6=String.valueOf(vocales);
System.out.println(s3+" "+s4+" "+s5+" "+s6);

5. Polimorfismo

Es cuando diferentes tipos de objetos responden de


forma diferente a la misma llamada a mtodo
Para implementarlo: declarar un tipo general de
variable de referencia que sea capaz de referirse a
objetos de diferente tipo
Para hacerlo usamos una superclase
Cul usaramos sin necesidad de crear una clase
propia?
La superclase Object

5. Polimorfismo

En el ejemplo obj se declara como un Object y la


llamada a mtodo obj.toString() es la que
exhibe un comportamiento polimrfico

Si obj contiene un objeto Perro, toString retorna Guau!


Guau!"
Si obj contiene un objeto Gato, toString retorna Miau!
Miau!"

5. Polimorfismo

5. Polimorfismo
import java.util.Scanner;
public class Pets
{
public static void main(String[] args)
{
Scanner stdIn = new Scanner(System.in);
Object obj;

Se declara obj
como un Object
Genrico

System.out.print("Which type of pet do you prefer?\n" +


"Enter d for dogs or c for cats: ");
if (stdIn.next().equals("d"))
{
obj = new Dog();
Llamada a mtodo
}
polimrfico.
else
{
obj = new Cat();
}
System.out.println(obj.toString());
System.out.println(obj);
} // end main
} // end Pets class

6. Enlace Dinmico (Dynamic


Binding)

El polimorfismo es un concepto, una forma de


comportamiento
El enlace dinmico es el mecanismo que permite dicho
comportamiento
Es lo que la JVM hace para corresponder una llamada a
mtodo polimrfico con un mtodo en particular
Justo antes de ejecutar la llamada a mtodo, la JVM
mira el tipo de objeto que ha sido asignado a la
variable de referencia
Si es de la clase X, la JVM enlaza el mtodo
correspondiente a X a la llamada al mtodo original
Despus que la JVM enlaza el mtodo apropiado a la
llamada al mtodo, la JVM ejecuta el mtodo enlazado

6. Enlace Dinmico (Dynamic Binding)

Si Perro implementa un mtodo display que


imprime Soy un perro", funcionar el siguiente
cdigo?
Object obj = new Perro();
obj.display();

6. Enlace Dinmico (Dynamic Binding)

Tener en cuenta:
Cuando un compilador ve la llamada a mtodo
<variableReferencia>.<mtodo>(), revisa si la
clase de la variable de referencia tiene la definicin
del mtodo llamado, si no la encuentra, no compila
2.
Normalmente, al asignar un objeto a una variable
de referencia, la clase de ambos es la misma,
pero en el ejemplo anterior vimos que un objeto
de la clase Perro es asignado en una variable
de referencia de tipo Object. Tal asignacin slo
funciona si la clase del lado derecho es una
subclase de la clase del lado izquierdo
1.

6. Enlace Dinmico (Dynamic Binding)


Object obj = new Object();
Object obj = new Perro();
Perro obj = new Object();

7. Operador instanceof

Operador que verifica si un objeto referenciado es


instancia de una clase en particular
Devuelve true si el objeto se verifica con su clase
correspondiente o con cualquiera de sus superclases
Sintaxis:
<nombreObjeto> instanceof <nombreClase>
Ejemplo:
Object obj=new Perro();
System.out.println(obj instanceof Perro);
System.out.println(obj instanceof Gato);
System.out.println(obj instanceof Object);
if(obj instanceof Perro)
System.out.println("Es un perrito");

8. Asignacin entre objetos en


una jerarqua de clases

Asignar un objeto de un tipo a una variable de


referencia de otro tipo
Persona
En la jerarqua:

Estudiante

Persona p = new Estudiante();


Estudiante s = new Persona();

Error

8. Asignacin entre objetos en


una jerarqua de clases

Podemos hacer cast entre objetos


La condicin es que el objeto del lado derecho del
casting tenga todo lo del objeto del lado izquierdo
Dicho de otro modo, que el objeto al que le aplicamos
cast sea del mismo tipo o de un tipo descendiente del
de la variable de referencia de la izquierda
Object obj10=new Perro();
Perro obj11=(Perro) obj10;
System.out.println(obj10);
System.out.println(obj11);
Object obj10=new Object();
Perro obj11=(Perro) obj10;
System.out.println(obj10);
System.out.println(obj11);

9. Polimorfismo con Arreglos

La utilidad del polimorfismo viene cuando tenemos un


arreglo de variables de referencia genrico y
asignamos diferentes tipos de objetos a los diferentes
elementos del arreglo
Nos permite recorrer el arreglo y llamar el mtodo
polimrfico para cada elemento del arreglo
En tiempo de ejecucin, la JVM usa el enlazamiento
dinmico para escoger el mtodo en particular a
aplicar a los diferentes tipos de objetos del arreglo

9. Polimorfismo con Arreglos


EJERCICIO
En la empresa tenemos 2 tipos de Empleado: el que
tiene un salario fijo mensual y el que trabaja por
horas (el salario fijo y el pago por hora vara de
empleado a empleado)
Deseamos manejar la planilla y obtener el reporte de
cunto pagar a fin de mes para cada empleado
Crear las clases necesarias. Implementar el Diagrama
UML y un main() que pruebe las clases creadas. Usar
polimorfismo

9. Polimorfismo con Arreglos


Employee
name : String
Employee(n : String)
getPay() : double
printPay() : void

Salaried
salary : double

Hourly
hourlyRate : double
hours : double = 0

Salaried(n : String, s : double)


getPay() : double

AplicacionPayroll
main()

Hourly(n : String, rate : double)


getPay() : double
addHours(h : double) : void

9. Polimorfismo con Arreglos


TIPS:
Crear un arreglo de 100 Employees
Crear 3 empleados como elementos del arreglo: 2
empleados por horas y 1 empleado con salario
Darle una cantidad de horas trabajadas a los
empleados por hora
Imprimir el reporte de cuanto se les debe pagar

Salida:
Anna 4000.0
Donovan 3200.0
Simon 48000.0

Llamada a mtodo
polimrfico

Este mtodo nunca se


ejecuta, se pone para
satisfacer al compilador

9. Polimorfismo con Arreglos


EJERCICIO
El ejercicio anterior pero que aada 160 horas pero slo
a cada objeto de empleado que gana por horas (antes de
la impresin de sus datos)

9. Polimorfismo con Arreglos


EJERCICIO
El ejercicio anterior pero aprovechando el toString
En main:
System.out.println(employees[i]);

9. Polimorfismo con Arreglos


EJERCICIO
El ejercicio anterior pero crear un men que pregunte el
tipo de empleado que se va a insertar cada vez, e
insertar los datos respectivos basado en el tipo
El ejercicio anterior con las siguientes restricciones:

A los empleados por horas se les paga todos los viernes


A los empleados con salario se les paga cada quincena
El mes empieza un martes
Suponga que los empleados por horas SIEMPRE trabajan 8 horas diarias
4 Anna 800.0
Suponga que el mes tiene 30 das
4 Donovan 640.0
Imprimir TODOS los pagos que debemos hacer al mes 11 Anna 1000.0
11
15
18
18
25
25
30

Donovan 800.0
Simon 24000.0
Anna 1000.0
Donovan 800.0
Anna 1000.0
Donovan 800.0
Simon 24000.0

10. Mtodos y clases abstract

Declarar un mtodo como abstract si la clase del mtodo es


una superclase y el mtodo es un mtodo dummy que ser
sobreescrito en las subclases
Java requiere que cuando definamos un mtodo como
abstract, debemos:

Usar una cabecera de mtodo abstracto en lugar de una definicin


de mtodo
Igual que una cabecera de mtodo, excepto que incluye el
modificador abstract y acaba con ;
public abstract double getPay();
Definir una versin sobreescrita de dicho mtodo en cada una de las
subclases de la superclase
Definir la superclase como abstract usando el modificador
abstract
public abstract class Employee
{
}

10. Mtodos y clases abstract

Definir una clase como abstract implica decirle al


compilador que no se permite crear instancias de
dicha clase
Si un programa intenta instanciar una clase
abstract, un error de compilacin es generado
Un mtodo abstract debera no ser ni private ni
final

10. Mtodos y clases abstract


public abstract class Employee
{
private String name;
public abstract double getPay();

public Employee(String n)
{
name = n;
}
public void printPay(int date)
{
System.out.println(date + " "+ name+" "+ getPay());
}
}

11. Interfaces

Una interface es como una clase abstracta pura


Slo provee:

Constantes de clase:
Declaraciones de mtodo:

public static final


public abstract

Sintaxis:

interface <nombreInterface>
{
<tipo> <nombreConstante> = <valor>;
...
<tipoRetorno> <nombreMtodo>(<listaParametros>);
...
}

11. Interfaces

Para implementar una interface:

public class <nombreClase> implements <nombreInterface>


{
...
}

Para implementar varias interfaces:

public class <nombreClase> implements


<nombreInterface1>, <nombreInterface2>, ...
{
...
}

Para herencia e implementacin:

public class <nombreClase> extends <nombreSuperClase>


implements nombreInterface1>, <nombreInterface2>, ...
{

11. Interfaces

Se usan las interfaces con diferentes fines:


1)
2)
3)

Almacenar constantes universales


Implementar polimorfismo
Estandarizar la comunicacin interclases

11. Interfaces
1) Almacenar constantes universales

Implementar una interface da a la clase que la


implementa acceso libre a las constantes definidas en
la interface
Brinda a dichas clases, un fcil acceso a constantes
(evita la notacin .dot)
Evita duplicar definiciones de esas constantes
Se podra utilizar una herencia, pero perderamos la
nica posibilidad de usar el mecanismo de herencia,
en cambio podemos implementar muchas interfaces

11. Interfaces
2) Implementar polimorfismo

Una de las principales razones de utilizar interfaces,


es implementar mltiples polimorfismos
Sirven para implementar polimorfismos que no
encajan con la jerarqua original
Imaginen que queremos un mtodo que sea
polimrfico, pero slo para algunas clases de la
jerarqua y que incluya clases que no estn en la
jerarqua de herencia dada
Ejemplo: mejoraremos el programa de la planilla

11. Interfaces
EJERCICIO

En la empresa tenemos 4 tipos de Empleado: el que tiene un


salario fijo mensual, el que trabaja por horas (el pago por hora
vara de empleado a empleado), el que trabaja por comisin %
de sus ventas y el que tiene un salario fijo mensual, pero
tambin comisin

Deseamos manejar la planilla y obtener el reporte de cunto


pagar a fin de mes para cada empleado

Implementar el Diagrama UML y un main() que pruebe las clases


creadas. Usar polimorfismo e Interfaces

Employee
name : String

<<Interface>>
Commission
COMMISSION_RATE : double = 0.10

Employee(n : String)
getPay() : double
printPay(date : double) : void

addSales(sales : double) : void

11. Interfaces

Hourly
hourlyRate : double
hours : double = 0
Hourly(n : String, rate : double)
getPay() : double
addHours(h : double) : void

Salaried
salary : double
Salaried(name : String, s : double)
getPay() : double

Commissioned
sales : double = 0.0
Commissioned(name : String)
addSales(s : double) : void
getPay() : double

SalariedAndCommissioned
sales : double
SalariedAndCommissioned(name : String, salary : double)
addSales(s : double) : void
getPay() : double

11. Interfaces
TIPS:
Crear un arreglo de 100 Employees
Crear 5 empleados como elementos del arreglo: 2 por
horas, 1 con salario, 1 por comisin y 1 por salario y
comisin
Darle una cantidad de horas trabajadas a los
empleados por hora
Darle una cantidad de total de ventas a los empleados
por comisin
Imprimir el reporte de cuanto se les debe pagar
Salida:
Anna 4000.0
Simon 48000.0
Donovan 3200.0
Glen 1500.0
Carol 25500.0

11. Interfaces
3) Estandarizar la comunicacin interclases
Especificar las cabeceras de un conjunto de mtodos
que otras clases deben implementar
Sirve de contrato entre el diseador y los
programadores
Muy til en proyectos de software (especialmente los
grandes)

11. Interfaces
EJEMPLO
Sistema de Contabilidad
Usa activos de la empresa como: cash, cuentas por
cobrar, muebles, equipos, vehculos, edificios, etc.
A la vez podemos crear una subjerarqua con aquellos
activos a largo plazo y que se deprecian: muebles,
equipos, vehculos, edificios
El contador prepara anualmente los Estados Financieros
de la empresa: Balance, Estado de ganancias y prdidas
Para ello se requiere acceder a los datos de los objetos
que se deprecian: costo original, fecha de
adquisicin y tasa de depreciacin

11. Interfaces

Para facilitar el acceso a estos objetos, sera bueno


tener referencias a ellos en un arreglo o arraylist
Luego el programa debera recorrer el arreglo y
acceder a los mtodos polimrficos get para obtener
el valor de los 3 atributos de cada objeto
Imaginar que se desarrolla el software en equipo y
diferentes miembros trabajan en distintos estados
financieros
La mejor forma para lograr coherencia entre ellos es
requerir que todas las clases que accedan a un cierto
conjunto de datos implementen la misma interface de
Java: implements

11. Interfaces

La interface para los mtodos get del ejemplo que accedan


a los 3 atributos la llamaremos EnvejecimientoActivos
Contendr declaraciones/cabeceras de los mtodos, pero
no definiciones
Recordar que si una clase en particular incluir la definicin
de los mtodos declarados en la interface, se deber incluir
la clausula implements en la cabecera de la clase

public class <nombreClase> implements <nombreInterface>


{
...
}

12. Modificador de acceso protected

El modificador de acceso protected est en medio de los


modificadores public y private en trminos de cun
accesible es
Los miembros protected (variables de instancia, variables de
clase y mtodos) slo pueden ser accedidos por clases dentro
del subrbol asociado con la clase del miembro
Object

the root of the Java class tree

Employee

Manager

Laborer

Manager
class's
subtree

Executive

MiddleManager

Secretary

Employee
class's
subtree

12. Modificador de acceso protected

Cundo usar modificador de acceso protected?


Cuando deseamos que un miembro sea accesible desde
cualquier clase dentro de su subrbol de clases, pero no
deseamos que sea accesible desde otro lugar ms

Ejemplo:

Suponga que la clase Employee contiene una variable de


instancia employeeId y todas sus clases descendientes
necesitan acceder a ella.
Para hacer ms fcil el acceso para los descendientes
declarar: employeeId como protected:
protected int employeeId;

As, las clases descendientes pueden acceder a employeeId


directamente en lugar de usar un accesosr getId()

12. Modificador de acceso protected


EJERCICIO (Usando protected)
La misma empresa vista, con la siguiente
restriccin:

Existen empleados a los que se les debe descontar


cuando se les paga
Los empleados afectados son aqullos que tienen
como sueldo fijo 10000 ms, la tasa de
descuento es del 15%

Salida:
Anna 4000.0
Simon 40800.0
Donovan 3200.0
Glen 1500.0
el salario original es: 24000.0 en ventas es: 15000.0
con descuento por impuestos: 3600.0
Carol 21900.0

12. Modificador de acceso protected

También podría gustarte