cap02_principios fundamentales sobre programación orientada a objetos

Upload: rodrigo-alvarez

Post on 07-Jan-2016

1 views

Category:

Documents


0 download

DESCRIPTION

Principios fundamentales sobre Programación Orientada a Objetos

TRANSCRIPT

  • Pgina 1 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    PROGRAMA A DISTANCIA:

    DESARROLLADOR EN JAVA.

  • Pgina 2 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Introduccin:

    El Instituto Nacional de Investigacin y Capacitacin en las Telecomunicaciones (INICTEL)

    de la Universidad Nacional de Ingeniera (UNI) presenta el programa en la Modalidad de

    Educacin distancia DESARROLLADOR EN JAVA, el cual tiene como objetivo conocer,

    comprender y aplicar el aprendizaje terico y prctico de los conceptos fundamentales para

    utilizar la tecnologa Java en el desarrollo de aplicaciones Web de porte empresarial.

    Durante el programa se estudiarn los conceptos bsicos del desarrollo Web con Java,

    creacin de pginas dinmicas con JSP y Servlets, manejo del Servidor Web Tomcat,

    Glass Fish estructura de un proyecto Web, acceso datos a nivel pagina, session, utilizacin

    de JDBC en entornos Web. . Al finalizar el programa, el alumno deber ser capaz de

    determinar la mejor arquitectura para una aplicacin Web y realizar el desarrollo del mismo

    en forma integral, escalable, robusta y segura

    El presente programa comprender los siguientes cursos:

    1. Fundamentos de HTML Java Script - XML (30 horas)

    2. Java 2 Nivel I: Programacin Orientada a Objeto con Java (30 horas)

    3. Java 2 Nivel II: Programacin de Java Servlets y Server Pages (30 horas)

    4. Java 2 Nivel III: Desarrollo de Aplicaciones Web con Enterprise Java Beans (30 horas)

    Objetivos del programa.

    El participante comprender y aplicar los lenguajes bsicos necesarios para

    disear pginas web con interactividad.

    El participante ser capaz de comprender y disear programas aplicando la

    programacin orientada a objetos (POO) utilizando el lenguaje Java.

    El participante podr realizar aplicaciones con programacin orientada a objetos

    aplicando la tecnologa Web

    El participante disear aplicaciones con POO y acceso a base de datos con

    tecnologa Web.

  • Pgina 3 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    INDICE

    CAPITULO 2:

    Principios fundamentales sobre Programacin Orientada a Objetos

    2.0 Programacin Orientada a Objetos 4

    2.1 La Herencia en JAVA 5

    2.2 Sobrecarga de Mtodos 7

    2.3 Polimorfismo 14

    2.4 Clases Abstractas 17

    2.5 Interfaces 26

    2.6 Resumen 37

  • Pgina 4 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    CAPITULO 2:

    Programacin con objetos

    Objetivos:

    Al finalizar este capitulo

    Identificar y analizar el lenguaje de programacin Java, sus

    fundamentos, sus estructuras de control de programa, y sus clases.

    Identificar los Fundamentos de la Programacin Orientada a Objetos,

    con la metodologa de programacin tales como la herencia, el

    polimorfismo, las clases abstractas, la interface.

    Analizar estas metodologas con programas que permitan comprender

    el uso de estas metodologas

    Introduccin:

    La Programacin Orientada a Objetos facilita la creacin de software de calidad

    basadas en el modo de pensar del hombre, con el modo de operar de las mquinas

    y se centra en los conceptos bsicos que son los objetos a la cuales se le atribuye

    sus propiedades, mtodos y a su vez se generan los modelos de herencia,

    abstraccin, encapsulamiento y polimorfismo.

    Pensar en trminos de objetos es muy parecido a cmo lo haramos en la vida real.

    Por ejemplo vamos a pensar en una persona para tratar de modelar en un esquema

    de POO1. Diramos que la persona es el elemento principal que tiene una serie de

    caractersticas, como podran ser el nombre, la edad, el sexo, etc. Adems tiene una

    serie de funcionalidades (acciones) asociadas, como pueden ser comer, caminar,

    dormir, etc.

    1 Programacin Orientada a Objetos

  • Pgina 1 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    2.1 La herencia en java

    Java permite el empleo de la herencia, caracterstica muy potente que permite

    definir una clase tomando como base a otra clase ya existente. Esto es una de

    las bases de la reutilizacin de cdigo, en lugar de copiar y pegar.

    En java, como ya vimos la herencia se especifica agregando la clusula

    extends despus del nombre de la clase. En la clausula extends indicaremos

    el nombre de la clase base de la cul queremos heredar.

    Al heredar de una clase base, heredaremos tanto los atributos como los

    mtodos, mientras que los constructores son utilizados, pero no heredados.

    Fig 1.-Concepto Grfico de Herencia

  • Pgina 2 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Fig. 2.-Concepto de Herencia con Diagramas de Clases

  • Pgina 3 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplos de aplicacin con herencia Ejemplo1.-realizar un programa con clases que permite realizar lo siguiente: Se desea repartir una herencia de 50000 por la cual se reparte al primer hijo la mitad de la herencia, al segundo hijo la tercera parte de lo queda y al tercer hijo lo que resta. Escribir lo que corresponde a cada uno.

    aplicaherencia.java

    package herencia;

    class aplicaherencia

    {

    double herencia,repartehijo1,repartehijo2,repartehijo3;

    public double asignarherencia()

    {

    herencia=50000;

    return herencia;

    }

    }

    hijo.java

    package herencia; class hijo extends aplicaherencia { public void reparteherencia() { repartehijo1=asignarherencia()/2; repartehijo2=(herencia - repartehijo1)/3; repartehijo3=herencia-repartehijo1-repartehijo2; } public void salidaherencia() { System.out.println("La herencia es "+herencia); System.out.println("La herencia del hijo1 es "+repartehijo1); System.out.println("La herencia del hijo2 es "+repartehijo2); System.out.println("La herencia del hijo3 es "+repartehijo3); } } miherencia.java

  • Pgina 4 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    package herencia; public class miherencia { public static void main(String[]args) { hijo heredan=new hijo(); heredan.asignarherencia(); heredan.reparteherencia(); heredan.salidaherencia(); } }

    Su diagrama de clases

    Fig. 3 Diagrama de Clases del Ejemplo1 En el siguiente diagrama de clases la clase hijo hereda de la clase aplicaherencia el mtodo asignarherencia. y en la clase miherencia se crea instancias utilizando las clases padre(hijo,aplicarherencia).

    Utilice el Software StarUML para realizar el diagrama

  • Pgina 5 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo2

    Empleado.java

    package herencia; public class Empleado { protected String nombre,cargo; protected double costoDia; public Empleado(String n,String c){ this.nombre=n;this.cargo=c;this.costoDia=80; } public String getNom(){ return nombre; } public String getCar(){ return cargo; } public static void main(String[] args) { } }

    Estable.java

    package herencia; public class Estable extends Empleado { protected int diasTrab; public Estable(String n,String c){

    super(n,c); // Este constructor permite accede a la clase principal } public void setDiasTrab(int d){ this.diasTrab=d; } public double getSueldo(){ return diasTrab*costoDia; } public static void main(String[] args) { // TODO Auto-generated method stub } }

    Eventual.java

    package herencia; public class Eventual extends Empleado { protected int horasTrab; public Eventual(String n,String c){ super(n,c); } public void setHorasTrab(int ht){ this.horasTrab=ht; }

  • Pgina 6 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    public double getSalario(){ return horasTrab*costoDia/8; } public static void main(String[] args) { } }

    Planilla.java

    package herencia; import javax.swing.*; public class Planilla { public static void main(String[] args) { Estable es=new Estable("Luis","vendedor"); Eventual ev=new Eventual("Juan","Vigilante"); es.setDiasTrab(10); ev.setHorasTrab(10); JOptionPane.showMessageDialog(null,es.getNom()+ " " +es.getCar()+" " +es.getSueldo()); JOptionPane.showMessageDialog(null,ev.getNom()+ev.getSalario()); } }

    F

    Fig. 4.-Diagrama de Clases del Ejemplo2

  • Pgina 7 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    2.2 Sobrecarga de mtodos

    Un mtodo sobrecargado se utiliza para reutilizar el nombre de un mtodo pero

    con diferentes argumentos (opcionalmente un tipo diferente de retorno). Las

    reglas para sobrecargar un mtodo son las siguientes:

    + Los mtodos sobrecargados debe de cambiar la lista de argumentos.

    + Pueden cambiar el tipo de retorno.

    + Pueden cambiar el modificador de acceso.

    + Pueden declarar nuevas o ms amplias excepciones.

    + Un mtodo puede ser sobrecargado en la misma clase o en una subclase.

    Veamos un mtodo que se desea sobrecargar:

    public void cambiarTamano(int tamano, String nombre, float patron){ }

    Los siguientes mtodos son sobrecargas legales del mtodo cambiarTamano():

    public void cambiarTamano(int tamano, String nombre){}

    public int cambiarTamano(int tamano, float patron){}

    public void cambiarTamano(float patron, String nombre) throws

    IOException{}

    Cmo invocar un mtodo sobrecargado::

    Lo que define qu mtodo es el que se va a llamar son los argumentos que se

    envan al mismo durante la llamada. Si se invoca a un mtodo con un String

    como argumento, se ejecutar el mtodo que tome un String como argumento,

    si se manda a llamar al mismo mtodo pero con un float como argumento, se

    ejecutar el mtodo que tome un float como argumento y as sucesivamente. Si

    se invoca a un mtodo con un argumento que no es definido en ninguna de las

    versiones sobrecargadas entonces el compilador arrojar un mensaje de error.

    Ejemplo de una clase con un mtodo sobrecargado:

    Al ejecutar el cdigo anterior obtendremos lo siguiente:

    Mtodo que recibe enteros. Mtodo que recibe flotantes.

    Mtodo que recibe una cadena: Monillo007

    Al utilizar objetos en lugar de tipos primitivos o cadenas se vuelve ms

    interesante. Veamos lo que sucede cuando se tiene un mtodo sobrecargado

    que en una de sus versiones toma un Animal como parmetro y en otra un

    Caballo.

  • Pgina 8 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo1.-Ejemplos de Mtodo Sobrecargado

    class Animal { }

    class Caballo extends Animal{ }

    class Animales{

    public void MetodoSobrecargado(Animal a){

    System.out.println("Mtodo de parmetro Animal...");

    }

    public void MetodoSobrecargado(Caballo c){

    System.out.println("Mtodo de parmetro Caballo...");

    }

    public static void main(String... args){

    Animales as = new Animales();

    Animal objetoAnimal = new Animal();

    Caballo objetoCaballo = new Caballo();

    as.MetodoSobrecargado(objetoAnimal);

    as.MetodoSobrecargado(objetoCaballo);

    }

    }

    Al ejecutar el cdigo anterior obtenemos:

    Mtodo de parmetro Animal...

    Mtodo de parmetro Caballo...

    Como era de esperarse, cada objeto manda a llamar al mtodo que le

    corresponde de acuerdo a su tipo.

  • Pgina 9 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo2.-En este ejemplo el Mtodo Geometra permite calcular el rea y

    el volumen.

    Sobrecarga.java

    package javaapplication5;

    public class Sobrecarga {

    double base,largo,altura,area,perimetro,volumen;

    public void Geometria(double x, double y){

    area=x*y;

    System.out.println("El Area de un rectngulo===."+area);

    }

    public void Geometria(double x, double y,double z){

    volumen=x*y*z;

    System.out.println("El volumen de un cubo es."+volumen);

    }

    public void Geometria (String cadena){

    System.out.println("Mtodos de Sobrecarga: "+ cadena);

    }

    }

    main.java

    package javaapplication5;

    import java.io.*;

    import java.util.Scanner;

    public class Main {

    double base,altura;

    public static void main(String[] args) {

    Sobrecarga s = new Sobrecarga();

    double a = 20.5;

    double b = 30.5;

    double c=10;

    s.Geometria("Geometria");

    s.Geometria(a, b);s.Geometria(a, b, c);

    }

    }

  • Pgina 10 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo3.-En este ejemplo el Mtodo Geometra permite calcular el rea y el

    volumen con Lectura de Datos.

    Ejemplo con Lectura de Datos

    Sobrecarga.java

    package javaapplication5;

    import java.io.*;

    import java.util.Scanner;

    public class Sobrecarga {

    double base,largo,altura,area,perimetro,volumen,dato;

    String linea;

    public void Geometria(double x, double y){

    area=x*y; System.out.println("El Area de un rectngulo===."+area);

    }

    public void Geometria(double x, double y,double z){

    volumen=x*y*z;

    System.out.println("El volumen de un cubo es."+volumen);

    }

    public void Geometria(String cadena){

    System.out.println("Mtodos de Sobrecarga: "+ cadena);

    }

    public void EjecutarMetodos()

    {Scanner teclado = new Scanner(System.in);

    System.out.println("Cual es la base");

    base = teclado.nextInt();

    System.out.println("Cual es el largo");

    largo = teclado.nextInt();

    System.out.println("Cual es la altura");

    altura = teclado.nextInt();

    Geometria("Geometricos");

    Geometria(base,largo);

    Geometria(base,largo,altura);

    }

    }

  • Pgina 11 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Principal.java

    package javaapplication5;

    import java.io.*;

    import java.util.Scanner;

    public class Principal {

    double base,altura;

    public static void main(String[] args) {

    Sobrecarga s = new Sobrecarga();

    S. EjecutarMetodos();

    }

    }

    Ejemplo4.-Otro ejemplo de Sobrecarga con el mtodo Suma

    Sumar.java

    /** Diversos modos de sumar */

    public class Sumar {

    public float suma(float a, float b) {

    System.out.println("Estoy sumando reales");

    return a+b;

    }

    public int suma(int a, int b) {

    System.out.println("Estoy sumando enteros");

    return a+b;

    }

    public static void main(String[] args) {

    float x = 1, float y = 2;

    int v = 3, int w = 5;

    System.out.println(suma(x,y));

    System.out.println(suma(v,w));

    }

    }

  • Pgina 12 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo5

    Esto tambin se aplica a los constructores. De hecho, es la aplicacin ms

    habitual de la sobrecarga:

    Rectangulo.java

    /** Calcula el area de un rectangulo

    */

    public class Rectangulo {

    private float x1,y1,x2,y2;

    public Rectangulo(float ex1, float ey1, float ex2, float ey2) {

    x1 = ex1;

    x2 = ex2;

    y1 = ey1;

    y2 = ey2;

    }

    public Rectangulo() {

    x1 = 0;

    x2 = 0;

    y1 = 1;

    y2 = 1;

    }

    public float calcularArea() {

    return (x2-x1) * (y2-y1);

    }

    public static void main(String[] args) {

    Rectangulo prueba1 = new Rectangulo(1,4,7,6);

    Rectangulo prueba2 = new Rectangulo();

    System.out.println(prueba1.calcularArea());

    System.out.println(prueba2.calcularArea());

    }

    }

  • Pgina 13 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Reglas de la sobrecarga y sobreescritura de mtodos::

    Ahora que hemos visto ambas formas de reescribir mtodos, revisemos las

    reglas y diferencias entre ambos tipos de reescritura:

    +Argumentos: En un mtodo sobrecargado los argumentos deben de cambiar

    mientras que en un mtodo sobreescrito NO deben cambiar.

    + El tipo de retorno: En un mtodo sobrecargado el tipo de retorno puede

    cambiar, en un mtodo sobreescrito NO puede cambiar, excepto por subtipos

    del tipo declarado originalmente.

    + Excepciones: En un mtodo sobrecargado las excepciones pueden cambiar,

    en un mtodo sobreescrito pueden reducirse o eliminarse pero NO deben de

    arrojarse excepciones nuevas o ms amplias.

    + Acceso: En un mtodo sobrecargado puede cambiar, en un mtodo

    sobreescrito el acceso NO debe de hacerse ms restrictivo(puede ser menos

    restrictivo).

    + Al invocar: En un mtodo sobrecargado los argumentos son los que

    determinan qu mtodo es el que se invocar, en un mtodo sobreescrito el

    tipo de objeto determina qu mtodo es elegido.

  • Pgina 14 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    2.3 Polimorfismo

    El polimorfismo en java consiste en declarar y definir varios mtodos con el

    mismo nombre, pero con diferente nmero y/o tipo de argumentos y que

    realizan diferentes operaciones. Sin embargo, el tipo que devuelven los

    mtodos debe coincidir.

    Polimorfismo es la capacidad de que diferentes objetos de una misma jerarqua

    tengan comportamientos distintos aunque reciban el mismo mensaje.

    La idea detrs del polimorfismo es poder disear nuestro cdigo teniendo en

    cuenta que todas las clases que derivan de una clase base heredan los

    mtodos de la clase base.

    Una sintaxis algo genrica puede ser la que sigue:

    class nombreClase { tipo1 var1; tipo2 var2; tipo3 var3; nombreClase nombreMetodo(tipo1 arg1, ) { sentencia11; sentencia12; sentencia1n; } nombreClase nombreMetodo(tipo2 arg1, ) { sentencia21; sentencia22; sentencia2n; } public static void main(args[]) { sentenciam1; sentenciam2; sentenciamn; } }

    En muchas ocasiones, cuando utilizamos herencia podemos terminar teniendo una

    familia de clases que comparten un interfaz comn. Por ejemplo, si creamos un

    nuevo fichero que contenga a Mamifero y Gato le aadimos:

    Mamifero.java

  • Pgina 15 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    package javaapplication5;

    class Mamifero {

    String especie,nombre, color;

    int patas;

    public void mover() {

    System.out.println("Los comportamientos de los mamferos y el numero de

    patas");

    }

    }

    Gato.java

    class Gato extends Mamifero {

    public void mover() {

    patas=4;

    System.out.println("EL Gato maulla");

    System.out.println("Su numeros de Patas es===>" +patas);

    }

    }

    Perro.java

    class Perro extends Mamifero {

    public void mover() {

    patas=4;

    System.out.println("El perro ladra");

    System.out.println("Su numeros de Patas es====>" +patas);

    }

    }

    Aves.java

    class Aves extends Mamifero {

    public void mover() {

    patas=2;

    System.out.println("Las Aves Vuelan");

  • Pgina 16 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    System.out.println("Su Numeros de Patas es==>" +patas);

    }

    }

    Polimorfismo.java

    public class Polimorfismo {

    public static void muevete(Mamifero m) {

    m.mover();

    }

    public static void main(String[] args) {

    Mamifero animal=new Mamifero();

    Gato manchas = new Gato();

    Perro pinky = new Perro();

    Aves aguila=new Aves();

    animal.mover();

    muevete(manchas);

    muevete(pinky);

    muevete(aguila);

    }

    }

    Vemos que el mtodo muvete llama al mtodo mover de un mamfero. El no

    sabe con qu clase de mamfero trata, pero funciona y se llama al mtodo

    correspondiente al objeto especfico que lo llama (es decir, primero un gato y

    luego un perro y luego un ave). Y esto no slo se aplica a los mtodos. Por

    ejemplo, podemos reescribir el cdigo del procedimiento principal:

    Y vemos que funciona exactamente igual. El polimorfismo consiste en que toda

    referencia a un objeto de una clase especfica puede tomar la forma de una

    referencia a un objeto de una clase heredada a la suya.

    2.4 Clases abstractas

    Concepto

    Hay ocasiones, cuando se desarrolla una jerarqua de clases en que algn

    comportamiento est presente en todas ellas pero se materializa de forma

    distinta para cada una. Por ejemplo, pensemos en una estructura de clases

  • Pgina 17 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    para manipular figuras geomtricas. Podramos pensar en tener una clase

    genrica, que podra llamarse Figura y una serie de clases que extienden a la

    anterior que podran ser Crculo, Polgono, etc. Podra haber un mtodo dibujar

    dado que sobre todas las figuras puede llevarse a cabo esta accin, pero las

    operaciones concretas para llevarla a cabo dependen del tipo de figura en

    concreto (de su clase). Por otra parte la accin dibujar no tiene sentido para la

    clase genrica Figura, porque esta clase representa una abstraccin del

    conjunto de figuras posibles.

    Para resolver esta problemtica Java proporciona las clases y mtodos

    abstractos. Un mtodo abstracto es un mtodo declarado en una clase para el

    cual esa clase no proporciona la implementacin (el cdigo). Una clase

    abstracta es una clase que tiene al menos un mtodo abstracto. Una clase que

    extiende a una clase abstracta debe implementar los mtodos abstractos

    (escribir el cdigo) o bien volverlos a declarar como abstractos, con lo que ella

    misma se convierte tambin en clase abstracta.

    Declaracin e implementacin de mtodos abstractos

    Siguiendo con el ejemplo del apartado anterior, se puede escribir:

    abstract class Figura {

    . . .

    abstract void dibujar();

    . . .}

    class Circulo extends Figuraca {

    . . .

    void dibujar() {

    // codigo para dibujar Circulo

    . . .

    }

    }

    La clase abstracta se declara simplemente con el modificador abstract en su

    declaracin. Los mtodos abstractos se declaran tambin con el mismo

    modificador, declarando el mtodo pero sin implementarlo (sin el bloque de

    cdigo encerrado entre {}). La clase derivada se declara e implementa de forma

    normal, como cualquier otra. Sin embargo si no declara e implementa los

  • Pgina 18 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    mtodos abstractos de la clase base (en el ejemplo el mtodo dibujar) el

    compilador genera un error indicando que no se han implementado todos los

    mtodos abstractos y que, o bien, se implementan, o bien se declara la clase

    abstracta.

    Clases abstractas

    Referencias y objetos abstractos

    Se pueden crear referencias a clases abstractas como cualquier otra. No hay

    ningn problema en escribir:

    Figura figur;

    Sin embargo una clase abstracta no se puede instanciar, es decir, no se

    pueden crear objetos de una clase abstracta. El compilador producir un error

    si se intenta:

    Figura figur = new Figura();

    Esto es coherente dado que una clase abstracta no tiene completa su

    implementacin y encaja bien con la idea de que algo abstracto no puede

    materializarse.

    Sin embargo utilizando el up-casting visto en el captulo dedicado a la Herencia

    se puede escribir:

    Figura figur = new Circulo();

    figur.dibujar();

    La invocacin al mtodo dibujarse resolver en tiempo de ejecucin y se

    llamar al mtodo de la clase adecuada. En nuestro ejemplo se llamar al

    mtodo dibujar de la clase Circulo.

  • Pgina 19 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo1.-En este ejemplo se usa la clase abstracta Figura con su etodo

    dibujkar

    Figura.java

    package javaapplication5;

    abstract class Figura {

    public int base=20,largo=30,altura=50,radio=10;

    public int area;

    abstract public void dibujar();

    public void mensaje(String cad)

    {System.out.println(cad);}

    }

    triangulo.java

    package javaapplication5;

    class triangulo extends Figura {

    public void dibujar()

    {

    area=base*altura/2;

    System.out.println("El area del Triangulo es==>"+area);

    }

    }

    Rectangulo.java

    package javaapplication5;

    class Rectangulo extends Figura {

    public void dibujar()

    {

    area=base*altura;

    System.out.println("El area del Rectangulo es==>"+area);

    }

    }

    Circulo.java

    package javaapplication5;

    class Circulo extends Figura {

    public void dibujar()

  • Pgina 20 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    {

    area=radio*radio;

    System.out.println("El area del Circulo es==>"+area);

    }

    }

    pruebaFigura.java

    package javaapplication5;

    public class pruebaFigura {

    public static void main(String[] args) {

    triangulo t1=new triangulo();

    t1.mensaje("Este es un triangulo");

    t1.dibujar();

    Rectangulo r1=new Rectangulo();

    r1.mensaje("Este es un Recatngulo");

    r1.dibujar();

    Circulo c1=new Circulo();

    c1.mensaje("Este es un Circulo");

    c1.dibujar();

    }

    }

  • Pgina 21 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo 2.-Otro Ejemplo con la Clase vehculo

    Vehiculo.java

    package javaapplication5;

    abstract class vehiculo {

    public int velocidad=0;

    abstract public void acelera();

    public void para()

    { System.out.println("Termino con velocidad es==>");

    velocidad=0;}

    }

    coche.java

    package javaapplication5;

    class coche extends vehiculo {

    public void acelera() {

    System.out.println("La aceleracin del coche es==>");

    velocidad+=5;

    }

    }

    Avion.java

    class Avion extends vehiculo {

    public void acelera() {

    System.out.println("La acelearacin del Avion es==>");

    velocidad+=50;

    }

    }

    Barco.java

    package javaapplication5;

    class Barco extends vehiculo {

    public void acelera() {

    System.out.println("La acelearacin del Barco es==>");

    velocidad+=10;

    }

    }

  • Pgina 22 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    prueba.java

    package javaapplication5;

    public class prueba {

    public static void main(String[] args) {

    //coche

    coche c1=new coche();

    c1.acelera();

    System.out.println(c1.velocidad);

    c1.para();

    System.out.println(c1.velocidad);

    //Avion

    Avion av1=new Avion();

    av1.acelera();

    System.out.println(av1.velocidad);

    av1.para();

    System.out.println(av1.velocidad);

    //Barco

    Barco bar1=new Barco();

    bar1.acelera();

    System.out.println(bar1.velocidad);

    bar1.para();

    System.out.println(bar1.velocidad);

    }

    }

  • Pgina 23 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo 3.- import java.util.*;

    abstract class Instrumento {

    public abstract void tocar();

    public String tipo() {

    return "Instrumento";

    }

    public abstract void afinar();

    }

    class Guitarra extends Instrumento {

    public void tocar() {

    System.out.println("Guitarra.tocar()");

    }

    public String tipo() { return "Guitarra"; }

    public void afinar() {}

    }

    class Piano extends Instrumento {

    public void tocar() {

    System.out.println("Piano.tocar()");

    }

    public String tipo() { return "Piano"; }

    public void afinar() {}

    }

    class Saxofon extends Instrumento {

    public void tocar() {

    System.out.println("Saxofon.tocar()");

    }

    public String tipo() { return "Saxofon"; }

    public void afinar() {}

    }

    // Un tipo de Guitarra

    class Guzla extends Guitarra {

  • Pgina 24 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    public void tocar() {

    System.out.println("Guzla.tocar()");

    }

    public void afinar() {

    System.out.println("Guzla.afinar()");

    }

    }

    // Un tipo de Guitarra

    class Ukelele extends Guitarra {

    public void tocar() {

    System.out.println("Ukelele.tocar()");

    }

    public String tipo() { return "Ukelele"; }

    }

    public class Musica2 {

    // No importa el tipo de Instrumento,

    // seguir funcionando debido a Polimorfismo:

    static void afinar(Instrumento i) {

    // ...

    i.tocar();

    }

    static void afinarTodo(Instrumento[] e) {

    for(int i = 0; i < e.length; i++)

    afinar(e[i]);

    }

    public static void main(String[] args) {

  • Pgina 25 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    // Declarar un Arreglo SIN INSTANCIAS es

    valido en Clases Abstractas

    Instrumento[] orquesta = new Instrumento[5];

    // Generar una INSTANCIA de una la Clase

    Abstracta no es valido

    // Instrumento nuevo = new Instrumento();

    int i = 0;

    // Up-casting al asignarse el Arreglo

    orquesta[i++] = new Guitarra();

    orquesta[i++] = new Piano();

    orquesta[i++] = new Saxofon();

    orquesta[i++] = new Guzla();

    orquesta[i++] = new Ukelele();

    afinarTodo(orquesta);

    }

    }

    La caracterstica de hacer una Clase/Mtodo abstract reside en

    que no puede ser generada una instancia de la misma, este

    comportamiento se demuestra en el mtodo principal (main)

    Aunque dentro del mtodo sea generado un Arreglo de esta

    Clase abstracta, recuerde que un arreglo es nicamente un

    contenedor de Objetos, esto permite que sea generado sin

    ningn error.

    Dentro de comentarios se encuentra la generacin de una

    instancia del tipo Instrumento la cual generara un error al ser

    compilada la Clase.

    Una clase abstracta es una clase que tiene al menos un mtodo que no ha sido

    especificado. Esto evita que se pueda instanciar.

  • Pgina 26 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    2.5 Interfaces

    Concepto de Interface

    El concepto de Interface lleva un paso ms adelante la idea de las clases

    abstractas. En Java una interface es una clase abstracta pura, es decir una

    clase donde todos los mtodos son abstractos (no se implementa ninguno).

    Permite al diseador de clases establecer la forma de una clase (nombres de

    mtodos, listas de argumentos y tipos de retorno, pero no bloques de cdigo).

    Una interface puede tambin contener datos miembro, pero estos son siempre

    static y final. Una interface sirve para establecer un 'protocolo' entre clases.

    Para crear una interface, se utiliza la palabra clave interface en lugar de class.

    La interface puede definirse public o sin modificador de acceso, y tiene el

    mismo significado que para las clases. Todos los mtodos que declara una

    interface son siempre public.

    Para indicar que una clase implementa los mtodos de una interface se utiliza

    la palabra clave implements. El compilador se encargar de verificar que la

    clase efectivamente declare e implemente todos los mtodos de la interface.

    Una clase puede implementar ms de una interface.

    Declaracin y uso

    Una interface se declara:

    interface nombre_interface {

    tipo_retorno nombre_metodo ( lista_argumentos ) ;

    . . .

    }

    Por ejemplo:

    interface InstrumentoMusical {

    void tocar();

    void afinar();

    String tipoInstrumento();

    }

  • Pgina 27 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Y una clase que implementa la interface:

    class InstrumentoViento extends Object implements InstrumentoMusical {

    void tocar() { . . . };

    void afinar() { . . .};

    String tipoInstrumento() {}

    }

    class Guitarra extends InstrumentoViento {

    String tipoInstrumento() {

    return "Guitarra";

    }

    }

    La clase InstrumentoViento implementa la interface, declarando los mtodos y

    escribiendo el cdigo correspondiente. Una clase derivada puede tambin

    redefinir si es necesario alguno de los mtodos de la interface.

    Referencias a Interfaces

    Es posible crear referencias a interfaces, pero las interfaces no pueden ser

    instanciadas. Una referencia a una interface puede ser asignada a cualquier

    objeto que implemente la interface. Por ejemplo:

    InstrumentoMusical instrumento = new Guitarra();

    instrumento.play();

    System.out.prinln(instrumento.tipoInstrumento());

    InstrumentoMusical i2 = new InstrumentoMusical(); //error.No se puede

    instanciar

    Extensin de interfaces

    Las interfaces pueden extender otras interfaces y, a diferencia de las clases,

    una interface puede extender ms de una interface. La sintaxis es:

    interface nombre_interface extends nombre_interface , . . . {

    tipo_retorno nombre_metodo ( lista_argumentos ) ;

    . . .

    }

  • Pgina 28 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Ejemplo.-

    vehiculo.java

    package javaapplication5;

    abstract class vehiculo {

    int velocidad;String cad;

    public void mensaje(String cad)

    {

    System.out.println(cad);

    }

    }

    arrancable.java

    package javaapplication5;

    interface arrancable {

    boolean motorArrancado=false;

    void arrancar();

    void detenerMotor();

    }

    coche.java

    package javaapplication5;

    class coche extends vehiculo implements arrancable {

    public void arrancar (){

    velocidad=70;

    System.out.println("Metodo coche.arrancar==>");

    System.out.println("velocidad===>"+velocidad);

    }

    public void detenerMotor(){

    velocidad=0;

    System.out.println("Metodo coche.detener Motor DETENIDO ");

    System.out.println("velocidad===>"+velocidad);

    }

    }

  • Pgina 29 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    BombaAgua.java

    package javaapplication5;

    class BombaAgua extends vehiculo implements arrancable {

    int capacidad;

    public void arrancar (){

    capacidad=500;

    System.out.println("Metodo BombaAgua.arrancar");

    System.out.println("capacidad de "+capacidad + "litros" );

    }

    public void detenerMotor(){

    capacidad=0;

    System.out.println("Metodo BombaAgua.detenerMotor DESCARGADO");

    System.out.println("capacidad de "+capacidad + "litros" );

    }}

    ArrancarObjetos.java

    package javaapplication5;

    public class ArrancarObjetos {

    public static void main(String[] args) {

    arrancable motorcito;//motorcito es una variable de tipo arrancable

    coche c=new coche(); //Objeto de tipo coche

    c.mensaje("BIENVENIDOS A MI COCHE");//mensaje Herencia de la

    superclase

    motorcito=c; //Motorcito apunta a c

    motorcito.arrancar(); //Se arrancar c

    motorcito.detenerMotor();

    BombaAgua ba=new BombaAgua(); //Objeto de tipo BombaAgua

    ba.mensaje("BIENVENIDOS A LA BOMBA DE AGUA");//mensaje Herencia de

    la superclase

    motorcito=ba; //Motorcito apunta a ba

    motorcito.arrancar(); //Se arranca la bomba de agua

    motorcito.detenerMotor();

    }

    }

  • Pgina 30 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    Agrupaciones de constantes

    Dado que, por definicin, todos los datos miembros que se definen en una

    interface son static y final, y dado que las interfaces no pueden instanciarse

    resulta una buena herramienta para implantar grupos de constantes. Por

    ejemplo:

    public interface Meses {

    int ENERO = 1 , FEBRERO = 2 . . . ;

    String [] NOMBRES_MESES = { " " , "Enero" , "Febrero" , . . . };

    }

    Esto puede usarse simplemente:

    System.out.println(Meses.NOMBRES_MESES[ENERO]);

    Un ejemplo casi real

    El ejemplo mostrado a continuacin es una simplificacin de como funciona

    realmente la gestin de eventos en el sistema grfico de usuario soportado por

    el API de Java (AWT o swing). Se han cambiado los nombres y se ha

    simplificado para mostrar un caso real en que el uso de interfaces resuelve un

    problema concreto.

    Supongamos que tenemos una clase que representa un botn de accin en un

    entorno grfico de usuario (el tpico botn de confirmacin de una accin o de

    cancelacin). Esta clase pertenecer a una amplia jerarqua de clases y tendr

    mecanismos complejos de definicin y uso que no son objeto del ejemplo. Sin

    embargo podramos pensar que la clase Botn tiene miembros como los

    siguientes.

    class Boton extends . . . {

    protected int x , y, ancho, alto; // posicion del boton

    protected String texto; // texto del boton

    Boton(. . .) {

    . . .

    }

    void dibujar() { . . .}

    public void asignarTexto(String t) { . . .}

    public String obtenerTexto() { . . .)

  • Pgina 31 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    . . .

    }

    Lo que aqu nos interesa es ver lo que sucede cuando el usuario, utilizando el

    ratn pulsa sobre el botn. Supongamos que la clase Botn tiene un mtodo,

    de nombre por ejemplo click(), que es invocado por el gestor de ventanas

    cuando ha detectado que el usuario ha pulsado el botn del ratn sobre l. El

    botn deber realizar alguna accin como dibujarse en posicin 'pulsado' (si

    tiene efectos de tres dimensiones) y adems, probablemente, querr informar a

    alguien de que se ha producido la accin del usuario. Es en este mecanismo de

    'notificacin' donde entra el concepto de interface. Para ello definimos una

    interface Oyente de la siguiente forma:

    interface Oyente {

    void botonPulsado(Boton b);

    }

    La interface define un nico mtodo botonPulsado. La idea es que este mtodo

    sea invocado por la clase Botn cuando el usuario pulse el botn. Para que

    esto sea posible en algn momento hay que notificar al Botn quien es el

    Oyente que debe ser notificado. La clase Botn quedara:

    class Boton extends . . . {

    . . .

    private Oyente oyente;

    void registrarOyente(Oyente o) {

    oyente = o;

    }

    void click() {

    . . .

    oyente.botonPulsado(this);

    }

    }

    El mtodo registrarOyente sirve para que alguien pueda 'apuntarse' como

    receptor de las acciones del usuario. Obsrvese que existe una referencia de

    tipo Oyente. A Botn no le importa que clase va a recibir su notificacin.

    Simplemente le importa que implante la interface Oyente para poder invocar el

  • Pgina 32 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    mtodo botonPulsado. En el mtodo click se invoca este mtodo. En el ejemplo

    se le pasa como parmetro una referencia al propio objeto Botn. En la

    realidad lo que se pasa es un objeto 'Evento' con informacin detallada de lo

    que ha ocurrido.

    Con todo esto la clase que utiliza este mecanismo podra tener el siguiente

    aspecto:

    class miAplicacion extends . . . implements Oyente {

    public static main(String [] args) {

    new miAplicacion(. . .);

    . . .

    }

    . . .

    miAplicacion(. . .) {

    . . .

    Boton b = new Boton(. . .);

    b.registrarOyente(this);

    }

    . . .

    void botonPulsado(Boton x) {

    // procesar click

    . . .

    }

    }

    Obsrvese en el mtodo registrarOyente que se pasa la referencia thisque en

    el lado de la clase Botn es recogido como una referencia a la interface

    Oyente. Esto es posible porque la clase miAplicacion implementa la interface

    Oyente . En trminos clsicos de herencia miAplicacion ES un Oyente .

  • Pgina 33 de 37

    Desarrollador en Java

    PROGRAMACIN ORIENTADA A OBJETOS CON JAVA

    MYSQL

    Mdulo 01 Area de Transferencia de

    Conocimientos

    2.6 RESUMEN

    En este captulo se comprendieron los conceptos de las metodologas

    de la programacin orientada a objetos su teora bsica, sus

    conceptos bsicos, su forma de implementar, la comprensin con

    ejemplos bsicos desde las herencias con las superclases y

    subclases, el polimorfismo, las clases abstractas y la simulacin de

    herencia mltiple con la clase interface.

    ENLACES DE INTERES

    http://www.jorgesanchez.net/programacion/manuales/Java.pdf

    http://www.manual-java.com/

    http://www.webtaller.com/manual-java/indice_manual_java.php

    http://www.docstoc.com/docs/278164/MANUAL-DE-JAVA