jueves, 12 de noviembre de 2015

Servlets

Definición de servlet
El servlet es una clase en el lenguaje de programación Java, utilizada para ampliar las capacidades de un servidor. Aunque los servlets pueden responder a cualquier tipo de solicitudes, éstos son utilizados comúnmente para extender las aplicaciones alojadas por servidores web, de tal manera que pueden ser vistos como applets de Java que se ejecutan en servidores en vez de navegadores web. Este tipo de servlets son la contraparte Java de otras tecnologías de contenido dinámico Web, como PHP y ASP.NET.

La palabra servlet deriva de otra anterior, applet, que se refiere a pequeños programas que se ejecutan en el contexto de un navegador web. El uso más común de los servlets es generar páginas web de forma dinámica a partir de los parámetros de la petición que envíe el navegador web.

Historia
La especificación original de Servlets fue creada por Sun Microsystems (la versión 1.0 fue terminada en junio de 1997). Comenzando con la versión 2.3, la especificación de Servlet fue desarrollada siguiendo el Proceso de la Comunidad Java (Java Community Process).

Ciclo de vida
1. Inicializar el servlet
Cuando un servidor carga un servlet, ejecuta el método init del servlet. El proceso de inicialización debe completarse antes de poder manejar peticiones de los clientes, y antes de que el servlet sea destruido.

Aunque muchos servlets se ejecutan en servidores multi-thread, los servlets no tienen problemas de concurrencia durante su inicialización. El servidor llama sólo una vez al método init al crear la instancia del servlet, y no lo llamará de nuevo a menos que vuelva a recargar el servlet. El servidor no puede recargar un servlet sin primero haber destruido el servlet llamando al método destroy.

2. Interactuar con los clientes
Después de la inicialización, el servlet puede dar servicio a las peticiones de los clientes. Estas peticiones serán atendidas por la misma instancia del servlet, por lo que hay que tener cuidado al acceder a variables compartidas, ya que podrían darse problemas de sincronización entre requerimientos simultáneos.

3. Destruir el servlet
Los servlets se ejecutan hasta que el servidor los destruye, por cierre del servidor o bien a petición del administrador del sistema. Cuando un servidor destruye un servlet, ejecuta el método destroy del propio servlet. Este método sólo se ejecuta una vez y puede ser llamado cuando aún queden respuestas en proceso, por lo que hay que tener la atención de esperarlas. El servidor no ejecutará de nuevo el servlet hasta haberlo cargado e inicializado de nuevo.

Clases y objetos necesarios
Podemos crear un Servlet haciendo uso del paquete javax.servlet.

Interface HttpServletRequest
Sigue este enlace para ver su definición detallada (en inglés): http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html

Interface HttpServletResponse
Sigue este enlace para ver su especificación detallada (en inglés): http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletResponse.html

Beneficios de utilizar Servlets en lugar de CGI
Son más eficientes y utilizan menos recursos. CGI utiliza un nuevo proceso por cada petición. En cambio en los Servlets sólo existe una copia cargada en la máquina virtual y por cada petición se inicia un hilo, lo cual reduce el uso de memoria del servidor y el tiempo de respuesta.
Tienen persistencia, por lo que siguen "vivos" una vez terminada la petición.

Ejemplo
Código de ejemplo de un Servlet que procesa una petición GET y devuelve una página web HTML sencilla:

package org.pruebas;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HolaMundoServlet extends HttpServlet {

    /**
     * Servlet de ejemplo que procesa una petición GET
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException 
     */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
        out.println("<html>");
        out.println("<head><title>Ejemplo Hola Mundo</title></head>");
        out.println("<body>");
        out.println("<h1>¡Hola Mundo!</h1>");
        out.println("</body></html>");
    }
}

miércoles, 11 de noviembre de 2015

Inserccion de Applets en una pagina HTML

 Inserción de Applets Java.


