Vous êtes sur la page 1sur 90

INTRODUCCIN A LA POO EN JAVA

Elaborado por: Prof. Carolina Matinez Prof Hector Palacios Modificado por: Prof. Eduardo Blanco Prof. Blai Bonet

Taller de Algoritmos 3

Contenido
Elementos para la POO en Java Carctersticas de la POO en Java

Elementos para la POO en Java

Paradigmas de programacin
Paradigma estructurado o procedural: Los
programas se dividen en procedimientos independientes con acceso total a los datos comunes.

Algortimos + Estructuras de Datos = Programas

Paradigma orientado a objetos: Los datos se


consideran la parte ms importante del programa. Los objetos modelan las caractersticas de los problemas del mundo real, su comportamiento ante estas caracteristicas y su forma de interactuar con otros elementos

Objetos + metodos = Programas

Ejemplo: Tomarse un caf en la panadera


Procedural:

OO:

El cliente entra el la panadera El cliente pasa detrs de la barra El cliente prepara la cafetera El cliente se sirve el caf El cliente se bebe el caf.

El cliente entra en la panadera El cliente pide un caf al cafetero El cafetero prepara el caf. El cafetero sirve el caf al cliente. El cliente se bebe el caf.

Conceptos de la Orientacin a Objetos


Clases: Patrones que indican como construir objetos Objetos: Instancias de las clases en tiempo de ejecucin. Miembros de la clase:

Atributos: Caractersticas o propiedades de los objetos (o clases). Pueden ser variables de tipos simples o referencias a otros objetos Mtodos: Comportamientos de los objetos. Son funciones que operan sobre los atributos de los objetos.

Caractersticas de la POO
Cada objeto tiene caractersticas reconocibles. Ejemplo: un empleado tiene Nombre, CI, sueldo, Cada objeto es nico. Ejemplo: el empleado1 es Juan Prez, con CI 1.456.786 gana 890.000 Bs. Los objetos almacenan informacin (sus caractersticas) Los objetos realizan operaciones sobre sus atributos.

Definicin de Aplicaciones
Una aplicacin est conformada por varias clases. La ejecucin comienza por el metodo main de la clase especificada Se recomienda definir una clase por cada archivo Java. En general, cada clase se define en un archivo cuyo nombre debe coincidir con el de la clase definida en l.

Estos dos ltimos puntos aplican a clases pblicas que son las que usaremos en el curso

