Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clases, objetos
Objetivos:
Programación Estructurada vs POO
Conceptos básicos de la POO
Clases, métodos y mensajes
Objetos
Atributos, modificadores
Enfoque POO
PORTABILIDAD.
El software desarrollado debe funcionar independientemente del hardware y del
entorno de funcionamiento o Sistema Operativo sobre el cual se ejecute.
PRODUCTIVIDAD.
Uno de los principales objetivos es simplificar el proceso de desarrollo de Software,
para lo cual es fundamental reutilizar componentes.
MANTENIMIENTO.
Constituye una de las etapas más costosas en el desarrollo de software que, por
tanto, habrá que optimizar. Es fundamental estructurar bien el programa para prever futuros
cambios o modificaciones.
CALIDAD.
A la hora de producir software, no hay que olvidar que se deben de desarrollar
productos de calidad, dada a partir de una serie de aspectos como:
robustez, fiabilidad, eficiencia, flexibilidad, ...
Programación Estructurada
vs
Programación Orientada a Objetos
Ventajas de POO:
Uniformidad
Comprensión
Flexibilidad
Reusabilidad
Clases
Objetos
Encapsulación y Ocultación de datos
Herencia
Abstracción
Polimorfismo y Ligadura Dinámica
Clase
Una clase permite describir objetos similares mediante la definición de sus
estructuras de datos y métodos comunes.
Las clases son plantillas para objetos,
permiten la agrupación de objetos que comparten las mismas propiedades y
comportamiento.
Ej: Existen rectángulos de varios tamaños, pero todos ellos pertenecen a la
clase rectángulo, que define los atributos comunes para todos ancho y alto, a la vez
que el método (o función miembro) calcularArea, también común para todos.
Superclase
Una superclase es una clase de más alto nivel que agrupa otras clases con
propiedades y funciones comunes,
por tanto, los objetos (también llamados instancias de una clase determinada) de
esas otras clases son también objetos de la superclase.
Las clases que son agrupadas por una superclase son sus subclases.
Una clase permite describir objetos similares mediante la definición de sus estructuras
de datos y métodos comunes.
Las clases son plantillas para objetos,
permiten la agrupación de objetos que comparten las mismas propiedades (o
atributos) y comportamiento ( métodos o funciones) .
Ej: Existen triángulos de varios tamaños, pero todos ellos pertenecen a
la clase triángulo
La clase define los atributos comunes para todos los triángulos
(Ej: ancho y alto)
El método (o función miembro) define una función común a
todos los triángulos como calcularArea.
A
L
T
O
ancho
Las clases se utilizan para representar entidades o conceptos, como los sustantivos en
el lenguaje.
Las clases son un pilar fundamental de la programación orientada a objetos.
Permiten abstraer los datos y sus operaciones asociadas al modo de una caja negra.
En otras palabras, nos interesará su forma de interactuar con el medio que le
rodea (en ocasiones, con otros elementos que también podrían ser cajas
negras) entendiendo qué es lo que hace, pero sin dar importancia a cómo lo
hace. Deben estar muy bien definidas sus entradas y salidas, es decir, su
interfaz; en cambio, no se precisa definir ni conocer los detalles internos de su
funcionamiento.
Ejemplos
Salidas
Rectangulo1
Ancho del rectangulo1: 100
Alto del rectangulo1: 200
Área del rectangulo1: 20000
Rectangulo2
Posición X del rectangulo2: 23
Posición Y del rectangulo2: 94
Nueva posición del rectangulo2
Posición X del rectangulo2: 40
Posición Y del rectangulo2: 72
Clase abstracta
Una clase abstracta es una clase que se declara con la palabra abstract, Ej:
public abstract class GraphicObject
{ // Declarar campos
// Declarar métodos no abstractas
abstract void draw ();
}
Una clase abstracta debe tener uno o más métodos abstractos.
Un método abstracto es un método que se declara sin la implementación de su
cuerpo (sin llaves, y seguido por un punto y coma), Ej:
abstract void moveTo (doble deltaX, doble deltaY);
La clase concreta que herede de esta clase abstracta debe implementar todos sus
métodos abstractos.
Si la subclase no implementa todos los métodos abstractos no podrá ser instanciada.
No se pueden crear instancias (objetos) de una clase abstracta.
Las clases abstractas, pueden declarar campos no static, y definir métodos concretos
que sean públicos, protegidos o privados.
En cambio con las interfaces, todos los campos son automáticamente
públicos, y todos los métodos que se declaren son públicos.
Solo se puede extender de una clase (ya sea abstract o no), pero se puede
implementar cualquier número de interfaces.
Se pueden crear referencias a clases abstractas como cualquier otra. Por ejemplo,
con la clase abstracta FiguraGeometrica, no hay ningún problema en poner:
FiguraGeometrica figura;
Sin embargo una clase abstracta no se puede instanciar, es decir, no se pueden crear
objetos de una clase abstracta. El compilador producirá un error si se intenta:
FiguraGeometrica figura = new FiguraGeometrica(); // ERROR!
Esto es coherente dado que una clase abstracta no tiene completa su implementación
y encaja bien con la idea de que algo abstracto no puede materializarse.
Sin embargo utilizando el up-casting en el tema de Herencia si se puede escribir:
FiguraGeometrica figura = new Circulo(. . .);
figura.dibujar();
La invocación al método dibujar() se resolverá en tiempo de ejecución y la JVM
llamará al método dibujar() de la clase Circulo.
Encapsulamiento
Es el ocultamiento del estado (datos) de un objeto, de manera que sólo se pueda
cambiar mediante las operaciones definidas para ese objeto.
Cada objeto está aislado del exterior. El aislamiento protege a los datos asociados de
un objeto contra su modificación por quien no tenga derecho a acceder a ellos,
eliminando efectos secundarios e interacciones.
De esta forma el usuario de la clase puede obviar la implementación de los métodos
y propiedades para concentrarse sólo en cómo usarlos.
Por otro lado se evita que el usuario pueda cambiar su estado de maneras
imprevistas e incontroladas.
Como se puede observar de los diagramas, las variables del objeto se localizan en el
centro o núcleo del objeto.
Los métodos rodean y esconden el núcleo del objeto de otros objetos en el
programa.
Al empaquetamiento de las variables de un objeto con la protección de sus métodos
se le llama encapsulamiento.
Típicamente, el encapsulamiento es utilizado para esconder detalles de la puesta en
práctica no importantes de otros objetos.
Entonces, los detalles de la puesta en práctica pueden cambiar en cualquier tiempo
sin afectar otras partes del programa.
Formas de encapsular
usando modificadores
Estándar (Predeterminado)
Abierto: Hace que el miembro de la clase pueda ser accedido desde el exterior de la
Clase y cualquier parte del programa.
Protegido: Solo es accesible desde la Clase y las clases que heredan (a cualquier
nivel).
Semi-cerrado: Solo es accesible desde la clase heredada.
Cerrado: Solo es accesible desde la Clase.
Modificadores de clase
transient El modificador
transient indica que
el atributo no se
graba al archivar el
objeto.
volatile El modificador
volatile tiene que ver
con el
multithreading. Son
atributos a los que
se puede acceder
simultaneamente por
distintos threads o
hilos de ejecución.
Java se asegura de
que cuando vayan a
ser utilizados
siempre se lea su
valor, por si ha sido
modificado por algún
thread.
throws hace referencia al uso
de excepciones,
indica qué
excepciones (errores)
va a generar el
método.
native Indica que el método
va a tener en su
cuerpo código nativo,
propio de la máquina,
como puede ser C, C+
+.
Métodos y Mensajes
empleado23.calcularSalario( horasTrabajadas);
//Empleado.java
Class Empleado
{
private String nombre;
private int edad;
private int antiguedad;
private float salario;
//PruebaEmpleado.java
public class PruebaEmpleado
{
public static void main(String args[])
{
Empleado empl1 = new Empleado( "Filemón", 32, 10, 30 );
System.out.println( empl1.toString() );
// o System.out.print( empl1 );
System.out.println( empl1 + " $" + salarioEmpl1);
// salida: “Filemón 32 38400.0”
}
}
Clases, Atributos
Deben ser significativas dentro del entorno de la aplicación. Es decir, deben servir para
identificar claramente y de manera única a cada uno de los objetos.
Class Libro
{
private String editorial;
private String autor;
private int numEdicion;
private String isbn;
private int numPaginas;
private int año;
El número de atributos debe ser el mínimo para realizar todas las operaciones que
requiere la aplicación.
Modificadores de Atributos
Ejemplo:
static int numero;
...
Vehiculo.numero;
final. Un atributo final es aquel cuyo valor no puede cambiar después de ser
inicializado.
Ejemplo:
private static final int NUM_COCHES=10;
Resumen Clase
Smith y Tockey , dice: “un objeto representa un elemento, unidad o entidad individual e
identificable, ya sea real o abstracta, con un papel bien definido en el dominio del
problema”.
Los atributos reflejan el estado de un objeto.
Todo objeto tiene un estado, exhibe algún comportamiento bien definido y tiene
una identidad única.
El estado de un objeto abarca todos los atributos (normalmente estáticos) del
mismo, más los valores actuales (normalmente dinámicos) de cada uno de esos atributos.
El comportamiento se refiere a cómo actúa y reacciona un objeto, en términos de
sus cambios de estado y paso de mensajes.
Ejemplo:
Una máquina expendedora de refrescos puede aceptar un tipo de monedas. Esta es
una propiedad estática (es decir, fija), lo que significa que es una característica esencial de
la máquina.
En cambio, la cantidad actual de monedas que ha aceptado en un momento dado
representa el valor dinámico de esta propiedad (atributo).
El mecanismo que acepta las monedas y devuelve un refresco a cambio es un conjunto
de métodos: su comportamiento.
//métodos que modifiquen el estado del objeto
class PruebaRectangulo
{
public static void main(String[] args)
{
Rectangulo r1 = new Rectangulo( 5, 10 );
Rectangulo r2 = new Rectangulo( 6, 7 );
System.out.println( "El área de r1 es "+ r1.calculaArea() ); // El área de r1 es 50
System.out.println( "El área de r2 es "+ r2.calculaArea() ); // El área de r2 es 42
}
}
Objetos, Identidad
La identidad expresa que aunque dos objetos sean exactamente iguales en sus
atributos, son distintos entre sí.
De esta forma, incluso una serie de coches recién salidos de fábrica son distintos
los unos de los otros.
Class A
{
Class PruebaA
{
static public void main(String[] args)
{
A refA= newA(); // refA es una referencia.
A refB= refA; // refA y refB apuntan al mismo objeto
A refC= null; // No apunta a ningún objeto
}
}
//Repaso_if.java
/* Enunciado: Escribe un método que dados tres números indique cual es el mayor
* (Objetivos: tipo básico int, salida por pantalla, definición de un método)
*/
public class Repaso_if
{
public static void mayorEs(int x, int y, int z)
{
int mayor= x;
if(y > x && y > z)
mayor= y;
else if(z > x && z > y)
mayor = z;
}
Encapsulación y Ocultación de datos
Ej:
De la misma forma que no tenemos acceso a las operaciones internas que realiza un
medidor de combustible en un coche para indicarnos la cantidad de combustible disponible.
No necesitamos saber, y no tenemos por qué tener acceso, a las operaciones internas
de un objeto que representa un altímetro de un avión en una aplicación; sólo es necesario
conocer el método del objeto del cuál se obtiene esa altura, no cómo el objeto altímetro
interacciona con el altímetro físico.
Esto no quiere decir que sea imposible conocer información de un objeto, sino que
las peticiones de información a un objeto hacerse a través de mensajes al objeto con el fin
de realizar una determinada operación. La respuesta a esa petición será la información
solicitada siempre que el objeto compruebe que el solicitante tiene acceso a ella.
Ejemplo:
Si el objeto altímetro anterior cambia su forma de interaccionar con el altímetro real
del avión (por ejemplo, porque se ha cambiado de modelo), no es necesario cambiar el resto
de objetos que utilizan ese objeto altímetro.
//Cerradura.java
//Ejemplo de encapsulación y ocultación de datos
class Principal
{
public static void main(String[] args)
{
Cerradura candado = new Cerradura( 123 );
System.out.println( candado.abreCerradura( 456 ) ); //‘false’
System.out.println( candado.abreCerradura( 123 ) ); //‘true’
}
}
class Cerradura
{
private int combinacion;
public boolean abreCerradura(int c)
{
if ( c == combinacion)
return true;
else
return false;
}
public Cerradura(int c)
{
combinacion= c;
}
}
Pensar en Objetos.
Ej: Considere una entidad bancaria
Clases y objetos
Del ejemplo expuesto anteriormente podemos deducir que la P00 se basa en la
observación de que, en el mundo real, los objetos se construyen a partir de otros
objetos.
La combinación de estos objetos es un aspecto de dicha programación, pero también
incluye mecanismos y características que hacen que la creación y el uso de objetos
sea sencillo y flexible.
Un mecanismo importantísimo es la clase, el encapsulamiento y la herencia,
son propiedades o características poderosas de la POO.
Atributos de CCuenta
Podemos crear una que representa una cuenta bancaria.
Pensando en la clase de objetos CCuenta, elegimos los atributos de interés que van a
definir esta clase de objetos:
nombre: nombre del cliente del banco al que pertenece la cuenta.
cuenta: número de la cuenta.
saldo: saldo actual de la cuenta.
tipoDelnterés: tipo de interés en tanto por cien.
Todos los atributos son definidos en la clase por variables:
class Ccuenta
{
private String nombre;
private String cuenta;
private double saldo;
private double tipoDelnterés;
}
Generalmente, los atributos de un objeto de una clase se ocultan a los usuarios del
mismo. ¿Qué quiere decir esto?
Que un usuario que utilice la clase CCuenta en su programa no podrá
escribir su código basado directamente en estos atributos, sino que tendrá
que acceder a ellos a través de los métodos que implemente la clase, como
veremos a continuación;
de esta forma, un usuario de la clase CCuenta no podrá asignar cualquier
valor a los atributos de la misma.
Esta protección es la que se consigue justamente con el modificador private
Un miembro declarado privado (private) es accesible solamente por los
métodos de su propia clase.
Esto significa que no se puede acceder a él por los métodos de cualquier otra clase,
incluidas las subclases
Mensajes a CCuenta
Cuando decimos que un objeto recibe un mensaje, debemos entender que el mensaje
es un concepto que subyace en nuestra mente;
la acción real es invocar al método que responde a ese mensaje
con el fin de modificar el estado del objeto.
Según esto, podemos decir que los nombres de los métodos de una clase forman el
conjunto de mensajes a los que un objeto de esa clase puede responder.
Agreguemos un método más para afianzar lo explicado hasta ahora. ¿Cuál será la
respuesta de un objeto CCuenta cuando reciba el mensaje “estado de la cuen ta”?
Simplemente devolverá su saldo:
public double estado()
{
return saldo;
}
class Ccuenta
{ private String nombre;
private String cuenta;
private double saldo;
private double tipoDelnterés;
public void asignarNombre(String nom)
{ if (nom.length() == 0)
{
System.out.println( “Error: cadena vacia”);
return;
}
nombre = nom;
}
public String obtenerNombre()
{ return nombre;
}
public double estado()
{ return saldo;
} //…..
}
Tarea:
Termine de escribir todos los métodos previstos para la clase Ccuenta.java
Para poder crear objetos de esta clase y trabajar con ellos, tendremos que escribir un
programa. Según lo estudiado en los capítulos anteriores, en un programa tiene que
haber una clase con un método main, puesto que éste es el punto de entrada y de
salida del programa.
Este requerimiento se puede satisfacer de tres formas. Vamos a comentarlas sobre el
ejemplo que estamos desarrollando:
1. Añadir a la clase CCuenta un método main que incluya el código del
programa (crear objetos CCuenta y realizar operaciones con ellos).
2. Añadir en el mismo fichero fuente en el que está almacenada la clase
CCuenta, otra clase, por ejemplo PruebaCCuenta, que incluya el método
main.
3. Tenemos un fichero fuente CCuenta.java, con la clase CCuenta. Añadir en la
misma carpeta (directorio) otro fichero fuente PruebaCCuenta,.java, clase
principal (la que contiene el método main).
Vamos a continuar el ejemplo aplicando el punto 3, porque es lo más práctico y lo
que más se ajusta a lo que hemos denominado POO, ya que de esta forma cada
fichero fuente se corresponde con una clase de objetos.
Herencia
Una de las razones para emplear la herencia es que permite la reutilización del
código de proyectos anteriores,
permitiendo la modificación (o especialización) de aquellos aspectos que no
concuerden exactamente con las necesidades de nuestra aplicación.
En cambio, si partimos del nivel de clases inferiores hacia los niveles superiores,
cada nivel supone una generalización del nivel inmediatamente inferior.
Herencia Simple
De atributos: Los atributos de una clase son heredadas automáticamente por todos
sus descendientes.
Esto quiere decir que un objeto tiene propiedades de su clase y propiedades
de las clases heredadas.
Los atributos deben definirse en las clases tan cercanas a las clases
terminales de la jerarquía como sea posible.
En los niveles superiores de la jerarquía normalmente no existe suficiente
información como para que puedan decidirse unos atributos u otros, mientras que
las clases terminales ya representan entidades más concretas.
//Persona.java
public class Persona
{
private String nombre;
public Persona(String n)
{
nombre= n;
}
//Estudiante.java
public class Estudiante extends Persona
{
private String titulacion;
//Principal.java
/*Un programa en Java en el que la clase estudiante hereda de la clase persona.
* La herencia se indica en Java con la palabra clave extends.
* Aquellas clases que no heredan explícitamente de ninguna clase lo hacen de Object.
*/
public class Principal
{
public static void main(String[] args)
{
Estudiante est1;
est1 = new Estudiante("Paula","Ingeniera Informatica");
System.out.println(est1); // llama a “toString”
System.out.println(est1.getNombre() );
}
}
Herencia Múltiple
Se produce cuando el objeto que hereda tiene más de un padre o alguno de sus
antepasados tiene varios padres.
En cualquier caso, esta herencia suele producir los conflictos conocidos como
colisión de nombres.
Sucede cuando el nombre de un método o atributo existe en más de una clase de
nivel superior
//Profesor.java
class Profesor
{
private String nombre;
public Profesor(String n)
{
nombre= n;
interface Investigador
{
public String getCampoInvestigacion();
}
Objetivos (definir varios métodos que ellos los identifiquen, métodos privados, swith)
Tarea
Escriba una clase CalculadoraFuncional, que herede de Calculadora, y que tenga las
interfaces de valor agregado como es la capacidad de calcular raíz cuadrada,
modula y porciento.
Además,crear la clase ejecutable PruebaCalculadoraFuncional.