De ahora en adelante consideraremos que ya tenemos un applet, bien porque lo hemos programado nosotros mismos, bien porque estamos usando un applet de distribución gratuita, es hora de aprender a insertarlo en nuestra página Web. Para ello usaremos una nueva etiqueta: APPLET. Esta etiqueta está formada por una instrucción de inicio, <APPLET>, y una instrucción de fin, </APPLET>.

Atención.
La etiqueta APPLET fue introducida por Netscape en la versión 2.0 de Navigator fruto de un acuerdo con Sun para soportar la tecnología Java. Todos sus navegadores posteriores también la soportan. El otro gran navegador, Microsoft Internet Explorer, soporta la tecnología Java desde la versión 3.0. En cuanto al estándar se refiere, esta etiqueta se incluye en la especificación HTML 3.2, aunque no podemos asegurar que los navegadores posteriores que respetan la norma HTML 3.2 soporten la tecnología Java, simplemente entienden la etiqueta, pero no son capaces de ejecutar un applet.

La inserción de un applet en una página es similar a la inserción de una imagen, a lo cual ya estamos muy acostumbrados. Deberemos especificar el archivo donde se encuentra el applet y las dimensiones (anchura y altura) que este debe ocupar en la página. Al igual que ocurría con las imágenes el applet se introducirá en el lugar exacto donde indique su código, si es necesario se insertará entre el texto, pero no pasará a una nueva línea, como sucedía con las marquesinas, si no lo indicamos específicamente (con la etiqueta <BR>). Para indicar el archivo en el que se encuentra el applet usaremos el atributo CODE y para especificar la anchura y altura en pixeles usaremos WIDTH y HEIGHT respectivamente. En resumen, para insertar un applet debemos usar el siguiente código en cualquier lugar de la página:


<APPLET CODE="nombre_applet.class" WIDTH="ancho" HEIGHT="alto">
</APPLET>

Los tres atributos que hemos usado deben incluirse obligatoriamente siempre que insertemos un applet. Esto parece obvio con el atributo CODE, ya que no se podría insertar el applet sin indicar donde está, pero resulta más extraño con los atributos WIDTH y HEIGHT. Aun así, si no especificamos el tamaño que debe ocupar el applet en la página no será mostrado ni ejecutado por el navegador. Debemos estar muy atentos a este detalle ya que hasta ahora estos dos atributos eran totalmente optativos y por ello es un error común olvidarlos y no ser capaz de descubrir porqué no funciona el applet.

Y aquí vemos como insertar un applet de ejemplo:


<HTML>
<HEAD>
<TITLE>Applet sonoro</TITLE>
</HEAD>
<BODY>
<APPLET CODE="SoundExample.class" WIDTH=450 HEIGHT=50></APPLET>
</BODY>
</HTML>

Los applets Java tienen la terminación .class, como ya hemos comentado antes, esto exige que para poder usar un applet debemos utilizar un sistema operativo que soporte nombres largos. Desgraciadamente los usuarios de Windows 3.1 no podrán probar esta tecnología localmente en su ordenador. Afortunadamente esto no significa que no puedan disfrutar los applets que estén publicados en el WWW.

Pasemos a explicar que ocurre cuando el navegador se encuentra con el código anterior. En primer lugar busca el archivo SoundExample.class en la misma dirección URL y en el mismo directorio donde se encuentre la página actual y lo baja a nuestro ordenador (este es un ejemplo en el que ambos archivos ya están en nuestro ordenador, con lo que este paso no sería necesario). Mientras reserva un rectángulo, con las dimensiones especificadas por los atributos WIDTH y HEIGHT, donde será mostrado el applet. Una vez ha llegado el archivo anterior el navegador llama a lo que se conoce como máquina virtual Java (también llamada JVM, Java Virtual Machine) que pasará a ejecutar el applet. A partir de ese momento el applet se ejecutará como cualquier otro programa de nuestro ordenador, aunque lo hará en el interior de la página Web. De esta forma cuando nuestro cursos este dentro del rectángulo de 450x50 creado el control pasará al applet y si pulsamos los botones el propio applet será el encargado de realizar las acciones oportunas. La Máquina Virtual Java implementa además ciertas medidas de seguridad para que el applet no pueda, por ejemplo, borrar nuestro disco duro. Una vez conocemos el funcionamiento de los applets podemos adentrarnos más a fondo en las diferentes características de estos que pueden ser modificadas con el lenguaje HTML.

