Sie sind auf Seite 1von 32

Conceptos básicos de POO

Clases, objetos

Objetivos:
 Programación Estructurada vs POO
 Conceptos básicos de la POO
 Clases, métodos y mensajes
 Objetos
 Atributos, modificadores

Enfoque POO

 El término POO indica más… una forma de diseño y una metodología de


desarrollo… que un lenguaje de programación,
 ya que en realidad se pueden aplicar los principios del paradigma de POO
(encapsulación, herencia y polimorfismo) en cualquier lenguaje de programación.

 También es razonable pensar que todo lo programado por lenguajes Orientados a


Objetos (LOO) es POO.
 Esto no es cierto, ya que incluso en un LOO puro, es posible que un mal diseño
lleve a una implementación que en realidad no siga los principios de POO mencionados.

Desarrollo de software con Java

 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

 El paradigma de programación estructurado,


 se basa en tomar un problema, y subdividirlo sucesivamente en subproblemas, hasta
llegar a unos subproblemas suficientemente sencillos de resolver.
 Problemas del paradigma de programación estructurada:
 Creciente complejidad de las aplicaciones.
 Limitaciones en la modelización de problemas no estructurados:
 El software se estructura según la solución del problema en vez de enfocarlo
directamente según el problema en sí mismo.
 Esto puede conducir a una separación conceptual entre el problema del mundo real
y su representación e implementación informática.
 Difícil reutilización del software.
 Mantenimiento difícil y costoso.
 La POO no trata de hacer más sencillo el problema a resolver (dividiéndolo),
 sino que trata de simular el problema a resolver.
 Así, en todo problema existen una serie de entidades (físicas o no) que
interaccionan para resolverlo,
 de manera que simulando estas entidades, y su comportamiento, es posible resolver
el problema en cuestión.
 Cada una de estas entidades es un objeto en el sistema desarrollado mediante POO,
de ahí el nombre de POO.

Ventajas de POO:

 Uniformidad

 Comprensión

 Flexibilidad

 Reusabilidad

Conceptos básicos de POO

 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

Haga sus propias clases


 TV
 Persona
 Bicicleta
 Mamífero
 Vehículo
Ejercicio
CrearObjetoRectangulo

 Cree la clase Punto


o Declara un punto de origen en el plano
 Cree la clase Rectángulo
o Esta clase tiene cuatro constructores con los cuales se pueden crear objetos
diferentes
 Cree la clase CrearObjetoRectangulo
o Para crear dos diferentes objetos rectángulo
 Cree la clase DibujaRectangulo
o Para dibujar el rectangulo haciendo uso de los objetos Punto y Rectangulo

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.

Cuándo usar clases abstractas

 Cuando quiera compartir código entre varias clases estrechamente relacionadas.


 Cuando las clases que extienden de la clase abstracta tienen muchos métodos o
campos comunes, y requieren modificadores de acceso distintos (como public,
protect, static).
 Esto le permite definir métodos que pueden acceder y modificar el estado del objeto
a la que pertenecen.

 Es evidente que los diversos tipos de motores tienen características diferentes.


Tienen poco en común un motor eléctrico de corriente alterna y una turbina de
vapor, sin embargo la construcción de una jerarquía en la que todos los motores
descienden de una clase abstracta “Motores”, presenta la ventaja de unificar la
interfaz. La definición de esta clase Motores es tan abstracta que no puede servir
para instanciar directamente ningún tipo de motor. Porque soporta la noción de un
concepto muy general del que solo puede utilizarse variantes más concretas como
los motores eléctricos, de explosión o de vapor para instanciarse.
Referencias y objetos abstractos

 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.

Ejercicio: Clase abstracta Figura

 Consideremos las figuras planas como el rectángulo, y el círculo. Tales figuras


comparten características comunes como es la posición de la figura, y el área de la
figura, aunque el procedimiento para calcular dicha área sea completamente
distinto.
 Podemos por tanto, diseñar una jerarquía de clases, tal que la clase base denominada
Figura, una clase abstracta, tenga las características comunes y cada clase derivada,
las específicas. La relación jerárquica se muestra en la figura.
 La clase Figura es la que contiene las características comunes a dichas figuras
