Curso de POO en Java

Curso de Programación Orientada a Objetos en Java
 
 
Objetivos del curso

En este curso se pretende introducir al alumno en el paradigma de la Programación Orientada a Objetos usando Java como lenguaje. El objetivo principal es que el alumno aprenda a implementar colecciones de datos usando dos interfaces de Java: Collection (List, Set y SortedSet) y Map.  Se pretende que el alumno entienda las cualidades de la POO: separar diseño de implementación, modularidad, encapsulación de los datos y de las funcionalidades sobre estos, reutilización sobre todo por composición, etc. Como el tiempo es limitado, hay cuestiones de la POO que se estudian con limitaciones: excepciones, chequeo de errores, tipos genéricos, herencia …
 
 
¿Qué debe saber el alumno al final del curso?
  1. El alumno debe saber leer un fichero de texto para formar una colección de datos a partir de la información extraída. Ejemplos de colecciones serán: listado de experimentos con bacterias, conjunto de vuelos, catálogo de pisos, notas de los alumnos de un centro universitario, encuestas electorales, pacientes de urgencias, etc.
  2. El alumno deberá saber implementar en Java las interfaces y clases para el tipo base y para el tipo colección. Por ejemplo: el tipo Punto y el tipo NubePuntos, el tipo Vuelo y el tipo Aeropuerto, el tipo Paciente y el tipo Unidad de Urgencias, el tipo Experimento y el tipo Ensayo, etc.
  3. El alumno deberá saber usar los métodos de las interfaces List, Set, SortedSet y Map para desarrollar las funcionalidades de los tipos anteriores.
  4. Los alumnos deberán saber implementar en Java, métodos que respondan a preguntas sobre las colecciones que incluyan contadores, acumuladores, ordenación, existe, máximos y mínimos, para todo y filtro
     
Metodología

¿Por qué programamos con interfaces en la asignatura?
La razón es fácil, es lo mismo que hace Java: ¿Qué son List y SortedMap, por poner sólo un par de ejemplos? Efectivamente, son interfaces con una funcionalidad que viene dada por sus métodos. Cada interfaz tiene una o varias clases que la implementan. En Java también, por ejemplo LinkedList o ArrayList son clases, que tienen sus constructores e implementan los métodos que define la interfaz List. Pues eso mismo hacemos nosotros con los tipos que definimos mediante una interfaz.
 
¿Sí pero en Java también hay clases de utilidad? ¿Se deben o no usar métodos estáticos?
Efectivamente Java, podríamos decir que, muchas veces por razones históricas de compatibilidad con versiones anteriores, conserva numerosos ejemplos de métodos estáticos. Algunos podríamos decir que son necesarios, por ejemplo, los de la clase Math. Sería difícil de otra manera hacer la raíz cuadrada de un número. Pero en otros muchos casos se ha quedado obsoleto, como pasa con la clase Collections y sus métodos sort, max, min, etc. los cuales han quedado ampliamente superados por los métodos de Stream en Java 8. En mi opinión, no se debería abusar de los métodos estáticos, entre otras razones porque ese no es el fundamento de la POO. Con la invocación de un método estático estamos recurriendo al paradigma de la programación imperativa.
 
¿Entonces está mal o no definir una clase de utilidad para trabajar con una colección de libros o un conjunto de puntos?
Formalmente no está mal, pero como he señalado antes no creo que sea correcto. Si queremos definir un tipo para encapsular el tratamiento de una colección de libros, lo lógico es hacer un tipo Biblioteca, de forma que cuando defina un objeto de tipo biblioteca y otro de tipo Libro:
Biblioteca mylibrary = new BibliotecaImpl();
Libro myBook = new LibroImpl(“La isla del Tesoro”, “R.L. Stevenson”);
 
Después pueda hacer:
mylibrary.añadir(myBook);
 