lunes, 12 de octubre de 2015

Creacion de applets

Programación Orientada a Objetos

Creación de Applet:

7 pasos sencillos para la creación de una applet:

1. Introducción 
2. Estructura de un applet 
3. Inserción en una página web 
4. Dibujando sobre un applet 
5. Etiquetas y botones 
6. Entradas de Texto 
7. Ejemplo: regresión lineal

1. Introducción 

Los applets son objetos Java que: 
• presentan una ventana gráfica para su ejecución 
• tienen un conjunto bien definido de operaciones que: - les permiten formar parte de otros programas (p.e., appletviewer) - y estar integrado en páginas web 
• permiten por tanto crear páginas web dinámicas 
• tienen algunas restricciones especiales: - no tienen operación main() - están gobernados por eventos - la entrada/salida es diferente a la de las aplicaciones

Eventos
Los eventos son sucesos que el sistema detecta relacionados con el programa, la entrada/salida, y el sistema de ventanas: 
• eventos de ratón: mover, hacer click, ...
 • eventos de teclado: pulsar o liberar una tecla 
• eventos de acción: pulsación de un botón o menú 
• eventos de texto: cambiar el valor de una entrada de texto 
• eventos de ventana: cerrar una ventana, abrirla, minimizarla... 
• etc.

Arquitectura gobernada por eventos (cont.):
En un programa gobernado por eventos: 
• hay operaciones que gestionan eventos 
• el applet está esperando a que llegue un evento 
• cuando el sistema detecta un evento llama a la operación asociada a ese evento • la operación debe terminar pronto • la operación no debe esperar a que algo ocurra (p.e., leer) • el usuario inicia la acción, no al revés como en las aplicaciones

2. Estructura de un applet

import java.awt.*;
import java.applet.*; 
public class SimpleApplet extends Applet { 
String mens;
public void init() { 
 mens="Inicializado"; 
 }
 public void start() { 
 mens=mens+" Comienza"; 
 } 
public void paint(Graphics g) { 
 g.drawString(mens,80,10); 
 } 
}

3. Inserción en una página web

Para insertar un applet en una página web: 
• con Bluej: “Run Applet in Web browser” 
• si la herramienta de creación de páginas web lo permite, añadir el applet en el lugar deseado 
• si no, añadir con el editor de textos en el lugar deseado: 
 donde: - codebase: directorio donde se encuentran las clases 
            - code: nombre del applet 
            - width, height: ancho y alto de la ventana

Visualización
Con un navegador de internet 
• Ojo: suelen usar versiones viejas de Java 
• Actualizar la máquina virtual java si es necesario 
Con la herramienta appletviewer: appletviewer pagina.html

4. Dibujando sobre un applet

La salida se hace dibujando sobre un entorno gráfico desde el método 
paint(): 
 - drawString(String str, int x, int y) 
 - drawLine(int startX, int startY, int endX, int endY) 
 - drawREct(int x, int y, int ancho, int alto) - drawOval(int x, int y, int ancho, int alto) 
 - drawArc(int x, int y, int ancho, int alto, int anguloInicial, int anguloBarrido)
 - drawPolygon (int x[], int y[], int numPuntos) 

Todas las coordenadas en pixels, siendo (0,0) la esquina superior izquierda 
Ángulos en grados, 0=horizontal

Ejemplo:

import java.awt.*; 
import java.applet.*; 
public class Dibujo extends Applet { 
public void init() { 
 } 
public void start() {
 } 
public void paint(Graphics g) 
{ g.drawOval(10,10,100,100); 
 g.drawOval(30,30,20,20);
 g.drawOval(70,30,20,20);
 g.drawArc(30,30,60,60,210,120); 
 }
 }

5. Etiquetas y botones

