INICIACIÓN A LA PROGRAMACIÓN LENGUAJE JAVA con BlueJ

Documentos relacionados
Programación orientada a objetos. Resumen de Temas Unidad 5: Herencia

Derechos de Acceso: COMPOSICION

Aplicaciones de Escritorio

Curso Fundamentos de Informática Lección 7. Programación Orientada a Objetos

16. Herencia Definición de herencia. 168 A. García-Beltrán y J.M. Arranz

Curso de Java POO: Programación orientada a objetos

Estructuras de Datos y Algoritmos. Primeros ejemplos de TDA

Java Avanzado Facultad de Ingeniería. Escuela de computación.

OOP y C++ Indice. 0.1 Análisis orientado a objetos(1/4) Análisis orientado a objetos(2/4) 0.- OOP 1.- INTRODUCCIÓN.

INICIACIÓN A LA PROGRAMACIÓN LENGUAJE JAVA

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Objeto Clase Atributo / Método Encapsulamiento Mensaje Herencia Polimorfismo Encadenamiento Dinámico

PROGRAMACION ORIENTADA A OBJETOS EN C++

CLASES QUE UTILIZAN OBJETOS. RELACIÓN DE USO ENTRE CLASES JAVA. CONCEPTO DE DIAGRAMA DE CLASES. (CU00641B)

1.2. Es Java un lenguaje ideal para aprender a programar? 1.4. Cuáles son las versiones y distribuciones Java y cuál usar?

EJEMPLO EJERCICIO RESUELTO CON POLIMORFISMO, SOBREESCRITURA DE MÉTODOS Y HERENCIA JAVA. CÓDIGO (CU00691B)

Herencia. Hay clases que comparten gran parte de sus características.

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Programación Orientada a Objetos con Java. Elementos Básicos del Lenguaje Java. Relación entre clases. Ejemplo de Clase: Punto !

POO en Java. Relaciones de composición y Herencia. Composición: clase Círculo. Composición. Herencia: La palabra reservada extends

FACULTAD DE ECONOMIA Y ADMINISTRACION DEPARTAMENTO DE CIENCIAS DE LA COMPUTACION CÁTEDRA PROGRAMACION GENERAL. Trabajo Práctico Nº 4

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

Conceptos más avanzados de Programación Orientada a Objetos

La Herencia: Teoría (1)

INTRODUCCION A LA PROGRAMACION EN JAVA

AGRUPA P R OBJET E OS 1

INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

Introducción a la Programación Orientada a Objetos

! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

POO en lenguajes compilados de tipos estáticos (Java y C#)

Boletín 7 Herencia. String Titular; Nombre del dueño de la cuenta double Saldo: Dinero disponible en la cuenta

Necesidad de la herencia pertenencia variedad is a has a herencia variedad definir una clase modificando una o más clases añadir nuevos miembros

Programación Orientada a Objetos (POO)

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

PROGRAMACIÓN EN C#.NET Programación Orientada a Objetos en C# Ing. Bruno López Takeyas

Programación Orientada a Objetos

ÍNDICE DEL LIBRO Y DEL EBOOK APRENDER A PROGRAMAR EN JAVA DESDE CERO. CURSO PASO A PASO.

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote METODOS CONSTRUCTORES Y LA REFERENCIA THIS

INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)

PARA QUÉ SIRVEN LAS INTERFACES JAVA. IMPLEMENTAR UNA INTERFAZ DEL API. VENTAJAS. EJEMPLOS BÁSICOS. (CU00697B)

Programación orientada a objetos. Capítulo 8 Mejora de las estructuras mediante herencia

Curso de Java POO: Programación orientada a objetos

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

MOO - Metodología y Programación Orientada a Objetos

HERENCIA Y TIPOS. Articulo. Video Audio Altavoces. Amplificador

Introducción a la Orientación a Objetos

Construcciones del Lenguaje Java

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Prácticas de Programación

GUÍA DE ESTILO EN JAVA

Taller de Programación I. Tema 06: Orientación al Objeto en Java (parte 2)

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

CONTENIDOS. La herencia permite: - Adoptar automáticamente características ya implementadas. Ahorro de tiempo y esfuerzo

EXAMEN PROGRAMACIÓN 21 de Septiembre de 2007 INGENIERÍA INFORMÁTICA Primera parte: Cuestiones 1,5 horas

PROYECTO FIGURAS DIAGRAMA DE FLUJO

Introducción al lenguaje JAVA

Tema 3. Programación orientada a objetos en Java (Parte 1)

