Introducción Fernández Universidad Autónoma de Madrid 20 de febrero de 2009 Introducción En qué consiste la Programación Orientada a Objetos? Vocabulario básico Ejemplo sencillo En qué consiste la POO? Vocabulario Funcionalidad enlatada Módulos que realizan unas tareas específicas de manera totalmente opaca (encapsulación) Ejemplo: la fábrica de ordenadores Todo es un objeto Los objetos tienen unas propiedades (estado) y pueden realizar determinadas acciones (metodos) Definiciones Clase: Plantilla a partir de la cual se crean los objetos (tipo) Objeto: Ejemplar de la clase Encapsulación: Ocultación de la información Métodos: Procedimientos que operan sobre los datos de un objeto Estado: Valores o variables internas del objeto Importante Sólo se manipula un objeto a través de sus métodos, la implementacion es una caja negra. Esta es la clave de la encapsulación
Un ejemplo sencillo Programación estructurada Manipulación de matrices cuadradas Calcular la traza Calcular el determinante Transponer Invertir Datos Tipo matriz Algoritmos double traza (matriz) double determinante (matriz) matriz transpuesta (matriz) matriz inversa (matriz) Los algoritmos y los datos están separados Programación orientada a objetos Lenguajes y paradigmas de programacion Objeto matriz Estado/propiedades: Dimensiones n n Valores M ij Comportamiento/Métodos: calculartraza calculardeterminante transponer invertir Lenguajes de programacion Dependientes de la maquina: Codigo o lenguaje maquina Ensamblador Independientes de la maquina: Lenguajes de programacion (alto nivel) Los algoritmos y los datos están unidos. Los programas son apendices de los datos
Paradigmas de programacion Programacion estructurada Paradigmas de programacion Programacion imperativa Programacion estucturada Abstraccion de datos Programacion orientada a objetos Programacion estructurada Abstraccion de las operaciones Modulos o funciones Interfaz: entrada, salida, funcionalidad Implementacion: datos locales, instrucciones Ventajas Facilita el desarrollo Facilita el mantenimiento Favorece la reutilizacion Abstraccion de los datos Programacion orientada a objetos Abstraccion de los datos (TAD) Los datos se agrupan en estructuras mas complejas Las operaciones (funciones) se asocian a los tipos de datos Se tiene modularidad tanto en las operaciones como en los datos Ventajas Mayor facilidad para ampliar el codigo (extensibilidad) Encapsulacion tambien para los datos Modularidad tambien en los datos Codigo mas facil de mantener, desarrollar y reutilizar Programacion orientada a objetos Ventajas Unimos los modulos de datos y las operaciones Objeto: estructura de datos que incorpora comportamiento OBJETO = DATOS + METODOS Mayor capacidad de reutilizacion, mantenimiento, etc., ya que la encapsulacion es mayor Lenguaje mas potente (herencia y polimorfismo) Mas facilidad para reflejar conceptos de problemas reales (Objetos!) Mas facil de programar (??!)
Programacion orientada a objetos Programacion orientada a objetos Resumen OBJETO = DATOS + METODOS ENCAPSULACION = acceder a los datos de un objeto solo a traves de sus metodos El comportamiento de un objeto se define mediante los metodos de ese objeto que se pueden invocar El estado de un objeto incluye informacion o datos del mismo Campos de aplicacion Bases de datos Interfaces graficas de usuario Sistemas cliente-servidor Lenguajes de POO Simula Smalltalk C++ Object Pascal Java Python Elementos de la POO Resumen de la clase anterior Conceptos de POO Objeto Datos Metodos Clases Mensajes Herencia Polimorfismo, sobrecarga y ligadura dinamica Encapsulacion Conceptos de básicos de POO OBJETO = DATOS + METODOS Encapsulación: Los objetos tienen una interfaz pública y una implementación privada Herencia: Las subclases especializan a sus padres Las clases son moldes o patrones para los objetos Cada objeto es una instancia de su clase Polimorfismo??!!
Primer ejemplo Primer ejemplo HelloWorld.java public class HelloWorld { System.out.println("Hello World!!"); 1 Todo el código está dentro de una clase 2 Por convención los nombres de las clases en mayúsculas (y en CamelCase ) 3 Cada clase va en un fichero (con el mismo nombre que la clase y extensión.java) Cómo compilar javac HelloWorld.java Genera el fichero HelloWorld.class Bytecodes de java Cómo ejecutar java HelloWorld Nombre de la clase sin extensión La JVM interpreta los bytecodes Hello World!! La clase Persona La clase Persona (cont.) Persona.java public class Persona { // Campos o datos: private String nombre; private int edad; // Constructor: public Persona (String n, int e) { nombre = n; edad = e;... Persona.java... // Metodos: public void setnombre (String n) { nombre = n; public void setedad (int e) { edad = e; public String getnombre() { return nombre; public int getedad() { return edad; public void dardescripcion() { System.out.println("Hola, me llamo " + nombre + " y tengo " + edad + " anios.");
Un main para Persona Compilar y ejecutar PersonaMain.java public class PersonaMain { Persona p = new Persona ("Carlos", 23); p.dardescripcion(); Compilamos javac PersonaMain.java Genera los ficheros PersonaMain.class y Persona.class Bytecodes de java Ejecutamos java PersonaMain Hola, me llamo Carlos y tengo 23 anios. La clase Profesor Un main para Profesor Profesor.java public class Profesor extends Persona { private String asignatura; public Profesor (String n, int e, String a) { super(n,e); asignatura=a; public void setasignatura (String a) { asignatura = a; public String getasignatura() { return asignatura; public void dardescripcion() { super.dardescripcion(); System.out.println("Soy profesor de la asignatura " + asignatura + "."); ProfesorMain.java public class ProfesorMain { Profesor prof = new Profesor ("Juan", 34, "POO"); prof.dardescripcion(); Compilamos y ejecutamos javac ProfesorMain.java java ProfesorMain Hola, me llamo Juan y tengo 34 anios. Soy profesor de la asignatura POO.
La clase Estudiante Un main para Estudiante Estudiante.java public class Estudiante extends Persona { private float nota; public Estudiante (String n, int e, float nn) { super(n,e); nota = nn; public void setnota (float nn) { nota = nn; public float getnota() { return nota; public void dardescripcion() { super.dardescripcion(); System.out.println("Soy estudiante y he sacado un " + nota + "."); EstudianteMain.java public class EstudianteMain { Estudiante e = new Estudiante ("Carmen", 20, 7.5f); e.dardescripcion(); Compilamos y ejecutamos javac EstudianteMain.java java EstudianteMain Hola, me llamo Carmen y tengo 20 anios. Soy estudiante y he sacado un 7.5. Un caso curioso Un caso curioso PersonasMain.java public class PersonasMain { Persona x; Profesor prof = new Profesor ("Juan", 34, "POO"); Estudiante e = new Estudiante ("Carmen", 20, 7.5f); x = prof; x.dardescripcion(); System.out.println(); x = e; x.dardescripcion(); Compilamos y ejecutamos javac PersonasMain.java java PersonasMain Hola, me llamo Juan y tengo 34 anios. Soy profesor de la asignatura POO. Hola, me llamo Carmen y tengo 20 anios. Soy estudiante y he sacado un 7.5. Qué pasará?
La clase ProfesorConEstudiante ProfesorConEstudiante.java public class ProfesorConEstudiante extends Profesor { private Estudiante estudiante; public ProfesorConEstudiante (String n, int e, String a, Estudiante estu) { super(n,e,a); estudiante = estu; public void ponernota(float nota) { estudiante.setnota(nota); public void dardescripcion() { super.dardescripcion(); System.out.println("Tengo como estudiante a " + estudiante.getnombre() + "."); Un main para ProfesorConEstudiante ProfesorConEstudianteMain.java public class ProfesorConEstudianteMain { Estudiante e = new Estudiante ("Carmen", 20, 7.5f); e.dardescripcion(); System.out.println(); ProfesorConEstudiante pce = new ProfesorConEstudiante ("Alberto", 32, "POO", e); pce.dardescripcion(); System.out.println(); pce.ponernota(9.2f); e.dardescripcion(); ProfesorConEstudiante Compilamos y ejecutamos javac ProfesorConEstudianteMain.java java ProfesorConEstudianteMain Hola, me llamo Carmen y tengo 20 anios. Soy estudiante y he sacado un 7.5. Hola, me llamo Alberto y tengo 32 anios. Soy profesor de la asignatura POO. Tengo como estudiante a Carmen. Hola, me llamo Carmen y tengo 20 anios. Soy estudiante y he sacado un 9.2.