nbuenas noches este doc esta dirigido a la comunidad de progrmadore
Size: 453.27 KB
Language: es
Added: Sep 23, 2025
Slides: 56 pages
Slide Content
CURSO PROGRAMACIÓN JAVA UNIDAD 3 - PROGRAMACIÓN ORIENTADA A OBJETOS
PROGRAMACION ORIENTADA A OBJETOS ¿Qué es la programación orientada a objetos? La Programación Orientada a Objetos (POO) es un paradigma de programación que busca que nuestra forma de programar sea más cercana a la forma como nos relacionamos en nuestro día a día. Un paradigma de programación es una propuesta tecnológica adoptada por una comunidad de programadores y desarrolladores cuyo núcleo central es incuestionable en cuanto que únicamente trata de resolver uno o varios problemas claramente delimitados. El nombre de "Orientado a Objetos" se debe a que nuestro código creará objetos que se encargarán de manipular los datos de entrada para así obtener datos de salida. Estos objetos tendrán propiedades y métodos.
PROGRAMACION ORIENTADA A OBJETOS CONCEPTOS CLAVE Para un mejor entendimiento y vamos a separar los conceptos en varios bloques , empezando desde lo mas básico ya que es primordial para poder programar en un lenguaje POO. Los primeros conceptos que vamos a ver son : CLASES OBJETOS
PROGRAMACION ORIENTADA A OBJETOS clases Java es un lenguaje en donde la estructura principal de su funcionamiento son las clases. Pero bien ¿Que son las clases? Para entenderlo haga lo siguiente: Observe bien la imagen. Fíjese de cada elemento que hay en ella. Obsérvela con detalle. Bien en este momento su cerebro acaba de generar el concepto de la programación orientada a objetos sin que usted se de cuenta de ello. ¿Cómo es eso? Es muy sencillo. Lo primero que tenemos que entender es como ya se dijo que la POO es la emulación de como funciona el mundo. Pero volvamos a la imagen
PROGRAMACION ORIENTADA A OBJETOS clases Si yo le preguntara , ¿Cuántos muebles hay en la foto? ¿2?, ¿3? ,¿4? . Ahora bien cambiemos la pregunta ¿Cuántos equipos electrónicos hay en la foto? Y lo mismo si le pregunto ¿Cuántos elementos que no son ni muebles ni aparatos electrónicos en la foto? Aquí lo interesante es saber como es que usted pudo identificar lo que era un mueble, un aparato electrónico o simplemente algo que no era ninguna de las cosas anteriores. Su cerebro de una forma natural y automática sin que usted se de cuenta hizo una clasificación de los artículos que se muestran en la fotográfica en medida de sus características
PROGRAMACION ORIENTADA A OBJETOS Clases y OBJETOS La palabra Clase viene de una traducción directa del vocablo en ingles “ Class ” pero realmente se enfoca y se debe de entender como Clasificación. Entonces las clases son clasificaciones, Ahora bien, ¿Que es lo que se clasifica ? La respuesta es simple, una clasificación o clase sirve para clasificar OBJETOS. Cuando yo le pedí que viera la imagen e identificara todos los muebles su cerebro de forma automática clasifico todos los objetos que cumplen con las características de ser un mueble.
PROGRAMACION ORIENTADA A OBJETOS Clases y OBJETOS En la programación orientada a objetos sucede exactamente lo mismo, creamos “clases” o clasificamos objetos . Entendiendo este primer concepto es primordial para entender el segundo grupo de conceptos de la POO: Atributos Métodos
PROGRAMACION ORIENTADA A OBJETOS ATRIBUTOS Ahora bien, ya quedamos que nuestra mente clasifica objetos, pero ¿Cómo sabe que un objeto es un mueble y no un aparato eléctrico?¿Como es que lo clasifica correctamente? Bien, la respuesta es simple; de la misma forma automática que nuestro cerebro clasifica hace una rápida revisión de las características de ese objeto, lo analiza y ve ¿esta tapizado? Tiene la forma de un mueble? Tiene patas? Tiene una superficie de madera? ¿Es acojinado? Todo esto el cerebro lo opera a una velocidad impresionante de tal forma que cuando nos llega la información a nuestro consiente lo damos en automático y sabemos que algo es un mueble por sus características físicas. Lo mismo con un objeto si vemos que es de metal, plástico , tiene un cable tiene luces , decimos tiene las características de un objeto electrónico. Es decir Hemos clasificado un objeto en su categoría correcta por sus atributos
PROGRAMACION ORIENTADA A OBJETOS METODOS Si bien ya tenemos la clasificación de un objeto por sus características otra cosa que usa nuestro cerebro de forma implícita para dar la correcta categoría a un objeto es lo que se puede hacer o para que sirve ese objeto , es decir, que acciones se pueden hacer con el ¿ Es para sentarse? ¿Es para poner cosas encima? ¿Se enciende? ¿ Se apaga? Todo esto termina por darle la perfecta clasificación a un objeto. Si veo un objeto , esta tapizado, esta acolchado y sirve para sentarse seguramente es un mueble. Si veo algo cuadrado, de plástico con leds, tiene un cable de corriente y además puedo prenderlo y apagarlo entonces seguramente es un aparato electrónico. Lo que puedo hacer con el objeto o lo que puede hacer son los métodos que tiene un objeto para funcionar como dicho objeto.
PROGRAMACION ORIENTADA A OBJETOS RESUMEN Entonces a forma de resumen tenemos lo siguiente: Una Clase es una clasificación de Objetos según sus atributos (características) y sus comportamientos o lo que se puede hacer con el objeto ( métodos ) Antes de ver otros conceptos de la POO vamos a aterrizar como es que Java usa estos conceptos (clase, objeto, atributos y métodos) en código y como se usan
PROGRAMACION ORIENTADA A OBJETOS DECLARACION DE UNA CLASE La clase como ya se dijo es la parte principal de Java. Todo gira alrededor de ellas. Entonces lo primero que debemos de hacer es aprender a crear una clase o “clasificación” de objetos Para declarar una clase lo hacemos como en el ejemplo. Utilizamos la palabra public la cual podría ser cambiada por protected o private o inclusive no llevarla pero eso lo veremos mas adelante. Cada una de estas palabras son indicadores de quien puede ver o usar la clase pero para este ejemplo lo pondremos publico es decir cualquiera puede ver o usar la clase. Luego sigue la palabra reservada class . Dicha palabra debe ser escrita tal cual en minúsculas. Como dijimos class quiere decir “Clase” o “Clasificación”. Luego le sigue el nombre que le pondremos a dicha clase o clasificación seguido de llaves que contendrán toda la implementación y código de nuestra clase. Esta es la forma de declaración mas simple que podremos hacer de una clase public class Television{ ... ... .... }
PROGRAMACION ORIENTADA A OBJETOS DECLARACION DE un objeto Como podrá ver en el ejemplo estamos declarando una clasificación para objetos que cumplan las características y tengan los comportamientos de una televisión. Es decir no podríamos meter un libro por que evidentemente es algo muy diferente y no lo podríamos clasificar como televisiones. Cuando declaramos una clase tenemos que crear algo que se llama CONSTRUCTOR. El constructor no es nada mas que una función que lo que hace es entregar el objeto de la clasificación es decir, si la clasificación es de televisiones entonces tenemos que dicho constructor es el que nos da un televisor. Para ponerlo de cierta forma. Imagine que tiene una bolsa llena de televisores. La bolsa es la clase. Cuando usted quiere un objeto televisor, la mano que se mete en la bolsa para coger un televisor y dárselo es el constructor. Existen 2 reglas principales para el constructor. Debe de llamarse igual que la clase Siempre debe de ser publica. Es decir siempre debe de llevar la palabra public public class Television{ public Television(){ } }
PROGRAMACION ORIENTADA A OBJETOS Uso de una clase Una vez que tenemos la declaración de la clase y su constructor podemos usarla. En este caso se hace un llamado a la clase por medio del constructor con la palabra “ new”. Lo que hace esta palabra es crear un objeto de la clase. En el argot de la POO a esto se le llama generar una Instancia o instanciar una clase El uso de new o la instancia de una clase se hace desde otro archivo que puede ser otra clase o bien la clase principal del programa . Cuando creamos un objeto o lo llamamos de la clase lo tenemos que almacenar en una variable que tiene que ser del mismo tipo del objeto en cuestión. Televisión() como se muestra en el ejemplo es el constructor que tenemos declarado dentro de la clase Televisión de esta forma T es una variable que contiene un Televisor public class Television{ public Television(){ } } Television T = new Television()
PROGRAMACION ORIENTADA A OBJETOS Métodos y atributos Los atributos de una clase como ya dijimos son las características de un objeto, entonces estas dentro de la declarativa de una clase son VARIABLES que describen ciertas características de un objeto ¿ Cuantas características podemos poner? Las que deseemos esto se llama NIVEL DE GRANULARIDAD. Es decir las características que nosotros consideremos necesarias para establecer al objeto. Un televisor puede tener muchas características. Para el ejemplo vamos a tomar tan solo 3 de las miles que pueden existir en este caso serán: Marca, Tamaño y si es SmartTV o no. Es común que a los atributos les pongamos valores default en caso de no requerir alguna característica en especifico. Tambien les ponemos para este ejemplo que sean publicas aunque lo común es que no lo sean Esto sería representado de la siguiente forma en el ejemplo public class Television{ public String marca =“ x”; public int tamaño =20; public boolean SmartTV =false; public Television(){ } }
PROGRAMACION ORIENTADA A OBJETOS Métodos y atributos Para los métodos también podemos establecer las funciones que tiene una tele. En este caso un televisor hacemos lo mismo que con los atributos nosotros establecemos que funcionalidades plasman para lo que nosotros es un televisor en nuestra clase, por ejemplo un televisor puede encenderse o bien apagarse, también puede si es SmartTV conectarse a internet o sintonizar canales En este caso tenemos 3 posibles métodos que podemos declarar. En Java los métodos son FUNCIONES. En el argot de la POO se les llama métodos. Entonces nuestra clase quedaría de la siguiente forma implementando 3 acciones: Encendido, Apagado y sintonizar canales. Los métodos en este ejemplo los vamos a poner como públicos para que cualquier clase pueda usarlos. La forma de escribir un método es la siguiente: modificador_deAcceso Valor_de_Retorno Nombre_Metodo (parámetros si lo lleva) { Funcionanamiento } public class Television{ public String marca =“ x”; public int tamaño =20; public boolean SmartTV =false; public Television(){} public string encendido(){} public string apagado(){} public string sintonizarCanales(){} }
PROGRAMACION ORIENTADA A OBJETOS Métodos y atributos La implementación o lo que va hacer cada función va de acuerdo a lo que nosotros queramos, en este caso y para este ejemplo solo vamos a querer que los métodos nos digan cual es la acción que esta haciendo el televisor. Observe que los 3 métodos o acciones devuelven un void . Esto quiere decir que los métodos no van a devolver algo si no mas bien van a ejecutar, en este caso un mensaje. La implementación de los métodos quedaría de la siguiente forma public class Television{ p ublic String marca =“ x”; public int tamaño =20; public boolean SmartTV =false; public Television(){} public string encendido(){ System.out.println(“La tele se ha encendido”); } public string apagado(){ System.out.println(“La tele se ha apagado”); } public string sintonizarCanales(){ System.out.println (“La tele esta sintonizando”); } }
PROGRAMACION ORIENTADA A OBJETOS Pidiendo una tele personalizada Hasta este momento, tenemos lista nuestra clase. Esta clase clasifica objetos de tipo televisor el cual tiene marca, un tamaño y puede o no ser smartTV y además se comporta como una tele es decir, se prende, se apaga y sintoniza canales. Digamos que si le pedimos la clase una tele nos va a dar eso una televisión. Pero ¿ Que pasa si quiero una televisión marca Sony de 40 pulgadas y que sea SmartTv ? En el mundo real las televisiones son muy variadas. Entonces ¿ Como hacemos esto? Actualmente solo tenemos un constructor el cual nos da una tele por decirlo “genérica” Para que una clase nos de un televisor con las características que queremos tendremos que crear otro constructor. A esta acción se le llama SOBRECARGA DE CONSTRUCTORES. Esta característica es que una clase pueda tener mas de un constructor en el cual podemos solicitar como queremos que se construya el objeto. Es casi casi como una personalización. En el ejemplo vamos a crear un constructor que nos permita pedir la marca, el tamaño y si queremos que sea smarTV . public class Television{ public String marca; public int tamaño; public boolean SmartTV; public Television(){} public Television(string M, int T, boolean S){ } public void encendido(){ System.out.println(“La tele se ha encendido”); } public void apagado(){ System.out.println(“La tele se ha apagado”); } public void sintonizarCanales(){ System.out.println (“La tele esta sintonizando”); } }
PROGRAMACION ORIENTADA A OBJETOS Pidiendo una tele personalizada Ahora debemos de preparar el nuevo constructor para que pueda recibir los parámetros que nosotros le indiquemos y así construirnos la tele que queremos. Para ello pasamos los valores a través del constructor y se los asignamos a los atributos de la clase El constructor que no recibe parámetros simplemente tomara los valores que tenga por default los atributos. Así que podemos ya trabajar y hacer las validaciones que necesitemos. De igual forma le agregaremos una funcionalidad al constructor default que nos despliegue los valores que vienen en la clase De esta forma ya tenemos lista nuestra clase para ser utilizada. Ahora solo falta compilar el archivo para que nos genere el archivo . class public class Television{ public String marca =“ x”; public int tamaño =20; public boolean SmartTV =false; public Television(){ System.out.println(“Usted a pedido una tele marca”+marca+” de “ +tamaño + “pulgadas y sin funcionalidad y no SmartTV”); } public Television(string M, int T, boolean S){ marca= M; tamaño = T; SmartTV =S; if(SmartTV==true){ System.out.println(“Usted a pedido una tele marca”+marca+” de “ +T + “pulgadas y SmartTV”); }else{ System.out.println(“Usted a pedido una tele marca”+marca+” de “ +T + “pulgadas y sin funcionalidad SmartTV”); } } public void encendido(){ System.out.println(“La tele se ha encendido”); } public void apagado(){ System.out.println(“La tele se ha apagado”); } public void sintonizarCanales(){ System.out.println(“La tele esta sintonizando”); } }
PROGRAMACION ORIENTADA A OBJETOS USANDO NUESTRA CLASE Lo que debemos hacer es ahora construir la clase principal del programa que invocara a la clase Television y nos dará los televisores que querramos y necesitemos esta clase NO LLEVA CONSTRUCTORES ya que es solo de ejecucion . Esta clase debe de tener el método principal o Main que ya hemos mencionado en módulos anteriores Su sintaxis es la siguiente: public static void main ( String [] args ){ ….. } public class Main{ public static void main ( String [] args ){ } }
PROGRAMACION ORIENTADA A OBJETOS USANDO NUESTRA CLASE Una vez creado el método principal ahora invocamos o instanciamos nuestro objeto Television . Para poder acceder a las acciones lo hacemos a través del punto “ . ” , de esta forma podremos obtener la información de la televisión En el ejemplo crearemos una televisión genérica y una con las características que nosotros le indiquemos En el fragmento de código a continuación crearemos una tele genérica, es decir con los valores default que trae la clase public class Main{ public static void main ( String [] args ){ Television generica = new Television (); generica.encendido (); generica.apagado (); generica . sintonizarCanales (); } }
PROGRAMACION ORIENTADA A OBJETOS USANDO NUESTRA CLASE Ahora crearemos la tele a nuestro gusto, es decir le daremos una marca , un tamaño y la haremos SmartTV Como se menciono tendremos que invocar al constructor que esta preparado para recibir dichos parámetros. También usaremos los métodos de la televisión ya que son los mismos, no importa que sea una tele genérica o una de marca , al final del camino siguen siendo televisiones y tienen el mismo comportamiento public class Main{ public static void main ( String [] args ){ Television generica = new Television (); generica.encendido (); generica.apagado (); generica . sintonizarCanales (); Television TvPersonalizada = new Television (“Sony”,40,true); TvPersonalizada .encendido (); TvPersonalizada .apagado (); TvPersonalizada . sintonizarCanales (); } }
PROGRAMACION ORIENTADA A OBJETOS USANDO NUESTRA CLASE La salida del programa seria algo como esto observe que el primer televisor creado imprime los valores de características default de la clase Mientras que la televisión personalizada imprime la marca , medida y funcionalidad que nosotros queríamos. Lo que si es que no importa si es una televisión genérica o personalizada, ambas son televisiones y ambas tienen los mismos comportamientos propios de un televisor por eso ambas se pueden apagar, prender y también sintonizar
PROGRAMACION ORIENTADA A OBJETOS HERENCIA Una vez entendida como funcionan las clases ahora entraremos a otro concepto: la herencia Cuando hablamos de herencia en programación no nos referimos precisamente a que algún familiar lejano nos ha podido dejar una fortuna, ya nos gustaría. En realidad se trata de uno de los pilares fundamentales de la programación orientada a objetos. Es el mecanismo por el cual una clase permite heredar las características (atributos y métodos) de otra clase.
PROGRAMACION ORIENTADA A OBJETOS HERENCIA La herencia permite que se puedan definir nuevas clases basadas de unas ya existentes a fin de reutilizar el código, generando así una jerarquía de clases dentro de una aplicación. Si una clase deriva de otra, esta hereda sus atributos y métodos y puede añadir nuevos atributos, métodos o redefinir los heredados . No hay nada mejor en programación que poder usar el mismo código una y otra vez para hacer nuestro desarrollo más rápido y eficiente. El concepto de herencia ofrece mucho juego. Gracias a esto, lograremos un código mucho más limpio , estructurado y con menos líneas de código, lo que lo hace más legible.
PROGRAMACION ORIENTADA A OBJETOS HERENCIA En Java tenemos que tener claro cómo llamar a la clase principal de la que heredamos y aquella que hereda de ella, así, clase que se hereda se denomina superclase. La clase que hereda se llama subclase. Por lo tanto, una subclase es una versión especializada de una superclase. Hereda todas las variables y métodos definidos por la superclase y agrega sus propios elementos únicos . Por ejemplo una persona tiene rasgos únicos si esta persona tiene hijos estos “heredaran” rasgos y características de su papa pero sin embargo tendrán los propios
PROGRAMACION ORIENTADA A OBJETOS HERENCIA Terminología importante: Superclase : la clase cuyas características se heredan se conoce como superclase (o una clase base o una clase principal). Subclase : la clase que hereda la otra clase se conoce como subclase (o una clase derivada, clase extendida o clase hija). La subclase puede agregar sus propios campos y métodos, además de los campos y métodos de la superclase. Reutilización : la herencia respalda el concepto de “reutilización”, es decir, cuando queremos crear una clase nueva y ya hay una clase que incluye parte del código que queremos, podemos derivar nuestra nueva clase de la clase existente. Al hacer esto, estamos reutilizando los campos/atributos y métodos de la clase existente.
PROGRAMACION ORIENTADA A OBJETOS Declara una jerarquía de herencia En java, cada clase solo puede derivarse de otra clase. Esa clase se llama superclase, o clase padre. La clase derivada se llama subclase o clase secundaria. Utiliza la palabra clave extends para identificar la clase que extiende su subclase. Si no declara una superclase, su clase amplía implícitamente la clase object . El objeto o clase object es la raíz de todas las jerarquías de herencia; es la única clase en java que no se extiende de otra clase.
PROGRAMACION ORIENTADA A OBJETOS Ejemplo de uso de herencia Para entender el concepto mejor, crearemos una superclase llamada DosDimensiones , que almacena el ancho y la altura de un objeto bidimensional, y una subclase llamada Triángulo que usaremos la palabra clave extends para crear esa subclase. public class DosDimensiones{ double base; double altura; public void mostrarDimension(){ System.out.println(" La base y altura es: "+base +“ y "+altura); } }
PROGRAMACION ORIENTADA A OBJETOS Ejemplo de uso de herencia //Clase principal public class Lados3{ public static void main(String[] args) { Triangulo t1=new Triangulo(); Triangulo t2=new Triangulo(); t1.base=4.0; t1.altura=4.0; t1.estilo="Estilo 1"; t2.base=8.0; t2.altura=12.0; t2.estilo="Estilo 2"; System.out.println(" Información para T1: "); t1.mostrarEstilo(); t1.mostrarDimension (); System.out.println("Su área es : "+t1.area()); System.out.println(); System.out.println(" Información para T2: "); t2.mostrarEstilo(); t2.mostrarDimension(); System.out.println("Su área es : "+t2.area()); } } //Una subclase de DosDimensiones para Triangulo public class Triangulo extends DosDimensiones{ public String estilo; public double area(){ return base*altura/2; } public void mostrarEstilo(){ System.out.println ("Triangulo es: "+estilo); } }
PROGRAMACION ORIENTADA A OBJETOS Ejemplo de uso de herencia En el programa anterior, cuando se crea un objeto de clase Triangulo, una copia de todos los métodos y campos de la superclase adquiere memoria en este objeto. Es por eso que, al usar el objeto de la subclase, también podemos acceder a los miembros de una superclase
PROGRAMACION ORIENTADA A OBJETOS herencia y modificadores de acceso Los modificadores de acceso definen qué clases pueden acceder a un atributo o método. esto podría servir por ejemplo para ser usados para proteger la información o mejor dicho definir cómo nuestro programa accede a ella. Es decir, los modificadores de acceso afectan a las entidades y los atributos a los que puede acceder dentro de una jerarquía de herencia. Aunque así de pronto esto pueda parecer complejo lo mejor, para entenderlo, es resumir sus características en una descripción general rápida de los diferentes modificadores:
PROGRAMACION ORIENTADA A OBJETOS herencia y modificadores de acceso Los modificadores de acceso son : Private : Solo se puede acceder a los atributos o métodos privados dentro de la misma clase . (Sin modificador) Se puede acceder a los atributos y métodos sin un modificador de acceso dentro de la misma clase, y por todas las demás clases dentro del mismo paquete . Protected : Se puede acceder a los atributos o métodos protegidos dentro de la misma clase, por todas las clases dentro del mismo paquete y por todas las subclases . Public : Todas las clases pueden acceder a los atributos y métodos públicos.
PROGRAMACION ORIENTADA A OBJETOS herencia y modificadores de acceso Como puede ver en esta lista, una subclase puede acceder a todos los atributos y métodos públicos y protegidos de la superclase. Siempre que la subclase y la superclase pertenecen al mismo paquete, la subclase también puede acceder a todos los atributos y métodos privados del paquete de la superclase. La siguiente tabla muestra el acceso a los miembros permitido por cada modificador:
PROGRAMACION ORIENTADA A OBJETOS herencia y modificadores de acceso En general se aconseja declarar todos los atributos como private , y cuando necesitemos consultar su valor o modificarlo, utilicemos los métodos get y set . Además en caso de que el tipo de valor devuelto por el método sea un boolean , se utilizará is en vez de get . Este principo se conoce como ENCAPSULAMIENTO . EL encapsulamiento es un principio del lenguaje Java cuya filosofía es hacer que los atributos de las clases se puedan editar sólo a través de métodos. De manera general, se hace teniendo las propiedades como privadas y métodos que la controlan públicos. Comúnmente, se crean un grupo de métodos llamados getters (se encargan de obtener el valor de la propiedad) y setters (se encargan de setearla ). En el ejemplo vera que usamos la palabra this . Esta se usa para hacer referencia a los atributos declarados dentro de la misma clase si una variable de un método se llama igual aun atributo de la clase, al hacer this.variable hacemos referencia al atributo de la clase. private String nombre; private boolean casado; //Metodos get y set para estos atributos public void setNombre(String nombre) { this.nombre = nombre; } public void setCasado(boolean casado) { this.casado = casado; } public String getNombre() { return nombre; } public boolean isCasado() { return casado; }
PROGRAMACION ORIENTADA A OBJETOS TIPOS DE HERENCIA Java, como la mayoría de lenguajes de programación modernos, dispone de diferentes tipos de herencia que podemos usar para hacer todavía más eficiente nuestro programa al añadir características o atributos procedentes de diferentes clases. Lo que sí debemos tener en cuenta es que solo puede existir una superclase, como veremos en los siguientes tipos de herencia
PROGRAMACION ORIENTADA A OBJETOS TIPOS DE HERENCIA Herencia única: donde las subclases heredan las características de solo una superclase.
PROGRAMACION ORIENTADA A OBJETOS TIPOS DE HERENCIA Herencia Multinivel: una clase derivada heredará una clase base y, además, la clase derivada también actuará como la clase base de otra clase.
PROGRAMACION ORIENTADA A OBJETOS TIPOS DE HERENCIA Herencia Jerárquica: una clase sirve como una superclase (clase base) para más de una subclase.
PROGRAMACION ORIENTADA A OBJETOS TIPOS DE HERENCIA Herencia Múltiple (a través de interfaces): una clase puede tener más de una superclase y heredar características de todas las clases principales. Pero Java no admite herencia múltiple con clases, así que para lograrlo tenemos que usar Interfaces.
PROGRAMACION ORIENTADA A OBJETOS TIPOS DE HERENCIA Herencia Híbrida (a través de Interfaces): Es una mezcla de dos o más tipos de herencia anteriores. Como Java no admite herencia múltiple con clases, la herencia híbrida tampoco es posible con clases, pero como en el ejemplo anterior, podemos lograr el mismo resultado a través de Interfaces.
PROGRAMACION ORIENTADA A OBJETOS polimorfismo En programación orientada a objetos, polimorfismo es la capacidad que tienen los objetos de una clase en ofrecer respuesta distinta e independiente en función de los parámetros (diferentes implementaciones) utilizados durante su invocación . Dicho de otro modo el objeto como entidad puede contener valores de diferentes tipos durante la ejecución del programa. En java el término polimorfismo también suele definirse como ‘sobrecarga de parámetros ’, que así de pronto no suena tan divertido pero como veremos más adelante induce a cierta confusión. En realidad suele confundirse con el tipo de poliformismo más común, pero no es del todo exacto usar esta denominación.
PROGRAMACION ORIENTADA A OBJETOS ejemplo de polimorfismo Un ejemplo clásico de poliformismo es el siguiente. Podemos crear dos clases distintas: Gato y Perro, que heredan de la superclase Animal . La clase Animal tiene el método abstracto hacerSonido () que se implementa de forma distinta en cada una de las subclases (gatos y perros suenan de forma distinta). Entonces, un tercer objeto puede enviar el mensaje de hacer sonido a un grupo de objetos Gato y Perro por medio de una variable de referencia de clase Animal, haciendo así un uso polimórfico de dichos objetos respecto del mensaje mover.
PROGRAMACION ORIENTADA A OBJETOS ejemplo de polimorfismo Un ejemplo clásico de poliformismo es el siguiente. Podemos crear dos clases distintas: Gato y Perro, que heredan de la superclase Animal . La clase Animal tiene el método abstracto hacerSonido () que se implementa de forma distinta en cada una de las subclases (gatos y perros suenan de forma distinta). Entonces, un tercer objeto puede enviar el mensaje de hacer sonido a un grupo de objetos Gato y Perro por medio de una variable de referencia de clase Animal, haciendo así un uso polimórfico de dichos objetos respecto del mensaje mover. class Animal { public void hacerSonido() { System.out.println (“Grrr..."); } } class Gato extends Animal { public void hacerSonido () { System.out.println (“Miau"); } } class Perro extends Animal { public void hacerSonido () { System.out.println (“Gau"); } }
PROGRAMACION ORIENTADA A OBJETOS ejemplo de polimorfismo Como todos los objetos Gato y Perro son objetos Animales, podemos hacer lo siguiente; Creamos dos variables de referencia de tipo Animal y las apuntamos a los objetos Gato y Perro. Ahora, podemos llamar a los métodos hacerSonido (). public class Main { public static void main(String[ ] args) { Animal a = new Perro(); Animal b = new Gato(); a . hacerSonido(); //Salida“Gau" b.hacerSonido(); //Salida“Miau" } }
PROGRAMACION ORIENTADA A OBJETOS ejemplo de polimorfismo Como se mencionaba el polimorfismo, que se refiere a la idea de "tener muchas formas", ocurre cuando hay una jerarquía de clases relacionadas entre sí a través de la herencia y este es un buen ejemplo. Por lo general diremos que existen 3 tipos de polimorfismo: Sobrecarga : El más conocido y se aplica cuando existen funciones con el mismo nombre en clases que son completamente independientes una de la otra . Paramétrico : Existen funciones con el mismo nombre pero se usan diferentes parámetros (nombre o tipo). Se selecciona el método dependiendo del tipo de datos que se envíe . Inclusión : Es cuando se puede llamar a un método sin tener que conocer su tipo, así no se toma en cuenta los detalles de las clases especializadas, utilizando una interfaz común.
PROGRAMACION ORIENTADA A OBJETOS DIFERENCIAS ENTRE POLIMORFISMO Y SOBRECARGA El polimorfismo presenta unas claras ventajas aplicado desde las interfaces las cuales veremos mas adelante, ya que nos permite crear nuevos tipos sin necesidad de modificar las clases ya existentes. Basta con recompilar todo el código que incluye los nuevos tipos añadidos sin retocar la clase anteriormente creada para añadir una nueva implementación lo que podría suponer una revisión completa de todo el código donde se instancia la clase. Por contra, un método está sobrecargado si dentro de una clase existen dos o más declaraciones de dicho método con el mismo nombre pero con parámetros distintos, por lo que no hay que confundirlo con polimorfismo.
PROGRAMACION ORIENTADA A OBJETOS DIFERENCIAS ENTRE POLIMORFISMO Y SOBRECARGA Esto puede parecer un poco confuso pero en definitiva el Polimorfismo consiste en redefinir un método de una clase padre en una clase hija. Mientras que sobrecarga es definir un nuevo método igual que otro viejo, pero cambiando el tipo o la cantidad de parámetros. El compilador, viendo los parámetros, sabe a qué método llamar en función del parámetro que estás pasando. La sobrecarga se resuelve en tiempo de compilación utilizando los nombres de los métodos y los tipos de sus parámetros; el polimorfismo se resuelve en tiempo de ejecución del programa, esto es, mientras se ejecuta, en función de la clase a la que pertenece el objeto.
PROGRAMACION ORIENTADA A OBJETOS CLASES ABSTRACTAS E INTERFACES Cuando hablamos de programación en lenguajes de alto nivel se suele decir que todo tiene similitud con la vida real. Dicho de otro modo, si algo se puede imaginar es que podemos programarlo. Aunque lo cierto es que habría que matizar que esto es más bien es un tira y afloja entre dos realidades. Por un lado tenemos lo que conocemos como real y por otra la parte lógica y más abstracta que viene siendo nuestra interpretación de cómo deben funcionar las cosas.
PROGRAMACION ORIENTADA A OBJETOS CLASES ABSTRACTAS Así cuando programamos en JAVA tarde o temprano necesitaremos trabajar con clases abstractas. Qué son y para que las usamos es algo que veremos en este artículo y ya adelanto que no es un concepto especialmente difícil de entender pues si ya entendemos los fundamentos básicos de la programación orientada a objetos como herencia y poliformismo no costará entender éste. Podemos pensar en las clases abstractas como una anotación y en cierto modo como si de una lista de la compra se tratase. En la vida real solemos hacer breves anotaciones de tareas pendientes sin entrar en descripciones detalladas o en cómo realizar cada una de ellas. Se trata de no olvidarnos de nada y evitar hacer borrón y cuenta nueva o volver sobre nuestros pasos más adelante organizando nuestro tiempo.
PROGRAMACION ORIENTADA A OBJETOS CLASES ABSTRACTAS Así en programación las clases abstractas funcionan como una clase que declara la existencia de métodos pero no su implementación . Eso es algo que haremos después en las diferentes subclases derivadas de la clase abstracta. Una clase abstracta puede contener métodos no abstractos pero al menos uno de los métodos sí debe serlo. Para verlo más claro lo mejor es fijarnos en el siguiente código public abstract class Producto { private int precio; public Producto(int precio) { this.precio = precio; } public int getPrecio(){ return this.precio; } public abstract void getNombre(); } public class Platano extends Producto{ public Platano (){ super(200); } @Override public String getNombre(){ return “Platano"; } }
PROGRAMACION ORIENTADA A OBJETOS interfaces Las Interfaces son unas clases completamente abstractas que contiene sólo una colección de métodos abstractos y propiedades constantes . Al igual que en las clases abstractas en un Interface se especifica qué se debe hacer pero no su implementación. Serán las clases que implementen estas interfaces las que describen las acciones que puede llevar a cabo un determinado objeto . Es posible que nos preguntemos, ¿Eso no eran los métodos que se definen en una clase abstracta hablamos antes? Casi, en una clase abstracta además de aparecer los métodos aparecía el código para dichos métodos, en cambio en un interfaz sólo existe el prototipo de una función, no su código.
PROGRAMACION ORIENTADA A OBJETOS especificaciones de interfaces Algunas especificaciones para interfaces: Lo definimos utilizando la palabra clave de la interface ( interface ). Puede contener solo variables estáticas . No puede contener un constructor porque las interfaces no pueden ser instanciadas . Las interfaces pueden extender otras interfaces . Una clase puede implementar cualquier número de interfaces.
PROGRAMACION ORIENTADA A OBJETOS ejemplo de interfaces Las interfaces tienen las siguientes propiedades: Una interfaz es implícitamente abstracta. No es necesario utilizar la palabra clave abstracta al declarar una interfaz . Cada método en una interfaz también es implícitamente abstracto, por lo que la palabra clave abstracta no es necesaria . Los métodos en una interfaz son implícitamente públicos . Una clase puede heredar de una sola superclase, ¡pero puede implementar múltiples interfaces! public interface Animal { public void comer(); public void hacerSonido(); } class Gato implements Animal { public void hacerSonido() { System.out.println (“Miau"); } public void comer() { System.out.println (“ÑamÑam"); } }
PROGRAMACION ORIENTADA A OBJETOS DIFERENCIAS ENTRE CLASE ABSTRACTA E INTERFACES Desde que java 8 introdujo las implementaciones por defecto en las interfaces, la diferencia a la hora de usarlas se ha diluido mucho, pero principalmente es conceptual. Cuando una clase hereda de otra clase (abstracta o no), estás definiendo qué es, pasar de una idea abstracta a una concreción. Además, estás definiendo una relación entre clases pero cuando implementas una interfaz, estás definiendo cómo se comporta. Es algo como definir y cumplir un contrato. Quizá lo mejor, ya a modo conclusión, es ver las clases abstractas e interfaces frente a frente en una tabla comparativa.
PROGRAMACION ORIENTADA A OBJETOS DIFERENCIAS ENTRE CLASE ABSTRACTA E INTERFACES Clase Abstracta Interfaz La palabra clave abstract se usa para crear una clase abstracta y se puede usar con métodos. La palabra clave de interface se usa para crear una interfaz, pero no se puede usar con métodos. Una clase puede extender solo una clase abstracta. Una clase puede implementar más de una interfaz. Las variables no son definitivas por defecto. Puede contener variables no finales. Las variables son finales por defecto en una interfaz. Una clase abstracta puede proporcionar la implementación de una interfaz. Una interfaz no puede proporcionar la implementación de una clase abstracta. Puede tener métodos con implementaciones. Proporciona una abstracción absoluta y no puede tener implementaciones de métodos. Puede tener modificadores de acceso públicos, privados, estáticos y protegidos. Los métodos son implícitamente públicos y abstractos en la interfaz de Java. No admite herencias múltiples. Es compatible con herencias múltiples. Es ideal para la reutilización del código y la perspectiva de la evolución. Es ideal para la declaración de tipo.
LABORATORIO 3 CREACIÓN DE CLASES , CLASES ABSTRACTAS , INTERFACES E IMPLEMENTACION DE HERENCIA INSTRUCIONES : Abrir el archivo Laboratorio 3 y seguir las instrucciones DESCRIPCION : El participante creara varios programas usando clases, clases abstractas, interfaces y herencia REQUISITOS : Tener instalado el JDK de Java y tenerlo correctamente configurado