miércoles, 16 de mayo de 2012

Polimorfismo

Profesional en Formación: Ricargo Galarza

Polimorfismo

El polimorfismo es un concepto de la programación orientada a objetos que nos permite programar en forma general, en lugar de hacerlo en forma específica. En general nos sirve para programar objetos con características comunes y que todos estos compartan la misma superclase en una jerarquía de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la programación.

También se refiere a la posiblididad de acceder a un variado rango de funciones distintas a través del mismo interfaz. O sea, un mismo identificador puede tener distintas formas dependiendo del contexto en el que se halle. El polimorfismo se puede establecer mediante sobrecarga, sobre escritura y enlace dinámico

Sobreescritura:
Cada vez que se tiene una clase que hereda un método de una superclase, se tiene la oportunidad de sobrescribir el método. El beneficio clave al sobrescribir un método heredado es la habilidad de definir un comportamiento específico para los objetos de la subclase ejemplo:

class Animal {

public void comer(){
System.out.println("Animal comiendo...");
}
}

class Caballo extends Animal{
public void comer(){
System.out.println("Caballo comiendo...");
}
public void relinchar(){
System.out.println("Caballo relinchando...");
}
}

class ProbarMetodos{

public static void main(String... args){
Animal a = new Caballo();
Caballo c = new Caballo();
a.comer();
c.comer();
a.relinchar();
 //error!
}
}

Aún cuando la clase Caballo define un método llamado relinchar(), la clase Animal no sabe que dicho método existe, por lo tanto, el compilador arrojará un error cuando se intente invocar al método relinchar() desde una referencia Animal, no importa que el objeto Caballosí lo tenga.

Bibliografia:

Excepciones con try catch y throws   



En Java, como en cualquier otro lenguaje de programación, pueden existir situaciones en la que el programa falle. Java llama a estos errores excepciones.

Para tratar excepciones deberemos usar la instrucción try (que significa intentar en español).