4. POLIMORFISMO. Figura 6: Funciones virtuales

- Compilar y ejecutar programas en Java - Estructura básica de una clase - El comando javac - El comando java - Introducción al IDE de desarrollo

FUNDAMENTOS DE PROGRAMACIÓN Curso: 2013/14 EXAMEN PARA ALUMNOS PRESENTADOS AL PRIMER PARCIAL PRIMERA PARTE. EJERCICIO 1 Cuestiones (1 punto)

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Clases e instancias. Algoritmos y Estructuras de Datos I. Clases e instancias. memoria dinámica.

Diseño Basado en Componentes. Curso 2008 / 09

b c b c b b a a c a a c b c c b b c b c d c c c b

Guía práctica de estudio 04: Clases y objetos

Programación orientada a objetos. Resumen de Temas Unidad 6: Polimorfismo y reutilización

Las clases están compuestas por un conjunto de miembros. (datos y funciones) también se conocen como (atributos y métodos)

Conceptos de Programación Orientada a Objetos

Clases Abstractas e Interfaces

Una Clase: define un grupo de objetos que tienen propiedades similares y se comportan de manera similar.

Elabore el diagrama de clases en UML y la codificación de un programa para resolver los siguientes problemas:

DOCUMENTAR PROYECTOS JAVA CON JAVADOC. COMENTARIOS, SÍMBOLOS, TAGS (DEPRECATED, PARAM, RETURN, ETC.) (CU00680B)

Arrays unidimensionales. Dim.Option Base. Erase. Ejemplos en Visual Basic (CU00311A)

FUNDAMENTOS DE INFORMÁTICA

Modulo 11. Clases y Objetos en Java

UNIVERSIDAD AUTÓNOMA DE CHIAPAS LICENCIATURA EN SISTEMAS COMPUTACIONALES

Clases y Objetos en Java. ELO329: Diseño y Programación Orientados a Objetos

Java Inicial (20 horas)

Programación orientada a objetos. Resumen de Temas Unidad 4: Sobrecarga

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

INTRODUCCIÓN AL PARADIGMA DE LA PROGRAMACIÓN ORIENTADA A OBJETOS CON JAVA

Unidad Didáctica 6. Tipos List y Set con tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos. Versión 1.0.

Seminario 1 Introducción a Java PROGRAMACIÓN 3

Conversión entre Tipos

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

PRÁCTICA No 4 POO Encapsulación. El alumno conocerá los principios de la encapsulación, y el uso de constructores para la inicialización de datos

Programación Orientada a Objetos

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

Bloque práctico 2: Java

Transcripción:

INICIACIÓN A LA PROGRAMACIÓN LENGUAJE JAVA con BlueJ Tema 3 Clases y Objetos Tema 4 Comunicación entre objetos. Algoritmos Tema 5 Herencia y abstracción de datos Tema 6 Diseño de clases

TEMA 5: Herencia y abstracción datos 1. Abstracción de datos Encapsulación de datos Composición 2. Herencia Concepto de Herencia Herencia y constructores Herencia y métodos: redefinición, uso de super Herencia y visibilidad: protected 3. Polimorfismo 4. Clase Object 5. Listas: vectores dinámicos

Abstracción de datos: definición En el lenguaje natural continuamente utilizamos palabras que representan la abstracción de un concepto. Por ejemplo, la palabra gato es la abstracción de: animal con una cabeza, cuatro patas, cola, etc. es capaz de andar, maullar, comer, etc. En lenguajes de programación orientados a objetos también abstraemos los conceptos mediante: campos: cabeza, patas, cola, etc. métodos: andar, maullar, comer, etc. La abstracción de datos es el proceso de identificar los atributos y propiedades de los conceptos. El resultado de este proceso es un tipo de dato abstracto: Gato, Matriz, Persona.

Abstracción de datos: encapsulación Hasta el momento, todos los campos que hemos definido han sido private Razón: buena técnica de programación ocultar la representación interna de los objetos, encapsulación de datos. Al usuario (programador) no le interesa cómo se representa el nombre de una Persona: con un String, con un array de caracteres, con una clase especial Nombre. Solo le interesa cómo obtener el nombre. Los detalles de implementación se ocultan en la clase.

Abstracción de datos: composición En muchas ocasiones al crear una clase hemos utilizado otra como campo. Por ejemplo, la clase Círculo tiene como campo un objeto de la clase Punto. Se define una relación entre clases: composición. En el diagrama de clases se representa Circulo tiene usa Punto Decimos que la clase Circulo tiene un Punto. La relación se representa mediante una línea punteada

