Sunteți pe pagina 1din 25

Profesora

Yasna Meza Hidalgo


mailto:
mailto: ymeza@ubiobio.cl

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.
public class Empleado
{
EMPLEADO /* Definición de atributos */
private String RUT;
- RUT
private String nombre;
- Nombre
- Ciudad private String ciudad;

+ RUT()
+ nombre() /* Definición de métodos */
+ ciudad() }
+ imprimir()

Agosto 2005 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 public class EmpleadoFijo


- RUT {
- Nombre /* Definición de atributos */
- Ciudad private String RUT;
- Sueldo_Fijo private String nombre;
- Numero_Cargas
private String ciudad;
+ RUT() private long sueldo_fijo;
+ nombre()
private int numero_cargas;
+ ciudad()
+ sueldo()
+ cargas() /* Definición de métodos */
+ imprimir()
}

Agosto 2005 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 public class EmpleadoHonorario


- RUT {
- Nombre /* Definición de atributos */
- Ciudad private String RUT;
- Valor_Hora private String nombre;
- Numero_Horas
private String ciudad;
+ RUT() private long valor_hora;
+ nombre()
private int numero_horas;
+ ciudad()
+ valorhora()
+ horas() /* Definición de métodos */
+ imprimir()
}

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 6

3
De esta forma se tienen tres clases definidas

EMPLEADO
- RUT EMPLEADO FIJO
- Nombre
- Ciudad - RUT EMPLEADO HONORARIO
- Nombre
+ RUT() - Ciudad - RUT
+ nombre() - Sueldo_Fijo - Nombre
+ ciudad() - Numero_Cargas - Ciudad
+ imprimir() - Valor_Hora
+ RUT()
- Numero_Horas
+ nombre()
+ ciudad() + RUT()
+ sueldo() + nombre()
+ cargas() + ciudad()
+ imprimir() + valorhora()
+ horas()
+ imprimir()

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 7

Información REPETIDA, que es común a todos los


elementos.
EMPLEADO
- RUT EMPLEADO FIJO
- Nombre
- Ciudad - RUT EMPLEADO HONORARIO
- Nombre
+ RUT() - Ciudad - RUT
+ nombre() - Sueldo_Fijo - Nombre
+ ciudad() - Numero_Cargas - Ciudad
+ imprimir() - Valor_Hora
+ RUT()
- Numero_Horas
+ nombre()
+ ciudad() + RUT()
+ sueldo() + nombre()
+ cargas() + ciudad()
+ imprimir() + valorhora()
+ horas()
+ imprimir()

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 8

4
EMPLEADO
- RUT
- Nombre
Superclase - Ciudad
+ RUT()
+ nombre()
+ ciudad()
Subclase 1 + imprimir() Subclase 2

EMPLEADO FIJO EMPLEADO HONORARIO


- Sueldo_Fijo - Valor_Hora
- Numero_Cargas - Numero_Horas

+ sueldo() + valorhora()
+ cargas() + horas()

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 9

Permite que las clases puedan heredar atributos y


operaciones de otras clases.
FIGURA

centro Superclase
Superclase Dibujar()
respecto de
CUADRADO Y
RECTÁNGULO Redefine la
CUADRILATERO CÍRCULO operación
… Subclases … dibujar
Dibujar()
de Figura Dibujar()

CUADRADO RECTÁNGULO
… …
Hereda el atributo centro y el método Dibujar() y
Perímetro() Área() agrega un método que calcula el área

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 10

5
¿Cómo se define
una subclase en
Java?

public class <nombre hija> extends <nombre padre>


{

}
Palabra reservada que
representa la relación de
herencia entre clases

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 11

Los atributos
¿Qué pasa con la
definidos como
visibilidad de
privados NO SON
los atributos y
VISIBLES dentro de
métodos definidos
las subclases.
en la clase
padre?
Las subclases los
heredan, pero NO
PUEDEN ACCEDER a
ellos.

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 12

