Вы находитесь на странице: 1из 127

Lenguajes , Tecnologas y Paradigmas de Programacin

Tema 2 El Paradigma Orientado a Objetos

Objectivos

Comprender el paradigma Orientado a Objetos y sus conceptos: encapsulacin, herencia y polimorfismo Aplicar los conceptos del paradigma orientado a objetos para un lenguaje orientado a objetos en particular principalmente Java, otros (C#, C++) Comparar los diferentes enfoques de implementaciones de diferentes lenguajes de programacin orientado a objetos

Bibliografia

Pressman Java programming language C# programming language C++ programming language

Contenidos

Introduccin Objectos Clases Constructores Destructores Packages Mensajes Encapsulacin

Agregacin Herencia Interfaces Polimorfismo Excepciones Tipos paramtricos

Introduccin
Vivimos en un mundo lleno de objetos...

En el mundo real cada cosa es un objeto: una silla, un perro, una casa, un coche, una persona...etc. Nosotros creamos programas basndonos en este modelo de objetos de la vida real.

Introduccin
Cada objeto tiene tres caractersticas bsicas:
Identidad lo hace nico y diferente Estado (datos, atributos, propiedades, etc): que describen el objeto Comportamiento (mtodos, operaciones, servicios, funciones, etc): que permite la manipulacin del objeto en una variedad de formas

Introduccin
Ejemplo
Silla A Silla B

Identidad: dos sillas similares, pero los dos son diferentes (identidad A vs identidad B) Estado: coste, dimensiones, alto, ancho, localizacin, color, material, etc. Comportamiento: compra, venta, mover, etc. (operaciones que normalmente modifican el estado del objeto)
7

Objetos

Nosotros podemos pensar que un objeto es una capsula que contiene los atributos y las operaciones

Objecto: silla Coste Dimensiones altura Localizacin Color Comprar Vender Mover

Identidad del Objecto

Atributos del Objecto

Operaciones del Objecto

Clases
Cada objeto pertenece a una clase mucho ms grande de objetos.

La clase es como una plantilla que describe cada uno de los atributos/operaciones comunes al conjunto de objetos.

Cada objeto es una instancia de una clase en particular


Clase

Muebles silla mesa silln Objectos escritorio coche

maquinas movil radio


9

tv

Clases

Los objetos heredan todos y cada uno de los atributos y las operaciones de la clase a la que pertenecen.
Representaremos las clases con sombra Clase: muebles Clase: muebles Coste Coste Dimensiones Dimensiones Medidas Medidas Localizacin Localizacin Color Color Comprar Comprar Vender Vender Mover Mover Representaremos los objetos sin sombra Objecto: mesa Coste Dimensiones Medidas Localizacin Color Comprar Vender Mover Objecto: silla Coste Dimensiones Medidas Localizacin Color Comprar Vender Mover

10

Clases

Con la clase, podemos identificar los objetos del mundo real que mantienen propiedades similares y definirlos todos juntos en una estructura comn La clase es el elemento principal de un programa orientado a objetos En tiempo de ejecucin creamos instancias u objetos de la clase y los manipulamos de alguna manera
clases programa runtina

11 objectos

Clases
Ejemplo (Java)

Java

Definicin de la clase

... public static void main(String[] args) {

public class Point { int x; int y; void move(int newx, int newy) { x = newx; y = newy; } }

Point pt = new Point();


pt.move(1,2); } ...

Creacin de un Objecto

12

Clases
Ejemplo (C#)

C#

Definicin de la clase

... public static void Main() {

public class Point { int x; int y; void move(int newx, int newy) { x = newx; y = newy; } }

Point pt = new Point();


pt.move(1,2); } ...

Creacin Objecto

13

Clases
Ejemplo (C++)
Definicin de la clase

C++
Instancia Esttica. El objeto es almacenado en el momento. Cuando la funcin termina el objeto ya no est disponible
... int main() {

class Point { int x; int y; void move(int newx, int newy); } void Point::move(int newx, int newy) { x = newx; y = newy; }

Point pt1;
pt1.move(1,2); Point *pt2 = new Point(); pt2->move(1,2); } ...

Instancia Dinmica. El objeto se almacena en la pila, cuando la funcin termina El objeto sigue disponible.

14

Clases
Ejemplo (C++)

C++

Mtodos en lnea
Definicin de la clase

class Point { int x; int y; void move(int newx, int newy) { ... } }

Mtodo en lnea El cuerpo del mtodo es definido en la declaracin de la clase.

15

Constructores
Para empezar a trabajar con objetos estos deben ser creados. El proceso para crear un objeto tiene dos pasos:

Asignacin de memoria: Se asigna la memoria necesaria para los atributos del objeto. Inicializacin: Se inicializan los valores de los atributos .

El constructor es una operacin especial que es invocada despus de la asignacin de objetos con el fin de iniciar sus atributos. El constructor es responsable de la asignacin y la inicializacin de todos los recursos de los objetos 16 necesarios antes de sufrir alguna manipulacin.

Constructores
Ejemplo (Java)

Java

El constructor toma el mismo nombre que la clase. No devuelve nada.


public class Point { int x, int y; Point(int x, int y) { this.x = x; this.y = y; } ... }
... public static void main(String[] args) {

Point pt = new Point(10,10);


} ...

17

Constructores
Ejemplo (Java)

Java

El constructor puede estar sobrecargado (varios constructores) Constructores encadenados: un constructor puede invocar otros constructores
public class Point { int x, int y; Point() { this(0,0); }
... public static void main(String[] args) {

Invoca otro constructor


Point pt1 = new Point(); Point pt2 = new Point(10,10);
} ...

Point(int x, int y) { this.x = x; this.y = y; } ... }

18

Constructores
Ejemplo (Java)

Java

Si un constructor no es especificado entonces el compilador de Java proporciona automticamente uno vacio.


public class Point { int x, int y; ... }
... public static void main(String[] args) {

Point pt = new Point();


} ...

19

Constructores
Ejemplo (C++)

C++

Muy parecido al Java, con sintaxis similar.


Instancia Esttica. El objeto se almacena en la pila. Cuando la funcin termina, el objeto ya no est ... disponible
int main() {

class Point { int x, int y; Point(); Point(int,int); } Point::Point() { x = 0; y = 0; } Point::Point(int a, int b) { x = a; y = b; }

Point pt1;
Point pt2(10,10); Point *pt3 = new Point(); Point *pt4 = new Point(10,10); } ...

Instancia Dinmica. El objeto esta almacenado en la pila. Cuando la funcin termina el objeto continua disponible
20

Destructores
Una vez que el objeto ya no se usa , este debe ser destruido y desasignado de la memoria. El proceso de destruir un objeto tiene dos pasos:

Cancelacin de asignacin de objetos/atributos: todos los recursos obtenidos durante el ciclo de vida del objeto se debe desasignar. La destruccin del objeto: el objeto en s se destruye la memoria y no est disponible ms.

El destructor es un mtodo especial que se invoca antes de que el objeto se destruya. El destructor es el responsable de cancelar la asignacin de cualquier recurso obtenido durante el ciclo de vida del objeto. 21

Destructores
Ejemplo (Java)
Java no soporta la gestin de memoria explcita

Java

Nosotros podemos crear objetos (usando el operador new) pero no podemos destruirlos explcitamente

Slo podemos marcar un objeto como "destruido" por la prdida de su referencia (ajustar el contenido de la variable a null) El garbage collector(basurero) es un proceso especial de la mquina virtual Java que se ejecuta de vez en cuando y busca referencias perdidas . El garbage collector invoca al mtodo finalize() y destruye los objetos (desasignando la memoria) 22

Destructores
Ejemplo (Java)

Java

El mtodo finalize() es un mtodo especial que contiene cada Objeto en Java.

Podemos especificar su comportamiento, por defecto (no hace nada) y podemos definir el cdigo que debe ejecutarse antes de que el objeto se destruya. Por lo tanto tenemos la oportunidad de cancelar la asignacin de todos los recursos antes de que el objeto se destruya.

23

Destructores
Ejemplo (Java)
public class Square { Point topL eft,bottomRight; Square() { topL eft = new Point(0,0); bottomR ight = new Point(10,10); } public void finalize() { topL eft = null; bottomR ight = null; } ... }
... public static void main(String[] args){ Square square = new Square(); // usamos square // marcamos el objeto como destruible square = null; // despus de esta lnea, el garbage // collector puede destruir el objeto } ...

Java

24

Destructores
Ejemplo (C++)

C++

Un objeto es destruido, ya sea por sus acabados de alcance, o porque se destruyen de forma explcita mediante la palabra clave delete. Cuando se destruye el objeto, se llama al destructor con el fin de liberar recursos previamente asignados. El destructor debe tener el mismo nombre de la clase, pero precedido de ~, y no devuelve ningn valor.

25

Destructores
Ejemplo (C++)
class Rectangle { Point topL eft, bottomR ight; R ectangle(); ~R ectangle(); } R ectangle::Rectangle() { topL eft = new Point(0,0); bottomR ight = new Point(10,10); } R ectangle::~Rectangle() { delete topL eft; delete bottomR ight; } ... void anyFunction() {

C++

// se crea el objeto // de alcance local Rectangle rect; ... // cuando la funcin termina // el objeto es destruido automticamente dado su alacance } ...

Este objeto se destruye automticamente por su alcance


26 Estos objetos son destruidos usando delete porque han sido creados usando new

Packages
Las Clases son organizadas en paquetes y subpaquetes que ayudan a agrupar todas las clases que ocupan funciones relacionadas. Los paquetes generalmente toma la forma de un rbol. Los paquetes suele modificar el nombre completo de la clase, convirtindose en el prefijo del nombre de la clase.
package A package B C C D D

package A package B C D

27

Packages
Ejemplo (Java)

Java

Recibe el nombre de package


package geometry;

package geometry;

public class Point { public class Square { int x, y; Point topL eft,bottomRight; ... ... } } al mismo La clase pertenece

package
... public static void main(String[] args) { geometry.Square square = new geometry.Square(); ... }
28

Nombre completo de la clase: geometry.Square

Packages
Ejemplo (Java)

Java

Los Packages son importados usando la clave import


package geometry; public class Square { Point topL eft,bottomRight; ... }

package geometry; public class Point { int x, y; ... }

import geometry.Square; import geometry.*; public static void main(String[] args) { Square square = new Square(); ... }

Si importamos podemos usar El nombre corto square.

29

Packages
Ejemplo (Java)

Java

Sub-packages separado con puntos


package geometry.polygons;

package geometry;

public class Point { public class Polygon { int x, y; geometry.Point[] points; ... ... } } a un package diferente La clase pertenece

import geometry.polygons.Polygon; import geometry.*; public static void main(String[] args) { Polygon poly = new Polygon(); ... }

Si importamos podemos usar El nombre corto polygon

30

Packages
Ejemplo (C#)

C#

Los paquetes son definidos usando la clave namespace


namespace geometry { namespace polygons { public class Polygon { ... namespace geometry.polygons { } public class Polygon { } ... } } }

namespace geometry { public class Point { int x, y; ... } }

public static void Main() { geometry.Point pt = new geometry.Point(); ... }

Importando todas las clases


using geometry; using Polygon = geometry.polygons.Polygon; public static void Main() { clases Point pt = new Point(); Polygon poly = new Polygon(); 31 }

Creando un alias para la

Mensajes

Hasta ahora hemos visto que un objeto contiene el estado (atributos) y comportamiento (operaciones).
Cada vez que el objeto recibe un estmulo, se inicia un cierto comportamiento (se ejecuta una operacin). Los mensajes son los estmulos comportamiento de los objetos. que inician el

Traduccin: Cuando un objeto recibe un mensaje, se ejecuta esa operacin.


Sender object attributes: Receiver object attributes:

operations:

operations:

32 message

Mensajes

Enviar/Recibir mensajes puede ser descrito as:


[destino, operacin, parmetros] [enviar, devolver]

Se enva un mensaje al destino, y una operacin se ejecuta en el receptor. Antes de enviar el resultado, otro mensaje/s de otro objeto/s pueden ser enviados.
obj1 attributos: obj2 attributos: obj3 attributos:

[obj1, {return}] operaciones:

operaciones:

[obj2, {return}]

operaciones:

op

op

33

[obj2, op, {data}]

[obj3, op, {data}]

Mensajes
Ejemplo (Java)

Java

Las Operaciones son llamadas Mtodos Un mtodo es invocado (un mensaje es enviado) para ello se usa la siguiente sintaxis: destino.operacin (parmetros)
public static void main(String[] args) { Point pt = new Point(); pt.move(10, 10); ... }
34

Mensaje [pt, move, {10, 10}]

Encapsulacin
Los atributos que describen una clase suelen ser encerrado por una "pared" de las operaciones que son capaces de manipular los datos de alguna manera. La nica manera de alcanzar atributos es ir a travs de uno de los mtodos que forman la pared Nosotros decimos que la clase encapsula los datos
Clase nombre Clase nombre atributos: atributos: operaciones atributos:

operaciones operaciones

35

Encapsulacin
Para soportar la encapsulacin, los lenguajes de programacin orientados a objetos suelen proporcionar modificadores de accesibilidad: pblico, privado, protegido amigo,, etc

Los modificadores de acceso pueden afectar a cualquier miembro de la clase (ya sean atributos u operaciones)
La regla de oro es que para ocultar los datos y publicar slo las operaciones necesarias (se cumple el principio de ocultacin de informacin: ensear tan poca informacin como sea posible)
36

Encapsulacin
Ejemplo (Java)

Java

Soporta 4 modificadores de acceso:

default (por defecto: package visible). El miembro es accesible por la misma clase y de cualquier clase dentro del mismo paquete. public: el miembro es accesible por todo el mundo protected: el miembro es accesible por la misma clase, las subclases y la clase de cualquier dentro del mismo paquete. private: el miembro es accesible slo desde la misma clase.
37

Encapsulacin
Ejemplo (Java)

Java

Los atributos son marcados como privados. Entonces ellos son accesibles a travs de los mtodos consultor (getXX()) y modificador (setXX()). Consultores y modificadores pueden filtrar / extender/ generar/ etc. Informacin, y finalmente aceptar o rechazar la operacin.

38

Encapsulacin
Ejemplo (Java)

Java

public class Point { private int x = 0; private int y = 0; public void move(int newx, int newy) { x = newx; y = newy; } public void setX (int newx) { x = newx; } public int getX () { return x; } public void setY (int newy) { y = newy; } public int getY () { return y; } }

Consultores

Modificadores

39

Encapsulacin
Ejemplo (C#)

C#

Soporta 4 modificadores de accesibilidad

internal (cuando no se usa modificador): conjunto visible. El miembro es accesible desde la misma clase. public: el miembro es accesible por todo el mundo protected: el miembro es accesible por la misma clase y alguna subclase private: el miembro es accesible slo por la misma clase.
40

Encapsulacin
Ejemplo (C#)

C#

C# soporta el concepto de 'propiedad'. Una propiedad es un atributo que se ha adjuntado un consultor y/o un mtodo de actualizacin.
public class Point { private int x = 0,y = 0;

Propiedades public int PositionX { Getters and Setters get { return x; } set { x = value; } Son opcionales
} public int PositionY { get { return y; } set { y = value; } } }

... public static void Main() { Point pt = new Point(); pt.PositionX = 10; pt.PositionY = 10; } ...

41

Encapsulacin
Ejemplo (C++)

C++

Soporta 4 modificadores de acceso

public: el miembro es accesible por todo el mundo. protected: el miembro es accesible por la misma clase y subclases. private (por defecto): el miembro es accesible slo por la misma clase. friend: un friend es una funcin externa o clase que tiene acceso a componentes internos (miembros privados y protegidos de otra clase).
42

Encapsulation
Ejemplo (C++)
... void myFriend(Point pt) { pt.x = 10; pt.y = 10; } ...

C++

class Point { private: int x, y; public: int getX (); void setX (int); int getY (); void setY (int); friend void myFriend(Point); friend class Square; } int Point::getX () { return x; } void Point::setX (int newx) { x = newx; } int Point::getY () { return y; } void Point::setY (int newy) { y = newy; }

Friends puede acceder a Miembros privados

class Square { ... } void Square::fn(Point pt) { pt.x = 10; pt.y = 10; } ...
43

Agregacin

Es tambin conocida como composicin. Un contenedor contiene uno o ms componentes. Esto significa que un objeto puede contener atributos que son objetos en s mismos. Agregacin fuerte: El ciclo de vida de los componentes est ligado al ciclo de vida del contenedor (Ej: cuando el contenedor muere todos los componentes tambin mueren).
Fuerte Coche
ruedas Motor Ojos

Persona
Nariz
44

Agregacin
Ejemplo (Java)

Java

Esquina inferior derecha

Atributos son objectos


public class Square { Point topL eft,bottomRight; Square() { topL eft = new Point(0,0); bottomR ight = new Point(10,10); } public void finalize() { topL eft = null; bottomR ight = null; } ... }

Esquina superior izda Cuadrado


Punto Punto

Agregacin Fuerte - Cuando el cuadro es creado, ambos puntos son creados - Cuando el cuadro es destruido, ambos puntos son destruidos

45

Herencia

Tambin conocida especializacin.

como

generalizacin

Es el mecanismo que permite el diseo de clases basadas en otras clases bsicas heredando/extendiendo toda la informacin descrita es aquellas clases. La clase bsica es llamada clase padre, superclase o clase general. La clase que hereda toda la informacin es llamada subclase, clase hija, clase derivada o clase especializada.
46

Herencia

Es un mecanismo muy poderoso para la reutilizacin de cdigo. Todo lo que se define en la superclase est disponible en la subclase.
Forma aributos: aributos: Forma Shape

attributes:

operaciones: operaciones:

operations:

herencia
Crculo atributos: atributos: Crculo Shape

Herencia
Cuadrado Shape Cuadrado atributos: atributos:

attributes:

attributes:

operaciones: operaciones:

operations:

operations:

operaciones: operaciones: 47

Herencia

Las subclases pueden redefinir (sobreescribir) la informacin definida en la superclase


Forma atributos: atributos: Forma Shape

attributes:

operacioes: operacioes: dibujar() operations: - dibujar() - area() - area()

hereda
Crculo atributos: atributos: Crculo Shape

hereda
Cuadrado Shape Cuadrado atributos: atributos:

attributes:

attributes:

operaciones: operaciones: - dibujar() operations: - dibujar() - area() - area()

operaciones: operaciones: - dibujar() operations: - dibujar() - area() - area() 48

Herencia

Las clases son organizadas segn la Herencia en jerarquas

49

Herencia
Herencia Simple

Una subclase slo puede heredar del padre.

Si una subclase necesita caractersticas de ms de una clase deber usar la agregacin para usarlas. La jerarqua son rboles estrictos.

50

Herencia
Herencia Mltiple

Una subclase puede heredar de ms de una clase padre. La jerarqua ya no es necesariamente en forma de rboles.

51

Herencia
Herencia Mltiple
Posible problema: colisiones Colisiones: cuando dos caractersticas que vienen de diferentes clases padre tienen el mismo nombre. Solucin: (1)Evitar esta situacin y generar error de compilacin. (2)Ocultar una caracterstica en favor de la otra. (3)cuando se utiliza la caracterstica, requiere la especificacin de cul de las dos caractersticas heredadas hace referencia. Algunos lenguajes prohben la herencia mltiple para evitar confusiones.
52

Herencia
Ejemplo (Java)

Java

Java implementa Herencia simple con clases pero Herencia mltiple con interfaces Para esto usa la palabra clave 'extends'
public class Circle extends Shape { public Circle() { ... } ... }

public class Shape { public Shape() { ... } public void draw() { ... } public float area() { ... } ... }

public class Square extends Shape { public Square() { ... } ... }

53

Herencia
Ejemplo (Java)

Java

Cuando un objeto de una subclase es creado, los constructores de la clase padre son invocados primero.
1
public class Shape { public Shape() { ... } public void draw() { ... } public float area() { ... } ... }

... Square square = new Square(); ...

public class Square extends Shape { public Square() { ... } ... }

54

Herencia
Ejemplo (Java)

Java

Nosotros podemos usar 'super' para encadenar los constructores de la subclase y superclase (debe ser la primera instruccin del constructor)
{ ... } a) { ... } a, int b) { ... }

public class Shape public Shape() { public Shape(int public Shape(int ... }

public class Square extends Shape { public Square() { super(0,0); // make something else } ... }

55

Herencia
Ejemplo (Java)

Java

La subclase puede redefinir (overwrite) los mtodos definidos en la superclase. Cuando redefinimos el prototipo del mtodo debe ser el mismo.

Si cambia el nombre entonces es otro mtodo. Si el nmero o el tipo de parmetros cambia entonces es otro mtodo con el mismo nombre. (overloading). Si cambia el valor que devuelve , entonces error.

El mtodo original definido en la superclase puede ser 56 usado con 'super'

Herencia
Ejemplo (Java)
public class Shape { protected Color color; protected double area; public void setArea(double area) { this.area = area; } public double getArea() { return area; } public String toString() { return Shape with area + area; } public boolean equals(Object x) { Figure fx = (Figure)x; return (color.equals(fx.color) && area == x.area); } }

Java

57

Herencia
Ejemplo (Java)
public class Circle extends Shape { protected double radio; public void setRadio(double radio) { this.radio = radio; } public double getRadio() { return radio; } /* Overwritten methods */ public String toString() { return super.toString() + and with radio + radio; } public boolean equals(Object x) { Circle cx = (Circle)x; return (super.equals(x) && radio == cx.radio); } }

Java

58

Herencia
Ejemplo (Java)

Java

En Java, la clase java.lang.Object es el padre de cualquier otra clase Si una clase no se extiende a otra clase , entonces por defecto se extiende a Objeto

59

Herencia
Ejemplo (Java)

Java

La clase java.lang.Object proporciona algunos mtodos interesantes.:


wait(), notify(), notifyAll(): procesos de sincronizacin hashCode(): cdigo nico para objeto toString(): String representacin de un objeto equals(): igualdad entre objetos

Los dos ltimos son redefinidos para ms subclases.

60

Herencia
Ejemplo (C#)

C#

Slo soporta Herencia simple Herencia con clases pero Herencia mltiple con interfaces (como Java) Para esto usa el smbolo ':'
public class Shape { ... public void draw() { ... } public float area() { ... } ... } public class Circle: Shape { ... }

public class Square: Shape { ... }

61

Herencia
Ejemplo (C#)

C#

Cuando un objeto de una subclase es creado, los constructores de la clase padre son invocados primero.

Las clases derivada pueden comunicarse con las clases base usando la palabra clave 'base'
public class Shape { public Shape() { ... } public Shape(int a) { ... } ... }

public class Square: Shape { public Square(): base(0) { ... } ... }


62

Herencia
Ejemplo (C#)

C#

La subclase puede redefinir (overwrite) los mtodos definidos en la superclase. Cuando redefinimos el prototipo del mtodo debe usar el mismo nombre.

Si el nombre cambia entonces es otro mtodo. Si el nmero o el tipo de parmetros cambia entonces es otro mtodo con el mismo nombre. (overloading). Si cambia el valor que devuelve , entonces error.

El mtodo original definido en la superclase puede ser usado con 'base'


63

Herencia
Ejemplo (C#)

C#

Si el mtodo en la supercalse est marcado como virtual' entonces el mtodo redefinido debe estar marcado con 'override' (ms adelante Polimorfismo) Si el mtodo de la superclase no est como virtual' entonces el mtodo redefinido debe estar marcado como 'new' El comportamiento del mtodo redefinido es diferente como veremos en Polimorfismo.

64

Herencia
Ejemplo (C#)

C#

public class Shape { public void draw() { ... } public virtual float area() { ... } }

public class Circle: Shape { public new void draw() { ... } public override float area() { ... } }
65

Herencia
Ejemplo (C++)

C++

El smbolo ':' se usa con los especificadores de acceso (public, private, protected) . El especificador de acceso es opcional, si no se especifica por defecto se asume privado (private) El especificador de acceso limita el nivel ms accesible de lo miembros heredados de la clase base Ej Los miembros con un nivel ms accesible son heredados con el mismo nivel.

66

Herencia
Ejemplo (C++)
class Circle: public Shape { ... }

C++

class Shape { public: void draw(); float area(); ... } void Shape::draw() { ... } float Shape::area() { ... }

class Square: public Shape { ... }

67

Herencia
Ejemplo (C++)

C++

C++ soporta Herencia mltiple con clases


class Shape { public: void draw(); float area(); ... } class Whatever { public: void print(); ... }

class Child: public Shape, public Whatever { public: void otherTask(); ... }

68

Herencia
Ejemplo (C++)

C++

Ambiguedades (colisiones) se resuelven usando el calificador ClassName::o usando la palabra clave virtual (ms sobre esto en Polimorfismo)
class A { public: int i,j void g(int) { } } class B { public: int j; void g() { } } class C: public A, public B { public: int i; }

int main() { C obj; obj.i = 5; // obj.j = 10; obj.A::j = 10; // obj.g(); obj.B::g(); }

Ambiguedad: atributo 'j' llega de dos fuentes. Usando A::j qualificador decide cual de ambos es usado

Ambigedad: a pesar de tener diferentes argumentos el nombre `g ` Tiene dos fuentes usando B::g se decidira cual se usa
69

Herencia
Clases Abstractas

Java

Una clase abstracta es una clase que est parcialmente definida y por lo tanto no se pueden crear instancias (no se pueden crear objetos de una clase abstracta). Una clase abstracta contiene mtodos abstractos. Un mtodo abstracto es un mtodo no implementado. Una clase abstracta por lo general recoge un conjunto de definiciones comunes que deben ser redefinidas por subclases siguientes. Las subclases deben implementarse (redefinirse) el mtodo abstracto o ellas tambin seran abstractas.
70

Herencia
Clases Abstractas . Ejemplo (Java)

Java

Usamos 'abstract'
public abstract class MyClass { ... }

Una clase con mtodos abstractos es necesariamente abstracta.


public abstract class MyClass { ... public abstract mthd(); ... }
71

Herencia
Clases Abstractas . Ejemplo (C++)

C++

En C++, un mtodo abstracto es llamado pure virtual method Una clase con un mtodo virtual es abstracto.
class Polygon { private: int width, height; public: void setWidth(int); void setHeight(int); virtual int area() = 0; }

72

Interfaces

Es un concepto que soporta encapsulacin Encapsulacin permite ocultar algunos datos (tpicamente datos), y publica otros miembros (por lo general operaciones) Nosotros podemos implementacin separar la interface de su

Interface: es la parte estable y pblica y que define las operaciones que un componente particular debe tener. Implementacin: es la parte oculta y cambiante , se define la implementacin de las operaciones as como los atributos particulares necesarios para la ejecucin de tales operaciones.
73

Interfaces

La interface llega a ser independiente de la implementacin. Slo las partes necesarias se publican el resto permanece oculto. A nosotros no nos centraremos en la implementacin, solo en las operaciones que nosotros podemos usar con un objeto.

74

Interfaces

La misma interface puede ser implementada de diferentes maneras.


implementation1 implementation1 attributes: attributes: implementation2 implementation2 interface interface operations: operations: operations: attributes: operations: attributes: implementation3 implementation3 operations: attributes: operations: attributes:

operations: operations:

75

Interfaces

Herencia tambin se usa con interfaces Entonces nosotros decimos que un padre/base/super inteface es heredado/extendido por un hijo/derivado/subinterface Herencia jerarqua tambin se puede crear

Simple Herencia vs mltiple Herencia No hay problemas de colisin: ningn comportamiento (implementacin) est 76 asociada con las operaciones (ellas estn vacas)

Interfaces
Ejemplo (Java)

Java

Una interface es una coleccin de mtodos sin implementacin Una interface define un comportamiento que puede ser implementado por cualquier clase. Est prohibido crear objetos a partir de las intefaces La interface es una entidad completamente independiente de cualquier implementacin potencial.

77

Interfaces
Ejemplo (Java)

Java

Nosotros usamos el identificador 'interface'


public interface Calculator { double add(double a, double b); double substract(double a, double b); double multiply(double a, double b); double divide(double a, double b); }

public interface Printer { void print(String texto); }

public interface Shape { void draw(); }

78

Interfaces
Ejemplo (Java)

Java

En una interface, todos los mtodos son pblicos por defecto (no hay necesidad de declararlos como public) En una interface podemos definir constantes Todas las constantes son pblicas por defecto (no hay necesidad de declararlas como public)

79

Interfaces
Ejemplo (Java)

Java

public interface Calculator { double PI = 3,2426; double add(double a, double b); double substract(double a, double b); double multiply(double a, double b); double divide(double a, double b); }

80

Interfaces
Ejemplo (Java)

Java

Una clase puede implementar cualquier nmero de interfaces. Si una clase implementa una interface, debe proporcionar implementaciones para lo mtodos definidos en la interface. La interface es un contrato que debe ser cumplido por las clases que la implementan. Si conocemos la interface que un clase particular implementa es muy simple deducir su funcionamiento.

81

Interfaces
Ejemplo (Java)

Java

Palabra clave 'implements'


public class CalculatorImpl implements Calculator { public double add(double a, double b) { return a+b; } public double substract(double a, double b) { return a-b; } public double multiply(double a, double b) { return a*b; } public double divide(double a, double b) { return a/b; } }
82

Calculator Calculator operations: operations:

implements
CalculatorImpl CalculatorImpl attributes: attributes:

operations: operations:

Interfaces
Ejemplo (Java)

Java

Java soporta Herencia mltiple con interfaces (recordar que slo Herencia simple es soportada con clases).
public interface B { public void m1(); public void m2(); } public interface C extends A, B { public void m3(); }

public interface A { public void m1(); }

public class MyClass implements C { public void m1() { ... } public void m2() { ... } public void m3() { ... } }

83

Interfaces
Ejemplo (C++)

C++

C++ no soporta nativamente el concepto de interface. En su lugar soporta el concepto de 'clase abstracta'. Si todos lo mtodos de una clase abstracta son puro virtual (abstracto), entonces la clase parecera una interface.
class Calculator { public: virtual double add(double,double) = 0; virtual double substract(double,double) = 0; virtual double multiply(double,double) = 0; virtual double divide(double,double) = 0; }

84

Interfaces
Ejemplo (C++)
class CalculatorImpl: Calculator { public: double add(double,double); double substract(double,double); double multiply(double,double); double divide(double,double); } double CalculatorImpl::add(double a, double b) { return a+b; } double CalculatorImpl::substract(double a, double b) { return a-b; } double CalculatorImpl::multiply(double a, double b) { return a*b; } double CalculatorImpl::divide(double a, double b) { return a/b; }
85

C++

Polimorfismo
Polimorfismo significa muchas formas

Es una caracterstica que permite valores de tipos de datos diferentes (y que tiene diferentes comportamientos) a ser tratadas utilizando una interfaz uniforme

Se aplica a ambos operaciones y tipos de datos

Una operacin puede ser polimrfica con respecto a uno o varios argumentos. Ejemplo: el operador + puede ser aplicado a valores de diferentes tipos como enteros, reales... Un tipo de datos puede ser polimrfico respecto a los tipos de elementos que contiene. Ejemplo: Una lista con los elementos que pertenecen a tipos arbitrarios..
86

Polimorfismo
Clases de Polimorfismo

Ad-Hoc o evidente Polimorfismo: trabaja con un nmero finito de tipos de datos diferentes y sin relacin potencial

Sobrecarga Coaccin
87

Polimorfismo
Clases Polimorfismo

Universal o real Polimorfismo: trabaja con un nmero infinito de tipos de datos donde hay una estructura comn.

Polimorfismo Inclusin (Herencia) Polimorfismo Paramtrico (genricos)


88

Polimorfismo
Sobrecarga (Overloading)

Una operacin con el mismo nombre tiene una variedad de definiciones Ejemplo: el operador + denota diferentes funciones, con diferentes implementaciones, dependiendo del tipo de argumentos (enteros, reales etc)

89

Polimorfismo
Sobrecarga (Overloading). Ejemplo (Java)

Java

Java soporta la sobrecarga de mtodos, siempre que tengan diferente nmero y tipo de argumentos.
public class Calculator { public double add(double a, double b){ ... } public int add(int a, int b){ ... } public float add(float a, float b){ ... } }

... int i = 10, j = 10; Calculator c = new Calculator(); c.add(i, j); ...
90

Polimorfismo
Sobrecarga. Ejemplo (Java)

Java

El lenguaje sobrecarga operadores matemticos, el operador + est sobrecargado para concatenar cadenas.

... int i = 10, j = 10; int r = i + j; ...

... String a = hello, b = world; String c = a + , + b + !; ...

91

Polimorfismo
Sobrecarga. Ejemplo (C#)

C#

Los mtodos soportan la sobrecarga como en Java Los operadores soportan sobrecarga
public class Matrix { public static Matrix operator *(Matrix m1, Matrix m2) { ... } public static Matrix operator +(Matrix m1, Matrix m2) { ... } public static Matrix operator -(Matrix m1, Matrix m2) { ... } }

... int i = 10; int j = 10; int r = i * j; ... Matrix m1 = new Matrix(); Matrix m2 = new Matrix(); Matrix m3 = m1 * m2; ...
92

Polimorfismo
Coaccin

Conversin (implcita o explicita) de un tipo de argumento en otro. Implcita : Normalmente usado en combinacin con una jerarqua de tipos. Ejemplo: nosotros encontramos coaccin en operadores aritmticos entre valores enteros y reales en muchos lenguajes.

Algunos lenguajes permiten forzar la coaccin explicita tambin llamada cast.


93

Polimorfismo
Coaccin. Ejemplo (Java)

Java

Coaccin Implcita
int i = 10; double j = 10.0; double r = i + j; // variable i es implcitamente convertida a double int error = i + j; // error; requiere coaccin explicita String a = i have ; int count = 10; String c = a + count + apples; // la variable count es implicitamente convertida a String

String a = hello, ; Calculator calc = new Calculator(); String c = a + calc; // el objeto Calculator es implicitamente convertido a String por la llamada // de mtodo String()

94

Polimorfismo
Coaccin. Ejemplo (Java)

Java

Explicita (cast)
int i = 10; double j = 10.0; int r = (int)(i + j); // el resultado (a double) es explcitamente convertido a int

Si la conversin no es legal, entonces un java.lang. ClassCastException ser lanzado en tiempo de ejecucin.


Calculator calc = new Calculator(); Integer i = (Integer)calc; // error, asignacin ilegal , Calculator y Integer no son clases compatibles

95

Polimorfismo
Herencia (Polimorfismo inclusin)

La misma variable puede contener objetos de diferentes tipos, siempre que estos objetos pertenezcan a una inclusin comn. El resultado es la misma variable que se comporta de maneras diferentes ante los mismas operaciones (polimorfismo). Este concepto se aplica tanto a clases como a interfaces.

96

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (Java)

Java

Polimorfismo con clases


Shape shp = new Shape();
Shape draw()
shp del tipo Shape (esttico) shp referencia un objeto de tipo Shape (dinmico)

Shape shp2 = new Circle();


<<extends>> <<extends>>
shp2 del tipo Shape (esttico) shp2 referencia un objecto de tipo Circle (dinmico)

Circle draw()

Square draw()

shp2.draw(); /* bibujar un crculo (circle)*/ shp2 = new Square(); shp2.draw(); /* dibujar un cuadrado (square) */
97

La misma variable se comporta de manera diferente en el mismo mtodo (Polimorfismo)

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (Java)

Java

Polimorfismo con interfaces


Shape shp = new CircleImpl();
<<interface>> Shape draw()
shp del tipo Shape (esttico) shp referencia un objecto del tipo CircleImpl (dinmico)

<<implements>>

<<implements>>

shp.draw(); /* dibuja un crculo */ shp = new SquareImpl(); shp.draw(); /* dibuja un cuadrado */

CircleImpl draw()

SquareImpl draw()
98

La misma variable se comporta de diferentes maneras (Polimorfismo)

Polimorfismo

Java

Herencia (Polimorfismo inclusin). Ejemplo (Java)

Una variable es polimrfica cuando su declaracin de tipo (tipo esttico) no coincide con el tipo de objeto referenciado (tipo dinmico). El operador instanceof ayuda a determinar el tipo dinmico de la variable:
if (shp instanceof Circle) {...}

Para convertir una referencia del tipo base (Shape) a una referencia de tipo derivada (Circle) es requerida una conversin explcita (casting) :
if (shp instanceof Circle) { Circle circ = (Circle)shp; }
99

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)

C#

En C#, podemos definir un mtodo virtual usando la clave 'virtual' Un mtodo virtual es un mtodo Polimrfico El se puede redefinir con nuevos valores en una subclase usando la palabra reservada 'override' Cuando el mtodo no era virtual se debe usar la palabra new

100

Polimorfismo
Herencia ( Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }

C#

Animal a1 = new Animal(); a1.habla(); a1.canta(); a1.saluda();


101

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }

C#

La salida es:
Animal a1 = new Animal(); a1.habla(); a1.canta(); a1.saluda();

Animal constructor Animal habla Animal canta Animal dice Hola


102

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }

C#

Animal a2 = new Perro(); a2.habla(); a2.canta(); a2.saluda();


103

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }

C#

La salida es:
Animal a2 = new Perro(); a2.habla(); a2.canta(); a2.saluda();

Animal constructor Perro constructor Animal habla Perro canta Animal dice Hola 104

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }

C#

Perro d = new Perro(); d.habla(); d.canta(); d.saluda();


105

Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }

C#

La salida es:
Perro d = new Perro(); d.habla(); d.canta(); d.saluda();

Animal constructor Perro constructor Perro habla Perro canta Animal dice Hola 106

Polimorfismo
Genricos (Polimorfismo Universal)

Soluciona el problema de la aplicacin de algoritmos y estructuras de datos genericas . Genrico significa que soporta diferentes tipos de datos. La misma estructura puede trabajar con diferentes tipos de datos de una forma homognea.

107

Polimorfismo

Java

Genricos (Polimorfismo universal). Ejemplo (Java)

Antes del JDK 1.5, Java no soportaba genricos La Generacidad fue simulada aprovechando el java.lang.Object Como todas las clases se extienden, entonces una variable de objeto puede contener una referencia a cualquier tipo de datos.
Object obj = new Integer(5);

Ms tarde, necesitamos hacer multiples conversiones explicitas (castings) para obtener el tipo de datos original
Integer n = (Integer)obj;
108

Polimorfismo
Genricos (Polimorfismo universal). Ejemplo (Java)

Java

Ejemplo Box almacene objetos de ningn tipo


public class B ox { private Object data; public Object get() { return data; } public void set(Object x) { data = x; } } public class BoxTest { public static void main(String[] args) { Box b = new B ox(); b.set(new Integer(46)); Integer n; n = (Integer)b.get(); } }

y si usamos el siguiente programa? dar un error de compliacin o de ejecucin?


public static void main(String[] args) { B ox b = new B ox(); b.set(Hello); Integer n = (Integer)b.get(); }

109

Polimorfismo

Java

Genricos (Polimorfismo universal). Ejemplo (Java)

Desde JDK .5 soporta genricos La generacidad permite usar tipos de datos como parmetros Ventajas:

Los Errores pueden ser detectados en tiempo de compilacin No usaremos conversiones explcitas Los Errores disminuyen y aumenta el rendimiento

110

Polimorfismo

Java

Genricos (Polimorfismo universal). Ejemplo (Java)


public class B ox <T> { private T data; public T get() { return data; } public void set(T x) { data = x; } }

El valor del parmetro T puede ser una clase o interface (pero nunca un tipo primitivo). Cuando un objeto de tipo Box es declarado necesitamos especificar el tipo del parmetro T.
Box <Integer> b = new Box <Integer>();
111

Polimorfismo

Java

Genricos (Polimorfismo Universal). Ejemplo (Java)

Ejemplo de uso

public static void main(String[] args) { B ox<Integer> b = new B ox<Integer>(); b.set(new Integer(46)); Integer n = b.get();

Este programa mostrara un error de compilacin.


public static void main(String[] args) { Box<String> b = new B ox<String>(); b.set(Hola); Integer n = b.get(); }

112

Polimorfismo

Java

Genericos (Polimorfismo Universal). Ejemplo (Java)

En Java, podemos encontrar una gran cantidad de clases genricas. La mayoria de ellas implementadas en colecciones (in java.util) Ejemplo: ArrayList, implementacin de una matriz de tamao variable
packake java.util; public class ArrayL ist <E > { public ArrayL ist(); public boolean add(E element); public E set(int index, E element); public E get(int index); public E remove(int index); public int size();
113

Polimorfismo

Java

Genericos (Polimorfismo universal). Ejemplo (Java)

A veces tenemos que restringir el tipo de parmetros genricos . Nostros usamos extends. Ejemplo: en el parking slo hay vehculos aparcados.
public class Parking <V extends Vehicle> { private int numPlaces; private ArrayL ist<V> places; public Parking(int numPlaces) { this.numPlaces = numPlaces; places = new ArrayL ist<V>(numPlaces); }

114

Polimorfismo
Genricos (Polimorfismo Universal). Ejemplo (Java)

Java

Nosotros podemos definir Mtodos Genricos (no clases). Ejemplo: Mostrar el contenido de una lista ArrayList
public class OperationsArray { public static <T> void showArray(ArrayL ist<T> a) { for (int i = 0; i < a.size(); i++) System.out.println(a.get(i).toString()); } }

Este parmetro colo puede ser usado dentro del Mtodo donde se ha definido
115

Polimorfismo
Generics (universal Polimorfismo). Ejemplo (Java)

Java

Ejemplo: La interface generca java.lang. Compara entre dos objetos comparables:

public interface Comparable<T> { public int compareTo(T x); }

<0, Devuelve un nmero > 0,

si es < x si es > x

== 0, si es = x
116

Polimorfismo

Java

Genricos (Polimorfismo Universal). Ejemplo (Java)

Ejemplo: usando genricos, nosotros implementamos la comparacin para el mtodo de la clase Figure.
public abstract class Figure implements Comparable<Figure> { ... public int compareTo(Figure f) { if (this.area() < f.area()) return -1; else if (this.area() > f.area()) return 1; else return 0; } ...

117

Excepciones

Este es el principal mecanismo de manejo de errores del paradigma orientado a objetos. Cuando un programa es ejecutado, pueden sufrir algunas situaciones imprevistas. Nosotros las llamamos Excepciones. El programa debe detectarlas y cambiarlas para resolverlas. La rutina que resuelve el problema es lo que se llama manejador de excepciones. Cuando se genera un excepcin la ejecucin normal del programa es interrumpida y es buscado el manejador de excepciones adecuado. Si se encuentra , el manejador de excepcin toma 118 el control.

Excepciones
Ejemplo (Java)

Java

En Java, podemos identificar dos tipos de situaciones de inesperadas.:

No recuperables o errors: bajo nivel, normalmente afectan al hardware, fallo de memoria, etc. Recuperables o Excepciones: el resto de situaciones.

En Java, los errores/Excepciones son clases.

119

Excepciones
Ejemplo (Java)

Java

Errores y Excepciones jerarqua


Object

Situacin inesperada Los errores deben repararse Error

Throwable Las Excepciones deben controlarse Exception IOException I/O error NullPointerException User Excepciones Error lgico de programa

Error de programacin RuntimeException ... ArithmeticException IndexOutOfBoundsException

Ex.: divisin x cero Ex.: indice fuera de rango Ex.: usa una referencia 120 nula

Excepciones
Ejemplo (Java)

Java

Definicin de un uso de excepcin


public class UserE xception extends E xception { /* Constructors */ public UserE xception(String msg) { super(msg); } public UserE xception() { super(); } }

Una excepcin normalmente contiene un mensaje con la descripcin del problema El mensaje se puede obtener invocando al mtodo getMessage(), heredado de la clase Throwable.
121

Excepciones
Ejemplo (Java)

Java

Cuando un error o excepcin surge , se crea un objeto de la clase correspondiente . Este objeto contiene informacin sobre el problema y la ejecucin del programa es interrumpida, lanzando tal excepcin Se produce una excepcin mediante la instruccin throw.

UserE xception exc = new UserE xception(); throw exc; /* abbreviated */ throw new UserE xception(Something);

122

Excepciones
Ejemplo (Java)

Java

Cuando se produce una excepcin el cdigo puede:

Propagar la excepcin a cualquiera , para ser gestionada por otro, (pasar la patata caliente). O controlar/atrapar la excepcin con un manejador de excepciones.

Cuando se invoca un mtodo que provoca una excepcin, el cdigo que lo invoc tiene las dos mismas opciones : propagar o atacar la excepcin.

123

Excepciones
Ejemplo (Java)

Java

Cuando un mtodo propaga una excepcin, el debe ser declarado como explcito en el prototipo del mtodo con throws.

public void propagateTheE xception() throws UserE xception { throw new UserE xception(); } public void propagateTheE xcepciones(int cod) throws E xception1, E xception2 { switch (cod) { case 1: throw new E xception1(); case 2: throw new E xception2(); } }

124

Excepciones
Ejemplo (Java)

Java

Con el fin de controlar/ atacar la excepcin, se debe definir un manejador de excepciones try-catch-finally
public static void main (String[] args) { try { Dentro del try colocamos el cdigo que podra lanzar Excepciones Dentro del catch , en caso de excepcin se controla canThrowE xception(); } catch (ThrownE xception exc) { System.out.println(E rror message: + exc.getMessage()); exc.printStackTrace(); } finally { } }
125

Optional. Se ejecuta SIEMPRE independientemente de la excepcin

System.out.println(This is always executed);

Excepciones
Ejemplo (Java)

Java

El bloque catch puede ser reproducido tantas veces como excepciones hayan en el cdigo.
try { mayThrowE xception1(); mayThrowE xception2() } catch (E xception1 e1) { System.out.println(E rror message: + e1.getMessage()); e1.printStackTrace(); } catch (E xception2 e2) { System.out.println(E rror message: + e2.getMessage()); e2.printStackTrace(); }

126

Excepciones
Ejemplo (Java)

Java

El bloque catch soporta Herencia para identificar el tipo de excepcin. La mayora de excepciones son manejadas al final.
try { mayThrowSeveralE xcepciones(); } catch (E xception e) { e.printStackTrace(); } catch (Throwable thr) { thr.printStackTrace(); }
127

Captura algn tipo de excepciones

System.out.println(E rror message: + e.getMessage());

Captura las situaciones inesperadas

System.out.println(E rror message: + thr.getMessage());

Вам также может понравиться