concretas por tanto, no tiene forma ni tiene área. Esto lo expresamos declarando
Figura como una clase abstracta, declarando la función miembro area abstract.
 Las clases abstractas solamente se pueden usar como clases base para otras
clases. No se pueden crear objetos pertenecientes a una clase abstracta. Sin
embargo, se pueden declarar variables de dichas clases.
 Haga ahora la clase DibujarFiguras que dibuje objetos de tipo círculo y rectángulo.

Qué es una Interface

 Define un camino estándar y public de especificar el propósito de una clase.


 Define un contrato para la clase que lo implementa ya que la obliga a
desarrollar todos sus métodos abstractos.
 Todos los métodos de la interface son abstractos.

Cuándo usar Interfaces

 Cuando clases no relacionadas quieran implementar su interfaz.


 Por ejemplo, las interfaces Comparable y Cloneable son implementadas por
muchas clases no relacionadas.
 Cuando desee especificar el comportamiento de un determinado tipo de datos, pero
no preocuparse por la implementación de este comportamiento.
 La interfaz es como una especie de contrato que al implementarla está obligado a
desarrollar sus métodos. Si no quiere desarrollar todos sus métodos debe declarar la
clase que la implementa como abstract.
 Cuando desee tomar ventaja de este tipo de herencia múltiple .
 Tenga en cuenta que muchas bibliotecas de java utilizan ambos tipos de clases,
abstractas e interfaces

Diferencias entre Clase Abstracta e Interface

 La abstracción en Java le permite crear atributos y no solo constantes como en una


interfaz.
 La abstracción le permite usar los modificadores de acceso “private”, “protected”, o
“default” en sus atributos.
 En una interfaz, solo se puede crear constantes que son “public”, “static”, y “final”.

 La abstracción le permite crear métodos con implementación, y métodos abstractos


que tienen que ser sobre escritos.
 La interface solo declara métodos abstractos.
 La abstracción te permite usar distintos modificadores de acceso en los métodos
también.
 En interfaces los modificadores de acceso en métodos siempre son “public”.
 La abstracción en Java se define por la palabra clave “abstract”.
 La interface en java se define por la palabra clave “interface”.
 Una clase abstracta se tiene que heredar y no implementar como en el caso de las
interfaces.
 Una clase concreta puede heredar solo de una clase abstracta pero puede
implementar más de una interface.

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

 Una declaración de clase puede ir precedida de modificadores que otorgan a la clase


ciertas propiedades:
 public. Una clase public es públicamente accesible.
 abstract. Una clase abstracta se considera incompleta y no se pueden crear
instancias de dicha clase.
 Esto sucede porque la clase contiene métodos abstractque deben ser implementados
por una subclase.
 final. Una clase final no admite subclases.
 Una clase no puede ser a la vez final y abstract.

Modificadores Modificadores de Modificadores de Modificadores de


clase métodos atributos

public Indica el nivel de Indica nivel de Indica nivel de


acceso a la clase. accesibilidad. Igual accesibilidad del
Cualquier clase que en los atributos. atributo. Permite su
puede acceder a acceso desde
ella; si no se pone cualquier clase del
se dice qu el nivel mismo paquete y de
de acceso es de otros paquetes.
package
final La clase no puede Indica que el método El modificador final
ser heredada y no puede ser tiene que ver con la
todos sus métodos redefinido al ser herencia. Indica que
se declaran como heredado por una ese atributo no
finales. subclase. El método puede ser redefinido
no puede sr al ser heredado en
sobrecargdo. otra clase.
abstract indica que contiene el método es
algún método abstracto, solo se da
abstracto; los su definición no su
métodos abtractos implementación.
solo están definidos Estos métodos no
pero no tienen tienen cuerpo solo la
código. De las cabecera. Cuando una
clases abstractas clase tiene al menos
no se puede un método abstracto
instanciar objetos. la misma clase tiene
que declararse
abstracta.
synchronized Indica que los tiene el mismo
objetos de dicha significado que en la
clase pueden ser clase, indica que se
accedidos va a utilizar de
concurrentemente manera concurrente.
(se usa en
multithreading) y
que van a ser
sincronizados
durante el acceso
concurrente.
extends Hace referencia a la
herencia; indica que
la clase hereda de
otra clase.
implements Indica que la clase
implementa los
métodos de una
clase abstracta o
interface.
private Indica nivel de Indica nivel de
accesibilidad. Igual accesibilidad del
que en los atributos. atributo. Nivel de
accesibilidad màs
restringido. A un
atributo private solo
se puede acceder
desde la propia
clase.
protected Indica nivel de Indica nivel de
accesibilidad. Actúa accesibilidad del
igual que con los atributo. Es un poco
atributos. menos restrictivo
que private. Se
puede acceder desde
cualquier clase que
esté en el mismo
paquete y desde
subclases (clases
que heredan de esta
clase) que estén en
otros paquetes, pero
no desde clases que
no hereden esta
clase y estén en
otros paquetes.
por defecto Un atributo package
(package) puede ser accedido
desde cualquier
clase del mismo
paquete, pero no
desde una clase que
pertenece a otro
paquete.
static mismo significado Con el modificador
que para los static la variable se
atributos. Podemos comporta como un
decir que hay variable global. Se le
métodos de clase y llama variable de
métodos de instancia, clase. Cualquier
según el método haga instancia de la clase
uso del modificador va a utilizar el mismo
static o no atributo. Si el
atributo no es static
se le reserva
memoria
independiente en
cada instacia de la
clase y se le llama
variable de
instancia.

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

 Los métodos no son más que funciones miembro de una clase.


 Se trata de funciones que, automáticamente, tratan con los atributos del objeto como
