Profesora Yasna Meza Hidalgo mailto: mailto:
[email protected]
Orientación a objetos Clase Objeto Encapsulación Relaciones entre clases
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 2
1
Suponga que se desea manejar información acerca de los empleados de una empresa. Se sabe que los empleados se dividen en Empleados Fijos y Empleados a Honorarios. Los Empleados fijos cuentan con un sueldo base y un número de cargas, por su parte los empleados a honorarios cuentan con un valor por hora y un número de horas trabajadas. Independiente del tipo de empleado que se trate cada uno de ellos, tiene un nombre, un RUT y una ciudad de residencia.
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 3
Cada empleado tiene un RUT, un nombre y una ciudad de residencia.
EMPLEADO
public class Empleado { /* Definición de atributos */ private String RUT; private String nombre; private String ciudad;
- RUT - Nombre - Ciudad + + + +
RUT() nombre() ciudad() imprimir()
Agosto 2005
/* Definición de métodos */
}
Profesora Yasna Meza Hidalgo
Diapositiva 4
2
Cada empleado fijo tiene los antecedentes comunes a todo empleado, además, de un sueldo fijo y un número de cargas. EMPLEADO FIJO -
RUT Nombre Ciudad Sueldo_Fijo Numero_Cargas
+ + + + + +
RUT() nombre() ciudad() sueldo() cargas() imprimir()
Agosto 2005
public class EmpleadoFijo { /* Definición de atributos */ private String RUT; private String nombre; private String ciudad; private long sueldo_fijo; private int numero_cargas; /* Definición de métodos */
}
Profesora Yasna Meza Hidalgo
Diapositiva 5
Cada empleado a honorarios tiene los antecedentes comunes a todo empleado, además, de un valor cancelado por hora y un número de horas trabajadas. EMPLEADO HONORARIO -
RUT Nombre Ciudad Valor_Hora Numero_Horas
+ + + + + +
RUT() nombre() ciudad() valorhora() horas() imprimir()
Agosto 2005
public class EmpleadoHonorario { /* Definición de atributos */ private String RUT; private String nombre; private String ciudad; private long valor_hora; private int numero_horas; /* Definición de métodos */
}
Profesora Yasna Meza Hidalgo
Diapositiva 6
3
De esta forma se tienen tres clases definidas EMPLEADO - RUT - Nombre - Ciudad + + + +
RUT() nombre() ciudad() imprimir()
Agosto 2005
EMPLEADO FIJO -
RUT Nombre Ciudad Sueldo_Fijo Numero_Cargas
+ + + + + +
RUT() nombre() ciudad() sueldo() cargas() imprimir()
EMPLEADO HONORARIO -
RUT Nombre Ciudad Valor_Hora Numero_Horas
+ + + + + +
RUT() nombre() ciudad() valorhora() horas() imprimir()
Diapositiva 7
Profesora Yasna Meza Hidalgo
Información REPETIDA, que es común a todos los elementos. EMPLEADO - RUT - Nombre - Ciudad + + + +
RUT() nombre() ciudad() imprimir()
Agosto 2005
EMPLEADO FIJO -
RUT Nombre Ciudad Sueldo_Fijo Numero_Cargas
+ + + + + +
RUT() nombre() ciudad() sueldo() cargas() imprimir()
Profesora Yasna Meza Hidalgo
EMPLEADO HONORARIO -
RUT Nombre Ciudad Valor_Hora Numero_Horas
+ + + + + +
RUT() nombre() ciudad() valorhora() horas() imprimir()
Diapositiva 8
4
EMPLEADO - RUT - Nombre - Ciudad
Superclase
+ + + +
Subclase 1
RUT() nombre() ciudad() imprimir()
Subclase 2
EMPLEADO FIJO
EMPLEADO HONORARIO
- Sueldo_Fijo - Numero_Cargas
- Valor_Hora - Numero_Horas
+ sueldo() + cargas()
+ valorhora() + horas()
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 9
Permite que las clases puedan heredar atributos y operaciones de otras clases. FIGURA centro
Superclase respecto de CUADRADO Y RECTÁNGULO
Superclase
Dibujar()
CUADRILATERO
Subclases de Figura
… Dibujar()
CUADRADO
…
Redefine operación dibujar
la
Dibujar()
RECTÁNGULO
…
…
Perímetro()
Área()
Agosto 2005
CÍRCULO
Hereda el atributo centro y el método Dibujar() y agrega un método que calcula el área
Profesora Yasna Meza Hidalgo
Diapositiva 10
5
¿Cómo se define una subclase en Java? public class <nombre hija> extends <nombre padre> { … }
Agosto 2005
Palabra reservada que representa la relación de herencia entre clases
Profesora Yasna Meza Hidalgo
¿Qué pasa con la visibilidad de los atributos y métodos definidos en la clase padre?
Agosto 2005
Diapositiva 11
Los atributos definidos como privados NO SON VISIBLES dentro de las subclases. Las subclases los heredan, pero NO PUEDEN ACCEDER a ellos.
Profesora Yasna Meza Hidalgo
Diapositiva 12
6
Entonces, cuando se quiera crear un objeto de la clase Empleado Fijo por ejemplo, ¿Cómo se va a acceder a los atributos de la clase Empleado?
Agosto 2005
Para definir el constructor de la clase EmpleadoFijo se DEBE hacer uso del constructor de la clase Empleado que se haya definido.
Profesora Yasna Meza Hidalgo
Diapositiva 13
¿Cómo se hace uso del constructor de una clase padre en una clase hija?, porque el siguiente código marca un error …
public class EmpleadoFijo extends Empleado { /* Definición de atributos */ … /* Definición de constructor */ public EmpleadoFijo(String n_rut, String n_nombre, String n_ciudad, long n_sueldo, int n_cargas) {
RUT = n_rut; nombre = n_nombre; ciudad = n_ciudad; sueldo_fijo = n_sueldo; numero_cargas = n_cargas; } }
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 14
7
public class Empleado { /* Definición de atributos */ … /* Definición de constructor */ public Empleado(String n_rut, String n_nombre, String n_ciudad) { RUT = n_rut; nombre = n_nombre; ciudad = n_ciudad; } }
Forma
de
invocar
al
public class EmpleadoFijo extends Empleado constructor de la clase { padre /* Definición de atributos */ … /* Definición de constructor */ public EmpleadoFijo(String n_rut, String n_nombre, String n_ciudad, long n_sueldo, int n_cargas) {
super(n_rut, n_nombre, n_ciudad); sueldo_fijo = n_sueldo; numero_cargas = n_cargas; } }
Agosto 2005
Profesora Yasna Meza Hidalgo
Sin embargo, existe un tipo de visibilidad que permite tener visibilidad de los atributos en las clases hijas.
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 15
¿Cuál es ese tipo de visibilidad?
Diapositiva 16
8
public class Empleado { /* Definición de atributos */ protected String RUT, nombre, ciudad; }
Ahora es acceso atributos.
válido el a estos
public class EmpleadoFijo extends Empleado { /* Definición de atributos */ … /* Definición de constructor */ public EmpleadoFijo(String n_rut, String n_nombre, String n_ciudad, long n_sueldo, int n_cargas) {
RUT = n_rut; nombre = n_nombre; ciudad = n_ciudad; sueldo_fijo = n_sueldo; numero_cargas = n_cargas; } }
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 17
• C y D son subclases de B. • B es superclase de C y D • A y B son subclases de Object
Object
A
B
C
Agosto 2005
D
Profesora Yasna Meza Hidalgo
Diapositiva 18
9
Java es un lenguaje fuertemente tipado
¿Y eso qué significa …?
Agosto 2005
Realiza la comprobación de tipos en tiempo de compilación
Profesora Yasna Meza Hidalgo
Diapositiva 19
Conversión implícita Conversión explícita
float saldo = 200; /* Es posible asignarle un entero */ int codigo = 3.7; /* ERROR*/
Figura f; Cuadrado c = new Cuadrado(); f = c;
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 20
10
Conversión implícita Conversión explícita
int i = 200; long l = (long) i; También existe el caso de la conversión de referencias (cast-down). Sin embargo, esto no siempre es válido …
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 21
Figura[] figuras = new Figura[30]; … Rectangulo r = (Rectangulo) figuras[i]; ERROR En tiempo de ejecución
Cuenta c = (Cuenta) figuras[i];
ERROR En tiempo de compilación
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 22
11
Cuando un método de la subclase tiene la misma signatura y valor de retorno que un método de la superclase se dice que la subclase lo está REDEFINIENDO.
Los atributos no se puede redefinir, sólo OCULTAN (el campo de la superclase todavía existe pero no se puede acceder).
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 23
POLÍGONO - NumVertices - Vertices[] + numVertices() + Vertice(int) + perímetro()
RECTÁNGULO - Lado1 - Lado2 + perímetro()
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 24
12
public class Poligono { private Punto[] vértices; private int numVertices; ... public float Perimetro() { float perimetro = 0 ; Punto anterior = vertices[0]; Punto actual ; int ultimo = numVertices – 1; for(int i=1 ; i <= ultimo ; i++) { actual = vertices[i]; perimetro+= anterior.distancia(actual) ; anterior = actual ; } /* Distancia del último con el primero */ return ( perímetro+=vértices[ultimo.distancia(vértices[0])) } } Agosto 2005
Profesora Yasna Meza Hidalgo
public class Rectangulo extends Poligono { private double lado1; private double lado2; ... public float Perimetro() { return (2*lado1 + 2*lado2) ; } }
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 25
Redefine método Perímetro()
Diapositiva 26
13
Poligono p; /* Puede referenciar a un objeto Polígono o Rectángulo */ Rectangulo r = new Rectangulo(); p = r; float peri = p.Perimetro(); ¿Cuál de los dos métodos perimetro() invocará?
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 27
¿Cuál es la public class Punto interpretación { de la llamada private int x, y; super.borrar()? public void borrar() {} } public class Píxel extends Punto { … public void borrar() { super.borrar(); /* Borra el punto */ color = null; } }
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 28
14
! " public class Uno { public int test() { return 1;} public int result1() { return this.test(); } } public class Dos extends Uno { public int test() { return 2;} } public class Tres extends Dos { public int result2() { return this.result1();} public int result3() { return super.test();} } public class Cuatro extends Tres { Public int test() { return 4; } }
Agosto 2005
Profesora Yasna Meza Hidalgo
! "
Diapositiva 29
¿Qué imprime?
public class PruebaSuperThis { public static void main(String args[]) { Uno obj1 = new Uno(); Dos obj2 = new Dos(); Tres obj3 = new Tres(); Cuatro obj4 = new Cuatro(); System.out.println(“obj1.test = “+obj1.test()); System.out.println(“obj1.result1 = “+obj1.result1()); System.out.println(“obj2.test = “+obj2.test()); System.out.println(“obj2.result1 = “+obj3.result1()); System.out.println(“obj3.test = “+obj3.test()); System.out.println(“obj4.result1 = “+obj4.result1()); System.out.println(“obj3.result2 = “+obj3.result2()); System.out.println(“obj4.result2 = “+obj4.result2()); System.out.println(“obj3.result3 = “+obj3.result3()); System.out.println(“obj4.result3 = “+obj4.result3()); } } Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 30
15
FIGURA centro
Superclase
Dibujar() Área() Perímtetro()
Superclase respecto de CUADRADO Y RECTÁNGULO
CUADRILATERO
Dibujar()
CUADRADO
…
Redefine operación dibujar
la
Dibujar()
RECTÁNGULO
…
…
Perímetro()
Área()
Agosto 2005
CÍRCULO
Subclases de Figura
…
Hereda el atributo centro y el método Dibujar() e implementa el método que calcula el área
Profesora Yasna Meza Hidalgo
Diapositiva 31
¿Podría implementar el método Área() y Perímetro() en la clase Figura?
¿Y en la clase Cuadrilátero?
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 32
16
Del ejemplo anterior se tiene un nuevo concepto ..... Clases Abstractas Entonces ... ¿Qué son las clases abstractas?
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 33
#$ Se fija un conjunto de métodos y atributos que permitan modelar un cierto concepto, que será refinado mediante la herencia. Un método abstracto cuenta con las siguientes características: • Sólo cuenta con la declaración y no poseen cuerpo de definición • La implementación es específica de cada subclase
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 34
17
FIGURA - centro + mostrarCentro() + area() + perimetro()
public abstract class Figura { public Punto centro; public void mostrarCentro() { System.out.println(centro.Imprimir()); } public abstract double area(); // No tiene implementación public abstract double perimetro(); // No tiene implementación }
public class Circulo extends Figura { static final double PI = 3.141516; protected int radio; public Circulo(int r) // Constructor { radio = r; } public double area() { return (PI*radio*radio); } public double perimetro() { return (2*PI*radio); } }
Agosto 2005
CÍRCULO * radio
TRIÁNGULO * base * altura
public class Triangulo extends Figura { protected int base, altura; // Constructor public Triangulo(int x_base, int x_altura) { base = x_base; altura = x_altura; } public double area() { return (base*altura/2); } public double perimetro() { ..... } }
Profesora Yasna Meza Hidalgo
Diapositiva 35
#$ Las subclases de una clase abstracta DEBEN: Sobreescribir todos los métodos abstractos de la superclase, o bien, ser declaradas como clases abstractas.
Una abstracta no instanciarse
clase puede
Agosto 2005
• Clases cuya descripción es incompleta • No proporcionan la implementación de todos sus métodos (éstos se declaran como abstract).
• Una clase con un método abstracto DEBE declararse como clase abstracta, pero ..... Una clase puede declararse como abstracta aunque no tenga ningún método abstracto.
Profesora Yasna Meza Hidalgo
Diapositiva 36
18
$ public class usaClaseAbstracta { public static void main(String args[]) { Figura figura; Triangulo triangulo; Circulo circulo;
ERROR!!! No se puede instanciar una clase abstracta
double area_triangulo, area_circulo; figura = new Figura(); triangulo = new Triangulo(29,6); circulo = new Circulo(7); triangulo.mostrarCentro(); circulo.mostrarCentro();
/* Muestra el centro del Triángulo */ /* Muestra el centro del círculo */
/* Calcula las áreas del triángulo y círculo */ area_triangulo = triangulo.area(); figura = circulo; area_circulo = figura.area(); } }
Agosto 2005
Profesora Yasna Meza Hidalgo
%
Diapositiva 37
&
Una interfaz es un conjunto de declaraciones de funciones. • Una interfaz SÓLO DECLARA COMPORTAMIENTO. • Si una clase implementa (implements) una interfaz, debe definir todas las funciones especificadas por la interfaz.. • Permite simular algunos aspectos de la herencia múltiple.
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 38
19
'
%
interface NombreInterfaz { static final tipo NOMBRECONSTANTE = valor; ........ public tipoDevuelto nombreMetodo([lista de parámetros]); } class nombreClase implements NombreInterfaz1[, NombreInterfaz2,...] { // Declaración atributos y métodos de la clase }
Agosto 2005
Profesora Yasna Meza Hidalgo
%
Diapositiva 39
&
interface Nombrable { static final boolean CIERTO = true; public void mostrarNombre (); } public class Elemento implements Nombrable { String nombre; public Elemento(String nom) { nombre = nom; } /* Obligatorio implementar método mostrarNombre porque se implementa la interfaz Nombrable */ public void mostrarNombre() { consola.IO_println(“Nombre = “+nombre); if (CIERTO) consola.IO_println(“Constante CIERTO del interfaz”); } }
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 40
20
Proviene del griego polymorphos (“muchas formas”). A nivel conceptual, se entiende como la posibilidad de emplear la misma expresión para denotar operaciones diferentes.
•Ejemplo.
Imprimir(texto) Imprimir(gráfico)
Agosto 2005
Profesora Yasna Meza Hidalgo
–
Diapositiva 41
En la POO el polimorfismo manifiesta de varias formas: • Objetos polimórficos • Sobrecarga de funciones • Anulación de funciones • Funciones polimórficas argumentos polimórficos)
Agosto 2005
Profesora Yasna Meza Hidalgo
se
(de
Diapositiva 42
21
En muchas ocasiones cuando se utiliza Herencia, es posible tener una familia de clases que comparten una interfaz común. ¿En serio? …..
Agosto 2005
Profesora Yasna Meza Hidalgo
public abstract class Mamifero
Diapositiva 43
Una clase ABSTRACTA
{ private int numero_patas; public abstract void mover() ; } ‹‹MAMÍFERO›› - Numero_patas + mover()
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 44
22
class Gato extends Mamifero { public void mover() { System.out.println(“Un gato moviéndose …."); } } ‹‹MAMÍFERO›› - Numero_patas + mover()
GATO + mover()
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 45
class Perro extends Mamifero { public void mover() { System.out.println(“Un perro moviéndose …."); } } ‹‹MAMÍFERO›› - Numero_patas + mover()
Agosto 2005
GATO
PERRO
+ mover()
+ mover()
Profesora Yasna Meza Hidalgo
Diapositiva 46
23
public class Polimorfismo { public static void muevete(Mamifero m) { m.mover(); } public static void main(String args[]) { Gato lindo = new Gato(); Perro feo = new Perro(); muevete(lindo); muevete(feo); } }
Agosto 2005
( $
Profesora Yasna Meza Hidalgo
Diapositiva 47
)
public class Sumar { public float suma(float a, float b) { System.out.println("Estoy sumando reales"); return a+b; } public int suma(int a, int b) { System.out.println("Estoy sumando enteros"); return a+b; } public static void main(String args[]) { float x = 1, float y = 2; int v = 3, int w = 5; System.out.println(suma(x,y)); System.out.println(suma(v,w)); } }
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 48
24
( $
) ¿La sobrecarga de métodos se puede aplicar a los constructores?
Agosto 2005
Profesora Yasna Meza Hidalgo
Diapositiva 49
25