Las etiquetas son ventanas de la clase Label con un texto, que se pueden añadir a un applet (con add()) Los botones de la clase Button, además de lo anterior, producen un evento de “acción” al ser pulsados • hay que programar el applet para que atienda a eventos de acción; para ello: - debe implementar ActionListener - debe tener una operación actionPerformed(), que atiende a todos los eventos de acción • hay que indicar que los eventos del botón son atendidos por el applet: - con la operación addActionListener()

Ejemplo:

import java.awt.*;
import java.applet.*;
import java.awt.event.*; 
public class Contador extends Applet implements ActionListener{

 Label mens; 
 Button incr,decr; 
int cuenta=0; 

public void init() { 
 mens=new Label ("Contador: "+cuenta);
 incr=new Button("Incrementar");
 decr=new Button("Decrementar"); 
 add(incr); 
 add(decr); 
 add(mens);
 incr.addActionListener(this); 
 decr.addActionListener(this); 
 }

Ejemplo (cont.):

public void actionPerformed(ActionEvent ev) { 
 String str = ev.getActionCommand();
 if (str.equals("Incrementar")) { 
 cuenta++; 
 }
 else if (str.equals("Decrementar")) { 
 cuenta--; } 
 mens.setText("Contador: "+cuenta); } 
public void start() {
 } 
public void paint(Graphics g) { 
 }
 }

6. Entradas de Texto

Son objetos de la clase TextField que:
 • presentan una ventana en pantalla en la que se puede teclear un texto 
• se pueden añadir a un applet • se puede leer su valor con getText() 
• generan eventos de tipo texto

Ejemplo:

import java.awt.*;
 import java.applet.*; 
import java.awt.event.*;
 public class Temperatura extends Applet 
implements ActionListener
 { 
 Label mens;
 Button af,ag; 
 TextField temp;

Ejemplo (cont.):

public void init() {
 mens=new Label (" "); 
 af=new Button("A Fahrenheit"); 
 ag=new Button("A Grados");
 temp= new TextField("0.0"); 
 add(af); 
 add(ag);
 add(temp); 
 add(mens); 
af.addActionListener(this); 
 ag.addActionListener(this); }

7. Ejemplo: regresión lineal

Se dispone de la clase RegresionLineal2, con la siguiente interfaz: 
public class RegresionLineal2 {
 public class NoCabe extends Exception {}
 public RegresionLineal2(int maxPuntos) 
public void inserta(double x, double y) throws NoCabe 
public double coefA() 
public double coefB() 
public double correlacion() 
public double valorY(double x) 
public void dibuja(Graphics g) 
}

Ejemplo (cont.):

import java.awt.*; 
import java.awt.event.*; 
import java.applet.*;
 public class AppletRL extends Applet implements ActionListener { 
 Button inserta, calcula; 
 TextField num1,num2;
 RegresionLineal rl; 
 String msg=""; 
boolean calculated=false;

//Initialize the applet public void init() 
{
try 
this.setSize(new Dimension(640,480));
 inserta=new Button("Inserta"); 
 calcula=new Button("Calcula");
 rl=new RegresionLineal(100); 
 num1=new TextField(8); 
 num2=new TextField(8); 
 Label lab1=new Label("X");
 Label lab2=new Label("Y");
 add(lab1); add(num1); 
 add(lab2); add(num2); 
 add(inserta); 
 add(calcula);

inserta.addActionListener(this); 
 calcula.addActionListener(this);
 }
 catch(Exception e) 
 e.printStackTrace(); 
 }
 }

public void actionPerformed(ActionEvent ev) { 
double x,y; String str = ev.getActionCommand(); 
if (str.equals("Inserta"))
 {
 try 
 x=Double.parseDouble(num1.getText());
 y=Double.parseDouble(num2.getText());
 rl.inserta(x,y);
 msg="Insertados "+num1.getText()+","+num2.getText(); } 
catch (Exception e) { 
 msg="Error en datos "; } 
 } 
