trabajo 01 java

35
Curso: Programacion orientada a objetos Profesor: Armando Ricardo Huapaya Sotero Turno: Noche Cliclo: 5 Seccion:05 Alumnos: -Perez Campusmana Marcos Miguel -Requena Calla Carlos -Fernandez de Cordova Casaretto Franco Javier

Upload: franco-fernandez-de-cordova

Post on 09-Dec-2015

245 views

Category:

Documents


8 download

DESCRIPTION

javaavasvsvdsvasdvsaddasdvsdavdsavdsvdsvdsvdsvasvdsav

TRANSCRIPT

Page 1: Trabajo 01 Java

Curso: Programacion orientada a objetos

Profesor: Armando Ricardo Huapaya Sotero

Turno: Noche

Cliclo: 5

Seccion:05

Alumnos: -Perez Campusmana Marcos Miguel

-Requena Calla Carlos

-Fernandez de Cordova Casaretto Franco Javier

Page 2: Trabajo 01 Java

Indice

Introduccion

1. Diseño de diagramas de clase

2. UML

3. Clases y Objetos

4. Atributos y métodos

5. Encapsulacion

6. Modificadores de acceso

7. Constructores

8. Jerarquias de Clases

9. Herencia

Bibliografia

Page 3: Trabajo 01 Java

Introduccion

¿QUÉ ES JAVA? CONCEPTO DE PROGRAMACIÓN ORIENTADA A OBJETOS

Java es un lenguaje de programación orientado a objetos que se popularizó a partir del

lanzamiento de su primera versión comercial de amplia difusión, la JDK 1.0 en 1996. Actualmente

es uno de los lenguajes más usados para la programación en todo el mundo.                                                                            

Los antecedentes de Java habría que buscarlos en los lenguajes de programación C y C++. El

lenguaje C fue desarrollado en la década de los 70 y constituye un lenguaje muy robusto usado

como núcleo del sistema operativo Unix. C no admite la orientación a objetos y está considerado

un lenguaje “poco amigable” desde el punto de vista de que su sintaxis, elementos de

programación que emplea (manejo directo de memoria) y otras cuestiones hacen que sea un

lenguaje difícil de aprender. C++ fue una evolución de C desarrollada en los años 80. Introdujo el

diseño orientado a objetos, pero manteniendo la compatibilidad con C. Esto suponía que C++

permitiera tanto el uso de la programación estructurada “tradicional” como la programación

orientada a objetos. Además C++ mantuvo ciertas características de C como el manejo directo

de la memoria, el uso de variables globales, sentencia goto, etc. que hicieron que la evolución

fuera “parcial”.

Como paso final en esta evolución tenemos Java, un lenguaje que evoluciona a partir de C y C+

+, pero que elimina diversos aspectos de estos lenguajes y se constituye en un lenguaje

definitivamente orientado a objetos. El romper con distintos aspectos de C++ cuyo manejo

inadecuado por parte de muchos programadores daba lugar a problemas en las aplicaciones ha

sido un factor decisivo para convertir a Java en un lenguaje popular y de amplio uso.

Nosotros vamos a quedarnos con el lado práctico de lo que hemos comentado respondiendo esta

pregunta: ¿Es necesario saber C ó C++ para programar en Java? No, no es necesario.

Aunque puede suponer una ventaja para aquellas personas que tengan conocimientos previos en

estos lenguajes, no recomendamos de forma explícita su estudio en profundidad como paso

previo al aprendizaje de Java.

De modo orientativo, veamos un esquema sobre la evolución de los lenguajes.

Page 4: Trabajo 01 Java

 

  

Este esquema es meramente orientativo: es imposible reflejar la diversidad de lenguajes y su

evolución en un gráfico tan simplificado. También los datos relativos a fechas son orientativos.

No hay que suponer que lo único válido sea la programación orientada a objetos por ser lo más

moderno. Al contrario, muchísima programación de la que se hace hoy en día se basa en

lenguajes o código no orientado a objetos. Además, la misma programación orientada a objetos

se basa en conceptos muy antiguos de programación.

Tener en cuenta que algunos lenguajes que nacieron en los años 60 han perdido vigencia y ya no