try { //declaración que causa la excepción }


Entre las llaves de try escribiremos el código que hará funcional nuestro programa. Para capturar la excepción que puede generar este código necesitaremos otra instrucción llamada catch (capturar).

catch(NombredeExcepcion obj){ //código para tratar el error }

 En Java, como en cualquier otro lenguaje de programación, pueden existir situaciones en la que el programa falle. Java llama a estos errores excepciones.

Para tratar excepciones deberemos usar la instrucción try (que significa intentar en español).

try { //declaración que causa la excepción }

 Entre las llaves de try escribiremos el código que hará funcional nuestro programa. Para capturar la excepción que puede generar este código necesitaremos otra instrucción llamada catch (capturar).

catch(NombredeExcepcion obj){ //código para tratar el error }

Herencia en Java

HERENCIA EN JAVA

Java permite el empleo de la herencia , característica muy potente que permite definir una clase tomando como base a otra clase ya existente. La idea es permitir la creación de  nuevas clases basadas en clases existentes. Cuando heredamos de una clase existente, reusamos  (o heredamos) métodos y campos, y agregamos nuevos campos y métodos para cumplir con la situación nueva.
Cada vez que encontremos la relación "es-un" entre dos clases, estamos ante la presencia de herencia.
  • Superclase y Subclases
    El concepto de herencia conduce a una estructura jerárquica de clases o estructura de árbol, lo cual significa que en la POO todas las relaciones entre clases deben ajustarse a dicha estructura.

    En esta estructura jerárquica, cada clase tiene sólo una clase padre. La clase padre de cualquier clase es conocida como susuperclase. La clase hija de una superclase es llamada una subclase


    Una superclase puede tener cualquier número de subclases.

    * Una subclase puede tener sólo una superclase.






  • A es la superclase de B, C y D.
  • D es la superclase de E.   
  • B, C y D son subclases de A.
  • E es una subclase de D.


  • Existen dos tipos de herencia sencilla y múltiple.
    Sencilla significa que sólo heredamos de una clase base, mientras que múltiple indica que tenemos varias clases.

     Limitaciones en la Herencia

    Todos los campos y métodos de una clase son siempre accesibles para el código de la misma clase.

    Para controlar el acceso desde otras clases, y para controlar la herencia por las subclase, los miembros (atributos y métodos) de las clases tienen tres modificadores posibles de control de acceso:

    public: Los miembros declarados public son accesibles en cualquier lugar en que sea accesible la clase, y son heredados por las subclases.
    private: Los miembros declarados private son accesibles sólo en la propia clase.
    protected: Los miembros declarados protected son accesibles sólo para sus subclases
    Por ejemplo:

    class Padre { // Hereda de Object
    // Atributos
          private int numeroFavorito, nacidoHace, dineroDisponible;
    // Métodos
         public int getApuesta() {
                  return numeroFavorito;
         }


          protected int getEdad() {
                 return nacidoHace;
          }
          private int getSaldo() {
                return dineroDisponible;
          }
    }


    class Hija extends Padre {
     // Definición
    }     class Visita {
         // Definición
    }

    Inicialización de clases derivadas

    Cuando se crea un objeto de una clase derivada se crea implicitamente un objeto de la clase base que se inicializa con su constructor correspondiente. Si en la creación del objeto se usa el constructor no-args, entonces se produce una llamada implicita al constructor no-args para la clase base. Pero si se usan otros constructores es necesario invocarlos explicitamente. 
    En nuestro ejemplo dado que la clase método define un constructor, necesitaremos también un constructor para la clase Ejecutivo, que podemos completar así:
    class Ejecutivo extends Empleado {
        int presupuesto;

        Ejecutivo (String n, int s) {
            super(n,s);
        }

        void asignarPresupuesto(int p) {
            presupuesto = p;
        }

        public String toString() {
            String s = super.toString();
            s = s + " Presupuesto: " + presupuesto;
            return s;
        }
    }




    Bibliografia:

    martes, 15 de mayo de 2012

    Busqueda y Ordenamiento

    Alumno: Ivo Andrés Astudillo Bustamante

    Ordenamiento

      
    Es la operación de arreglar los elementos de un determinado vector en algún orden secuencial de acuerdo a algún criterio de ordenamiento.
    El propósito principal de un ordenamiento es el de facilitar las búsqueda de los elementos que se encuentran en un arreglo. 

    Criterios de Ordenamiento:

    • Ordenamiento por Intercambio o Burbuja.

    • Ordenamiento por Selección.

    • Ordenamiento por Inserción. 

    Ordenamiento por Intercambio o Burbuja:

    El método de intercambio se basa en comparar los elementos del arreglo e intercambiarlos si su posición actual o inicial es contraria inversa a la deseada. Pertenece a este método el de la burbuja clasificado como intercambio directo. Aunque no es muy eficiente para ordenar listas grandes, es fácil de entender y muy adecuado para ordenar una pequeña lista de unos 100 elementos o menos.
    Una pasada por la ordenación de burbujeo consiste en un recorrido completo a través del arreglo, en el que se comparan los contenidos de las casillas adyacentes, y se cambian si no están en orden. La ordenación por burbujeo completa consiste en una serie de pasadas ("burbujeo") que termina con una en la que ya no se hacen cambios porque todo está en orden.

    Ordenamiento por Selección:

    Los métodos de ordenación por selección se basan en dos principios básicos:
    Seleccionar el elemento más pequeño (o más grande) del arreglo.
    Colocarlo en la posición más baja (o más alta) del arreglo.
    A diferencia del método de la burbuja, en este método el elemento más pequeño (o más grande) es el que se coloca en la posición final que le corresponde.

    Ordenamiento por Inserción:

    El fundamento de este método consiste en insertar los elementos no ordenados del arreglo en subarreglos del mismo que ya estén ordenados. Dependiendo del método elegido para encontrar la posición de inserción tendremos distintas versiones del método de inserción. 

    BÚSQUEDA

     
    La búsqueda es una operación que tiene por objeto la localización de un elemento dentro de la estructura de datos. A menudo un programador estará trabajando con grandes cantidades de datos almacenados en arreglos y pudiera resultar necesario determinar si un arreglo contiene un valor que coincide con algún valor clave o buscado.
    Siendo el array de una dimensión o lista una estructura de acceso directo y a su vez de acceso secuencial, encontramos dos técnicas que utilizan estos dos métodos de acceso, para encontrar elementos dentro de un array: búsqueda lineal y búsqueda binaria.

    Tipos de Búsqueda:

    • Búsqueda Binaria.

    • Búsqueda Lineal.  

    Búsqueda Binaria:

    Para poder ejecutar el Método de Búsqueda Binaria, se debe de contar con un Array ordenado. El procedimiento que se realiza es el siguiente:
    1. El Programa internamente selecciona el elemento central del Array.
    2. Si el elemento a buscar es el dato central el proceso termina.
    3. Si el elemento a buscar no coincide con el elemento central, continua la búsqueda:
    4. Se subdivide en dos partes al Array.
    5. Si el elemento a buscar es menor que el dato central, entonces selecciona la mitad de la parte izquierda.
    6. La parte seleccionada se subdivide nuevamente y se repite todo el proceso.
    7. El proceso termina cuando el dato es encontrado.

    Búsqueda Lineal:

    La búsqueda secuencial es la técnica más simple para buscar un elemento en un arreglo. Consiste en recorrer el arreglo elemento a elemento e ir comparando con el valor buscado (clave). Se empieza con la primera casilla del arreglo y se observa una casilla tras otra hasta que se encuentra el elemento buscado o se han visto todas las casillas. El resultado de la búsqueda es un solo valor, y será la posición del elemento buscado o cero. Dado que el arreglo no está en ningún orden en particular, existe la misma probabilidad de que el valor se encuentra ya sea en el primer elemento, como en el último. Por lo tanto, en promedio, el programa tendrá que comparar el valor buscado con la mitad de los elementos del arreglo.
    El método de búsqueda lineal funciona bien con arreglos pequeños o para arreglos no ordenados. Si el arreglo está ordenado, se puede utilizar la técnica de alta velocidad de búsqueda binaria, donde se reduce sucesivamente la operación eliminando repetidas veces la mitad de la lista restante.

    Biografia:

     

    lunes, 14 de mayo de 2012

    Instrucciones de control I.


    Las instrucciones de un programa pueden ser:
    • Simples:
    - Expresiones: de asignación, incremento o decremento
    - Llamadas a métodos
    - Creación de objetos
    - instrucciones de control: if, switch, while, do-while, for
    • Compuestas:
    - Se encierran entre llaves {}, y también se llaman bloques
    - Pueden contener muchas instrucciones y declaraciones;
    - Las declaraciones del bloque sólo son visibles en él, y en los bloques contenidos en él
    -Instrucción condicional simple
    La instrucción condicional simple permite tomar decisiones empleando una variable booleana:
    Ejemplo: poner un texto aprobado o suspenso según la nota

    Ejemplo: poner un texto aprobado o suspenso según la nota





    -Instrucción condicionales anidadas.
    Las instrucciones if también se pueden anidar:
    El else se asocia al if anterior más próximo que no tenga else, siempre que esté en el mismo bloque que el else.
    Ejemplo: poner “cum laude” en el ejemplo anterior si nota>=9


    -Instrucción condicional múltiple (switch).
    Permite tomar una decisión de múltiples posibilidades, en función de un valor no booleano
    Si este valor es discreto (byte, short, int, long, char, o enumerado), podemos utilizar una instrucción switch




    El funcionamiento es el siguiente:
    - Se compara la expresión con el primer valor.
    - Si coincide, se ejecutan las instrucciones puestas bajo ese valor, y todas las siguientes que se encuentren, hasta encontrar un break.
    - Si no coincide, se compara con el segundo valor, y así sucesivamente.
    - Si no coincide con ningún valor, se ejecutan las instrucciones que haya en la parte default, si existe.
    - Después de un break, la instrucción switch termina y seguimos por la siguiente instrucción.
    - Los valores deben ser constantes, no variables.
    - No puede haber ninguno coincidente.



    -Instrucción condicional múltiple no discreta(else if).
    Cuando la decisión no es discreta, usamos una “escalera” de instrucciones if:





    Las condiciones se examinan empezando por la de arriba.
    Tan pronto como una se cumple, sus instrucciones se ejecutan y la instrucción se abandona.
    Si ninguna de las condiciones es cierta se ejecuta la última parte else.
    La instrucción switch es mucho más eficiente que la instrucción condicional múltiple
    En switch sólo se toma una decisión
    En el if múltiple se evalúan muchas condiciones.

    Ejemplo: Poner nota media entera con letra
      

    Instrucciones de control II

     

    Los bucles que veremos serán el FOR, el WHILE y el DO-WHILE, explicaremos cuantas veces se ejecuta uno u otro y cómo funcionan.
    -Instrucciones bucle o de lazo.
    Permiten ejecutar múltiples veces unas instrucciones
    Se corresponden a la composición iterativa de teoría.
    La cantidad de veces se puede establecer mediante:
    Una condición:
    - Se comprueba al principio: las instrucciones del bucle se hacen cero o más veces
    - Se comprueba al final: las instrucciones del bucle se hacen una o más veces.
    Un número fijo de veces: se usa una variable de control
    - Bucle con condición de permanencia al principio, este bucle se ejecuta 0 o N veces.


    Ejemplo: Calcular el primer entero positivo tal que la suma de él y los anteriores sea mayor que 100.






    - Bucle con condición de permanencia al final, como mínimo se ejecuta 1 vez, y como máximo N veces.



     - Bucle con variable de control. Se puede ejecutar 0 o N veces (normalmente este bucle no se usa para ejecutar 0 veces…).





    Es equivalente a:



    Ejemplo: Sumar los 100 primeros números enteros positivos



    Ejemplo: Sumar los 51 primeros números pares.




    -Recomendaciones sobre el bucle “for”(experiencia propia).
    Debe usarse para lazos con variable de control y de una manera uniforme.
    Es conveniente declarar la variable de control en el lazo (no usar variables globales).
    Es conveniente que la expresión de incremento sea la propia variable de control.
    Es conveniente que la expresión de permanencia sea simple.
    Nunca cambiar el valor de la variable de control en las instrucciones (utilizarla como operando).
    -Instrucciones de salto en bucle.
    Hay tres instrucciones que permiten saltarse las instrucciones
    Restantes del bucle:
    • break:
    - Termina el bucle
    • continue:
    - Termina las instrucciones del bucle, pero sigue en él
    • return:
    - Termina un método, pero si estamos en un bucle, lógicamente también lo termina.


    BIBIOGRAFIA:


    viernes, 11 de mayo de 2012

    Componentes de la GUI

    Componentes de la GUI

    Introduccion

    Una GUI proporciona a una aplicación una “apariencia visual” única. Al proporcionar distintas aplicaciones
    en las que los componentes de la interfaz de usuario sean consistentes e intuitivos, los usuarios pueden
    familiarizarse en cierto modo con una aplicación, de manera que pueden aprender a utilizarla en menor tiempo
    y con mayor productividad.
    Para crear interfaces graficas nos valemos del paquete SWING el cual forma parte de las API´s de java; este paquete nos permite diseñar interfaces graficas para tener una interaccion mas amigable con el usuario.

    AWT a SWING  

    AWT:Contiene clases para crear interfaces de usuario, y para pintar gráficos e imágenes. 
    SWING:Paquete java para la generación del GUI en aplicaciones reales de gran tamaño.
    Componentes y Contenedores
    Los componentes SWING tienen la misma funcionalidad que los componentes AWT, y además, añaden nuevas.
    Las interfaces de usuario se crean empleando clases que representan componentes (botones, scrollbar, ventanas, etc.).
    Existen componentes de tipo contenedor, que pueden contener a otros componentes, disponiendolos en pantalla según dispongan las clases Representan la actividad entre el sistema, los programas y los usuarios.

    Eventos y Metodos

    Cualquier clase puede recibir y manejar los eventos.
    Normalmente:
    Componentes generarán eventos en respuesta a las acciones de los usuarios.
    Objetos del usuario escucharán y atenderán los eventos generados.
    Se definen varios tipos de eventos.
    En java 1.0 sólo existía un super-evento que representaba todo.
    Cada tipo de evento tiene campos y métodos específicos.
    Debe importarse java.awt.event.*
    Los objetos escuchadores deben registrarse en los generadores para que estos les envien los eventos.
    Cuando se produce un evento, el generador invoca un método en todos los objetos escuchadores registrados.
    El método que se invoca depende del tipo de evento.
    Estos métodos se definen en varias interfaces llamadas escuchadoras.
    Las clases escuchadoras deben implementar las interfaces escuchadores asociadas a los tipos de eventos que quieran atender.
    Los métodos de los generadores para registrar y dar de baja a los escuchadores son addXXX y removeXXX, donde XXX es el nombre de la interfaz escuchadora.
    estión de geometría usadas.
    Los componentes pueden producir eventos, que provocarán la ejecución de ciertos métodos en las clases que escuchan por tales eventos. 
    Los componentes Swing tienen la misma funcionalidad que los componentes AWT, y además, añaden nuevas funcionalidades.
    Como regla general de traducción: Poner una J delante de los componentes AWT.  

    Bibliografias
    http://jungla.dit.upm.es/~santiago/docencia/apuntes/applets/index.htm
    http://jungla.dit.upm.es/~santiago/docencia/apuntes/Swing/index.htm



    Arreglos En Java


    Los Arreglos en Java
    Se pueden definir como objetos en los que podemos guardar mas de una variable, es decir, al tener un unico arreglo, este puede guardar multiples variables de acuerdo a su tamaño o capacidad, es importante recordar que las variables guardadas deben ser del mismo tipo, por ejemplo: Si tenemos un arreglo de tipo Numerico que puede almacenar 10 variables, solo podra almacenar 10 numeros diferentes, no otras variables como caracteres o Strings.
    Existen 2 tipos de arreglos, los unidimensionales, y los multidimensionales(generalmente 2 dimensiones y se les denomina matrices), en esta lección veremos como declarar y utilizar los arreglos unidimensionales, estos son mas sencillos y faciles de comprender, y pueden servirnos para muchas aplicaciones.

     La estructura de declaración de un arreglo es la siguiente:
     tipo_dedato [] nombre_variable;

     Definir tamaño de arreglos: Para asignar a un arreglo su tamaño o capacidad, se hace de la siguiente forma:
     arreglo = new tipo_dedato[capacidad];

     Ejemplo:
     array = new String[10] //
    En donde la capacidad es de 10.Una vez se tiene declarado un arreglo, y al mismo se le ha asignado un tamaño o capacidad, podemos accesar a los datos dentro del mismo y asignarle valores. Para hacer esto es necesario proceder de la siguiente forma:

    arreglo[indicador]=valor;

     Ejemplos:
    1 array[0] = "Ejemplo"; //aqui se asigna el valor "Ejemplo" a un arreglo de String en su primera posicion
    2 array2[3] = 5; //se asigna un valor de 5 al 4to elemento de un arreglo numerico;

    Cabe recalcar que en la segunda linea de código en los comentarios dice que se declara un valor de 5 al 4to elemento , ya que en java los arreglos comienzan desde la pocicion 0 así como en la primera linea de Código. Bibliografia
    http://www.slideshare.net/dare3_16/arreglos-en-java
    http://codigoprogramacion.com/java/96-arreglos-en-java.html.

    Métodos

    Métodos

    Declaración de métodos

    En Java toda la lógica de programación (Algoritmos) está agrupada en funciones o métodos.
    Un método es:
    • Un bloque de código que tiene un nombre,
    • recibe unos parámetros o argumentos (opcionalmente),
    • contiene sentencias o instrucciones para realizar algo (opcionalmente) y
    • devuelve un valor de algún Tipo conocido (opcionalmente).
    La sintaxis global es:
    Tipo_Valor_devuelto  nombre_método ( lista_argumentos ) {
            bloque_de_codigo;
    }
    y la lista de argumentos se expresa declarando el tipo y nombre de los mismos (como en las declaraciones de variables). Si hay más de uno se separan por comas.
    Por ejemplo:
    int sumaEnteros ( int a, int b ) {
            int c = a + b;
            return c;
    }
    • El método se llama sumaEnteros.
    • Recibe dos parámetros también enteros. Sus nombres son a y b.
    • Devuelve un entero. 
    En el ejemplo la claúsula return se usa para finalizar el método devolviendo el valor de la variable c.

    El termino void

    El hecho de que un método devuelva o no un valor es opcional. En caso de que devuelva un valor se declara el tipo que devuelve. Pero si no necesita ningún valor, se declara como tipo del valor devuelto, la palabra reservada void. Por ejemplo:
       void haceAlgo() {
            . . .
        }
    Cuando no se devuelve ningún valor, la claúsula return no es necesaria. Observese que en el ejemplo el método haceAlgo tampoco recibe ningún parámetro. No obstante los paréntesis, son obligatorios.

    Uso de métodos

    Los métodos se invocan con su nombre, y pasando la lista de argumentos entre paréntesis. El conjunto se usa como si fuera una variable del Tipo devuelto por el método.
    Por ejemplo:
    int x;
    x = sumaEnteros(2,3);
    Nota: Esta sintaxis no está completa, pero sirve para nuestros propósitos en este momento. La sintaxis completa se verá cuando se hable de objetos.
    Aunque el método no reciba ningún argumento, los paréntesis en la llamada son obligatorios. Por ejemplo para llamar a la función haceAlgo, simplemente se pondría:
    haceAlgo();
    Observese que como la función tampoco devuelve ningún valor no se asigna a ninguna variable. (No hay nada que asignar).




     

    miércoles, 9 de mayo de 2012

    Archivos y flujos


    Antes de entrar al análisis de lo que son los archivos y flujos en java deberemos tener en claro algunos conceptos importantes. Entre los conceptos que vamos a analizar están los siguientes.

    ¿Qué es un archivo o fichero?

    En términos informáticos, un archivo es un grupo de datos estructurados que son almacenados en algún medio, los cuales pueden ser usados por aplicaciones.

     Características de los archivos.

    Entre las características que los archivos (informática) se encuentran los siguientes:

    Nombre y extensión.-  Cada una de los archivos es individual y este es identificado por un nombre y una extensión, esta ultima nos ayuda a identificar el formato del archivos

    • Datos sobre archivo.- Además de los datos anteriormente analizados cada archivo según el sistema de archivos se guarda también algunos datos adicionales como: fecha de creación, fecha de modificación y fecha de ultimo acceso, y algunas propiedades como: oculto, de sistema, de solo lectura.

    • Tamaño.- Los archivos también poseen un tamaño el cual pueden ser medido en byte, kilobytes, megabytes, etc., este tamaño dependerá de la cantidad de caracteres que este contenga.
    • Ubicación.- Todo archivo pertenece a un directorio o subdirectorio. Esta ubicación suele comenzar con la unidad de lógica que lo contiene y posteriormente encontraremos los subdirectorios hasta llegar al directorio contenedor del archivo.
    Flujo.- En informática se puede decir que un flujo es un conjunto de clases que son las encargadas de la administración de los ficheros. Mas adelantes se analizaran mas a fondo algunas de estas clases.

    Una vez que se han analizados estos conceptos podemos adentrarnos mas en el estudio de los ficheros o archivos en informática.

    En java a los archivos se los considera a cada archivo como un flujo secuencial de bytes. Ahora en cada sistema operativo podemos encontrar una manera diferente de identificar el fin de archivo.

    En algunos casos el fin de archivo se da por una excepción y en otros en cambio se da debido a un valor de retorno de un método invocado en un objeto manejador de flujos

    Los flujos de archivos se pueden usar tanto para la entrada o para la salida de datos. Los flujos que reciben y envían bytes a archivos se les conoce como: flujos basados en bytes y el almacenamientos de los datos se da en formato binario; en cambio los flujos que reciben y envían caracteres del/a los archivos se les conoce como flujos basados en caracteres y el almacenamiento se realiza mediante una secuencia de caracteres.

    Los archivos que se crean usando flujos basados en bytes se conocen como archivos binarios. Los archivos que se crean usando flujos basados en caracteres se les conoce como archivos de texto.

    Los programas en java realizan la apertura de un archivo creando un objeto el cual se asociara a un flujo de bytes o caracteres. El lenguaje de programación java crea tres objetos flujo los cuales se asocian con dispositivos cuando un programa java empieza su ejecución; estos son: System.in, System.out, System.err.

    System.in.- Es aquel que permite a un programa recibir bytes desde teclado.
    System.out.- Es aquel que permite a un programa mostrar datos por pantalla.
    System.err.- Es aquel que permite a un programa mostrar un mensaje de error en la pantalla.  

    Claro que no siempre se aplica las definiciones antes descritas ya que cada uno de estos flujos tiene la capacidad de redirigirse. Es así como System.in tiene la capacidad de leer bytes desde un origen distinto, los otros 2 en cambio pueden permitir que la salida se envié a una ubicación distinta, como por ejemplo a un archivo en disco. La clase System proporciona algunos métodos para la redirección de flujos estándar de entrada, salida y error como son: setIn, setOut y setErr.

    El manejo de los archivos en java se da gracias a las clases del paquete java.io el cual posee definiciones para las clases de flujos como las siguientes:
    ·         FileOutputStream
    ·         FileReader
    ·         FileWriter

    Todos los archivos se abren gracias a que se crean objetos de estas clases de flujos, que heredan de las siguientes clases:
    ·         InputStream
    ·         OutputStream
    ·         Reader
    ·         Writer

    Para la realización de entrada y salida de datos pueden usarse objetos de las clases siguientes:
    ·         ObjectInputStream
    ·         ObjectOutputStream
    ·         FileInputStream
    ·         FileOutputStream

    Para las operaciones de entrada y salida que se basan en caracteres se las puede llevar a cabo con las siguientes clases:
    ·         Scanner
    ·         Formatter

    La primera se usa en forma extensa la cual recibe datos desde teclado, claro que también puede ser usada para leer datos desde archivos; la segunda en cambio permite la visualización de datos con formato por pantalla o enviarlos a un archivo.

    Bibliografía.
    • Deitel P, Deitel H (2008). Java como programar. México: Pearson Prentice Hall.
    • Diccionario de Informativa (s.f). Recuperado el 10 de Abril del 2010, de http://www.alegsa.com.ar/Dic/archivo.php
    • Martínez A; Ramón Jiménez J (s.f). Flujos en Java Programación Orientada a Objetos. Recuperado el 11 de Abril del 1012 de http://uamisoft.izt.uam.mx/dokuwiki/lib/exe/fetch.php?media=amm:cursos:poo:07-p:sem11flujos.pdf

    HERENCIA

    1.- Superclases y subclases

    Dado que la mayor parte de las veces un objeto de una clase es un objeto de otra clase, en este contexto las super clases tienden a ser más generales y las subclases más específicas.

    Las relaciones de herencia dan como resultado estructuras jerárquicas en forma de árbol. 
    Uno de los problemas de la herencia es que una subclase pueda heredar métodos innecesarios. A pesar que una superclase sea la más apropiada para una subclase, a menudo las subclases necesitan que las superclase sea personalización del método, dados estos casos la subclase se puede cambiar el método de su superior con la utilización de una implementación adecuada. 

    2. -Miembros Protected

    Protected ofrece una protección medio entre el public o el private. Los miembros de estas subclases se pueden utilizar por otros miembros de la misma, por los miembros de sus subclases y por los miembros de otras clases que estén en el mismo paquete. Todos los miembros de tipo public y protected de una superclase dada retienen su modificador de acceso pasan a ser miembros de una subclase. 
    Los métodos de una subclase pueden referirse a los miembros public y protected que hereden características de la superclase tan solo con la utilización del nombre de los miembros.

    3.- Los constructores en las subclases

    Los constructores de una superclase pueden ser llamados de forma implícita o explicita, ocurre de manera similar cuando una superclase se deriva de otra clase, el constructor de una superclase invoca al constructor de la clase que le sigue un nivel mas arriba en la jerarquía.

    4.- Ingeniería de software

    Cuando una clase extiende de una ya existente esta clase hereda los miembros que no son privados de la clase que ya existe. También se puede personalidad la clase a nuestro gusto con el fin de que esta cumpla con nuestras necesidades.
    La OOP nos facilita la reutilización de código ya existente, con lo que se obtiene una reducción considerable en el tiempo de desarrollo

    BIBLIOGRAFÍA
    • Camacho, D. Valls, J.,Garcia J.,Molina, J. Bueno,E. (2003). Programaciòn,Algoritmos y ejercicios resueltos en Java. Mexico: Pearson Prentice Hall.