else if (str.equals("Calcula")) { calculated=true; }
 repaint(); // fuerza a que se llame a paint() }

public void paint(Graphics g) { 
if (calculated) {
 g.drawString("Valores obtenidos. A="+rl.coefA()+
 " B="+rl.coefB()+ 
 " r="+rl.correlacion(),40,460);
 rl.dibuja(g); }
 else 
{
 g.drawString(msg,40,60);
 }
 } 
}

Applets

Programación Orientada a Objetos

Applets
Un applet es un componente de una aplicación que se ejecuta en el contexto de otro programa, por ejemplo en un navegador web. El applet debe ejecutarse en un contenedor, que le proporciona un programa anfitrión, mediante un plugin, o en aplicaciones como teléfonos móviles que soportan el modelo de programación por "applets".

A diferencia de un programa, un applet no puede ejecutarse de manera independiente, ofrece información gráfica y a veces interactúa con el usuario, típicamente carece de sesión y tiene privilegios de seguridad restringidos. Un applet normalmente lleva a cabo una función muy específica que carece de uso independiente. 

Ejemplos comunes de applets son las Java applets y las animaciones Flash. Otro ejemplo es el Windows Media Player utilizado para desplegar archivos de video incrustados en los navegadores como el Internet Explorer. Otros plugins permiten mostrar modelos 3D que funcionan con una applet.
Un Java applet es un código JAVA que carece de un método main, por eso se utiliza principalmente para el trabajo de páginas web, ya que es un pequeño programa que es utilizado en una página HTML y representado por una pequeña pantalla gráfica dentro de ésta.
Por otra parte, la diferencia entre una aplicación JAVA y un applet radica en cómo se ejecutan. Para cargar una aplicación JAVA se utiliza el intérprete de JAVA (pcGRASP de Auburn University, Visual J++ de Microsoft, Forte de Sun de Visual Café). En cambio, un applet se puede cargar y ejecutar desde cualquier explorador que soporte JAVA (Internet Explorer, Mozilla Firefox, Google Chrome, Netscape...).

En orientación a Objetos:

Un applet Java es un applet escrito en el lenguaje de programación Java. Los applets de Java pueden ejecutarse en un navegador web utilizando la Java Virtual Machine (JVM), o en el AppletViewer de Sun.
Entre sus características podemos mencionar un esquema de seguridad que permite que los applets que se ejecutan en el equipo no tengan acceso a partes sensibles (por ej. no pueden escribir archivos), a menos que uno mismo le dé los permisos necesarios en el sistema; la desventaja de este enfoque es que la entrega de permisos es engorrosa para el usuario común, lo cual juega en contra de uno de los objetivos de los Java applets: proporcionar una forma fácil de ejecutar aplicaciones desde el navegador web.
En Java, un applet es un programa que puede incrustarse en un documento HTML, es decir en una página web. Cuando un navegador carga una página web que contiene un applet, este se descarga en el navegador web y comienza a ejecutarse. Esto permite crear programas que cualquier usuario puede ejecutar con tan solo cargar la página web en su navegador.

Ventajas
Los applets de Java suelen tener las siguientes ventajas:
  • Son multiplataforma (funcionan en Linux, Windows, OS X, y en cualquier sistema operativo para el cual exista una Java Virtual Machine).
  • El mismo applet puede trabajar en "todas" las versiones de Java, y no sólo en la última versión del plugin. Sin embargo, si un applet requiere una versión posterior del Java Runtime Environment (JRE), el cliente se verá obligado a esperar durante la descarga de la nueva JRE.
  • Es compatible con la mayoría de los navegadores web.
  • Puede ser almacenado en la memoria caché de la mayoría de los navegadores web, de modo que se cargará rápidamente cuando se vuelva a cargar la página web, aunque puede quedar atascado en la caché, causando problemas cuando se publican nuevas versiones.
  • Puede tener acceso completo a la máquina en la que se está ejecutando, si el usuario lo permite.
  • Puede ejecutarse a velocidades comparables a las de otros lenguajes compilados, como C++ (dependiendo de la versión de la JVM).
  • Puede trasladar el trabajo del servidor al cliente, haciendo una solución web más escalable tomando en cuenta el número de usuarios o clientes.