6
Para definir el
Entonces, cuando se constructor de la
quiera crear un clase EmpleadoFijo
objeto de la clase se DEBE hacer uso
Empleado Fijo por del constructor de
ejemplo, ¿Cómo se la clase Empleado
va a acceder a los que se haya
atributos de la definido.
clase Empleado?

Agosto 2005 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 Diapositiva 15

Sin embargo, existe


un tipo de
visibilidad que
permite tener
visibilidad de los
atributos en las
clases hijas.
¿Cuál es ese
tipo de
visibilidad?

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 16

8
public class Empleado
{
/* Definición de atributos */ Ahora es válido el
protected String RUT, nombre, ciudad;
acceso a estos
}
atributos.

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.
Object • B es superclase de C y D
• A y B son subclases de
Object
A B

C D

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 18

9
Java es un lenguaje fuertemente tipado
Realiza la comprobación de
tipos en tiempo de
¿Y eso qué compilación
significa …?

Agosto 2005 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 Diapositiva 25

public class Rectangulo extends Poligono


{
private double lado1; Redefine método
private double lado2; Perímetro()
...
public float Perimetro()
{
return (2*lado1 + 2*lado2) ;
}
}

Agosto 2005 Profesora Yasna Meza Hidalgo 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

public class Punto ¿Cuál es la


{ interpretación
private int x, y; de la llamada
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()
Superclase Área()
respecto de Perímtetro()
CUADRADO Y
RECTÁNGULO Redefine la
CUADRILATERO CÍRCULO operación
… Subclases … dibujar
Dibujar()
de Figura Dibujar()

CUADRADO RECTÁNGULO
… …
Hereda el atributo centro y el método Dibujar() e
Perímetro() Área() implementa el método que calcula el área

Agosto 2005 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()

CÍRCULO TRIÁNGULO
public abstract class Figura
{ * radio * base
public Punto centro;
public void mostrarCentro()
* altura
{
System.out.println(centro.Imprimir());
}
public class Triangulo extends Figura
public abstract double area(); // No tiene implementación
{
public abstract double perimetro(); // No tiene implementación
} protected int base, altura;
// Constructor
public Triangulo(int x_base, int x_altura)
{
public class Circulo extends Figura
base = x_base; altura = x_altura;
{
}
static final double PI = 3.141516;
public double area()
protected int radio;
{
public Circulo(int r) // Constructor
return (base*altura/2);
{
}
radio = r;
public double perimetro()
}
{
public double area()
.....
{
}
return (PI*radio*radio);
}
}
public double perimetro()
{
return (2*PI*radio);
}
}

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 35

#$
Las subclases de una • Clases cuya descripción es incompleta
clase abstracta DEBEN: • No proporcionan la implementación de
todos sus métodos (éstos se declaran
Sobreescribir todos los como abstract).
métodos abstractos de la
superclase, o bien, ser
declaradas como clases
abstractas.

• Una clase con un método


abstracto DEBE declararse como
clase abstracta, pero ..... Una
clase puede declararse como
abstracta aunque no tenga ningún
Una clase método abstracto.
abstracta no puede
instanciarse

Agosto 2005 Profesora Yasna Meza Hidalgo Diapositiva 36

18
$
public class usaClaseAbstracta
{
public static void main(String args[])
{
Figura figura;
Triangulo triangulo;
Circulo circulo;
ERROR!!!
double area_triangulo, area_circulo; No se puede
instanciar una
figura = new Figura(); clase abstracta
triangulo = new Triangulo(29,6);
circulo = new Circulo(7);

triangulo.mostrarCentro(); /* Muestra el centro del Triángulo */


circulo.mostrarCentro(); /* 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 se
manifiesta de varias formas:
• Objetos polimórficos
• Sobrecarga de funciones
• Anulación de funciones
• Funciones polimórficas (de
argumentos polimórficos)

Agosto 2005 Profesora Yasna Meza Hidalgo 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 Diapositiva 43

Una clase
ABSTRACTA
public abstract class Mamifero
{
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()

GATO PERRO

+ mover() + mover()

Agosto 2005 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

S-ar putea să vă placă și