La alternativa “estática” es una clase Bibliotecas que tendría un método con la siguiente signatura:
void static añadir(List  bib, Libro lib);
 
y se pueden preguntar ¿Dónde está en este último ejemplo la ocultación de los detalles de implementación y la encapsulación? Pues eso, brillan por su ausencia.

¿Qué significa encapsular y por qué se hace?
Las colecciones que se implementan encapsulan la información y la funcionalidad. Los alumnos preguntan en qué se diferencia una NubePuntos de un List o un  Aeropuerto de un Set. Además de que un aeropuerto puede tener muchas más información y por tanto tener más atributos que un simple listado de vuelos, la principal diferencia es la posibilidad de darle más funcionalidad a nuestro tipo colección. De hecho, esa es una de las mejoras de Java 8, ya que el tipo stream es mucho más flexible que el tipo List. El encapsulamiento permite por ejemplo operaciones de filtro que permiten reutilizar métodos ya creados. Un método de filtro sobre NubePuntos devuelve otra NubePuntos a la que puedo aplicar métodos que calculan un acumulador o un máximo. Si devolviera una List no podría hacerlo.

Contenidos
 
El temario del curso son 8 temas:
  1. Introducción a la POO
  2. Elementos del lenguaje Java
  3. Diseño de tipos
  4. Colecciones
  5. Tipo Map
  6. Interfaces funcionales
  7. Métodos de stream (Java 8)
  8. Lectura y escritura de Ficheros
Estos temas se pueden resumir de la siguiente forma, los dos primeros sientan las bases de las características de la POO, en general y de Java en particular. En el primero se definen interfaz, clase, objeto y método y las características que debe tener la POO. En el segundo declaración de tipos básicos y envoltorios, estructuras de control, concepto de igualdad e identidad, excepciones, … En el tercer tema se abordan más profundamente los conceptos de coherencia entre equals y compareTo, diferencia entre compareTo y Comparator, composición y herencia, tipos genéricos. El cuarto tema introduce las interfaces List, Set y SortedSet que normalmente son encapsuladas en lo que llamamos tipos colección: aeropuerto, librería, catálogo de pisos, urgencias, etc. Las funcionalidades que proporcionamos a estos tipos colección son las habituales en un curso de programación básica: contadores, sumadores, máximos, filtros, etc. El tema 5 amplia la posibilidad de tener la colección de datos organizada mediante el tipo Map: puntos por cuadrante, vuelos por fecha, libros por temática, experimentos por bacteria, etc. En los temas 6 y 7 se explican los conceptos de programación funcional que permiten las interfaces funcionales y los métodos de Stream. Finalmente en el último tema, se  estudia cómo construir un tipo colección a partir de la información obtenida de un fichero de texto o como guardar los resultados en otro.
 
 
¿Qué puedo encontrar en este blog?
 
En este blog puedes encontrar unos apuntes en pdf elaborados con los contenidos que podría calificar de teóricos. Lógicamente su estudio es recomendable y, es posible, que algunos aspectos de la resolución de problemas no se entiendan sin al menos una lectura previa. Delante de cada vídeo está el documento escrito que se usa como base para las explicaciones y que también aparece en los videos.Pinche sobre el nombre del tema para obtener el pdf.

Además:
  • Un conjunto de vídeos grabados en clase con la explicación de estos apuntes y la resolución de algunos problemas
  • Acceso a un conjunto de preguntas tipo test sobre las cuestiones resueltas en los vídeos o apuntes.
  • Enunciados de problemas y soluciones de los mismos, especialmente de exámenes.
  • Material para el estudio de la programación en Java 8
Cualquier errata o aclaración puede ser informada en el formulario de abajo.


 
 


Otros vídeos:



Otros vídeos de cursos anteriores que recomendamos:
 
 
 
 
 
Tema 2. (Parte II). Agregados indexados en Java
 

Otros vídeos:
Tema 2. (Parte III). Reutilización por herencia
 