Desventajas:
Los applets de Java suelen tener las siguientes desventajas:
  • Requiere el plugin de Java, que no está disponible por omisión en todos los navegadores web.
  • No puede iniciar la ejecución hasta que la JVM esté en funcionamiento, y esto puede tomar tiempo la primera vez que se ejecuta un applet.
  • Si no está firmado como confiable, tiene un acceso limitado al sistema del usuario - en particular no tiene acceso directo al disco duro del cliente o al portapapeles.
  • Algunas organizaciones sólo permiten la instalación de software a los administradores. Como resultado, muchos usuarios (sin privilegios para instalar el pluginen su navegador) no pueden ver los applets.
  • Un applet podría exigir una versión específica del JRE.
  • Puede tener vulnerabilidades que permitan ejecutar código malicioso.1

Polimorfismo y Manejo de Excepsiones

Programación Orientada a Objetos

Polimorfismo:
La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Este es uno de los conceptos esenciales de una programación orientada a objetos. Así como la herencia está relacionada con las clases y su jerarquía, el polimorfismo se relaciona con los métodos.
En programación orientada a objetos se denomina polimorfismo a 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. Un objeto polimórfico es una entidad que puede contener valores de diferentes tipos durante la ejecución del programa.
En algunos lenguajes, el término polimorfismo es también conocido como ‘Sobrecarga de parámetros’ ya que las características de los objetos permiten aceptar distintos parámetros para un mismo método (diferentes implementaciones) generalmente con comportamientos distintos e independientes para cada una de ellas.
En programación orientada a objetos, el polimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos. El único requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber responder al mensaje que se les envía.
La apariencia del código puede ser muy diferente dependiendo del lenguaje que se utilice, más allá de las obvias diferencias sintácticas.
Por ejemplo, en un lenguaje de programación que cuenta con un sistema de tipos dinámico (en los que las variables pueden contener datos de cualquier tipo u objetos de cualquier clase) como Smalltalk no se requiere que los objetos que se utilizan de modo polimórfico sean parte de una jerarquía de clases
El polimorfismo es una relajación del sistema de tipos, de tal manera que una referencia a una clase (atributo, parámetro o declaración local o elemento de un vector) acepta direcciones de objetos de dicha clase y de sus clases derivadas (hijas, nietas,…).

En general, hay tres tipos de polimorfismo:
Polimorfismo de sobrecarga
Polimorfismo paramétrico (también llamado polimorfismo de plantillas)
Polimorfismo de inclusión (también llamado redefinición o subtipado)






Polimorfismo de sobrecarga
El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra (éstas no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener la función "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es verlo en la pantalla.
Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varían de acuerdo a los parámetros que se les aplican. Así es posible, por ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando está haciendo referencia a una operación entre dos números enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenación).
Polimorfismo paramétrico
El polimorfismo paramétrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico selecciona automáticamente el método correcto a aplicar en función del tipo de datos pasados en el parámetro.
Por lo tanto, podemos por ejemplo, definir varios métodos homónimos de addition() efectuando una suma de valores.
  • El método int addition(int,int) devolvería la suma de dos números enteros.
  • float addition(float, float) devolvería la suma de dos flotantes.
  • char addition (char, char) daría por resultado la suma de dos caracteres definidos por el autor.
  • etc.
Una signature es el nombre y tipo (estático) que se da a los argumentos de una función. Por esto, una firma de método determina qué elemento se va a llamar.
Polimorfismo de subtipado
La habilidad para redefinir un método en clases que se hereda de una clase base se llama especialización. Por lo tanto, se puede llamar un método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarándolos con una interfaz común (siendo esta la clase básica).
Imagine un juego de ajedrez con los objetos reyreinaalfilcaballotorre y peón, cada uno heredan el objeto pieza
El método movimiento podría, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento de pieza sin tener que verse conectado con cada tipo de pieza en particular.



