Académique Documents
Professionnel Documents
Culture Documents
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
Paradigmas de programacin
Paradigma estructurado o procedural: Los
programas se dividen en procedimientos independientes con acceso total a los datos comunes.
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.
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
Ejemplo:
Circulo miCirculo; miCirculo = new Circulo();
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.
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).
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;
Las variables miembro pertenecientes a una clase. Argumentos de un mtodo de la clase. Variables locales de un mtodo de la clase.
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){} }
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
La definicin de los miembros de una clase se puede ampliar aadiendo modificadores al principio.:
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:
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; }
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();
45
Persona p1;
46
Declarando
Clase
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.
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
55
57
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
64
public class EjemplosManipulacionObjetos2 { public static void main(String[] args) { Persona juan = new Persona("Juan", "5555555"); // Levantar nullPointerException juan.padre.nombre(); } }
65
66
67
Modificadores de Acceso
68
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
class
Ficha { private long id; private static long idactual = 0; public Ficha() { id = idactual++; } public long id() {return id;}
71
Herencia
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
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
81
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(){...} }
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;
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();
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
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:
Punto x; y; color;
class Rectangulo extends Figura { Punto ptoFinal; void dibujar() {...} } class Circulo extends Figura { int radio; void dibujar() {...} }
90