si fuesen variables locales a la función.
 Los métodos, por tanto, son el mecanismo de acceso y manipulación de los datos
del objeto.
 Cada método está constituido por un conjunto de instrucciones escritas en un
lenguaje de programación determinado, asociadas a un objeto determinado y cuya
ejecución sólo puede desencadenarse a través de un mensaje recibido por este.
 Los objetos se comunican a través del paso de mensajes.
 En la práctica, esto supone la ejecución de un método en un objeto determinado.
 Un mensaje le dice a un objeto lo que tiene que hacer, identificando un método y los
operandos necesarios para su ejecución.
 Los objetos reciben, interpretan y responden a mensajes procedentes de otros
objetos.
 Un mensaje consiste en una dirección y una instrucción formada por un nombre de
método y 0 o más parámetros:

OBJETO. Método [parámetros]

 Supongamos el conjunto de objetos de los Empleados de una empresa.


 Para un empleado concreto, queremos calcular su salario mensual, pero para ello se
necesita conocer el número de horas trabajadas.
 Se envía un mensaje al objeto, empleado23, de activar calcularSalario() con unas
horasTrabajadas determinadas:

empleado23.calcularSalario( horasTrabajadas);

 Ante este mensaje, el receptor (empleado23) ejecutará su método calcularSalario()


 (siempre que el emisor tenga permiso para solicitar dicha operación),
 o, en caso de no poder procesar el mensaje, se devolverá un mensaje de error.
Ej de Clases
Métodos y Mensajes

//Empleado.java
Class Empleado
{
private String nombre;
private int edad;
private int antiguedad;
private float salario;

public Empleado(String n, int e, int a, float s)


{
nombre= n;
edad= e;
antiguedad= a;
salario= s;
}

public float calcularSalario( int horasTrabajadas)


{
return( ( salario * horasTrabajadas) + ( antiguedad* 60 ) );
}

public String toString()


{
return( nombre + ““+ edad );
}
}

//PruebaEmpleado.java
public class PruebaEmpleado
{
public static void main(String args[])
{
Empleado empl1 = new Empleado( "Filemón", 32, 10, 30 );

float salarioEmpl1= empl1.calcularSalario( 1260 );

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;

public Libro(String e, String a, int n, String i, int p, int an)


{
autor = a;
editorial = e;
numEdicion= n;
isbn= i;
numPaginas= p;
año= an;
}
}

El número de atributos debe ser el mínimo para realizar todas las operaciones que
requiere la aplicación.

Modificadores de Atributos

Los atributos o campos de clase pueden precederse con modificadores de acceso.

Existen cuatro posibles modificadores de acceso:

predeterminado. Sólo son accesibles desde las clases del paquete


private. Sólo son accesibles en la propia clase
protected. Son accesibles en las subclases de la clase y en la propia clase.
public. Son accesible en cualquier parte donde la clase sea accesible.
static. Se crean variables de clase. Cuando se declara un campo static en una clase
sólo existe una copia de ese campo, independientemente del número de instancias de la
clase que se creen.
Un atributo static puede ser referido directamente dentro de su propia clase, pero
cuando se accede a él externamente, hay que utilizar el nombre de la clase.

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

