sábado, 18 de diciembre de 2010

viernes, 17 de diciembre de 2010

Actividad de la Doceava Semana

Interfaces gráficas de usuario

Para ejemplificar las interfaces gráficas utilicé dos pantallas del proyecto que propuse a realizar.

Pantalla Login
La primera pantalla es la de acceso al sistema (login), en esta pantalla te pide el usuario y password y verfica (aun en proceso) en la tabla de usuario los valores. En caso de login exitoso te redirecciona hacia la pantalla de bienvenida.

El código de esta pantalla esta en la presentación:

Y la captura de pantalla es esta:
Pantalla Bienvenida


La segunda pantalla es la pantalla de bienvenida al sistema, le coloqué un menú bar y varios menús mas con sus respectivos items y para que el fondo no se viera tan solo le coloqué una imagen de java.

El código de la pantalla de bienvenida es:

Y la captura de la pantalla de bienvenida es:

De igual manera el codigo en archivo txt, se puede descargar desde este vínculo:
http://www.4shared.com/file/m5vorIHD/codigo_interfaz_grafica_usuari.html

Los enlaces de las páginas en las que me basé para esta entrada fueron:
http://download.oracle.com/javase/tutorial/uiswing/components/icon.html
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/ImageIcon.html
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JFrame.html
http://download.oracle.com/javase/tutorial/uiswing/components/frame.html

jueves, 16 de diciembre de 2010

Actividad de la Treceava Semana

Sistemas Distribuidos

A continuación se muestra una presentación sobre las diferentes arquitecturas de sistemas distribuidos y se elige una de ellas para que, en dado caso de implementarse el proyecto por medio de sistemas distribuidos se pueda hacer en base a esta.


Los enlaces de donde obtuve información son:
http://chuwiki.chuidiang.org/index.php?title=Sockets_%26_rmi
http://en.wikipedia.org/wiki/Internet_socket
http://www.relativo.com/xcript/scrip-sockets.htm

martes, 14 de diciembre de 2010

Actividad de la Onceava Semana

Pruebas Unitarias

Son pruebas individuales de un método o clase.

El procedimiento de elaboración de estas consiste en:

  • Antes de implementar una determinada funcionalidad, piensa cómo deberías probarla para verificar que se comporta correctamente. Esto permite desarrollar la funcionalidad teniendo las ideas muy claras de lo que debería hacer.
  • Escribe el código que implementa la funcionalidad deseada.
  • Escribe el código de las pruebas inmediatamente después.
  • Ejecuta las pruebas que hiciste.
  • Corrige la unidad de código que implementa la funcionalidad deseada hasta que pase todas y cada una de las pruebas.
  • Al añadir una nueva funcionalidad, repite el ciclo: piensa en cómo probarla, codifica la funcionalidad, codifica las pruebas, ejecuta todas las pruebas que hiciste (nuevas y viejas). No sigas hasta que el código pase absolutamente todas las pruebas.
  • Así una y otra vez para cada nueva funcionalidad que implementes


 

Se han implementado dos clases del proyecto consultoriomédico, las cuales son paciente y medicina, cada una de las cuatro clases tiene 4 métodos, alta, consulta, actualiza y baja. Estas clases tienen una conexión con una base de datos local MySQL y escriben directamente sobre ella.


 

Dado que ambas clases son similares solo pondré el código de una y la de pruebas, de todos modos las clases el código completo junto con los requerimientos se puede descargar de :


 

http://www.4shared.com/file/ULKfcnXj/codigo_pruebas_unitarias.html


 


 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;


 


 

public
class paciente {

    

    protected
int
idPaciente;

    protected String nombre = "";

    protected String apPaterno = "";

    protected String apMaterno ="";

    protected String fechaNacimiento = "";

    protected
int
edad;

    protected String sexo = "";

    protected
int
telefono;

    protected String calle ="";

    protected String colonia = "";

    protected String municipio = "";

    protected String ciudad ="";

    protected
int
cp;

    protected
int
noRegSoc;

    protected String resultado;

    

    public paciente(){

    }

    //Se crea el método de la Alta del paciente