Herencia Consideremos las clases public class Alumno { private String nombre; private int edad; private int nip; //identificador private Asignatura[] matricula; public Alumno(String no, int e, int ni, Asignatura [] mat) { public String getnombre() { return nombre; public int getedad() { return edad; public int getnip() { return nip; public int hallarcursomasbajomatriculado() {

Herencia public class Profesor { private String nombre; private int edad; private int nip; //identificador private double sueldobase; private int añostrabajados public Profesor(String no, int e, int ni, double sb, int a) { public String getnombre() { return nombre; public int getedad() { return edad; public int getnip() { return nip; public double hallarsueldo() {

Herencia Las clases Alumno y Profesor comparten: algunos campos: nombre, edad, nip algunos métodos: getnombre(), getedad(), getnip() Es necesario escribir el mismo código dos veces? Para la clase Alumno y Profesor. Usando el mecanismo de herencia no es necesario

Herencia Alumno y Profesor comparten que son Personas. Se crea la clase Persona con la parte común a Alumno y Profesor. Se crea Alumno y Profesor heredando de Persona. La herencia proporciona una relación entre clases es un : Persona es un Alumno es un Profesor Un Alumno es una Persona, un profesor es una Persona En el diagrama de clases, la relación de herencia:

Herencia public class Persona { private String nombre; private int edad; private int nip; //identificador public Persona(String no, int e, int ni) { public String getnombre() { return nombre; public int getedad() { return edad; public int getnip() { return nip;

Herencia: en Java public class Profesor extends Persona { private double sueldobase; private int añostrabajados public Profesor(String no, int e, int ni, double sb, int a) { public double hallarsueldo() { public class Alumno extends Persona { private Asignatura[] matricula; public Alumno(String no, int e, int ni, Asignatura [] mat) { public int hallarcursomasbajomatriculado() {

Herencia El mecanismo de herencia se puede aplicar tantas veces como sea necesario La clase que hereda se llama: clase derivada o heredada Alumno es una clase derivada de Persona La clase de la que se hereda se llama: clase base o padre Persona es la clase base o padre de Alumno. Alumno es la clase base o padre de Becario Todas las clases por encima de la jerarquía de clases: superclases Las superclases de Becario son: Alumno y Persona Persona Alumno Profesor Becario Jerarquía de clases

Herencia Las clases derivadas heredan todos los campos y métodos de su clase base. Lo único que no se hereda son los constructores. En otras palabras: Los campos de la clase Alumno son Los propios de Alumno: Asignatura[] matricula más los de la clase Persona: nombre, edad, nip Los campos de Profesor son los propios de Profesor: sueldobase, añostrabajados más los de la clase Persona: nombre, edad, nip Los métodos de Alumno son: los propios de Alumno: hallarcursomasbajomatriculado() más los de la clase Persona: getnombre(), getedad(), getnip() Los métodos de Profesor son: los propios de Profesor: hallarsueldo() más los de la clase Persona: getnombre(), getedad(), getnip()

Herencia: ejemplo public class Punto2D { private double x; private double y; public Punto2D() { x = 0; y = 0; public Punto2D(double nx, double ny) { x = nx; y = ny; public double getx() { return x; public double gety() { return y; public class Punto3D extends Punto2D{ private double z; public Punto3D() { public Punto3D(double nx, double ny, double nz) {. public double getz() { return z;

Herencia: constructores En el ejemplo anterior, cómo se implementan los constructores de Punto3D? Primera aproximación ERRÓNEA: como los campos x e y son de Punto3D, asignamos los valores directamente public class Punto3D extends Punto2D{ private double z; public Punto3D(double nx, double ny, double nz) { x = nx; y = ny; z = nz; //error compilación No se puede: los campos x e y son privados. Solo se tiene acceso directo a ellos dentro de la clase Punto2D Solución chapuza: declaro los campos públicos. El código sería correcto sintácticamente. NO SE DEBE HACER NUNCA.

Herencia: constructores Para construir un objeto de una clase derivada es necesario llamar a un constructor de la clase base La llamada se hace mediante: super(arg1,arg2,..) donde los argumentos se corresponden con algún constructor clase base. Con la llamada a super se construye una parte del objeto, la correspondiente a la clase base. Después hay que dar valor a los campos propios de la clase derivada public class Punto3D extends Punto2D{ private double z; public Punto3D(double nx, double ny, double nz) { super(nx, ny);//llamada constructor clase base Punto2D z = nz; //valor de la parte propia de Punto3D

Herencia: constructores Qué ocurre si la clase tiene un constructor por defecto? En este caso, y solo en este, si no se llama explícitamente a un constructor de la clase base, implícitamente se llama al constructor por defecto de la clase base. Esto es, se hace una llamada a super(). public class Punto3D extends Punto2D{ public Punto3D() {//para crear el punto (0,0,0) z = 0; //valor de la parte propia de Punto3D public class Punto3D extends Punto2D{ public Punto3D() {//para crear el punto (0,0,0) super(); //llamada a constructor por defecto clase base //no es necesario, equivalente anterior z = 0; //valor de la parte propia de Punto3D

Herencia: ejemplo constructores public class Persona {... public Persona(String no, int e, int ni) { nombre = no; edad = e; nip = ni;... public class Alumno extends Persona {... public Alumno(String no, int e, int ni, Asignaturas[] mat) { super(no, e, ni); matricula = mat;... public class Profesor extends Persona {... public Profesor(String no, int e, int ni, double sb, int a) { super(no, e, ni); sueldobase = sb; añostrabajados = a;...

Herencia: ejemplo uso métodos Punto2D p2d = new Punto2D(1, 2); Punto3D p3d = new Punto3D(4, 5, 6); System.out.println(p2d.getX()); //correcto System.out.println(p3d.getY()); //correcto System.out.println(p3d.getZ()); //correcto System.out.println(p2d.getZ()); //incorrecto. // no hay método getz en Punto2D

Herencia: redefinición de métodos Añadimos a la clase Punto2D un método para hallar la distancia al origen public class Punto2D{ private double x; private double y;... public double hallardistanciaorigen() { return Math.sqrt(x*x + y*y); La clase derivada Punto3D hereda el método hallardistanciaorigen() Por tanto, Punto3D p3d = new Punto3D(1, 2, 3); System.out.println(p3d.hallarDistanciaOrigen()); es correcto sintácticamente, pero no da el resultado buscado.

Herencia: redefinición de métodos Solución: redefinir el método hallardistanciaorigen() en la clase derivada Punto3D public class Punto3D extends Punto2D{ private double z;... public double hallardistanciaorigen() { return Math.sqrt(x*x + y*y + z*z); Redefinir un método en una clase derivada es cambiar la implementación del método de una superclase para que se adapte a las necesidades de la clase derivada. No todos lo métodos necesitan ser redefinidos. Por ejemplo, los métodos getx(), gety() de Punto2D no están redefinidos en Punto3D

Herencia: uso de super en métodos Añadimos a la clase Persona método tostring() public class Persona{ public String tostring() { Strin res = Nombre: + nombre +. Edad: + edad +. NIP: + nip; return res; En la clase Profesor y Alumno deberíamos redefinir el método tostring() para que apareciesen los datos propios de las clases. Cómo?

Herencia: uso de super en métodos Es correcto este código? public class Profesor extends Persona{ public String tostring() { //ERROR String res = Nombre: + nombre +. Edad: + edad +. NIP: + nip; res +=. Años trabajados: + añostrabajados; res +=. SueldoBase: + sueldobase; return res; NO. Los campos nombre, edad, nip son privados de Persona. No se tiene acceso a ellos directamente en la clase Profesor

Herencia: uso de super en métodos Solución 1: bastante mejorable. Usar los métodos públicos de Persona que nos devuelven los campos nombre, edad, nip. public class Profesor extends Persona{ public String tostring() { Strin res = Nombre: + getnombre(); res +=. Edad: + getedad(); res +=. NIP: + getnip; res +=. Años trabajados: + añostrabajados; res +=. SueldoBase: + sueldobase; return res;

Herencia: uso de super en métodos Solución 2: preferida. Llamar al método tostring() usando la cláusula super.llamada_metodo_clase_base public class Profesor extends Persona{ public String tostring() { Strin res = super.tostring(); //tostring() de Persona res +=. Años trabajados: + añostrabajados; res +=. SueldoBase: + sueldobase; return res;

Herencia La relación de herencia nos permite referenciar objetos de las clases derivadas mediante variables de las clases bases. Un Alumno es una Persona, pero no todas las Personas son Alumnos Alumno al = new Alumno( ); Profesor pr = new Profesor(); Persona p = new Persona( ); Persona per1 = al; //Correcto, un Alumno es Persona Persona per2 = pr; //Correcto, un Profesor es Persona al = p //incorrecto, al es una variable de tipo Alumno //no puede hacer referencia a una persona

Visibilidad: protected La palabra clave protected se usa para indicar la visibilidad de campos y métodos. Se tendrá acceso a un campo o método declarado como protected desde cualquier clase que pertenezca al mismo paquete o desde cualquier clase derivada. En este curso no vamos a usar casi nunca este tipo de visibilidad.

Polimorfismo Encapsulación de datos, herencia y polimorfismo son tres conceptos clave de la Programación Orientada a Objetos. El polimorfismo es la capacidad que tienen los métodos de las clases derivadas de comportarse de distinta forma con referencias a superclases. Alumno al = new Alumno( ); Profesor pr = new Profesor(); Persona persona; persona = pr; System.out.println(persona.toString()); //se ha usado el método tostring() de Profesor persona = al; System.out.println(persona.toString()); //se ha usado el método tostring() de Alumno

Polimorfismo En este ejemplo, se simula el lanzamiento una moneda. Si sale cara, se introduce un alumno en el array Si sale cruz, se introduce un profesor Qué aparece por pantalla? No se usa el método tostring() de Persona. Se usa el tostring() de Alumno o Profesor Alumno al = new Alumno( ); Profesor pr = new Profesor(); Persona [] gente = new Persona[2]; Random gen = new Random(); for (int i = 0; i < gente.length; i++) { int moneda = gen.next(2); if (moneda == 0) { gente[i] = al; else { gente[i] = pr; for (int i = 0; i < gente.length; i++) { System.out.prilntln(gente[i].toString());

Clase Object Suponer que no tenemos declarado en la clase Punto2D el método tostring(). Si se ejecuta el siguiente código Punto2D p = new Punto(1, 2); System.out.println( p.tostring()); Aparece por pantalla algo como 123f3567@Punto Por qué se puede invocar el método tostring() si no lo hemos definido? Razón: todas las clases en Java, incluso las creadas por nosotros, derivan automáticamente de una clase llamada Object.

Clase Object La clase Object tiene implementados varios métodos. Alguno de ellos son: int hashcode(): devuelve un entero que identifica al objeto String tostring(): devuelve un String compuesto por nombre de la clase + @ + el número devuelto por hashcode() Notar que cada vez que hemos implementado el método tostring() en una clase, hemos redefinido el método ya implementado de la clase Object. public class Punto2D {... //redefinición del método tostring() de Object public String tostring() { String res = ( + x +, + y + ) ; return res;.

Listas: vectores dinámicos Los arrays definidos hasta el momento tienen capacidad para un número fijo de elementos. Problema: guardar una serie de números enteros. Solución: estática: en un array tipo int[]. Incoveniente: cuando creamos el array hay que decidir la capacidad del array. Si la serie tiene más números que la capacidad? int [] guardar = new int[50]; dinámica: usar un objeto de la clase ArrayList Ventaja: en este tipo de vectores, que llamaremos listas, no hay capacidad fijada. Se pueden introducir y quitar los elementos que se quieran.

Listas: vectores dinámicos Cómo se usa un ArrayList? La clase ArrayList pertence al paquete java.util Cuando se declara el objeto de tipo ArrayList hay que indicar qué tipo de dato se guardará entre <tipodato> ArrayList<Integer> guardar = new ArrayList<Integer>(); ArrayList<Persona> poblacion = new ArrayLis<Persona>(); Cuidado: si queremos guardar algún tipo de dato primitivo ERROR ArrayList<int> ArrayList<long> ArrayList<char> ArrayList<boolean> ArrayList<double> CORRECTO ArrayList<Integer> ArrayList<Long> ArrayList<Character> ArrayList<Boolean> ArrayList<Double>

Listas: vectores dinámicos Una vez declarado y creado el ArrayList se utilizan los métodos de la clase ArrayList<Integer> lista = new ArrayList<Integer>(); lista.add(5); //añade un elemento al final de la lista lista.add(6); int tamaño = lista.size(); //total de elementos guardados en lista int n = lista.get(0);//devuelve el elemento guardado en posición 0 //mostrar todos los elementos por pantalla for (int i = 0; i < lista.size(); i++) { System.out.println(lista.get(i)); lista.remove(0); //elimina el elemento guardado en la posición 0

Listas: bucle para cada Las colecciones de elementos tipo ArrayList o arrays se pueden recorrer también mediante el tipo de bucle para cada ArrayList<Integer> lista = new... ; //mostrar todos los elementos por pantalla for (int n : lista) { //para cada n en lista System.out.println(n); Sintaxis: Si colec es una colección de datos de tipo Tipo (ArrayList<Tipo>, Tipo[]) for (Tipo o : colec) { // para cada o en colec.