se usan, mientras que otros se han ido modernizando y continúan usándose más o menos

ampliamente, como es el caso de Cobol. Lo que consideramos interesante con este esquema es

que se vea que Java es una evolución que por un lado incorpora cosas que se venían usando

desde hace mucho tiempo en programación, y por otro introduce ciertas novedades que lo

convierten en un lenguaje moderno. 

Java es un lenguaje útil para casi todo tipo de problemas. Podemos citar como funcionalidades

de Java varias:

 1. Aplicaciones “cliente”: son las que se ejecutan en un solo ordenador (por ejemplo el

portátil de tu casa) sin necesidad de conectarse a otra máquina. Pueden servirte por ejemplo

para realizar cálculos o gestionar datos.

2. Aplicaciones “cliente/servidor”: son programas que necesitan conectarse a otra máquina

(por ejemplo un servidor de datos) para pedirle algún servicio de forma más o menos continua,

como podría ser el uso de una base de datos. Pueden servir por ejemplo para el teletrabajo:

trabajar desde casa pero conectados a un ordenador de una empresa.

3. Podemos hablar también de “aplicaciones web”, que son programas Java que se

ejecutan en un servidor de páginas web. Estas aplicaciones reciben “solicitudes” desde un

ordenador y envían al navegador (Internet Explorer, Firefox, Safari, etc.) que actúa como su

cliente páginas de respuesta en HTML.

 

Page 5: Trabajo 01 Java

Éstos son sólo algunos ejemplos de todo el potencial que hay detrás de Java como lenguaje para

aprender y obtener muchos beneficios con su uso. Obviamente por determinados términos

empleados (cliente, cliente/servidor, base de datos, HTML…), te darás cuenta de que el lenguaje

Java tiene mucha potencialidad, pero también de que su conocimiento a fondo requeriría mucho

tiempo. Nosotros en este curso vamos a estudiar únicamente los aspectos más básicos de Java.

Diseño de diagrama de clasesUn diagrama de clases sirve para visualizar las relaciones entre las clases que involucran el sistema, las cuales pueden ser asociativas, de herencia, de uso y de contenimiento.

Un diagrama de clases está compuesto por los siguientes elementos:

Clase : atributos, métodos y visibilidad. Relaciones : Herencia, Composición, Agregación, Asociación y Uso.

Elementos (Diagrama UML):

Clase

Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia de una clase). A través de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.).

En UML, una clase es representada por un rectángulo que posee tres divisiones:

Page 6: Trabajo 01 Java

En donde:

o Superior: Contiene el nombre de la Claseo Intermedio: Contiene los atributos (o variables de instancia) que

caracterizan a la Clase (pueden ser private, protected o public).o Inferior: Contiene los métodos u operaciones, los cuales son la forma

como interactúa el objeto con su entorno (dependiendo de la visibilidad: private, protected o public).

Ejemplo:

Una Cuenta Corriente que posee como característica:

o Balance

Puede realizar las operaciones de:

o Depositaro Giraro y Balance

El diseño asociado es:

Atributos y Métodos:

o Atributos:

Los atributos o características de una Clase pueden ser de tres tipos, los que definen el grado de comunicación y visibilidad de ellos con el entorno, estos son:

Page 7: Trabajo 01 Java

public (+, ): Indica que el atributo será visible tanto dentro como fuera de la clase, es decir, es accesible desde todos lados.

private (-, ): Indica que el atributo sólo será accesible desde dentro de la clase (sólo sus métodos lo pueden accesar).