    public
boolean AltaPaciente(int idPaciente, String nombre, String apPaterno,String apMaterno,String fechaNacimiento,

            int edad,String sexo, int telefono, String calle, String colonia, String municipio,

            String ciudad,int cp,int noRegSoc){

        //Se verifica que no haya valores nulos

        if(nombre.length()==0 || nombre==null){

            return
false;

        }else
if(apPaterno.length()==0 || apPaterno==null) {

            return
false;

        }else
if(fechaNacimiento.length()==0 || fechaNacimiento==null) {

            return
false;

        }else
if(sexo.length()==0 || sexo==null) {

            return
false;

        }else{

            try

     {

     /Se intenta hacer el insert del alta

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

     Connection conexion = DriverManager.getConnection (

     "jdbc:mysql://localhost/consultorio","root", "root");

     Statement s = conexion.createStatement();

     String q="INSERT INTO PACIENTE VALUES("+idPaciente+",\"" +nombre+"\",\"" +apPaterno+"\",\"" +apMaterno+"\",\"" +fechaNacimiento+"\","+edad+",\"" +sexo+"\","+telefono+",\"" +calle+"\",\"" +colonia+"\",\"" +ciudad+"\",\"" +municipio+"\","+cp+","+noRegSoc+"); ";

    
 

     try{

         s.executeUpdate(q);

         System.out.println("Registro Insertado Correctamente");

     }catch(SQLException e) {

         System.out.println(e);

         return
false;

     };

     conexion.close();

     }

     //Excepcion del insert

catch (Exception e)

     {

     e.printStackTrace();

     return
false;

     }

     return
true;

        }

    }

    // Se crea el método de la Baja

    public
boolean BajaPaciente(int idPaciente){

    // Se intenta hacer la baja en la base de datos    

try

{


 

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

Connection conexion = DriverManager.getConnection (


"jdbc:mysql://localhost/consultorio","root", "root");

Statement s = conexion.createStatement();

String q="DELETE FROM paciente WHERE idPaciente="+idPaciente+";";


 


try{

    s.executeUpdate(q);

    System.out.println("Registro Borrado Correctamente");

}catch(SQLException e) {

    System.out.println(e);

    return
false;

};


 

conexion.close();

}


// Excepción de la baja


catch (Exception e)

{

e.printStackTrace();


return
false;

}


return
true;

    }

    

    // Se crea el método de la consulta

public
boolean ConsultaPaciente(int idPaciente){

    // Se
intenta hacer la consulta a la BD
    


try

{


 

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

Connection conexion = DriverManager.getConnection (


"jdbc:mysql://localhost/consultorio","root", "root");

Statement s = conexion.createStatement();

ResultSet rs = s.executeQuery ("select * from paciente where idPaciente="+idPaciente+";");


 


while (rs.next())

{

System.out.println (rs.getInt (1)+rs.getString(2)+rs.getString(3)+rs.getString(4));

}


// Se
cierra
la
conexión
con
la base de
datos.

conexion.close();

}


catch (Exception e)

{

e.printStackTrace();


return
false;

}


return
true;

    }

    

public
boolean ActualizaPaciente(int idPaciente, String nombre, String apPaterno,String apMaterno,String fechaNacimiento,

            int edad,String sexo, int telefono, String calle, String colonia, String municipio,

            String ciudad,int cp,int noRegSoc){

        if(nombre.length()==0 || nombre==null){

            return
false;

        }else
if(apPaterno.length()==0 || apPaterno==null) {

            return
false;

        }else
if(fechaNacimiento.length()==0 || fechaNacimiento==null) {

            return
false;

        }else
if(sexo.length()==0 || sexo==null) {

            return
false;

        }else{

            try

     {

    
 

     DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

     Connection conexion = DriverManager.getConnection (

     "jdbc:mysql://localhost/consultorio","root", "root");

     Statement s = conexion.createStatement();

     String q="UPDATE PACIENTE SET nombre=\"" +nombre+"\",apPaterno=\"" +apPaterno+"\",apMaterno=\"" +apMaterno+"\",fechaNacimiento=\"" +fechaNacimiento+"\",edad="+edad+",sexo=\"" +sexo+"\",telefono="+telefono+",calle=\"" +calle+"\",colonia=\"" +colonia+"\",ciudad=\"" +ciudad+"\",municipio=\"" +municipio+"\",cp="+cp+",NoRegSocial="+noRegSoc+" where idPaciente="+idPaciente+";";

    

     try{

         s.executeUpdate(q);

         System.out.println("Registro Actualizado Correctamente");

     }catch(SQLException e) {

         System.out.println(e);

         return
false;

     };

     // Se
cierra
la
conexión
con
la base de
datos.

     conexion.close();

     }

     catch (Exception e)

     {

     e.printStackTrace();

     return
false;

     }

     return
true;

        }

    }

}


 


 

Clase de Pruebas JUNIT:


 

import junit.framework.*;

public
class Test extends TestCase {

    public Test(){    

    }

    public
void testPaciente(){

//Aqui probamos con la instrucción AssertTrue los métodos de las clases. Los métodos nos regresan un valor binario, true si es correcto, false en caso contrario.

paciente paciente =new paciente();

        assertTrue(paciente.AltaPaciente(2, "Pedro", "Gonzalez", "Garcia", "1980-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertTrue(paciente.ConsultaPaciente(2));

        assertTrue(paciente.ActualizaPaciente(2, "Pedro", "Villarreal", "Garcia", "1940-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertTrue(paciente.BajaPaciente(2));

    }

    public
void testPacienteValoresNulos(){

        //Como no podemos insertar valores nulos utilizamos el AssertFalse para que nos marque correcto cuando no haga las instrucciones

paciente paciente =new paciente();

        assertFalse(paciente.AltaPaciente(3, "", "", "Garcia", "1980-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertFalse(paciente.ActualizaPaciente(3, "", "", "Garcia", "1940-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

    }

    public
void testPacienteValoresNulosPermitidos(){

        paciente paciente =new paciente();

        assertTrue(paciente.AltaPaciente(4, "Pedro", "Gonzalez", "", "1980-1-01", 30, "H", 83847563, "Calle 123", "De las calles", "Callejero", "Callejero", 34567, 8945688));

        assertTrue(paciente.ActualizaPaciente(4, "Pedro", "Villarreal", "", "1940-1-01", 30, "H", 83847563, "", "De las calles", "Callejero", "Callejero", 34567, 8945688));

    }

    public
void testMedicina(){

        medicina medicina =new medicina();

        assertTrue(medicina.AltaMedicina(2,"NAPROXENO","PHARMA","NAPROXENO","NAPROXENO","2012-9-01"));

        assertTrue(medicina.ConsultaMedicina(2));

        assertTrue(medicina.ActualizaMedicina(2,"NAPROXENO","PHARMA","NAPROXENO","NAPROXENO","2013-9-01"));

        assertTrue(medicina.BajaMedicina(2));

    }

    public
void testMedicinaValoresNulos(){

        medicina medicina =new medicina();

        assertFalse(medicina.AltaMedicina(3,"","","","NAPROXENO","2012-9-01"));

        assertFalse(medicina.ActualizaMedicina(3,"","","NAPROXENO","NAPROXENO","2013-9-01"));

    }

    public
void testMedicinaValoresNulosPermitidos(){

        medicina medicina =new medicina();

        assertTrue(medicina.AltaMedicina(4,"NAPROXENO","PHARMA","NAPROXENO","","2012-9-01"));

        assertTrue(medicina.ActualizaMedicina(4,"NAPROXENO","PHARMA","NAPROXENO","","2013-9-01"));

    }

    public
static
void main(String args[]){

        junit.textui.TestRunner.run(Test.class);

    }

}


 

Pantalla de Pruebas


Los enlaces de las páginas en que me basé para hacer este trabajo son:

http://www.gsi.dit.upm.es/~legf/doc/lprg/Transparencias%20LPRG/Pruebas%20Unitarias.pdf

http://www.gsi.dit.upm.es/~anieto/doc/lprg/LPRG%20Documentacion%20y%20Pruebas%20Unitarias.pdf

domingo, 12 de diciembre de 2010

Actividad de la Décima Semana

Eventos, Excepciones y Errores

Los eventos son mecanismos que permiten que una parte del programa
avisa a otra parte sobre un cambio (tipo callback). Se utilizan
típicamente para cosas gráficas, como reaccionar a botones.

Las excepciones son situaciones que causan la no posibilidad de
continuar como planeado (por ejemplo, se iba a abrir un archivo, pero
ese no existe), que deben causar alguna consulta con el usuario u otro
mecanismo para resolver el problema.

Los errores por lo general son no-recuperables y lo único que queda es
cerrar el programa con algo de dignidad.

Para la demostración de dichos conceptos utilicé una ventana del programa del proyecto propuesto. Hice una presentación sobre esto:

Las ligas de las páginas en las que me basé fueron:
http://www.programacion.com/articulo/manejo_de_errores_usando_excepciones_java_98/2
http://www.elcodigo.net/tutoriales/javascript/javascript5.html

sábado, 11 de diciembre de 2010

Actividad de la Novena Semana

Patrones de Diseño

Los patrones de diseño son soluciones simples y elegantes a problemas específicos y comunes del diseño orientado a objetos. Son soluciones basadas en la experiencia y que se ha demostrado que funcionan.

Para que una solución sea considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reusable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.

Los patrones de diseño no son fáciles de entender, pero una vez entendido su funcionamiento, los diseños serán mucho más flexibles, modulares y reutilizables. Han revolucionado el diseño orientado a objetos y todo buen arquitecto de software debería conocerlos.

A continuación se enlistan los patrones mas comunes.

Patrones de creación

* Abstract Factory. Proporciona una interfaz para crear familias de objetos o que dependen entre sí, sin especificar sus clases concretas.
* Builder. Separa la construcción de un objeto complejo de su representación, de forma que el mismo proceso de construcción pueda crear diferentes representaciones.
* Factory Method. Define una interfaz para crear un objeto, pero deja que sean las subclases quienes decidan qué clase instanciar. Permite que una clase delegue en sus subclases la creación de objetos.
* Prototype. Especifica los tipos de objetos a crear por medio de una instancia prototípica, y crear nuevos objetos copiando este prototipo.
* Singleton. Garantiza que una clase sólo tenga una instancia, y proporciona un punto de acceso global a ella.


Ejemplos de un Patrón de Creación
Escogí Factory Method por que me pareció interesante para implementar en mi proyecto. A continuación viene una presentación de este patrón con un par de ejemplos de este. Uno es de mi proyecto.

Patrones estructurales

* Adapter. Convierte la interfaz de una clase en otra distinta que es la que esperan los clientes. Permiten que cooperen clases que de otra manera no podrían por tener interfaces incompatibles.
* Bridge. Desvincula una abstracción de su implementación, de manera que ambas puedan variar de forma independiente.
* Composite. Combina objetos en estructuras de árbol para representar jerarquías de parte-todo. Permite que los clientes traten de manera uniforme a los objetos individuales y a los compuestos.
* Decorator. Añade dinámicamente nuevas responsabilidades a un objeto, proporcionando una alternativa flexible a la herencia para extender la funcionalidad.
* Facade. Proporciona una interfaz unificada para un conjunto de interfaces de un subsistema. Define una interfaz de alto nivel que hace que el subsistema se más fácil de usar.
* Flyweight. Usa el compartimiento para permitir un gran número de objetos de grano fino de forma eficiente.
* Proxy. Proporciona un sustituto o representante de otro objeto para controlar el acceso a éste.

Ejemplos de un Patrón de Estrucutura
Igual que el ejemplo anterior escogí facade por que vi que era el mas fácil de implementar en el proyecto que propuse. En la presentación viene un ejemplo del proyecto y otro que encontré de facade.

Patrones de comportamiento

* Chain of Responsibility. Evita acoplar el emisor de una petición a su receptor, al dar a más de un objeto la posibilidad de responder a la petición. Crea una cadena con los objetos receptores y pasa la petición a través de la cadena hasta que esta sea tratada por algún objeto.
* Command. Encapsula una petición en un objeto, permitiendo así parametrizar a los clientes con distintas peticiones, encolar o llevar un registro de las peticiones y poder deshacer la operaciones.
* Interpreter. Dado un lenguaje, define una representación de su gramática junto con un intérprete que usa dicha representación para interpretar las sentencias del lenguaje.
* Iterator. Proporciona un modo de acceder secuencialmente a los elementos de un objeto agregado sin exponer su representación interna.
* Mediator. Define un objeto que encapsula cómo interactúan un conjunto de objetos. Promueve un bajo acoplamiento al evitar que los objetos se refieran unos a otros explícitamente, y permite variar la interacción entre ellos de forma independiente.
* Memento. Representa y externaliza el estado interno de un objeto sin violar la encapsulación, de forma que éste puede volver a dicho estado más tarde.
* Observer. Define una dependencia de uno-a-muchos entre objetos, de forma que cuando un objeto cambia de estado se notifica y actualizan automáticamente todos los objetos.
* State. Permite que un objeto modifique su comportamiento cada vez que cambia su estado interno. Parecerá que cambia la clase del objeto.
* Strategy. Define una familia de algoritmos, encapsula uno de ellos y los hace intercambiables. Permite que un algoritmo varíe independientemente de los clientes que lo usan.
* Template Method. Define en una operación el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases redefinan ciertos pasos del algoritmo sin cambiar su estructura.
* Visitor. Representa una operación sobre los elementos de una estructura de objetos. Permite definir una nueva operación sin cambiar las clases de los elementos sobre los que opera.

Ejemplo de Patrón de Comportamiento
Por último muestro el ejemplo del patrón Command, basado en el proyecto y en otro que me encontré cuando investigaba sobre este.

Las ligas de donde extraje la información son:
http://www.ingenierosoftware.com/analisisydiseno/patrones-diseno.php
http://download.microsoft.com/download/d/1/a/...adb7.../patrones.ppt
http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o

Actividad de la Octava Semana

Presentación de Diagramas UML

En la siguiente presentación se muestran los diagramas de clases, de casos de usos y de actividades para el proyecto propuesto.

lunes, 6 de diciembre de 2010

Actividad de la Séptima Semana

Diagrama de Actividad UML

Los enlaces de las páginas en que se basé para hacer la presentación fueron:
http://www.scribd.com/doc/2568098/UML-Diagramas-de-actividad
http://www.agilemodeling.com/style/activityDiagram.htm

La herramienta con la que hice el diagrama fue:
http://www.descargarsoft.com/descargar-argouml-para-crear-diagramas-uml/

Diagrama de Actividad

En este diagrama podemos apreciar las distintas actividades que se llevan a cabo en el sistema.

Empieza con una llamada del paciente, luego la secretaria, o la persona que atiende la llamada, verifica si el paciente tiene o no cita. En caso de que el paciente tenga cita entonces lo que quiere es una modificación de la cita y se procede a modificar el calendario de las citas. Cuando el paciente no tiene cita se procede a solicitar una cita.

Antes se verifica si el paciente esta dado de alta en el sistema, para esto se va a consultar el catalogo de pacientes y si se encuentra se procede a asignarle la cita, si no se encuentra dado de alta, se le piden los datos para darlo de alta en el sistema.

Para asginar la cita, se consulta en el calendario cuales son las fechas disponibles y se le propone una al paciente, en caso de aceptar, se modifica el calendario poniendole la cita al paciente, en caso de no aceptar se vuelve a consultar el calendario hasta encontrar una fecha en la que el paciente acepte.

Una vez que es el dia de la cita, entonces el paciente llega con el médico, y el médico genera la consulta en base a la cita previamente establecida, se procede a capturar los datos específicos de la consulta y se elabora el diagnostico.

Si el paciente requiere algún medicamento, se procede a consultar la existencia del medicamento deseado en el almacén y si este existe se le asigna el medicamento borrandolo del almacén, en el caso de que no exista, se avisa al paciente y se solicita al proveedor dicho medicamento.

Para asignar el medicamento se crea la receta médica y se imprime y entrega al paciente.

Por último se pasa la consulta al historial clínico del paciente.

viernes, 3 de diciembre de 2010

Actividad de la sexta semana

DIAGRAMAS UML

Los tutoriales en los que me basé fueron: http://www.dcc.uchile.cl/~psalinas/uml/introduccion.html
http://en.wikipedia.org/wiki/Unified_Modeling_Language

La herramienta que utilicé para la elaboración del diagrama fue:
http://staruml.sourceforge.net/en/download.php

Creé un diagrama de clases para los usuarios ya que habrá personas que hagan actividades diferentes en el sistema, y se requieren crear roles, para dichas actividades


Aqui esta el diagrama de clases para el sistema en general

lunes, 8 de noviembre de 2010

Actividad de la Cuarta Semana

Documentación y Herramientas de Desarrollo

La herramienta que he elegido es JAVADOC

Descripción:
Javadoc es una herramienta para la generación de documentación de API'S (Interfaz de programación de aplicaciones) en formato HTML a partir de código fuente JAVA.

Descarga de la herramienta:
Javadoc puede ser descargado solamente como parte del paquete Java JDK o SDK. La liga de descarga es la siguiente:
https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u22-oth-JPR@CDS-CDS_Developer

Tutoriales de la herramienta:
http://www.mcs.csueastbay.edu/~billard/se/cs3340/ex7/javadoctutorial.html
http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

Para ejemplificar la utilización de Javadoc tomaremos como base el programa de la semana pasada, el programa de Bicycle, aquí esta el código de dicho programa:


Donde podemos observar que:
  • los comentarios van en el formato /** Comentario */
  • utilizamos varios como @author (que especifica el autor de la clase), @param (que especifica los parametros del método),  @version (muestra la version de la clase),  @since (donde ponemos la version de java que utilizamos), @see(es un link a alguna variable/parametro/metodo de la clase), @deprecated(nos muestra que un metodo fue reemplazado).
Para ejecutar javadoc, lo podemos hacer desde nuestra consola cmd desde windows posicionandonos en la carpeta del JDK instalado en el directorio /bin, ahi ejecutamos esta sentencia:
javadoc -author -version Bicycle.java
El -author y -version es para que nos traiga el author y la version que no se generan por defecto.

Al hacer esto inmediatamente despues nos genera un  Html en la carpeta raiz de Java, con la documentación:


Y aqui vemos como se transladan los comentarios y los tags de la clase hacia el HTML generado:

Los tags author, version y since se pasaron así
Los comentarios y el tag deprecated
Los tags see y deprecated ademas de los comentarios

sábado, 6 de noviembre de 2010

Actividad de la Tercera Semana

Herencia y poliformismo
Primero comenzaremos por definir algunos conceptos que se utilizan en la herencia y poliformismo:

Subclass (subclase): Es una clase derivada de otra clase. También se puede llamar, clase derivada, clase extendida o clase hijo.

Superclass (superclase). Es la clase sobre la cual se derivan otras clases, es decir, la clase de la cual esta derivada la subclase. También se puede llamar clase padre o clase base.

HERENCIA

El concepto de herencia en la programacion orientada a objetos consiste en utilizar las atributos y metodos de las clases en la realización de nuevas clases. Es decir que si vamos a definir alguna clase y ya existe alguna clase que incluye código que vamos a utilizar en la nueva, podemos heredarlo.

Una subclase hereda todos los componentes (objetos, atributos, métodos) de la superclase.

A continuación presentaremos un ejemplo de Herencia, en código Java:


public class Bicycle {
 
    // La bibicleta contiene atributos 
public int cadence;
    public int gear;
    public int speed;
 
    // La clase bicicleta contiene un constructor 
public Bicycle(int startCadence, int startSpeed, int startGear) {
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;
    }
 
    // La clase contiene 4 métodos
    public void setCadence(int newValue) {
        cadence = newValue;
    }
 
    public void setGear(int newValue) {
        gear = newValue;
    }
 
    public void applyBrake(int decrement) {
        speed -= decrement;
    }
 
    public void speedUp(int increment) {
        speed += increment;
    }
 
}
Para declarar la clase bicicleta de montaña como subclase de bicicleta se usa el siguiente código:

public class MountainBike extends Bicycle {
 
    // la clase de bicicleta de montaña adiere un atributo
    public int seatHeight;

    // la clase tiene un constructor
    public MountainBike(int startHeight, int startCadence, int startSpeed,  
        int startGear) {
        super(startCadence, startSpeed, startGear);
        seatHeight = startHeight;
    } 
 
    // la clase tiene un método
    public void setHeight(int newValue) {
        seatHeight = newValue;
    } 

}
 Con esto la clase Bicicleta de Montaña hereda los atributos y métodos de la clase padre Bicicleta, exepto por los constructores que esos no se pueden heredar pues son unicos de clase clase.

Una subclase hereda todos los miembros de tipo protected y public de la clase padre,  sin embargo no hereda los miembros private.

Aplicación en la actividad de la semana dos (tienda en linea tipo amazon):
Superclase: Producto
Subclase: Pedido


Superclase: Cliente
Subclase: Pedido

Superclase: Pedido
Subclases: Envío, Estatus


POLIFORMISMO
 
El diccionario define el término poliformismo como un principio de biología en el cual, cada organismo o especie puede adquirir diferentes formas o estados. Si queremos llevar este término a la programación orientada a objetos tenemos por poliformismo, que la subclase de una clase puede definir su propio comportamiento y compartir funcionalidades de la clase padre.

Para ejemplificar el poliformismo tomaremos el ejemplo antes mencionado solo que lo modificaremos un poco. Agregaremos un método de impresión a la clase padre, bicicleta.


public void printDescription(){
 System.out.println("\nBike is in gear " + this.gear + " with a cadence of " +
        this.cadence + " and travelling at a speed of " + this.speed + ". ");
}
Despues agragaremos otra subclase Bicicleta de carrera. A la clase bicicleta de 
montaña le agregaremos otro método en el cual extraeremos la suspención de esta 
bicicleta. Asi es como quedo la clase bicicleta de montaña:
public class MountainBike extends Bicycle{
  private String suspension;

  public MountainBike(int startCadence, int startSpeed, int startGear, String 
    suspensionType){
    super(startCadence, startSpeed, startGear);
    this.setSuspension(suspensionType);
  }

  public String getSuspension(){
    return this.suspension;
  }

  public void setSuspension(String suspensionType){
    this.suspension = suspensionType;
  }

  public void printDescription(){
    super.printDescription();
    System.out.println("The MountainBike has a " + getSuspension()
            + " suspension.");
  }
} 
Notamos como se sobreescribe el método de la impresion de la clase padre bicicleta, 
adiriendo la descripción de la suspencion de la clase de la bicicleta de montaña.
Ahora definimos la otra clase de la siguiente manera:
public class RoadBike extends Bicycle{
  private int tireWidth; // In millimeters (mm)

  public RoadBike(int startCadence, int startSpeed, int startGear, int 
    newTireWidth){
    super(startCadence, startSpeed, startGear);
    this.setTireWidth(newTireWidth);
  }

  public int getTireWidth(){
    return this.tireWidth;
  }

  public void setTireWidth(int newTireWidth){
    this.tireWidth = newTireWidth;
  }

  public void printDescription(){
    super.printDescription();
    System.out.println("The RoadBike has " + getTireWidth()
            + " MM tires.");
  }

}
 
Igual que en la clase anterior vemos como se sobreescribe sobre el método de 
impresión de la clase padre. Esta es una prueba sobre las clases que tenemos:
public class TestBikes {
  public static void main(String[] args){
    Bicycle bike01, bike02, bike03;

    bike01 = new Bicycle(20, 10, 1);
    bike02 = new MountainBike(20, 10, 5, "Dual");
    bike03 = new RoadBike(40, 20, 8, 23);

    bike01.printDescription();
    bike02.printDescription();
    bike03.printDescription();

  }
}
Y la salida que obtenemos es la siguiente:
Bike is in gear 1 with a cadence of 20 and travelling at a speed of 10. 

Bike is in gear 5 with a cadence of 20 and travelling at a speed of 10. 
The MountainBike has a Dual suspension.

Bike is in gear 8 with a cadence of 40 and travelling at a speed of 20. 
The RoadBike has 23 MM tires.
Aplicación en la actividad de la segunda semana(tienda en línea tipo Amazon)
En el método, mostrar estatus de la clase estatus de pedido
puede obtenerse diferentes impresiones
Estatus(en almacen)
Estatus(en envio)
Estatus(recibido)
Estatus(rechazado)
Podemos utilizar el poliformismo en la impresion de estos estatus.
Fuente:
http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html
Escogí esta fuente por que me pareció simple la explicación y muy buen ejemplo, aparte de que como estamos viendo java pensé que lo mejor sería ir a la página principal del lenguaje.