Ejemplo de Clase
class Circulo { // Atributos (publicos) double radio; String color; // Metodos (publicos) void asigRadio( ){ } double area( ){ } }

Creacin de un objeto

Se usa la palabra reservada new


<refObjeto> = new <NombreClase>();

Ejemplo:
Circulo miCirculo; miCirculo = new Circulo();

Acceso a los miembros de un Objeto


A travs del operador punto (.) se puede acceder tanto a los atributos pblicos como a los mtodos.
<refObjeto>.<atributo> <refObjeto>.<metodo>()

Ejemplo:
Circulo miCirculo = new Circulo(); miCirculo.radio = 10; miCirculo.color = azul; miCirculo.area();

Mtodos
Son el equivalente a los procedimientos de los lenguajes no OO. Un mtodo es un bloque de cdigo definido dentro de una clase. Proporciona un mecanismo para indicarle a un objeto que realice una accin. Un mtodo tiene acceso a todos los atributos de su clase. Un mtodo puede invocar otros mtodos La ejecucin de todos las aplicaciones se inicia en el mtodo main de alguna de las clases.

Definicin de mtodos (I)


Sintaxis para la definicin de un mtodo:
<tipoRet> <nombreMetodo>(< parametros >...) { <instrucciones>...}

La declaracin de un mtodo tiene cuatro

partes bsicas: El nombre del mtodo (nombreMetodo) El tipo del valor de regreso del mtodo (tipo). Si no devuelve ningun valor debe ser void. Una lista de parmetros (parametros). Cada parmetro tiene la forma <tipo> <argumento>. Se separan con comas. El cuerpo del mtodo (instrucciones).

Definicin de mtodos (II)


<instrucciones>, Conjunto de instrucciones que implementan la tarea que debe realizar el mtodo. Si devuelve un valor debe finalizar con la sentencia return return <valor>; <valor> Debe ser del mismo <tipoRet> con que se ha declarado el mtodo. El cdigo se ejecuta hasta alcanzar la instruccin return (si devuelve un valor) o hasta el final del mtodo. Se pueden declarar variables locales si son necesarias.

Ejemplos de Mtodos
double obtRadio( ){ return radio; } void asigRadio(int nuevoRadio){ radio = nuevoRadio; } double Area( ) { return radio*radio*Math.PI; }

Parmetros
Las variables en la lista de parmetros se separan con comas. Los parmetros de la lista en la especificacin del mtodo, son llamados parmetros formales. Cuando un mtodo es llamado, estos parmetros formales son reemplazados por los parmetros actuales. Los parmetros actuales deben ser equivalentes en tipo, orden y nmero a los parmetros formales.

Parmetros - Ejemplo
num = 3; char cr; ch = obj.calc (2, num, Hola Mundo");

char calc (int num1, int num2, String mensaje) { int sum = num1 + num2; char result = mensaje.charAt (sum); } return result;

Paso de parmetros por valor


Cuando es invocado un mtodo con un parmetro de tipo primitivo (p.e. int) el valor del parmetro actual es pasado al mtodo. El valor actual de la variable fuera del mtodo no es afectado, independientemente de los cambios hechos al parmetro formal dentro del mtodo.

Parmetros por valor: Ejemplo


class PruebaPasoPorValor { public static void main(String[] args) { int t = 3; System.out.println(Antes del llamado, la variable t es + t); nPrintln(Bienvenido a Java!, t); System.out.println(Despues del llamado, la variable tes + t); } static void nPrintln(String mensaje, int n) { while (n > 0) { System.out.println(n = +n); System.out.println(mensaje); n--; } }

Paso de parmetros por referencia


Se pueden pasar objetos a mtodos como parmetros actuales Cuando se pasa un objeto al mtodo la referencia del objeto es pasado al parmetro formal Cualquier cambio al objeto local que ocurra dentro del cuerpo afectar al objeto original que fue pasado como argumento.

Parmetro por referencia: Ejemplo


class PruebaPasoPorReferencia { public static void main(String[] args){ Circulo miCirculo; miCirculo = new Circulo(5.0, "blanco"); imprimeCirculo(miCirculo); colorCirculo(miCirculo, negro); imprimeCirculo(miCirculo); } public static void colorCirculo( Circulo c, String color) { c.color = color; } public static void imprimeCirculo(Circulo c) { System.out.println("El rea del circulo de radio " + c.getRadio( ) + " es " +c.Area()); System.out.println("El color del Circulo es " + c.color); } }

Parmetro por referencia: Ejemplo


class Circulo { private double radio; private String color; public Circulo(double r, String c){ radio = r; color = c; } public double getRadio( ){ return radio; } public String getColor( ){ return color; } public double Area( ){ return radio*radio*Math.PI; } }

Alcance de las variables (I)


En java se dispone de tres tipos de variables:

Las variables miembro pertenecientes a una clase. Argumentos de un mtodo de la clase. Variables locales de un mtodo de la clase.

Los argumentos trabajan como variables locales.


public class Ejemplo { private int x; // variable miembro public metodo (int y){ // argumento int z; // variable local x = y + z; } }

Alcance de las variables (II)


Las variables miembros son visibles desde cualquier parte de la clase. Los argumentos y variables locales slo son visibles dentro del mtodo al que pertenece, dejan de existir al finalizar el mtodo. Dentro de un mtodo, si coincide el identificador de un argumento o variable local con el de una variable miembro, slo se accede a la variable del mtodo.

Ejemplo
public class A { private int x; public void metodo (int y){ int x=2; y = 3*x + y - x; System.out.println(y); } } public static main(String[] args) { int arg = 4; A obj = new A(); obj.x = 1; obj.metodo(arg); System.out.println(arg); System.out.println(obj.x); }

Si se requiere accesar el x que es atributo de la clase, es necesario especificarlo mediante el uso de la referencia al objeto

La referencia this
Se emplea para referirse al objeto actual dentro de un mtodo. Con this se hace accesible una variable miembro cuyo identificador coincide con una variable local.

Constructores (I)
Un constructor es un tipo especial de mtodo que permite construir un objeto de una clase. Ejemplo:
public class Circulo { public Circulo(){} public Circulo(double r){} public Circulo(double r, String c){} }

Se utilizan junto con la palabra reservada new que hace la invocacin


Circulo c1 = new Circulo(27);

Constructores (II)
Los constructores se pueden sobrecargar y son opcionales Si no se define ningn constructor, Java proporciona uno por defecto (sin parmetros). Si se define un constructor con argumentos se pierde el constructor por defecto Normalmente en el constructor se inicializan las variables miembro.

Destructores
En Java no hay destructores El garbage collector es el encargado de liberar la memoria.

Cuando se detecta objetos no referenciados Al final de un bloque que haya utilizado objetos.

Carctersticas de la POO

Ms conceptos de OO
Encapsulamiento: Permite la proteccin de ciertas partes de un objeto del acceso desde otros objetos externos Herencia: Jerarqua de clases basada en la agrupacin de atributos o mtodos comunes Polimorfismo: Tratamiento generalizado a todas las clases pertenecientes a una jerarqua de herencia.

Encapsulamiento
El encapsulamiento consiste en la agrupacin de datos y su tratamiento en una misma estructura. Permite la proteccin de la manipulacin externa de algunas partes de los objetos. Un objeto suele tener datos y mtodos privados, de acceso restringido. Fuerza al usuario a usar una interfaz para acceder a los datos. Hace que el cdigo sea ms fcil de mantener

Modificadores para restringir el acceso (I)

La definicin de los miembros de una clase se puede ampliar aadiendo modificadores al principio.:

[modificador]<tipo> <identificador>; [modificador]<tipo> <nombre>(<args>) {...}

Los modificadores permiten acceder a los datos o mtodos de manera restringida

Modificadores para restringir el acceso (II)

public. El miembro de la clase es accesible desde cualquier parte del cdigo. private. El miembro de la clase slo es accesible desde cdigo perteneciente a la propia clase. Note que las subclases tampoco tienen acceso. protected(o friendly). Slo las subclases de la clase y nadie ms pueden acceder a las variables y mtodos.

Ejemplo encasulamiento
public class Circulo { // Atributos private double radio; private String color; // Metodos public void asigRadio( ){ } public double getRadio( ){} } public static main(String args[] ) { Circulo c1; double r1; c1 = new Circulo(); r1 = c1.radio; // Incorrecto!!! r1= c1.getRadio(); // Correcto

Herencia (I)
Jerarquia de clases basada en agrupar atributos y/o mtodos comunes Las clases descendientes se llaman subclases. Las clases ascendientes se llaman superclases. Las subclases heredan caractersticas y mtodos de las superclases (excepto los constructores)

Herencia (II)
Supongamos que tenemos la clase Jefe y la clase Secretaria definidas como:

Jefe { <int><codigo>, <String><nombre>, <int><numDepart>, <int><numSupervisados>} Secretaria { <int><codigo>, <String><nombre>, <int><numDepart>, <Jefe><trabajaPara>}

Herencia (II)
Las partes comunes se pueden agrupar en una misma clase, manteniendo las otras dos con las partes no comunes y heredando de esta nueva clase con la palabra reservada extends.
public class Empleado { protected int codigo; protected String nombre; protected Int numDep; } public class Jefe extends Empleado{ private int numSupervisados; } public class Secretaria extends Empleado { private Jefe trabajaPara; }

Herencia (III)
Para saber si la relacin de herencia es correcta, se plantea la pregunta La subclase es una superclase?. La respuesta debe ser s. Una secretaria es una persona? Si una clase hereda de una nica clase se considera herencia simple. Si una clase hereda de varias clases se considera herencia mltiple. Java slo permite herencia simple. La herencia simple hace que el cdigo sea reutilizable.

Ejemplo herencia
public class Articulo { // clase padre private float precio=0; ... public void setPrecio(float elPrecio) { precio = elPrecio; } ... public float getPrecio() { return precio; } } // los mtodos y atributos de Articulo son heredados a Pelicula public class Pelicula extends Articulo {// clase hijo private descripcion; public void setDescripcion(String descrip) { descripcion = descrip; } ... public String getDescripcion() { return descripcion; } }

Relacin de Contenido
Una clase puede tener referencias a objetos de otras clases. A diferencia de la herencia, es necesario instanciarlos por separado. Responde afirmativamente a la pregunta: <contenedor> tiene un <contenido>? Un artculo tiene precio? Un empleado tiene nombre?

Polimorfismo
Un mtodo con el mismo nombre, tipo de retorno y lista de parmetros puede ser aplicado a objetos de diferentes clases. Uso, trabajar con la clase ms general:

Parmetros polimrficos Colecciones heterogneas

Ejemplo de Polimorfismo
public class Profesor extends Persona { Considere la siguiente jerarqua de clases:

public class Persona { protected nombre = persona; Public Persona(String p) { Nombre = p; } public String toString(){
return Persona:+nombre; }

public Profesor(String p) { super(p); } public String toString() { return Profesor:+nombre; } }


public class Alumno extends Persona { .... public String toString() { return Alumno:+nombre; } } public class ProfesorJubilado extedns Profesor { }

Ejemplo de Polimorfismo
Persona v[]=new Persona[10]; // Se introducen alumnos, profesores y personas en v v[0] = new Persona(); v[1] = new Profesor(); v[2] = new Alumno(); v[3] = new ProfesorJubilado(); .... v[9] = new ProfesorJubilado();

for (int i=0 ; i<10; i++){ System.out.println(v[i].toString()); }

45

Ciclo de vida de un objeto


// An no existe, = null Creacin de objetos: p1 = new Persona(juan..

Persona p1;

Llama al Constructor. Puede dar excepcin: OutOfMemoryError


p1.nombre = otro // illegal: privated p1.nombre() new Persona(maria,...).nombre() == maria

Uso del objeto


No hay ms referencias: recolector de basura

46

Declarando

Clase

Atributos Mtodos Constructores

Declarando una clase


Partes de la declaracion public abstract final class Name extends SuperClass implements Interfaces { cuerpo... } La clase... es pblicamente accesible no puede ser instanciada la clase no puede ser derivada tiene por nombre Name hereda de SuperClass implementa ciertas Interfaces

Por defecto: no public, no abstract, no final, extends Object Si no, es pblica. Slo visible en el mismo paquete.
47

Declarando un atributo
Partes de la declaracin Nivel de acceso
static final transient volatile

Propsito private, protected, etc. si es una var de clase es constante no serializar cambia inesperadamente (thread)

tipo nombre
48

49

Declarando un mtodo
Sintaxis:
modificadores tipo nombre(parametrosFormales) [ throws excepciones] { sentencias }

Tipo a retornar puede ser void Valor devuelto: return <value> Se pueden declarar variables locales si son necesarias Paso de parmetros en Java: por valor. Incluso las
referencias, imitando el pasaje por referencia de otros lenguajes.

Modificadores para mtodos


Modificador niveldeacceso
static abstract final native synchronized

Propsito private, protected, etc. mtodo de clase sin implementacion no puede ser sobreescrito otro lenguaje (c/c++) requiere monitor

50

51

Constructores
Inicializacin de la instancia de una clase: atributos Tan complejos como se desee (ej: pueden invocarse
otros mtodos de la misma clase, o de otras instancias creadas en el constructor). Los constructores tienen el nombre de la clase + argumentos: Persona(String .... Cero o ms constructores por clase. Sino se declara: el constructor por defecto pone los atributos en cero (false, null). Pueden levantar excepciones, pero no pueden devolver un resultado. No se heredan, slo pueden llamarse

Constructores
class Punto { private double x; private double y; public Punto() { this(0.0,0.0); } public Punto(double x,double y) { this.x = x; this.y = y; } ... }

52

Constructores
class Circulo { private Punto centro; private double radio; public Circulo() { this(new Punto(),1); } public Circulo(double x, double y, double radio) { this(new Punto(x,y),radio); } public Circulo(Punto centro, double radio){ this.centro = centro; this.radio = radio; } ... }

53

54

Sobrecarga de mtodos (Polimorfismo)


Todo mtodo tiene una firma: su nombre con el nmero y el tipo de sus parmetros. Sobrecargar mtodos: mismo nombre, distinta firma Siempre se resuelve en tiempo de compilacin (en base al tipo esttico de los parmetros reales): en base al nmero y la especificidad del tipo de los argumentos.

55

Sobrecarga de mtodos (Polimorfismo)


public class DemoOverloading { void print(int a, int b) { ... } void print(int a, char b) { ... } void print(char a, int b) { ... } void print(int a, int b, int c) { ... } }
public class EjemplosManipulacionObjetos { public static void main(String[] args) {

DemoOverloading dm = new DemoOverloading();


md.print(1, 2); md.print(1, a); md.print(a, 1); md.print(1, 2, h); } }

INTRODUCCIN A LA POO EN JAVA (continuacin)


Taller de Algoritmos 3

57

Atributos y metodos de clase


Referidos a la clase y no a una instancia particular

58

Atributos de clase
De instancia. Cada una tiene un valor particular.
Representan el estado particular de cada objeto. De clase. Todas las instancias comparten el mismo valor para estos atributos (como atributo global). Si se cambia en una instancia, se refleja en todas. Representan el estado compartido Se declaran utilizando el modificador static.
class Ficha { public long id; public static long idactual = 0; public Ficha() { id = idactual++; } }

59

Mtodos de clase
Como atributos: static nicamente pueden acceder a atributos de clase No pueden usar la referencia this Unicamente pueden invocar a mtodos de clase El acceso a los mtodos y atributos de clase se
realiza utilizando el operador y el nombre de la clase: Math.sqrt(...); Math.PI; Los mtodos de clase son tiles para:

Modularizar el mtodo main de las aplicaciones Bibliotecas de subrutinas (por ejemplo, java.lang.Math)

60

Ejemplo de static
public class Error{ int x ; public static y ; public static void main (String args[]) Y = 15 ; OK x = 20 ; ERROR } } {

Referencias

62

Referencias
En los mtodos de instancias: disponible una referencia que refiere a la instancia particular: this Por ejemplo para acceder a los atributos ocultos por declaraciones locales en el mtodo null: valor de las referencias que no refieren a ningn objeto. Por defecto toda referencia se inicializa a null Ivette C. Martnez - Hctor Palacios

63

Referencias: Null Pointer


public class Persona { String ci, nombre; Persona madre, padre; public Persona(String nombre, String ci) { this.ci = ci; this.nombre = numbre; } public Persona(String nombre, String ci Persona madre, Persona padre){ this(ci, nombre); this.madre = madre; this.padre = padre; } }

64

Referencias: Null Pointer


Error muy comn: tratar de acceder a referencias null.

public class EjemplosManipulacionObjetos2 { public static void main(String[] args) { Persona juan = new Persona("Juan", "5555555"); // Levantar nullPointerException juan.padre.nombre(); } }

65

Ejemplo con referencias


Public class Ficha{ public int id; Public Ficha(int i) { id = i; } } public class RefDemo { public static void main(String[] args) { Ficha f1; Ficha f2; f1 = new Ficha(2); f2 = new Ficha(4); f2 = f1; f1.id++; } } f2.id;++;

66

Ejemplo con referencias


public class RefDemo2 { public static void main(String[] args) { Persona juan = new Persona("Juan","5555555"); Persona maria = new Persona("Mara","5555555"); Persona pedro = new Persona(Pedro","5555555", maria, juan); juan = maria = null; } }

67

Modificadores de Acceso

68

Modificadores de acceso: atributos y mtodos


El acceso desde otras clases, puede controlarse mediante modificadores en su declaracin:

public : Accesibles en cualquier lugar desde donde la clase es accesible. As mismo, son heredados por las subclases. private: Accesibles nicamente en el interior de la clase. protected: accesibles en las subclases y en el cdigo del mismo paquete. Ninguno (package): Accesible en la clase y el paquete.

Mtodos privados
69

En lugar de construir mtodos pblicos gigantescos e ininteligibles, mejor utilizar mtodos privados. Otro caso til:
class Quicksort implements EstrategiaOrdenacion { public void ordena(Comparable[] v) { quicksort(v,0,v.length1); } private void quicksort(Comparable[] v, int inf, int sup) { ....} }

70

Mtodos para controlar el acceso al estado


No es buena prctica de programacin disponer
directamente de atributos de acceso pblico, excepto constantes (final) Permite cambiar la implementacin Mejor mtodos que controlen el acceso al estado (lectores, escritores: setters, getters): encapsulamiento, control de acceso, mantenibilidad.

class

Ficha { private long id; private static long idactual = 0; public Ficha() { id = idactual++; } public long id() {return id;}

71

Herencia

Ivette C. Martnez - Hctor Palacios

72

Herencia
La clase extendida es la superclase. La clase que se extiende es la subclase Las subclases heredan caractersticas y mtodos de las superclases (excepto los constructores) Puede heredarse de slo una clase Se define una jerarqua de objetos Pero pueden implementarse varias interfaces (truco para permitir herencia mltiple)

73

Object
Todas las clases heredan implcitamente de la
clase Object: raiz de la jerarqua. Object define un conjunto de mtodos redefinibles:

public boolean equals(Object o): Permite definir el criterio de igualdad de contenido de una determinada clase El operador == nicamente chequea la igualdad de referencias. En Object, equals se define directamente como la identidad de referencias. public String toString(): Permite decidir la representacin externa de un objeto. Por defecto es el valor de su referencia, etiquetada con el nombre de la clase.

74

Object
public
class Ficha { private long id; private static long idactual = 0; public Ficha() { id = idactual++; } public long id() { return id; } public boolean equals(Object o) { return (o instanceof Ficha) && ((Ficha)o).id() == id; } public String toString() { return "Ficha(id="+id+")"; }

75

Operadores de Comparacin de Objetos


String s1 = new String("Hola"); String s2 = new String("Hola"); if (s1 == s2) ... if (s1.equals(s2)) ... // false // true

s1.equals(s2) equivale a s2.equals(s1)

76

Heredando clases
La herencia de clases se lleva a
cabo mediante extends Establece una relacin de especializacin -- generalizacin entre clases. La subclase puede introducir nuevos mtodos y redefinir mtodos de la superclase.

77

Heredando clases
public class Persona { // Hereda de Object private String nombre; public Persona(String nombre) { this.nombre = nombre; } public String nombre() {return nombre;} } public class Empleado extends Persona { private double salario; public Empleado(String nombre,double salario) { super(nombre); this.salario = salario; } public double salario() {return salario;} }

Constructores y Subclases
Los constructores de las
subclases siempre invocan un constructor en la superclase como primera accin: El estado establecido en las superclases se inicializa siempre antes Por defecto, este constructor es el que no tiene argumentos. Qu ocurre en el ejemplo?: Ivette C. Martnez - Hctor Palacios
public class Persona { private String nombre; public Persona(String nombre) { this.nombre = nombre; } public String nombre() { return nombre; } } public class Anonimo extends Persona { private String encontradoEn; public Anonimo(String encontradoEn) { this.encontradoEn = encontradoEn; } public String encontradoEn() { return encontradoEn; } }
78

Constructores y Subclases
Los constructores no
se heredan. La forma de invocar constructores de la superclase desde la subclase es a travs de super(...) El uso de this(...) como primera sentencia de un constructor permite retardar la eleccin del constructor de la superclase que se va a ejecutar.
public class Empleado extends Persona { private double salario; public Empleado() { this("*desconocido*",0); } public Empleado(double salario) { this("*desconocido*",salario); } public Empleado(String nombre, double salario) { super(nombre); this.salario = salario; } pulic double salario() { return salario; } }
79

80

Relacin "es-un
Para saber si la relacin de herencia es correcta, se plantea la pregunta "la subclase es-una superclase?". La respuesta debe ser "s el Jefe es-un Empleado? S la Secretaria es-un Empleado? S
class Bici { int numRuedas; int numAsientos; int velocidadMax; } class Avion { int numRuedas; int numAsientos; int velocidadMax; int numAlas; } { int numRuedas; int numAsientos; int velocidadMax; } class Avion extends Bici { int numAlas; } class Bici

Avion es-una Bici? NO

81

Relacin de Contenido ("tieneun")


Una clase puede contener referencias de objetos
de otras clases Se diferencia de la herencia en que es necesario instanciarlos por separado Responde afirmativamente a la pregunta: <Contenedor> tiene-un <Contenido>?
class Motor { ... ... } class Chasis { class Coche { Motor m; Chasis ch; }

un Coche tiene-un Motor? S un Coche tiene-un Chasis? S

82

Sobreescritura de Mtodos
Una subclase puede modificar los mtodos que ha
heredado de la superclase, manteniendo los mismos nombre, tipo de retorno y lista de argumentos
class Empleado { ... int calcularVacaciones(){...} }

class Jefe extends Empleado { int numTrabajadores; int calcularVacaciones(){...} }

83

Polimorfismo en Herencia
Una clase slo tiene una forma, pero una variable
que hace referencia a la superclase de una jerarqua puede tener muchas formas (una por cada subclase)
Empleado e1 = new Empleado(); Empleado e2 = new Jefe(); Empleado e3 = new Secretaria(); e2.numTrabajadores=15; // Error ((Jefe)e2).numTrabajadores=15;

Pueden utilizarse de dos maneras:


Parmetros polimrficos Colecciones heterogneas

84

Parmetros Polimrficos
class Mascota {...} class Raton extends Mascota {...} class Gato extends Mascota {...} class Veterinario { void vacunar ( Mascota m ) {...} } ... Veterinario doctor = new Veterinario(); Gato tom = new Gato(); Raton jerry = new Raton(); doctor.vacunar(tom); doctor.vacunar(jerry); ...

85

Colecciones Heterogneas
Hasta ahora un array slo poda contener
elementos del mismo tipo (coleccin homognea) Utilizando polimorfismo se pueden tener elementos de distinto tipo en un array (coleccin heterognea) Se crean utilizando arrays definidos con el tipo superclase
Mascota[] listaMascotas = new Mascota[5]; listaMascotas[0] = new Mascota(); listaMascotas[1] = new Gato(); listaMascotas[2] = new Raton(); listaMascotas[3] = new Raton(); listaMascotas[4] = new Gato();

Ejemplo de Colecciones Heterogneas


Se consigue tratar a
todos los elementos por igual, aunque alguno tenga un tratamiento especial
... Empleado[] lista = new Empleado[100]; lista[0] = new Empleado(); lista[1] = new Empleado(); ... lista[56] = new Jefe(); ... lista[99] = new Empleado(); for (int i = 0; i < lista.length; i++){ System.out.println( lista[i].calcularVacaciones()); }

class Empleado { ... int salario; int calcularVacaciones(){...} } class Jefe extends Empleado { int numTrabajadores; int calcularVacaciones(){...} }

86

87

Clases Abstractas

88

Clases Abstractas
Una clase abstracta es una clase de la que no
se pueden crear objetos Representa un concepto que no se puede instanciar Se define anteponiendo el modificador abstract a la definicin de una clase
abstract class Mamifero {...} class Canino extends Mamifero {...} class Felino extends Mamifero {...} class Roedor extends Mamifero {...} ... Mamifero m = new Mamifero(); // Error

Mtodos Abstractos
Un mtodo es abstracto si se
declara (dentro de una clase abstracta), pero no se implementa

Todas las subclases de una

abstract class Mamifero { ... public abstract void alimentar(); }

clase abstracta deben implementar los mtodos abstractos que tenga definidos, a menos que sea tambien abstracta

class Canino extends Mamifero { ... public void alimentar() {...} } class Felino extends Mamifero { ... public void alimentar() {...} }

89

Ejemplo
Jerarqua de figuras geomtricas:

class { int int int }

Punto x; y; color;

class Rectangulo extends Figura { Punto ptoFinal; void dibujar() {...} } class Circulo extends Figura { int radio; void dibujar() {...} }

abstract class Figura { Punto ptoOrigen; abstract void dibujar(); }

90

Vous aimerez peut-être aussi