Otros vídeos sobre el mismo tema:
Tema 2. (Parte IV). Excepciones


Otros vídeos del curso pasado sobre el mismo tema:
  • http://www.youtube.com/watch?v=P-t0lwk1GNs Diferencias entre los comportamientos de los distintos tipos de datos que se pueden pasar como argumentos a métodos en Java: tipos primitivos, tipos wrappers, String, objetos simples, objetos Collection
Otros vídeos
 



Otros vídeos sobre el mismo tema:
  • http://www.youtube.com/watch?v=2HNlORtRSio Definición de órdenes alternativos al orden natural mediante clases de tipo Comparator. Problemática de la coherencia con el equals: cómo romper los empates mediante compareTo. Ejemplo de Clase Comparator con constructor
  • http://www.youtube.com/watch?v=gY7gKvYYhPM Descripción de los principales métodos estáticos de la clase de utilidad Collections, con especial atención a los que usan un orden tanto natural (compareTo) como alternativo (Comparator)

Tema 3 (Parte II). Diseño de Tipos y Reutilización 


Otros vídeos del curso pasado sobre el mismo tema:
  • http://www.youtube.com/watch?v=O_YG9_gP054 En los primeros minutos de este tema se hace un ejercicio con tipos genéricos
Vídeo de la UPV sobre el mismo tema
  • http://www.youtube.com/watch?v=N3yy2pfUaE0 Los minutos finales sobre ordenación de Arrays sobran si usamos los métodos sort de las clases Collections y Arrays

Otros vídeos sobre el mismo tema:
  • http://www.youtube.com/watch?v=ph10UgYJwAQ Definición y uso de los tipos List y Set de java.util. Diferencias. Necesidad e implementación del método hashCode
  • http://www.youtube.com/watch?v=3MGIwo-j8OM Breve descripción de los métodos de Collection, comunes a List y Set y de los específicos de List. Concepto de referencia de un objeto en una Collection. Concepto de vista de una Collection. Anidamiento de colecciones o agregados
  • http://www.youtube.com/watch?v=a8xbwRN-7R0 Descripción del tipo SortedSet o conjunto ordenado. Problemática con los SortedSet definidos a partir de un Comparator no coherente con equals. Métodos propios de SortedSet
 



 

 
Puede ver otro video sobre el uso y construcción de un Map inverso en el siguiente video del Ejercicio Urgencias:



Vídeos del curso pasado sobre el mismo tema
  • http://www.youtube.com/watch?v=Y3fSk7XpUPo Encapsulación de la lectura. Después de explicar la clase Scanner, en este vídeo se encapsula la lectura de ficheros mediante métodos de utilidad que reciben el nombre de un fichero y devuelven un List de String con la información del mismo. Este método puede ser modificado para devolver una Collection de objetos de cualquier tipo a partir de la información almacenada en un fichero de texto.
  • Ejercicio Urgencia (parte I)
    Resolución paso a paso de un ejercicio de diseño de tipos, cuyo enunciado puede obtener aquí arriba. En este vídeo se plantea el problema y se implementa el tipo Hora a partir de dos atributos enteros: hora y minuto.
  • Ejercicio Urgencia (parte II)
    En este segundo vídeo se implementa el tipo Ingreso que modela el paso de un paciente por la unidad de Urgencias. 
  • Ejercicio Urgencia (parte III)
    El tipo Urgencias implementa un conjunto ordenado de ingresos para un día concreto. En este vídeo se codifican los métodos de Object (equals, toString, hashCode), compareTo, constructor y el método que devuelve el número de ingresos.
  • Ejercicio Urgencia (parte IV)
    Se continua con la funcionalidad del tipo Urgencia. En este apartado se responde a la pregunta de qué médicos han tratado las urgencias mediante un Set de String.
  • Ejercicio Urgencia (parte VI)
    En este vídeo se responde a la pregunta de qué medicos trataron al mayor número de pacientes. Para ello se invierte el Map del apartado anterior construyendo un SortedMap. 
  • Ejercicio Urgencia (parte VII)
    En este vídeo se implementa un Comparator para ordenar los ingresos. Con este Comparator se ordenará una lista, que será escrita en un fichero y se obtendrá el valor máximo.
  • Ejercicio Urgencia (parte VIII)
    En primer lugar, se construye un contador de los ingresos por el tipo enumerado TipoUrgencias. En la segunda parte se resuelve el problema de detectar los elementos repetidos usando dos Collection de tipo Set.







 
 

31 comentarios:

  1. Muy bueno el curso, es de gran ayuda. Gracias por compartir

    ResponderEliminar
  2. REALMEN TE HAY QUE AGRADECER AL PROFESOR RIQUELME QUE COMPARTA SUS CONOCCIMIENTOS Yo personalmente es desempleado y me tengo que reciclar no puedo pagar un curso que cuesta mas de 2000 euros.Muchas gracias estoy aprendiendo a programar JAVA sin haber programado en mi vida ......

    ResponderEliminar
  3. Donde están los videos anteriores? antes los subian con otra cuenta de Youtube, alguno la sabe?

    ResponderEliminar
    Respuestas
    1. Hola, todos los videos de Java están enlazados en esta página. No sé a qué te refieres con los videos anteriores.

      Eliminar
  4. Hola tengo una duda de lo explicado en el video 5 del Tema 1.
    Porque cuando se instancia un objeto Punto se crea poniendo:
    Punto p = new PuntoImpl(0.,0.);
    Porque se pone primero la interfaz y luego la clase?

    Y no se pone:
    Punto p = new Punto();

    o

    PuntoImpl p = new PuntoImpl();

    Tengo entendido (quizas no este en lo cierto) que para crear un objeto solo se puede poner un tipo. Por ejemplo:
    Si tenemos las clases Automovil, moto, coche. Las clases Moto y Coche heredan de Automovil. Tengo entendido que si queremos instanciar un objeto Moto o Coche debemos hacer:

    Coche c = new Coche(); o Moto m = new Moto();

    Si hicieras:

    Coche c = new Automovil(); o Moto m = new Automovil();

    Estas instancias estarian mal, pues cuando quisieras llamar a un método propio de la clase Coche no podrias, solo veria los metodos comunes que comparte con la SuperClase (o clase padre).

    Al igual si es de una interfaz daría igual o algo. Me gustaria que me constestará y me saque de dudas.

    Un Coordial saludo. Un Aprendiz de Java.

    ResponderEliminar
    Respuestas
    1. Hola, sólo se puede invocar con el operador new al constructor de una clase. Si Punto es una interfaz no puedes poner

      Punto p = new Punto();

      porque las interfaces no tienen constructor en cuanto que son un "diseño" del tipo. Son las clases las que sí tienen constructor. Sí se podría poner como dices

      PuntoImpl p = new PuntoImpl();

      Pero no es adecuado. La razón es que con la interfaz tenemos definidas las características generales de un Punto que después pueden ser implementadas por diferentes clases, una de las cuales es PuntoImpl con coordenadas cartesianas, pero, por ejemplo, podríamos implementar Punto con otra clase que fuera en coordenadas en polares y tendríamos PuntoImpl2.

      De esta forma el tipo (interfaz) sólo se preocupa de qué es lo que necesita (métodos de la interfaz) y, por otro lado, la clase se ocupa de cómo hacerlo implementando atributos y métodos.

      Respecto del resto de tu razonamiento estás confundiendo clase padre con interfaz que son conceptos diferentes. Efectivamente hay profesores y autores que prefieren usar clases abstractas y después mediante herencia concretar. Pero nosotros preferimos el concepto de interfaz.

      De hecho este es el mismo modelo que proporciona Java ya que, por ejemplo, List o Set son interfaces mientras que las clases que las implementan son ArrayList o HashSet.

      Un saludo

      Eliminar
  5. Un saludo profesor Riquelme y agradecerle los excelenrtes vídeos que ha compartido sobre el curso de JAVA , pero no tengo claro todavía la diferencia entre objeto y referencia a un objeto . ¿Podría aclararlo con un ejemplo ? Muchas gracias.

    ResponderEliminar
  6. El objeto es una entidad en Java que permite estructurar la funcionalidad que se quiere tener, mientras que la referencia a un objeto es la información que se guarda en una variable para poder acceder a ese objeto. Eso que preguntas está ligado con los conceptos de identidad e igualdad de objetos que está en dos videos diferentes del Tema 2 Parte I.

    El problema para los que vengan de programar en C es que los objetos en Java no se guardan como las variables del C. Cuando en Java se define un objeto, por ejemplo:

    Punto p = new PuntoImpl(2.,3.);

    se dice que p es un objeto pero realmente es una referencia a un objeto, esto es, una zona de memoria donde están guardadas las coordenadas (2,3).

    Gráficamente en muchos textos se representa como que p es una bolita con una flecha que apunta a una caja que dentro tiene un 2 y un 3.

    Si creamos otro Punto q
    Punto q = new PuntoImpl(7.,8.);
    Tenemos otra bolita q con otra flecha que apunta a otra caja que tiene un 7 y un 8.

    Cuando hacemos una asignación

    p=q;

    la flecha que salía de p hacia la caja con el 2 y el 3 cambia (desaparece la flecha realmente, quedándose la caja con el 2 y el 3 sin referencia y borrada por el recolector de basura), creándose otra flecha que saliendo de p apunta a la misma caja que q. De esta forma ahora p y q son el MISMO objeto (son dos referencias al mismo objeto), y cualquier modificación que se haga sobre q también se hace sobre p. Es un ejemplo de dos referencias distintas (p y q) y un solo objeto.

    Saludos

    ResponderEliminar
    Respuestas
    1. Gracias por la explicación profesor Riquelme. Un saludo y feliz año 2014

      Eliminar
  7. Profesor, En el tema 3 el los vídeos 2,3,4 tienen intercambiados los link...
    #video -> #destino video.
    2 -> 4
    3 -> 2
    4 -> 3
    ¡Saludos y gracias por los vídeos!

    ResponderEliminar
  8. muchas gracias, creo que ya está corregido. Por lo menos hay alguien que me escucha ;-)

    ResponderEliminar
  9. Si señor! muy buen pack, completo, con PDF´s y video tutoriales. Felicidades por el trabajo

    ResponderEliminar
  10. Enhorabuena. Un trabajo muy completo. Gracias por la dedicación

    ResponderEliminar
  11. Una pregunta, de hilos (Thread) no teneis nada o eso se da en otra clase? Y si es así podría obtener los apuntes sobre hilos de esa clase? Un saludo

    ResponderEliminar
    Respuestas
    1. Hola, lo siento pero estos videos son de un curso de iniciación a la POO para ingeniería y en un cuatrimestre de 6 créditos no nos da tiempo a más.

      Eliminar
  12. Buenos noches profesor Riquelme . Primero felicitarle por sus videos y el material de trabajo insertado .Tengo una duda con el tema de paso de argumentos por valor o referencia ,según he visto cuando se pasa un argumento a un parámetro de un método se hace siempre por valor ,pero en muchos foros he visto que se hace también por referencia.En un foro en concreto vi que muchos programadores se decantaban por una u otra opción o por las dos ,al final cuando creía que se pasaba solo por valor veía argumentos contrarios y eso parecía una discusión de filósofos pues cada uno decía una cosa diferente . En definitiva creía entenderlo pero salí con varias dudas .Podría usted aclararme el paso de argumentos por valor y por referencia .Muchas gracias profesor por sus videotutoriales.

    ResponderEliminar
    Respuestas
    1. Supongo que ya has visto los dos videos sobre este tema que están enlazados más arriba:

      http://www.youtube.com/watch?v=4hOZnkLhVX8

      http://www.youtube.com/watch?v=P-t0lwk1GNs

      Resumiendo: la confusion viene porque Java se podría decir que tiene los dos tipos de argumentos (por valor y por referencia) según el tipo de dato que se esté pasando al método. Los datos inmutables (primitivos, wrappers, String) son por valor (no podría ser de otra manera). Los objetos mutables son por referencia (efectivamente tampoco podría ser de otra forma). Por tanto en Java cada argumento se comporta como corresponde a su naturaleza. Por eso hay autores que dicen una cosa y otros que dicen otra, incluso algunos (como yo) que opina que en Java no debería hablarse de parámetros por valor o por referencia que es nomenclatura de lenguajes como el C.

      Eliminar
  13. Hola, vivo en Málaga y soy estudiante de primer año de Ingeniería Informática en la Uma.
    El motivo de mi correo es agradecerle sus vídeos que encontré en su blog, lamentablemente en la Uma no nos han enseñado java de una manera comprensible al alumno y a muchos nos a costado entenderlo, tengo el examen de java el próximo martes así que solo quería agradecer sus tan claras explicaciones que me están ayudando muchísimo, que Dios lo bendiga.

    ResponderEliminar
    Respuestas
    1. Buenas, yo tambien soy alumno de la asignatura de POO de ingenieria de la salud en la UMA y pienso lo mismo.

      Muchas gracias por estas enseñanzas son de gran ayuda.

      Eliminar
  14. Buenas, en el 3º Parcial del curso 2013-2014, en el ejercicio 5 dice lo siguiente:
    5. Usando el método del apartado 4 implemente un método que devuelva el distrito (o varios por si

    hubiera empate) con el mayor número medio de habitaciones. (1 punto)



    public List getDistritoMaximoHabitaciones(){

    SortedMap>mapinv=getMapDistritoXHabitaciones();

    Double max=mapinv.lastKey();

    return mapinv.get(max);

    }
    Al devolver el distrito o varios, (por eso la lista de Integer), aparece lastKey() que devuelve la última clave del Map, por lo tanto mi duda es, ¿si en caso de empate también devuelve consecuentemente todos los distritos y por ello se usa lastKey()?

    ResponderEliminar
    Respuestas
    1. Lo primero que debes tener en cuenta es que en el código de arriba faltan los tipos del Map ya que el símbolo < no sale en HTML.

      Por otra parte, el conjunto de claves del map inverso es de tipo Double y el conjunto de valores de tipo List de Integer. Por eso, mapinv.lastKey() se asigna a max de tipo Double y mapinv.get(max) es de tipo List de Integer.

      Mira los videos de invertir un Map y entenderás mejor por qué el conjunto de valores del map inverso es de tipo List

      Eliminar
  15. hola, primero agradecer este gran aporte del Sr. Riquelme. y en segundo lugar queria saber si pueden subir las carpetas con el codigo del Proyecto libreria y el paquete Publicacion.....desde ya muchas gracias

    ResponderEliminar
  16. Hola gracias por tu atención. Varias veces me han pedido el código de los programas explicados, pero no estoy seguro de que sea didácticamente conveniente darlo. Creo que el alumno debe obligarse a escribir el código a la vez que se explica en el vídeo, pues si no es escribiendo el código hay muchas cuestiones sintácticas que pasarían desapercibidas. Tengo la idea (puede que equivocada) de que si se proporciona el código el alumno se va a limitar a echarle un vistazo y no a escribirlo que es realmente como se aprende a programar. Si el tener el código es por algún error, basta con escribirlo aquí y se intentará ayudar.

    ResponderEliminar
    Respuestas
    1. muchas gracias de todas formas, mi pedido se fundamentaba en que viendo los videos me encontre que partian de Clases que se habias construido anteriormente en otros videos pero no encontre esos videos para descargarlos, precisamente en los que se explicaban el Proyecto Libreria, sin embargo respeto su punto punto de vista. Un abrazo desde Argentina

      Eliminar
  17. Hola gracias por compartir este fabuloso curso de POO. No se si sería posible activaran los siguientes enlaces:

    - Enlace al código del tipo ListaValores realizado por Enric Climent

    - Enlace al código del tipo Medicamento realizado por Enric Climent

    Gracias,

    saludos!!

    ResponderEliminar
  18. Esos enlaces son externos, me los ofreció el propio Enric pero por lo que veo los ha deshabilitado

    ResponderEliminar
  19. Profesor, tengo una duda con lo que es el equals en caso de herencia, en el ejemplo de pixel que hereda de punto.
    Pixel instanceof Punto = true
    Punto instanceof Pixel = false
    Se debe cumplir simetría? en el caso de:
    unPunto = new Punto(0,0);
    unPixel = new Pixel(0,0,negro);
    unPunto.equals(unPixel); = true
    unPixel.equals(unPunto); = false
    ¿Es normal? o la simetría es para un solo equals y aquí tenemos dos diferentes.
    Tengo otra una duda, que sucede para los datos que son identificadores únicos e irrepetibles (DNI, de persona por ejemplo), es válido usarlos como único involucrado en el equals, ¿Cuál sería la peor situación?
    He visto códigos en los que lo han hecho, y me da no sé qué al verlo, sé que no es muy elegante, pero, no le encuentro consecuencias grabes, aunque seguro que deben haber. Suelo seguir las reglas de sus vídeos, para no arriesgarme.
    También he visto, en algunos ejemplos equals que dependen del toString, (hacen primero el toString y luego el equals comparando las cadenas). No me gusta decirlo, pero se ve tentador, en especial por el instanceof que verifica el tipo.

    Saludos cordiales, y gracias por compartir sus clases.

    ResponderEliminar
  20. La herencia suele traer los problemas que comentas con el equals y con el compareTo. Por eso, sólo suelen definirse en la clase padre y no en la clase hija. Respondiendo a tu pregunta efectivamente un Pixel es un Punto pero un Punto no es un Pixel y el método instanceof devolverá true unPixel instanceof Punto y false en unPunto instanceof Pixel. Respecto del equals depende de si redefines el equals o no en Pixel. Si no lo haces puedes comparar unPixel y unPunto sin problemas en ambos sentidos. Si redefines equals en Pixel entonces la comparación de unPixel y unPunto te dará falso puesto que unPunto no es un Pixel. Respecto de las propiedades implicadas en el equals, deben ser previamente definidas. En problemas reales está claro que el DNI o el ISBN son identificadores únicos, en clase solemos poner algunas propiedades más para dar un poco más de "gracia" al código del equals. Lo que si debe ser como explicamos en los vídeos es que las propiedades implicadas en el equals

    ResponderEliminar
  21. Muchas gracias Profesor Riquelme por todo este fantástico material. En septiembre con suerte hare un ciclo superior de programacion en el cual se da Java y estoy adelantandome un poco.

    Espero en el futuro poder entrar a la carrera y dar clase con usted porque es fantastico oirle explicar.

    Un saludo!

    ResponderEliminar
  22. En el video 3 del tema Map (map para contar caracteres) no entiendo la parte en que dice: si está el carácter se usa esta parte del for, si no esta se usa la otra.
    Los primeros caracteres no van a estar ninguno, no? entonces por qué utiliza la parte del for donde su supone que si están...
    No se si me explico

    ResponderEliminar
    Respuestas
    1. El algoritmo debe servir para todos los caracteres, los primeros y los últimos. De hecho solo podemos suponer que no está el primero ya que el segundo podría ser el mismo que el primero.

      Eliminar