protected (#, ): Indica que el atributo no será accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de las subclases que se deriven (ver herencia).

o Métodos:

Los métodos u operaciones de una clase son la forma en como ésta interactúa con su entorno, éstos pueden tener las características:

public (+, ): Indica que el método será visible tanto dentro como fuera de la clase, es decir, es accesible desde todos lados.

private (-, ): Indica que el método sólo será accesible desde dentro de la clase (sólo otros métodos de la clase lo pueden accesar).

protected (#, ): Indica que el método no será accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de métodos de las subclases que se deriven (ver herencia)

Relaciones entre Clases:

Ahora ya definido el concepto de Clase, es necesario explicar cómo se pueden interrelacionar dos o más clases (cada uno con características y objetivos diferentes).

Antes es necesario explicar el concepto de cardinalidad de relaciones: En UML, la cardinalidad de las relaciones indica el grado y nivel de dependencia, se anotan en cada extremo de la relación y éstas pueden ser:

o uno o muchos: 1..* (1..n)o 0 o muchos: 0..* (0..n)

Page 8: Trabajo 01 Java

o número fijo: m (m denota el número).

Herencia (Especialización/Generalización): 

Indica que una subclase hereda los métodos y atributos especificados por una Super Clase, por ende la Subclase además de poseer sus propios métodos y atributos, poseerá las características y atributos visibles de la Super Clase (public y protected), ejemplo:

En la figura se especifica que Auto y Camión heredan de Vehículo, es decir, Auto posee las Características de Vehículo (Precio, VelMax, etc) además posee algo particular que es Descapotable, en cambio Camión también hereda las características de Vehiculo (Precio, VelMax, etc) pero posee como particularidad propia Acoplado, Tara y Carga.

Cabe destacar que fuera de este entorno, lo único "visible" es el método Características aplicable a instancias de Vehículo, Auto y Camión, pues tiene definición pública, en cambio atributos como Descapotable no son visibles por ser privados.

Agregación: 

Para modelar objetos complejos, n bastan los tipos de datos básicos que proveen los lenguajes: enteros, reales y secuencias de caracteres. Cuando

Page 9: Trabajo 01 Java

se requiere componer objetos que son instancias de clases definidas por el desarrollador de la aplicación, tenemos dos posibilidades:

Por Valor: Es un tipo de relación estática, en donde el tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye. Este tipo de relación es comúnmente llamada Composición (el Objeto base se construye a partir del objeto incluido, es decir, es "parte/todo").

Por Referencia: Es un tipo de relación dinámica, en donde el tiempo de vida del objeto incluido es independiente del que lo incluye. Este tipo de relación es comúnmente llamada Agregación (el objeto base utiliza al incluido para su funcionamiento).

Un Ejemplo es el siguiente:

En donde se destaca que:

Un Almacén posee Clientes y Cuentas (los rombos van en el objeto que posee las referencias).

Cuando se destruye el Objeto Almacén también son destruidos los objetos Cuenta asociados, en cambio no son afectados los objetos Cliente asociados.

La composición (por Valor) se destaca por un rombo relleno. La agregación (por Referencia) se destaca por un rombo

transparente.

La flecha en este tipo de relación indica la navegabilidad del objeto referenciado. Cuando no existe este tipo de particularidad la flecha se elimina.

Asociación: 

La relación entre clases conocida como Asociación, permite asociar objetos que colaboran entre sí. Cabe destacar que no es una relación fuerte, es decir, el tiempo de vida de un objeto no depende del otro.

Ejemplo:

Page 10: Trabajo 01 Java

Un cliente puede tener asociadas muchas Órdenes de Compra, en cambio una orden de compra solo puede tener asociado un cliente.

Dependencia o Instanciación (uso): 

Representa un tipo de relación muy particular, en la que una clase es instanciada (su instanciación es dependiente de otro objeto/clase). Se denota por una flecha punteada.

El uso más particular de este tipo de relación es para denotar la dependencia que tiene una clase de otra, como por ejemplo una aplicación grafica que instancia una ventana (la creación del Objeto Ventana está condicionado a la instanciación proveniente desde el objeto Aplicación):

Cabe destacar que el objeto creado (en este caso la Ventana gráfica) no se almacena dentro del objeto que lo crea (en este caso la Aplicación).

Casos Particulares:

Clase Abstracta:

Una clase abstracta se denota con el nombre de la clase y de los métodos con letra "itálica". Esto indica que la clase definida no puede ser instanciada pues posee métodos

Page 11: Trabajo 01 Java

abstractos (aún no han sido definidos, es decir, sin implementación). La única forma de utilizarla es definiendo subclases, que implementan los métodos abstractos definidos.

o Clase parame trizada:

Una clase parame trizada se denota con un subcuadro en el extremo superior de la clase, en donde se especifican los parámetros que deben ser pasados a la clase para que esta pueda ser instanciada. El ejemplo más típico es el caso de un Diccionario en donde una llave o palabra tiene asociado un significado, pero en este caso las llaves y elementos pueden ser genéricos. La genericidad puede venir dada de un Template (como en el caso de C++) o bien de alguna estructura predefinida (especialización a través de clases).

En el ejemplo no se especificaron los atributos del Diccionario, pues ellos dependerán exclusivamente de la implementación que se le quiera dar.

Ejemplo:

Supongamos que tenemos un el caso del Diccionario implementado mediante un árbol binario, en donde cada nodo posee:

key: Variable por la cual se realiza la búsqueda, puede ser genérica.

Page 12: Trabajo 01 Java

item: Contenido a almacenar en el diccionario asociado a "key", cuyo tipo también puede ser genérico.

Para este caso particular hemos definido un Diccionario para almacenar String y Personas, las cuales pueden funcionar como llaves o como ítem, solo se mostrarán las relaciones para la implementación del Diccionario:

Encapsulaciones

Definición:

El encapsulamiento habla del modo de ocultar como ha sido implementado el estado, los atributos, de un objeto. Se accede a este estado a través de los métodos públicos, es decir su interfaz publica. Una buena práctica es hacer las validaciones correspondientes a los posibles estados del objeto, en estos métodos, de modo tal de mantener al objeto en un estado consistente.

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.

También se lo llama “information hiding”. De la misma forma podemos respetar el encapsulamiento si se tiene, en la clase Auto, un atributo velocidad, que sea privado, el único modo de modificar la velocidad es a través de los método acelerar() y frenar(), es decir que esta encapsulada la velocidad, y solo se la puede modificar por los métodos acelerar() y frenar(), no se puede cambiar la velocidad de ninguna otra forma.

Métodos de acceso

Los métodos de acceso son el medio de acceder a los atributos privados del objeto. Son métodos públicos del objeto.

Page 13: Trabajo 01 Java

-El getter: El método para acceder a los atributos en forma de solo lectura se los denomina “getters”. Son los métodos que retornan el valor de los atributos. El NetBeans, como la mayoría de los entornos de desarrollo, permite generarlos de forma automática.

-El setter: El método para acceder a los atributos en forma de escritura se los denomina “setters”. Son los métodos que establecen el valor de los atributos. Tambien se los genera de forma automática en los entornos de desarrollo

Modificadores de accesoMODIFICADORES DE ACCESO JAVA: PUBLIC, PRIVATE, PROTECTED.

Hasta ahora habíamos dicho que una subclase no tiene acceso a los campos de

una superclase de acuerdo con el principio deocultación de la

información. Sin embargo, esto podría considerarse como demasiado

restrictivo.

 Decimos que podría considerarse demasiado restrictivo porque limita el

acceso a una subclase como si se tratara de una clase cualquiera, cuando en

realidad la relación de una superclase con una subclase es más estrecha que

con una clase externa. Por ello en diferentes lenguajes, Java entre ellos, se usa

un nivel de acceso intermedio que no es ni public ni private, sino algo

intermedio que se denomina como “acceso protegido”, expresado con la

palabra clave protected, que significa que las subclases sí pueden tener

acceso al campo o método.

El modificador de acceso protected puede aplicarse a todos los miembros de

una clase, es decir, tanto a campos como a métodos o constructores. En el

caso de métodos o constructores protegidos, estos serán visibles/utilizables por

las subclases y otras clases del mismo package. El acceso protegido suele

aplicarse a métodos o constructores, pero preferiblemente no a campos, para

evitar debilitar el encapsulamiento. En ocasiones puntuales sí resulta de

interés declarar campos con acceso protegido.

Page 14: Trabajo 01 Java

La sintaxis para emplear esta palabra clave es análoga a la que usamos con las

palabras public y private, con la salvedad de que protected suele usarse

cuando se trabaja con herencia. Desde un objeto de una subclase podremos

acceder o invocar un campo o método declarado como protected, pero no

podemos acceder o invocar a campos o métodos privados de una superclase.

Declara un campo de una clase como protected y en un test crea un objeto de

la subclase y trata de acceder a ese campo con una invocación directa del tipo

interino43.IdProfesor = “54-DY-87”.

Java admite una variante más en cuanto a modificadores de acceso: la omisión

del mismo (no declarar ninguno de los modificadores public, private o

protected). En la siguiente tabla puedes comparar los efectos de usar uno u

otro tipo de declaración en cuanto a visibilidad de los campos o métodos:

 

MODIFICADOR CLASE PACKAGE SUBCLASE TODOS

public Sí Sí Sí Sí

protected Sí Sí Sí No

No especificado Sí Sí No No

private Sí No No No

Constructor

Un constructor es un método especial de una clase que se llama automáticamente siempre que se declara un objeto de esa clase.La principal misión del constructor es reservar memoria e inicial izar las variables miembros de la clase.

Page 15: Trabajo 01 Java

Funcionamiento del constructor JavaCuando se crea un objeto en java se realiza las siguientes operaciones de forma automática:

Se asigna memoria para el objeto. Se inicializa los atributos de estos objetos con los valores predeterminados por

el sistema. Se llama al constructor de la clase que puede ser uno entre varios.

Características del constructor Java Debe tener el mismo nombre que la clase a la que pertenece. En una clase puede haber varios constructores con el mismo nombre y con

distinta cantidad o tipos de argumentos. Es decir permite sobrecarga. Los constructores no se heredan. Un constructor no puede devolver ningún valor incluyendo el void. Un constructor debería declararse publico, para que pueda ser invocado desde

cualquier parte donde se desee crear un objeto de su clase. Es el primer método que se ejecuta. Se ejecuta de forma automática.

Constructor Java por defectoSi para una clase no se define ningún método constructor se crea uno automáticamente por defecto.El constructor por defecto es un constructor sin parámetros que no hace nada. Los atributos del objeto son iniciados con los valores predeterminados por el sistema.Este tipo de constructor se lo llama como constructor no-args, ya que no recibe parámetros.

Constructor Java copiaEs un constructor que recibe por parámetro un objeto del mismo tipo de la clase, asignando atributo por atributo al nuevo objeto generado.

Ejemplos

Constructor Java por default:

Page 16: Trabajo 01 Java

Acá vemos una clase con el constructor por defecto es decir sin declarar el constructor.

La llamada al constructor por default.

Constructor Java sobrecargado:

Se puede apreciar el  constructor Persona() y su sobre carga, el constructor Persona(String nombre).

Page 17: Trabajo 01 Java

La llamada al constructor por sobre carga.

Constructor Java Copia

Este constructor recibe por parámetro un objeto del tipo Persona y asigna los valores de la persona pasada por parámetros a la nueva instancia de la

persona.

HerenciaLa herencia es específica de la programación orientada a objetos, donde una clase nueva se crea a partir de una clase existente. La herencia (a la que habitualmente se denomina subclases) proviene del hecho de que la subclase (la nueva clase creada) contiene los atributos y métodos de la clase primaria. La principal ventaja de la herencia es la capacidad para definir atributos y

Page 18: Trabajo 01 Java

métodos nuevos para la subclase, que luego se aplican a los atributos y métodos heredados. Esta particularidad permite crear una estructura jerárquica de clases cada vez más especializada. La gran ventaja es que uno ya no debe comenzar desde cero cuando desea especializar una clase existente. Como resultado, se pueden adquirir bibliotecas de clases que ofrecen una base que puede especializarse a voluntad (la compañía que vende estas clases tiende a proteger los datos miembro usando la encapsulación).

¿QUÉ ES LA HERENCIA?Diferentes tipos de objetos suelen tener una cierta cantidad en común unos con otros.

Bicicletas de montaña bicicletas de carretera y bicicletas tándem, por ejemplo, todos comparten las características de las bicicletas (velocidad actual, la cadencia actual de pedal, arte actual) .Sin embargo, cada uno define también las características adicionales que los hacen diferentes: las bicicletas tándem tiene dos asientos y dos juegos de manillares, las bicicletas de carrera tienen gota manillar, algunas bicicletas de montaña tienen una anillo de cadena, dándoles una menor relación de desmultiplicación.

La programación orientada a objetos permite heredar a las clases de uso común del Estado y el comportamiento de otras clases. En este ejemplo, Bicicleta ahora se convierte en la superclase de la Montañera, Carrera y Tandem. En el lenguaje de programación Java, cada clase se le permite tener una superclase directa, y cada superclase tiene el potencial para un número ilimitado de las subclases:

Bicicleta

Page 19: Trabajo 01 Java

Montañera Carrera Tandem

Una jerarquía de clases de bicicleta

La sintaxis para la creación de una subclase es simple. Al principio de su declaración de clase, el uso de palabras clave extends, seguido por el nombre de la clase a heredar:

Class bicicleta_de_montaña extends bicicleta {

//Los nuevos campos y métodos de definición de una bicicleta de montaña irían aquí

}

Esto da a la montañera todos los mismos campos y métodos de bicicleta, pero permite propio código para centrarse exclusivamente en las características que lo hacen único. Sin embargo, usted debe tener cuidado de documentar adecuadamente el estado y el comportamiento que casa superclase define, ya que ese código no aparecerá en el archivo fuente de cada subclase.

Supongamos, por ejemplo, que tenemos la clase Jefe y la clase Secretaria definidas como sigue:

class Jefe { class Secretaria {

int numEmpleado; int numEmpleado;

String nombre; String nombre;

int numDepart; int numDepart;

int salario; int salario;

} }

Las partes comunes se pueden agrupar en una misma clase, manteniendo las otras dos clases con las partes no comunes y heredando de esta nueva clase con la palabra reservada extends.

Page 20: Trabajo 01 Java

Relación “es-un”

Para saber si la relación de herencia es correcta, se plantea la pregunta “¿la subclase es-una superclase? La respuesta debe ser “si” ¿el Jefe es-un Empleado? Sí

Ventajas

Se ahorra código Permite reutilizar código extendiendo su funcionalidad

Desventajas

Se ahorra código Se introduce una fuerte dependencia en la clase hija respecto a la clase

padre Puede dificultar la reutilización Un cambio en la clase padre puede tener

efectos imprevistos en las clases hijas Un objeto de una clase hija puede tener un comportamiento

inconsistente con lo esperado de un objeto de la clase padre Se establece una jerarquía o clasificación. Si cambia el criterio de

clasificación puede acarrear muchas modificaciones

Se indica usando la palabra reservada extends

class Punto3D extends Punto2D

Visibilidad:

Los miembros privados de la superclase no son visibles desde la subclase.

Los miembros públicos de la superclase son visibles y siguen siendo públicos en la subclase.

Se puede acceder a los miembros de la superclase usando la palabra reservada super.

Si una clase se declara como final no se puede heredar de ella. En java, todas las clases heredan implícitamente de la clase Object.

EJEMPLO

Page 21: Trabajo 01 Java

import javax.*;import javax.swing.JOptionPane;

public class Mamifero{ private int patas; private String nombre; public void imprimirPatas(){ JOptionPane.showMessageDialog(null," Tiene " + patas + " patas\n", "Mamifero", JOptionPane.INFORMATION_MESSAGE); }

public Mamifero(String nombre, int patas){ this.nombre = nombre; this.patas = patas; }} public class Perro extends Mamifero { public Perro(String nombre){ super(nombre, 4); }} public class Gato extends Mamifero { public Gato(String nombre){ super(nombre, 4); }} public class CrearPerro { public static void main(String[] args) { Perro perrito = new Perro("Pantaleon"); perrito.imprimirPatas(); /*Está en la clase mamífero*/ }}

Page 22: Trabajo 01 Java

Herencia y creación

El constructor de la clase hija refina el comportamiento del padre. En Java los constructores no se heredan. La primera sentencia del constructor de la clase hija SIEMPRE es una llamada al constructor de la clase padre.

La llamada al constructor del padre puede ser:

Implícita:

Si se omite, se llamará implícitamente al constructor por defecto, equivale a poner como primera sentencia super();

Si no existe el constructor por defecto en la clase padre dará un error en tiempo de compilación.

Explícita:

super(); o super(a,b); o …

Dependiendo de si el constructor al que invocamos tiene o no argumentos

ACCESO PROTEGIDO (OCULTACIÓN DE INFORMACIÓN)

Una subclase hereda todos los atributos definidos en la superclase, pero no puede acceder a los campos privados.

Para permitir que en un método de la subclase se pueda acceder a una característica (atributo/método) de la superclase, éste tiene que declararse como protected

Es discutible la visibilidad protegida para los atributos

Page 23: Trabajo 01 Java

Es útil la visibilidad protegida para los métodos

Protected: características visibles a las subclases y al resto de clases del paquete.

De más restrictivo a menos:

private

Visible sólo en la clase donde se define

Sin modificador (por defecto)

Visible a las clases del paquete

protected Visible a las subclases y al resto de clases del paquete

public Visible a todas las clases

REFINAMIENTO: Se añade nueva funcionalidad al comportamiento heredado

super

La palabra reservada super se utiliza para invocar a un método de la clase padre. Se debe utilizar para el refinamiento de métodos. No se tiene que utilizar para invocar a métodos heredados.Se puede utilizar en el cuerpo de otros métodos:

Deposito>>getCapital: devuelve el capital fijo

DepositoEstructurado>>getCapital: devuelve el capital fijo + capital variable

En los métodos de DepositoEstructurado habrá que determinar cuál de las dos versiones del método getCapital es la que necesitamos.

Page 24: Trabajo 01 Java

Se puede cambiar el nivel de visibilidad, sólo si se relaja:

Podemos pasar de menos a más, pero no al contrario.

El tipo de retorno (regla covariante) Siempre que el tipo de retorno del método redefinido sea compatible con

el tipo de retorno del método original

Un tipo B es compatible con un tipo A si la clase B es subclase de A

Ejemplo: Jerarquía de Empleado

Empleado >> public Empleado getColega(){…}

Jefe >> public Jefe getColega() {…}

RESTRINGIR LA HERENCIA

En Java se puede aplicar el modificador final a un método para indicar que no puede ser redefinido.

Asimismo, el modificador final es aplicable a una clase indicando que no se puede heredar de ella.

¿El modificador final va contra el principio abierto-cerrado?

TIPOS DE HERENCIA

Page 25: Trabajo 01 Java

POLIMORFISMO

Otro concepto de la POO es el polimorfismo. Un objeto solamente tiene una forma (la que se le asigna cuando se construye ese objeto) pero la referencia a objeto es polimórfica porque puede referirse a objetos de diferentes clases (es decir, la referencia toma múltiples formas). Para que esto sea posible debe haber una relación de herencia entre esas clases. Por ejemplo, considerando la figura anterior de herencia se tiene que: 

Una referencia a un objeto de la clase B también puede ser una referencia a un objeto de la clase A.

Una referencia a un objeto de la clase C también puede ser una referencia a un objeto de la clase A.

Una referencia a un objeto de la clase D también puede ser una referencia a un objeto de la clase A.

Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de la clase D.

Page 26: Trabajo 01 Java

Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de la clase A

Formas de polimorfismo:

Polimorfismo de asignación (variables polimorfas) Polimorfismo puro (función polimorfa) Polimorfismo ad hoc (sobrecarga) Polimorfismo de inclusión (redefinición) Polimorfismo paramétrico (genericidad)

Abstracción

Volviendo a la figura anterior de la relación de herencia entre clases, se puede pensar en una jerarquía de clase como la definición de conceptos demasiado abstractos en lo alto de la jerarquía y esas ideas se convierten en algo más concreto conforme se desciende por la cadena de la superclase.

Sin embargo, las clases hijas no están limitadas al estado y conducta provistos por sus superclases; pueden agregar variables y métodos además de los que ya heredan de sus clases padres. Las clases hijas pueden, también, sobreescribir los métodos que heredan por implementaciones especializadas para esos métodos. De igual manera, no hay limitación a un sólo nivel de herencia por lo que se tiene un árbol de herencia en el que se puede heredar varios niveles hacia abajo y mientras más niveles descienda una clase, más especializada será su conducta.

La herencia presenta los siguientes beneficios:

Las subclases proveen conductas especializadas sobre la base de elementos comunes provistos por la superclase. A través del uso de herencia, los programadores pueden reutilizar el código de la superclase muchas veces.

Los programadores pueden implementar superclases llamadas clases abstractas que definen conductas "genéricas". Las superclases abstractas definen, y pueden implementar parcialmente, la conducta pero gran parte de la clase no está definida ni implementada. Otros programadores concluirán esos detalles con subclases especializadas.

COMPATIBILIDAD DE TIPOS Un tipo B es compatible con un tipo A sólo si la clase B es descendiente

de la clase A. DepositoEstructurado es compatible con Deposito

Page 27: Trabajo 01 Java

Una asignación polimórfica es válida sólo si el tipo estático de la parte izquierda es compatible con el tipo de la parte derecha.

El paso de parámetros es válido sólo si el tipo del parámetro real es compatible con el tipo del parámetro formal.

Page 28: Trabajo 01 Java

JERARQUÍA DE CLASES

La herencia organiza las clases en una estructura jerárquica formando jerarquías de clases

No es tan sólo un mecanismo para compartir código

Consistente con el sistema de tipos del lenguaje Si una clase B hereda de otra clase A entonces:

B incorpora la estructura (atributos) y comportamiento (métodos) de la clase A

B puede incluir adaptaciones: B puede añadir nuevos atributos B puede añadir nuevos métodos B puede redefinir métodos

Las adaptaciones son dependientes del lenguaje

Page 29: Trabajo 01 Java

VENTAJAS DE USAR JERARQUÍA DE CLASES

Se puede reutilizar todas las funcionalidades comunes a múltiples clases lo incluimos en superclases. La cual se puede acceder a todos los métodos y atributos

Se puede realizar cambios en el código, si cambiamos en una superclase automáticamente se ve reflejado en las subclases y en las subclases de las subclases y así sucesivamente en esta jerarquía, reciben la información de la herencia.

Esto hace que es código sea más claro.

DISEÑO DE JERARQUÍA DE HERENCIAGeneralización (Factorización)

Se detectan clases con un comportamiento común

Ejemplo: Libro y Revista son Publicaciones

Especialización (Abstracción)

Se detecta que una clase es un caso especial de otra

Ejemplo: Rectángulo es un tipo de Polígono

No hay receta mágica para crear buenas jerarquías

Problemas con la evolución de la jerarquía

Page 30: Trabajo 01 Java

Bibliografía http://java-white-box.blogspot.pe/2013/12/javaplayer-constructores-en-java-que-es.html http://puntocomnoesunlenguaje.blogspot.pe/2012/07/normal-0-21-false-false-

false_103.html http://aprenderaprogramar.com/index.php?

option=com_content&view=article&id=665:public-private-y-protected-javatipos-de-modificadores-de-acceso-visibilidad-en-clases-subclases-cu00693b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

http://mundogeek.net/archivos/2009/03/30/modificadores-en-java/ http://profesores.fi-b.unam.mx/carlos/java/java_basico3_3.html http://labojava.blogspot.pe/2012/05/introduccion-oopencapsulamiento.html http://aprenderaprogramar.com/index.php?

option=com_content&view=article&id=368:ique-es-java-concepto-de-programacion-orientada-a-objetos-vs-programacion-estructurada-cu00603b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

http://jarroba.com/herencia-en-la-programacion-orientada-a-objetos-ejemplo-en- java/

http://rua.ua.es/dspace/bitstream/10045/15995/1/POO-3-Herencia-10-11.pdf http://es.slideshare.net/equipo2/poo-herencia-abstraccion-y-polimorfismo?

next_slideshow=1 http://www2.caminos.upm.es/Departamentos/matematicas/Fdistancia/PIE/java/

temasj/tjava1.pdf https://sites.google.com/site/programacionbasicajava/herencia http://www.arrakis.es/~abelp/ApuntesJava/GestionExcepciones.htm http://profesores.fi-b.unam.mx/carlos/java/indice.html http://codejavu.blogspot.pe/2013/05/herencia-en-java.html