1. Definir los conceptos básicos relacionados con herencia en la programación orientada a objetos, basándose en investigación previa y discusión en clase. 2. Identificar las superclases y subclases de problemas resueltos mediante el uso de herencia en programación orientada a objetos. 3. Resolver problemas haciendo uso de herencia para desarrollar programas orientados a objetos. 4. Definir los conceptos básicos relacionados con polimorfismo en la programación orientada a objetos basándose en la investigación previa y discusión en clase. Es una propiedad que permite que los objetos sean creados a partir de otros ya existentes, obteniendo características (métodos y atributos) similares a los ya existentes. • Se realiza tomando una clase existente y derivando nuevas clases de ella. La clase derivada hereda las estructuras de datos y funciones de la clase original, además se pueden añadir nuevos miembros a las clases derivadas y los miembros heredados pueden ser modificados. • Es un modelo de herencia común utilizado por lenguajes de programación basada en prototipos. Funciona sobre el principio de que la mayoría de los objetos derivan de otros, objetos más generales, y sólo se diferencian en una pequeña cantidad de aspectos menores; mientras que normalmente mantienen una lista interna de punteros a los objetos de los que provienen.clases derivadas y los miembros heredados pueden ser modificados. Hace referencia a una característica de los lenguajes de programación orientada a objetos en la que una clase puede heredar comportamientos y características de más de una superclase. Esto contrasta con la herencia simple, donde una clase sólo puede heredar de una superclase. Como permitir a una clase llamada MusicoEstudiante heredar de una clase llamada Persona, una clase llamada Músico, y una clase llamada Trabajador. Esto puede ser abreviado como MusicoEstudiante: Persona, Músico, Trabajador. Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. La implementación de una clase comprende dos componentes: la declaración y el cuerpo de la clase. class NombredeClase{ …………………… } class Ticket { Float precio; String destino; Date fechaSalida; void firma(Float dePrecio, String deDestino, Date deFecha) { precio = dePrecio; destino = deDestino; fechaSalida = deFecha; } } El término superclase se refiere a la clase que es el ancestro más directo, así como a todas las clases ascendentes. class NombredeClase extends NombredeSuperClase{ ... } Una subclase es una clase que desciende de otra clase. Una subclase hereda el estado y el comportamiento de todos sus ancestros. class SubClase extends SuperClase{ ... } Regla: “Una subclase hereda todas las variables miembros de su superclase que puedan ser accesibles desde la subclase (a menos que la variable miembro esté oculta en la subclase)” Esto quiere decir lo siguiente: Heredan aquellas variables miembros declaradas como public o protected. Heredan aquellas variables miembros declaradas sin especificador de acceso (normalmente conocidas como "Amigas") siempre que la subclase esté en el mismo paquete que la clase. ¨No hereda las variables miembros de la superclase si la subclase declara una variable miembro que utiliza el mismo nombre. La variable miembro de la subclase se dice que oculta a la variable miembro de la superclase. No hereda las variables miembro private. Regla: “Una subclase hereda todos los métodos de sus superclase que son accesibles para la subclase (a menos que el método sea sobre escrito por la subclase)” Esto quiere decir lo siguiente: Hereda aquellos métodos declarados como public o protected. Hereda aquellos métodos sin especificador de acceso, siempre que la subclase esté en el mismo paquete que la clase. No hereda un método de la superclase si la subclase declara un método que utiliza el mismo nombre. Se dice que el método de la subclase sobrescribe al método de la superclase. No hereda los métodos private. La habilidad de una subclase para sobrescribir un método de su superclase permite a una clase heredar de su superclase aquellos comportamientos "más cercanos" y luego suplementar o modificar el comportamiento de la superclase. Una subclase no puede sobrescribir métodos que hayan sido declarados como final en la superclase (por definición, los métodos finales no pueden ser sobrescritos). Si intentamos sobrescribir un método final, el compilador mostrará un mensaje de error y no compilará el programa. Una subclase tampoco puede sobrescribir métodos que se hayan declarado como static en la superclase. En otras palabras, una subclase no puede sobrescribir un método de clase. Las subclases deben sobrescribir aquellos métodos que hayan sido declarados como abstract en la superclase, o la propia subclase debe ser abstracta. Escribir Clases y Métodos Abstractos explica con más detalle los métodos y clases abstractos. Se puede declarar que una clase sea final; esto es, que la clase no pueda tener subclases. Existen dos razones por las que se querría hacer esto: Un mecanismo que los hackers utilizan para atacar sistemas es crear subclases de una clase y luego sustituirla por el original. Se podría pensar que una clase es "perfecta“, es decir, la clase no debería tener subclases Es la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación. El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o propiedades denominados de forma idéntica. Buscar un ejemplo mejor Es aquél en el que el código no incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible Es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explícitos y declarados uno por uno antes de poder ser utilizados Java permite que varios métodos dentro de una clase se llamen igual, siempre y cuando su lista de parámetros sea distinta. /** Por ejemplo, si tuviéramos un método que sirviera para sumar números pero sin indicar de qué tipo:*/ public class Sumar { public float suma(float a, float b){ System.out.println("Estoy sumando reales"); return a+b; } public int suma(int a, int b){ System.out.println("Estoy sumando enteros"); return a+b; } … es un método declarado en una clase para el cual esa clase no proporciona la implementación (el código). Los métodos abstractos son útiles cuando se quiere que cada implementación de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los métodos abstractos. Los interfaces proporcionan un mecanismo para abstraer los métodos a un nivel superior, lo que permite simular la herencia múltiple de otros lenguajes. … public class Mamifero {public class Perro extends Mamifero { private int patas; public Perro(String nombre){ private String nombre; super(nombre, 4); } public void imprimirPatas() {} public class Gato extends Mamifero{ System.out.println(nombre + " tiene " + patas + public Gato(String nombre){ " patas"); } super(nombre, 4); } public Mamifero(String nombre, int patas) {} public class CreaPerro this.nombre = nombre;{ public static void main(String [] args) { this.patas = patas; } Perro bobi = new Perro("Bobi"); } … bobi.imprimirPatas(); /*Está en la clase mamífero*/ } }