 Una clase es una plantilla para objetos,


 permite agrupar objetos que comparten las mismas propiedades y
comportamientos.

 Los métodos permiten el acceso y manipulación de los datos del objeto.


 Al definir un método se indica la accesibilidad, lo que devuelve nombre del método
y los parámetros entre paréntesis.
Ejemplo: public void saltar()
private intc onsultarHoras()

 Los atributos describen los objetos.


 Al definirlos se pone modificadores de acceso [static] [final] el tipo nombre.
 Ejemplo:
 privateintedad;
 Private static int numAlumnos;
 Private static final int NUM_MAX_ALUM= 100;
 Los objetos se comunican entre sí a través del paso de mensajes, en la práctica
supone la ejecución de un método determinado.
 Obj1.metodo(); //Con o sin parámetros
Objeto

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.

Un OBJETO es la integración de tres aspectos:

 Relaciones, permiten que el objeto se integre en la organización de la que forma


parte junto con otros objetos.
 Las relaciones pueden ser de tipo jerárquico (herencia) o semántico.
 Propiedades (atributos), distinguen un objeto de los restantes (tamaño, posición,
color, ...).
 Cada propiedad tendrá un determinado valor.
 Las propiedades de un objeto pueden ser heredadas por sus descendientes.
 Métodos (operaciones),conjunto de operaciones que puede hacer un objeto
(estudiar, caminar, trabajar, rotar, volar, etc.).
 Un método es un procedimiento o función que altera el estado de un objeto o
hace que el objeto envíe un mensaje, es decir, que devuelva valores.
 Los métodos pueden ser heredados por sus descendientes.

 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
}
}

public class Rectangulo


{
private int ancho;
private int alto;

public Rectangulo(int n, int l) //constructor


{
ancho = n;
alto = l;
}

public int calculaArea()


{
return( ancho* alto );
}
}

Objetos, Identidad

 Cada objeto existe y tiene entidad por sí mismo.

 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.

 Esto tiene importancia cuando descendemos al nivel de programación.


 Aquí, cada objeto tiene un controlador por el cual se identifica. Éste puede ser una
variable, una estructura de datos, una cadena de caracteres, etc.
 El controlador será distinto para cada uno de los objetos, aunque las referencias a
éstos sean uniformes e independientes del contenido, se permite crear agrupaciones de
objetos con el mismo tratamiento (clases).

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;

System.out.println("El número mayor de "+x+", "+y+", "+z+" es: "+ mayor);


}

public static void main(String args[])


{
int elMayor=0;
Repaso_if r= new Repaso_if();
r.mayorEs(5,2,8);
}

}
Encapsulación y Ocultación de datos

 Un objeto es la integración de atributos y métodos.


 Los datos son los atributos de un objeto y los métodos se utilizan para
procesar los atributos de ese objeto.
 Todos esos atributos y métodos se encapsulan en una única unidad, que es la
clase.
 A partir de esta clase, se instancian posteriormente los objetos.

 La organización interna de la clase es inaccesible desde el exterior (ocultamiento de


la información).
 Las partes ocultas o encapsuladas de una clase, y por tanto de sus objetos,
son su implementación privada, o lo que es lo mismo se dice que son privados.
 Se dice que los métodos visibles son públicos y forman la interfaz del
objeto
 (en general se asume el ocultar los atributos como una buena técnica de
programación).
 Cada objeto mantiene sus propios datos internos y los usuarios de un objeto pueden
acceder y manipular los datos internos solamente a través de sus métodos,
 de tal forma que la interfaz de un objeto es su conjunto de métodos públicos.
 Así, detalles internos de la implementación de un objeto como algoritmos o
representaciones internas de datos, no son visibles.
 Esto refuerza el ocultamiento de la información y permite un alto nivel de
abstracción.

 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.

 El ocultamiento de información facilita que los usuarios de un objeto no estén


expuestos al peligro cuando su implementación cambia mientras no haya cambiado la
interfaz. Entonces los programas que utilizaban el objeto pueden seguir funcionando sin
alteración alguna.

 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.