Clasificación Se puede clasificar el polimorfismo en dos grandes clases:
• Polimorfismo dinámico (o polimorfismo paramétrico) 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.
• Polimorfismo estático (o polimorfismo ad hoc) es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explicitados y declarados uno por uno antes de poder ser utilizados. El polimorfismo dinámico unido a la herencia es lo que en ocasiones se conoce como programación genérica.
También se clasifica en herencia por redefinición de métodos abstractos y por método sobrecargado. El segundo hace referencia al mismo método con diferentes parámetros. Otra clasificación agrupa los polimorfismo en dos tipos: Ad-Hoc que incluye a su vez sobrecarga de operadores y coerción, Universal (inclusión o controlado por la herencia, paramétrico o genericidad).
Ejemplo:

 ‘este método devuelve la suma de 2 parámetros
 Function suma (int numero1, int numero2)
 ‘este método devuelve la suma de los 3 parámetros
 Function suma (int numero1, int numero2, int numero3)
 ‘este método devuelve la concatenación de cadena1 y cadena2
 Function suma (String cadena1, String cadena2.


Ejemplo: polimorfismo.


public class A extends B {
public void print() {
System.out.println("A");
}

}
public class B {
public void print() {
System.out.println("B");
}

}
public class C extends B {
public void print() {
System.out.println("C");
}

}
public class Main {
public static void main(String[] args) {
B[] bs = new B[3];
bs[0] = new B();
bs[1] = new A();
bs[2] = new C();
naivePrinter(bs);

}

private static void naivePrinter(B[] bs) {
for (int i = 0; i < bs.length; i++) {
bs[i].print();
}

}
}

Manejo de excepciones.
El manejo de excepciones es una técnica de programación que permite al programador controlar los errores ocasionados durante la ejecución de un programa informático. Cuando ocurre cierto tipo de error, el sistema reacciona ejecutando un fragmento de código que resuelve la situación, por ejemplo retornando un mensaje de error o devolviendo un valor por defecto.
Una excepción en términos de lenguaje de programación es la indicación de un problema que ocurre durante la ejecución de un programa. Sin embargo, la palabra excepción se refiere a que este problema ocurre con poca frecuencia generalmente cuando existe algún dato o instrucción que no se apega al funcionamiento del programa por lo que se produce un error. El manejo de excepciones permite al usuario crear aplicaciones tolerantes a fallas y robustos (resistentes a errores) para controlar estas excepciones y que pueda seguir ejecutando el programa sin verse afectado por el problema. En lenguaje java estas excepciones pueden manejarse con las clases que extienden el paquete Throwable de manera directa o indirecta, pero existen diversos tipos de excepciones y formas para manejarlas.
El manejo de excepciones ayuda al programador a trasladar el código para manejo de errores de la línea principal de ejecución, además se puede elegir entre manejar todas las excepciones, las de cierto tipo o de las de grupos relacionados, esto hace que la probabilidad de pasar por alto los errores se reduzca y a la vez hace los programas más robustos. Pero es importante utilizar un lenguaje de programación que soporte este manejo, de lo contrario el procesamiento de errores no estará incluido y hará el programa más vulnerable. Este manejo está diseñado para procesar errores que ocurren cuando se ejecuta una instrucción, algunos ejemplos son: desbordamiento aritmético, división entre cero, parámetros inválidos de método y asignación fallida en la memoria. Sin embargo, no está diseñado para procesar problemas con eventos independientes al programa como son pulsar una tecla o clic al mouse.
Las excepciones se dividen en verificadas y no verificadas. Es importante esta división porque el compilador implementa requerimientos de atrapar o declarar para las verificadas lo que hará que se detecten las excepciones automáticamente y de acuerdo al lenguaje de programación utilizado se utilizará un método para corregirlas. Sin embargo para las no verificadas se producirá un error indicando que deben atraparse y declararse. Por eso el programador debe pensar en los problemas que pueden ocurrir cuando se llama a un método y definir excepciones para verificarse cuando sean importantes. Las clases de excepciones pueden derivarse de una superclase común, por lo que con un manejador para atrapar objetos de la superclase, también se pueden atrapar todos los objetos de las subclases de esa clase. Pero también, se pueden atrapar a cada uno de los tipos de las subclases de manera individual si estas requieren ser procesadas diferente.
Limpieza de pila.
En ocasiones cuando se lanza una excepción, pero no se atrapa en un enlace específico, la pila de llamadas se limpia y el programa intenta volverlo a atrapar en el siguiente bloque, esto se conoce como limpia de pila. Este proceso hace que el método en el que no se atrapó la excepción termina, todas sus variables quedan fuera del enlace y el control regresa a la instrucción que originalmente la invocó. La limpieza de pila de repetirá hasta que la excepción pueda ser atrapada porque de lo contrario se producirá un error a la hora de compilar.
Aserciones.
Las aserciones ayudan a asegurar la validez del programa al atrapar los errores potenciales e identificar los posibles errores lógicos del desarrollo. Estas pueden escribirse como comentarios para apoyar a la persona que desarrolla el programa. Algunos ejemplos son:
Precondiciones y pos condiciones ñ Estas características son utilizadas por los programadores para hacer un análisis de lo esperado del programa antes y después de su ejecución. Son importantes porque gracias a ellas se pueden detectar posibles fallas en el programa y corregirlas.
Las precondiciones son verdaderas cuando se invoca a un método, estas describen las características del método y las expectativas que se tienen en el estado actual del programa. Si no se cumplen las precondiciones el comportamiento del método es indefinido por lo que se lanza una excepción que esté preparada o continuar con el programa esperando el error. Las pos condiciones describen las restricciones en el entorno y cualquier efecto secundario del método. Es recomendable escribirlas para saber que esperar en un futuro si es que se hacen modificaciones.
Conclusión.
El manejo de excepciones ayuda a lidiar con los errores de una aplicación por medio de la manipulación del código para hacer programas más robustos. Además existen herramientas que ayudan a manejarlas tal es el caso de los bloques try (intentar) que encierran el código que puede lanzar una excepción y los bloques el catch (atrapar) que lidian con las excepciones que surjan. También existen técnicas que el programador utiliza para conocer el posible funcionamiento del programa y detectar los errores que pueda contener.

Ejemplo:
import java.io.IOException;

// ...

public static void main(String[] args) {
try {
// Se ejecuta algo que puede producir una excepción
} catch (IOException e) {
// manejo de una excepción de entrada/salida
} catch (Exception e) {
// manejo de una excepción cualquiera
} finally {
// código a ejecutar haya o no excepción
}
}


Básicamente el manejo de excepción es un Objeto descendiente de la clase java.lang.Object, podemos pensar en ellas como una condición excepcional en nuestro sistema el cual altera la correcta ejecución del mismo, las excepciones nos indican que hay algo anómalo,  inconsistente o simplemente un Error, lo cual impide que el sistema se ejecute como debería de ser...

Tal vez se preguntaran si ¿pero Anómalo, inconsistente o Error no es básicamente lo mismo?...... podría ser, pero en este enfoque no necesariamente lo es, ya que lo que vamos a conocer como una excepción no siempre es un error (hablando como excepcion en general, ya que en java una Excepción es muy diferente a un Error), muchas veces necesitaremos trabajar con excepciones controladas para indicar alguna inconsistencia en nuestro sistema que podría provocar errores.......

A modo de ejemplo, podemos encontrarnos con el famoso NullPointerException el cual nos indica que un objeto se encuentra vació, pero esto no es un error ya que nosotros podemos trabajar con objetos null, entonces veámoslo como si la excepcion nos dijera "Es un objeto nulo y no se puede efectuar el proceso", mientras que hay errores como NoClassDefFoundError el cual nos indica que la máquina virtual de Java (JVM) no puede encontrar una clase que necesita, debido a por ejemplo que no encuentra un .class, esto si se maneja como un error en java.


Jerarquía de excepciones: