
This course includes our updated coding exercises so you can practice your skills as you learn.
See a demo
Este curso cubre los tres exámenes de certificacion OCP 8. El 1Z0−809 para quienes hayan superado el examen OCA 8 (1Z0−808). El OCP 8 Upgrade Exam (1Z0−810) para quienes hayan superado el examen OCP 7 Exam (1Z0−804) o el examen OCP 7 Upgrade Exam (1Z0−805). Y el OCP 8 Upgrade Exam (1Z0−813) para quienes hayan superado cualquiera de los examenes SCJP/OCJP Java 6 y anteriores.
Este curso sigue estrictamente el contenido del curso oficial 'Oracle Certified Professional Java SE Programmer guide II', así como cada uno de los objetivos del examen OCP 8 aunque también puede ser una guía ideal para actualizarte con las nuevas características de Java 8. Asumo que tienes instalado el JDK 8 y que estás familiarizado con algún entorno de desarrollo Java como Eclipse o NetBeans. Por otro lado, si necesitas refrescar algunos conceptos básicos de Java, te recomiendo mi curso 'OCA 8'.
El operador 'instanceof' suele utilizarse para identificar conversiones de tipo válidas en tiempo de ejecución. En esta lección, veremos cuándo y como utilizar el operador 'instanceof'.
Desde Java 8, los métodos que no son static reciben el nombre de virtuales. En esta lección, veremos qué son los métodos virtuales y el mecanismo de invocación.
La anotación @Overrides previene errores de nomenclatura. En esta lección, estudiaremos qué es y cuándo utilizar la anotación @Overrides.
La clase Object, heredada por todas las clases Java de forma implícita, define una serie de métodos que pueden ser útiles rescribir. En esta lección, veremos cuáles son esos métodos y qué significado tienen.
Cuando programamos, es común definir un tipo que sólamente puede tener un conjunto finito de valores. En esta lección, estudiaremos los enumerados que representan un conjunto de constantes.
En esta lección, abordaremos las clases anidadas. Clases definidas dentro de otras clases. Las clases anidadas miembro, es decir, que no son estáticas, se conocen como clases internas. Las clases anidadas además pueden ser locales, anónimas y estáticas.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
Las interfaces pueden facilitar el diseño rápido de una aplicación porque proporcionan una guía de desarrollo al equipo que puede trabajar en paralelo. En esta lección, repasaremos qué son las interfaces y como utilizarlas adecuadamente así como las novedades que incorpora Java 8, métodos por defecto y métodos estáticos.
Java define una interfaz funcional como una interfaz que contiene un único método abstracto. En esta lección, veremos una introducción a la programación funcional y a las expresiones lambda.
Una interfaz, múltiples implementaciones. En esta lección, abordaremos la importancia de saber utilizar las propiedades del polimorfismo correctamente.
Un principio de diseño es una práctica reconocida o idea con fundamento que facilita el proceso de diseño del software. En esta lección, veremos algunos principios de diseño de creación de clases.
Un patrón de diseño de software es una solución a un problema recurrente dentro de un cierto contexto. En esta lección, revisaremos los patrones de diseño más comunes como el patrón Singleton.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
La framework de colecciones de Java incluye implementaciones de las interfaces List<E>, Map<K, V>, Queue<E> y Set<E> que ya debes conocer.
Las clases genéricas son contenedores tipados. En esta lección, veremos qué es el autoboxing, cómo se utilizan las clases genéricas y que problemas resuelven.
Una colección es un grupo de objetos contenidos en un sólo objeto. La Framework Collections de Java es un conjunto de clases del paquete java.util que se utilizan para guardar colecciones. En esta lección, abordaremos las colecciones más comunes de la Framework Collections.
La interfaz Comparable expresa el orden 'natural' de un objeto, mientras que la interfaz Comparator puede entenderse como una forma alternativa de ordenación de objetos. En esta lección, repasaremos cuáles son las diferencias entre Comparator y Comparable.
La búsqueda y la ordenación son temas recurrentes con lo que estamos familiarizados. El método sort facilita la tarea a la hora de ordenar colecciones de objetos que implementan las interfaces Comparable o Comparator. En este lección, veremos algunas de las técnicas de búsqueda y ordenación.
Java 8 introdujo numerosas mejoras: referencias a métodos, expresiones lambdas y streams entre otros. En esta lección, abordaremos en profundidad esas mejoras.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
Las expresiones lambda usan el mismo conjunto de reglas que las clases internas. Las lambdas pueden acceder a variables estáticas, variables de instancia, parámetros de métodos efectivamente finales y variables locales efectivamente locales. En esta lección, aprenderemos a usar variables definidas fuera de la expresión lambda.
Java 8 introduce algunas interfaces funcionales, las que declaran un sólo método abstracto, de conveniencia que debes conocer. En esta lección, conoceremos las interfaces funcionales más importantes de Java 8 como Supplier<T>, Consumer<T>, Predicate<T> y Function<T, R>.
Podemos pensar en la clase Optional como una caja que puede estar vacía o quizás contenga algo. En esta lección, veremos como usar la clase Optional como valor de retorno y como alternativa a null.
Un stream, en Java, es una secuencia de datos y un stream pipeline es las operaciones que se ejecutan en un stream para producir un resultado. Similar a una línea de ensamblaje de una fábrica. En esta lección, veremos qué son y cómo se utilizan lo Streams.
Además de streams de objetos, Java 8 proporciona streams de datos de tipo int, long y double. En esta lección, repasaremos los streams de valores primitivos.
Además de todo los visto hasta ahora, existen relaciones entre los streams y los datos, también se pueden encadenar Optional y agrupar collectors. En esta lección, veremos algunos usos avanzados de los Streams.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
Java 8 ha supuesto un verdadero lavado de cara a la hora de trabajar con fechas y horas. Y aunque todavía es posible utilizar la clases tradicionales, estas clases no forman parte del examen. En esta lección, revisaremos la nueva forma de trabajar con fechas, horas y ambas combinadas.
La clase String no forma parte de los objetivos del examen pero está omnipresente en prácticamente todas las preguntas. En esta lección, revisaremos aquellos aspectos más rebuscados de la clase String.
Muchas aplicaciones se utilizan en diferentes paises o zonas geogràficas: el formato de las fechas, la moneda, etc. tienen que adaptarse a cada localidad. En esta lección, trataremos el tema de la internalización (I18N) y localización.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
Como sabes hay dos categorias de excepciones: comprobadas y no comprobadas. Un programa puede fallar por múltiple razones, entre otras: problemas de Entrada/Salida, fallo en la conexión a la red, error de sintaxis en una orden SQL o error de formato al usar la clase DateTimeFormatter. En esta lección, veremos en detalle cómo gestionar adecuadamente las excepciones.
Aunque Java proporciona múltiples excepciones listas para usar ('out of the box'), en ocasiones, puede ser conveniente crear una excepción propia más especializada. En esta lección, trataremos el tema de las excepciones personalizadas.
Cuando algo va mal, lo habitual es registrar el problema y relanzar la excepción enmascarada como una excepción no comprobada, de tipo 'RuntimeException'. La orden multi-catch nos permite escribir la gestión de excepciones sin repetición de código. En esta lección, abordaremos la orden multi-catch nueva desde Java 8.
Como debes saber, un bloque try debe tener uno o más bloques catch y/o un bloque finally. En cambio, la orden try con recursos permite omitir tanto el bloque catch como el bloque finally, aunque ambos son perfectamente legales. En esta lección, estudiaremos la orden try-con-recursos presente desde Java 8.
Registrar y reenviar una excepción a menudo como una excepción no comprobada es un patrón muy común. En esta lección, aprenderemos a utlizar este mecanismo de gestión de errores.
Una aserción es una expresión lógica que se coloca en un punto del código estratégico donde queremos que una cierta condición sea cierta. Lo que ayuda a detectar condiciones de error en el código. En este lección, trataremos en profundidad el tema de las aserciones, así como cómo habilitarlas y deshabilitarlas.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
Un thread o hilo es la unidad de ejecución más pequeña que puede gestionar el Planificadorr (Scheduler) del Sistema Operativo, en contraste con los procesos, de donde derivan. Los threads se ejecutan en un entorno compartido y pueden comunicarse entre ellos. En esta lección, profundizaremos en el uso de los threads.
La interfaz Runnable está omnipresente a la hora de trabajar con threads. Define un único método abstracto llamado run() y por lo tanto es una intefaz funcional.
La interfaz ExecutorService crea y gestiona thread por nosotros. Podemos obtener un ExecutorService mediante la clase de factoria Executors. En esta lección, veremos la interfaz ExecutorService y clases afines.
La interfaz Callable<T> representa una tarea que retorna un valor y que puede lanzar una excepción.
Las interfaces Callable<T>, Future<T> y ExcecutorService están íntimamente ligadas. Un objeto ExecutorService ejecuta el método submit() que tiene como parámetro un Callable<T> y que retorna un Future<T>.
La interfaz ScheduledExecutorService como sabes deriva de la interfaz ExecutorService y añade funcionalidad para ejecurar tareas después de un intervalo de tiempo o de forma repetitiva.
Los pools de threads son conjuntos the threads listos para ser usados, lo que disminuye drásticamente el tiempo de creación e inicilización de objetos.
Dado que los threads se ejecutan en un entorno compartido, debemos procurar lo medios para que la concurrencia no produzca efectos no deseados. En esta lección, aprenderemos a acceder adecuadamente a los datos de áreas compartidas.
Además de las clases a prueba de threads proporcionadas por Java, podemos sincronizar ciertos fragmentos de código e incluso métodos enteros mediante un lock o cerrojo.
La Java Collections Framework de Java 8 introduce nuevas clases concurrentes con soporte multi-threading. En esta lección, revisaremos a fondo las colecciones con soporte multi-thread.
La API Collections contiene algunas soluciones interesantes al problema del acceso concurrente, más concretamente, las interfaces: BlockingQueue, ConcurrentMap y ConcurrentNavigableMap.
Junto con la clase ConcurrentHashMap Java 5 introdujo implementaciones copy-on-write de una lista, la clase CopyOnWriteArrayList y de un conjunto, la clase CopyOnWriteArraySet.
A menudo puede ser necesario obtener una colección sincronizada partiendo de una que no lo es, ya sea una lista o un conjunto o un mapa.
La API Streams proporciona la programación funcional en Java y además cuenta de serie con soporte para la concurrencia. En esta lección, veremos los streams paralelos en contraposición a los streams série, que son capaces de procesar resultados concurrentemente.
Como sabes, los streams paralelos pueden llegar a representar un incremento sustancial en la productividad (performance).
Las reducciones son operaciones complejas que pueden procesar colecciones de objetos y devolver un valor u objeto.
La API Concurrency incluye clases que pueden usarse para coordinar tareas entre un grupo de threads relacionados. En esta lección, repasaremos la gestión de procesos concurrentes.
Cuando dos threads pretenden acceder a un mismo recursos compartido, pueden bloquearse entre ellos lo que se conoce como abrazo mortal. Corregir este tipo de problemas es una de las tareas más difíciles que puede llevar a cabo un desarrollador. En esta lección, veremos algunos de los problemas derivados del uso de threads y cómo prevenirlos.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
Un fichero (file) es un registro dentro del Sistema de Archivos. Los ficheros se organizan dentro de directorios. Un directorio o carpeta es un registro dentro del Sistema de Archivos que puede contener ficheros así como otros directorios. Finalmente el directorio raíz es el directorio inicial, del que 'cuelgan' el resto de carpetas y ficheros, como por ejemplo la unidad C:\ en Windows o la barra inclinada en sistemas Linux '/'. En esta lección, repasaremos el concepto de Sistema de Archivos.
Los streams de procesamiento de las Entradas y Salidas (I/O) no tienen ninguna relación con la API Streams asociada con la Programación Funcional. En esta lección, aprenderemos qué son los Streams desde el punto de vista de las entradas y salidas.
InputStream's, OutputStream's con o sin buffers, Reader's y Writer's así como la serialización son los objetivos de esta lección. En ella, revisaremos los streams de entrada y salida más habituales.
El paquete java.io incluye numerosas clases que se pueden utilizar para interactuar con el usuario. La clase java.io.Console se introdujo con el JDK 6 como una forma evolucionada de System.in y System.out. Actualmente es la forma recomendada de interacción en un entorno textual como la pantalla y el teclado. En esta lección, veremos cómo interactuar con el usuario en un entorno basado en texto.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
La interfaz java.nio.file.Path es el punto de entrada principal a la hora de trabajar con NIO.2. Un objeto de tipo Path representa una ruta en el Sistema de Ficheros independientemente de la plataforma, ya sea un fichero o directorio. En esta lección, presentaremos la API NIO.2.
La API NIO.2 proporciona un rico repertorio de métodos estáticos y clases que trabajan con objetos Path. En esta lección, veremos en detalle las clases Paths y Files.
La clase Files ademas de numerosos métodos utilizados para crear, modificar, leer o eliminar un fichero, también proporciona acceso a los metadatos (datos que describen otros datos) de esos ficheros. En esta lección, repasaremos los atributos más importantes de los ficheros.
Buscar un fichero dentro del Sistema de Ficheros nunca fue tan fácil. Tareas que anteriormente requerían un gran esfuerzo de programación con el JDK 8 se han simplificado enormemente. En esta lección, aprenderemos a utilizar los nuevos métodos a la hora de trabajar con el Sistema de Ficheros.
La inmensa mayoría de métodos de la clase File tienen su contrapartida en la API NIO.2. Y es de hecho, la forma recomendada de proceder. En esta lección, compararemos la clase File y la API NIO.2.
En esta lección, resumiremos brevemente los contenidos de esta sección.
En esta lección, revisaremos los puntos clave del examen.
· Este curso es un curso dirigido a programadores Java que dominen los contenidos del curso OCA y que quieran conocer en profundidad detalles del lenguaje Java que probablemente ignoran.
· Consta de 10 secciones e incluye el código fuente así como varios tests ampliamente comentados al final de cada sección.
· Sigue la estructura del Curso de certificación Oracle Certification Professional por lo que al terminar el curso estarás en condiciones de superar el examen oficial.
· En función de tus conocimientos actuales y experiencia el curso puede ocuparte entre unas pocas semanas o varios meses.
· Este curso, no es una curso de iniciación a Java sino un curso de certificación (no oficial) diseñado para ayudar a aquellos programadores Java que quieran dar un importante paso adelante en su vida profesional.
Durante las próximas semanas:
• Revisaremos todos y cada uno de los objetivos del examen oficial 1Z0-809.
• Descubrirás detalles que seguramente desconocías y que te harán sentir un excelente programador.
• En definitiva, profundizarás en el uso de uno de los lenguajes de programación más solicitados actualmente.
• Cuando superes el examen oficial, formarás parte de un selecto grupo de programadores certificados.