trabajo 01 java
DESCRIPTION
javaavasvsvdsvasdvsaddasdvsdavdsavdsvdsvdsvdsvasvdsavTRANSCRIPT
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
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
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.
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.
É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:
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:
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)
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
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:
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
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.
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.
-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.
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.
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:
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).
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
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
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.
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
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*/ }}
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
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.
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
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.
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
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.
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
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
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
http://www.cs.buap.mx/~ygalicia/POO.pdf https://books.google.com.pe/books?
id=TRUdyfwdaSoC&pg=PA187&lpg=PA187&dq=JERARQUIA+DE+CLASE+EN+JAVA&source=bl&ots=DpFFoc4cwK&sig=-uai-QFHQAsIf0yxJXCaB266K7U&hl=es&sa=X&ved=0CD0Q6AEwBmoVChMIqe_3-v2CyAIVDJUNCh3yZAip#v=onepage&q=JERARQUIA%20DE%20CLASE%20EN%20JAVA&f=false
https://www.youtube.com/watch?v=3WNu1vuc-aw