Documente Academic
Documente Profesional
Documente Cultură
Orientación a objetos
Clase
Objeto
Encapsulación
Relaciones entre clases
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.
+ RUT()
+ nombre() /* Definición de métodos */
+ ciudad() }
+ imprimir()
2
Cada empleado fijo tiene los
antecedentes comunes a todo
empleado, además, de un sueldo
fijo y un número de cargas.
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()
4
EMPLEADO
- RUT
- Nombre
Superclase - Ciudad
+ RUT()
+ nombre()
+ ciudad()
Subclase 1 + imprimir() Subclase 2
+ sueldo() + valorhora()
+ cargas() + horas()
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
5
¿Cómo se define
una subclase en
Java?
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.
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?
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;
}
}
8
public class Empleado
{
/* Definición de atributos */ Ahora es válido el
protected String RUT, nombre, ciudad;
acceso a estos
}
atributos.
• 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
9
Java es un lenguaje fuertemente tipado
Realiza la comprobación de
tipos en tiempo de
¿Y eso qué compilación
significa …?
Conversión implícita
Conversión explícita
Figura f;
Cuadrado c = new Cuadrado();
f = c;
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).
ERROR
En tiempo de ejecución
ERROR
En tiempo de compilación
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.
POLÍGONO
- NumVertices
- Vertices[]
+ numVertices()
+ Vertice(int)
+ perímetro()
RECTÁNGULO
- Lado1
- Lado2
+ perímetro()
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]))
}
}
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á?
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; }
}
¿Qué
! " imprime?
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
¿Podría implementar el
método Área() y
Perímetro() en la clase
Figura?
¿Y en la clase
Cuadrilátero?
16
Del ejemplo anterior se tiene
un nuevo concepto .....
Clases Abstractas
Entonces ...
¿Qué son las
clases
abstractas?
#$
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);
}
}
#$
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.
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);
figura = circulo;
area_circulo = figura.area();
}
}
% &
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.
19
' %
interface NombreInterfaz
{
static final tipo NOMBRECONSTANTE = valor;
........
public tipoDevuelto nombreMetodo([lista de parámetros]);
}
% &
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”);
}
}
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)
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)
21
En muchas ocasiones cuando
se utiliza Herencia, es
posible tener una familia de
clases que comparten una
interfaz común.
¿En serio?
…..
Una clase
ABSTRACTA
public abstract class Mamifero
{
private int numero_patas;
public abstract void mover() ;
}
‹‹MAMÍFERO››
- Numero_patas
+ mover()
22
class Gato extends Mamifero
{
public void mover()
{
System.out.println(“Un gato moviéndose ….");
}
}
‹‹MAMÍFERO››
- Numero_patas
+ mover()
GATO
+ mover()
GATO PERRO
+ mover() + mover()
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);
}
}
( $ )
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));
}
}
24
( $ )
¿La sobrecarga de
métodos se puede
aplicar a los
constructores?
25