Ejemplo de encapsulación y ocultación de datos

//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

 En ella identificamos entidades que son cuentas:


 cuenta del cliente 1, cuenta del cliente 2, etc.
 Una cuenta es un objeto que tiene unos atributos como
 nombre, número de cuenta y saldo,
 y tiene un conjunto de métodos como
 IngresarDinero, Reti rarDinero, Abonarlntereses, SaldoActual, Transferencia
etc.
 En el caso de una transferencia:
cuenta01.Transferencia(cuenta02);
 Transferencia sería el mensaje que el objeto cuenta02 envía al objeto cuenta01,
solicitando le sea hecha una transferencia, siendo la respuesta a tal mensaje la
ejecución del método Transferencia.
 Trabajando a este nivel de abstracción, manipular una entidad bancaria resultará
muy sencillo.

Considere el Banco XYZ


 Podemos ver a esta entidad como a un objeto que tiene que comunicarse con otros
muchos objetos
 (bolsa, otras entidades bancarias, empresas, etc.) para lograr sus fines: ganar
dinero.
 A su vez, la entidad XYZ tendrá un montón de sucursales distribuidas por toda la
geografía.
 Cada sucursal es otro objeto, de diferentes características que la entidad
bancaria, que se comunicará con otras sucursales para satisfacer las
peticiones de sus clientes.
 Pero. ¿y qué es un cliente?
 Es otro objeto, con sus propias características
 se comunicará con otros objetos (sucursales, otros clientes, empresas, etc.)
 para realizar operaciones desde sus cuentas (transferencias, cargos,
ingresos, etc.).
 Pero y las cuentas ¿no son también objetos?
 Evidentemente.
Vemos entonces que escribir un programa de gestión para el Banco XYZ supondría crear
objetos banco, sucursal, cliente, cuenta, etc., que deben comunicarse entre sí para poder
responder a las operaciones solicitadas en cada momento

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

Comportamiento de la clase CCuenta


 El comportamiento define las acciones que el objeto puede emprender.
 Por ejemplo, pensando acerca de un objeto de la clase CCuenta, esto es, de una
cuenta de un cliente de un determinado banco, algunas acciones que pueden hacerse
son:
Asignar el nombre de un cliente del banco a una cuenta.
Obtener el nombre del cliente de una cuenta.
Asignar el número de la cuenta.
Obtener el número de la cuenta.
Realizar un ingreso.
Realizar un reintegro.
Asignar el tipo de interés.
Obtener el tipo de interés.
Obtener el saldo, esto es, el estado de la cuenta.

 Para definir este comportamiento hay que añadir métodos a la clase.


Métodos a la clase CCuenta
 Los métodos son rutinas de código definidas dentro del cuerpo de la clase,
 que se ejecutan en respuesta a alguna acción tomada desde dentro de un
objeto de esa clase
 o bien desde otro objeto de la misma o de otra clase.
 Recuerde que los objetos se comunican mediante mensajes.
 El conjunto de mensajes a los que un objeto puede responder se corresponde
con el conjunto de métodos que implementa su clase.

 Ej: agregar a la clase CCuenta un método que responda


a la acción de asignar el nombre de un cliente del banco a una cuenta:

public void asignarNombre(String nom)


{ //se asegura que nombre a asignar no sea una cadena vacía
if (nom.length() == 0)
{
System.out.println(”Error: cadena vacía”);
return;
}
nombre = nom;
}

 Observe que el método ha sido declarado público (public).


 Un miembro declarado público está accesible para cualquier otra clase o subclase
que necesite utilizarlo.
 La interfaz de una clase, está formada por todos los miembros públicos de la
misma.

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;
} //…..
}

public class PruebaCCuenta


{
public static void main(String [] args)
{
CCuenta cuenta01 = new CCuenta();
cuenta01l.asignarNombre(”Alex C. Rojas”);
cuenta01.asignarCuenta(’1800622”);
cuenta01.asignarTipoDelnterés(2.5);
cuenta01.ingreso(12000);
cuenta01.reintegro(3000);
System.out.println(cuenta01.obtenerNombre();
System. out. pri ntl n( cuenta01.obtenerCuenta ( );
System.out.println(cuenta01.estado());
System.out.println(cuenta01.obtenerTipoDelnterés());
}
}

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

 La herencia designa la facultad de los objetos de compartir propiedades y


operaciones entre ellos.
 Como la herencia humana, existen unas determinadas clases hijo que heredan las
propiedades y atributos de otras clases padres.

 Desde un punto de vista de implementación, se trata de crear nuevas clases de


objetos a partir de otras ya existentes,
 es decir, de reutilizar el comportamiento de una clase en la definición de otras
nuevas.
 Cualquier clase hereda la declaración de los atributos y los métodos de su
superclase,
 pudiendo estas subclases especializarse añadiendo declaraciones de atributos
adicionales y declaraciones de métodos propios o incluso cambiando los atributos y
métodos heredados.

 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 las jerarquías que establecen las relaciones de herencia, a medida que


descendemos de nivel, cada nivel aporta un grado más de especialización sobre el nivel
inmediatamente superior.

 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

 Se produce cuando la clase que recibe la herencia tiene un sólo padre.

 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.

 De métodos. La herencia de los métodos permite aumentar la reutilización de


software y simplifica, por tanto, el diseño.
 Además, facilita la programación, reduce redundancias y simplifica la
corrección de los programas.
 Los métodos deben situarse tan elevados en la jerarquía de clases como sea
posible, aunque puedan ser abstractos (es decir, sin incluir código). De esta forma se
facilita la abstracción, al poder establecer métodos comunes a varias clases.

//Persona.java
public class Persona
{
private String nombre;

public Persona(String n)
{
nombre= n;
}

public String getNombre()


{
return nombre;
}
}

//Estudiante.java
public class Estudiante extends Persona
{
private String titulacion;

public Estudiante(String n, String t)


{
super( n ); // Llama al constructor de Persona
titulacion= t;
}

public String getTitulacion()


{
return titulacion;
}

public String toString()


{
return getNombre() + ", " + 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() );
}
}

Ejercicio de herencia simple

 El programa debe utilizar la herencia para extender de la clase Caja.


 La clase Caja recibirá los valor del altura, anchura y profundidad por medio de su
constructor y tiene el método calculaVolumen().
 La clase CajaPeso extenderá de la clase Caja para incluir el atributo peso, recibe los
datos por medio de su constructor.
 La clase PruebaCajaPeso creará dos objetos CajaPeso e inicializará sus atributos.
Para ambos objetos calcula e imprime el volumen, y el peso de la caja.

Herencia Múltiple

 Se produce cuando el objeto que hereda tiene más de un padre o alguno de sus
antepasados tiene varios padres.

 La herencia múltiple ofrece la posibilidad de definir clases híbridas, que comparten


los miembros de dos o más clases predefinidas.
 Es difícil de encontrar en los lenguajes OO, ya que para determinar si un objeto
hereda un miembro puede que haya que seguir caminos por más de un padre.

 Pueden darse conflictos debidos a que un objeto herede la misma propiedad o


método de dos objetos situados al mismo nivel (al tener dos padres) o a distinto nivel
(colisión de nombres).
 Este tipo de situaciones se da cuando una clase hereda 2 o más versiones de un
método provenientes de los distintos ancestros, y es inevitable en el caso de la herencia
repetida,
 que se produce cuando una clase hereda de otras que a su vez heredan de una clase
común.

 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

 Java no permite herencia múltiple.


 La herencia siempre es simple, aunque permite la implementación de múltiples
interfaces.
 Los interfaces son clases que sólo contienen métodos abstractos.
 Se pueden distinguir otros dos tipos de herencia:
 Herencia selectiva (o parcial) que permite decidir qué métodos se heredan y cuáles
no.
 Esto complica sintácticamente la definición de una clase, lo que hace que sean
pocos los lenguajes que la adoptan.
 Herencia no selectiva que fuerza a que todos los atributos y métodos sean
heredados.
 Esta es la más utilizada en lenguajes como C++, Java o C#.

//Profesor.java
class Profesor
{
private String nombre;

public Profesor(String n)
{
nombre= n;

public String getNombre()


{
return nombre;
}
}

interface Investigador
{
public String getCampoInvestigacion();
}

Ej: Calculadora,java //Ej de clases

Escriba los métodos que puede tener una Calculadora.


Además, proporcione un método calcular que seleccione la operación en función de un
char.

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.

Das könnte Ihnen auch gefallen