Practica 5 Miércoles, Abr 2 2008 

Este viernes empezamos como es costumbre con una breve explicación teórica, volvimos a recordar algunos conceptos de herencia ( upcasting y downcasting), haciendo hincapié en la posibilidad que ofrece java de poder extender de una clase e implementar varias; también hablamos de los dos métodos de polimorfismo sobrecarga y sobreescritura ( omitimos la explicación), y se explicó el significado de una clase abstracta e interfaces, recordaremos que una clase abstracta implementa algún método abstracto mientras que en una interface todos  los métodos son abstractos ( y públicos), no hace falta recordar que un método abstracto es aquel que no está implementado y que cualquier clase que implemente una interface deberá implementar todos los métodos de esta. 

Ahora empezamos con la práctica en si, dividimos la práctica en dos partes en la primera (ejercicios 1,2) lo primero que hicimos fue reescribir los métodos toString() de las clases de la práctica 4, en el 2 nos piden actualizar la clase Clase, que implementa Almacenable, desde mi punto de vista es la parte más complicada y que no hemos hecho correctamente.

Þßàpublic void guarda( java.io.FileWriter out )  throws Exception{
ÏϧÏϨêîìthrow new Exception (IOException);
ÏϧÏϨ¹¹Ïout = this.toString();
ÏϧÏÏ©} 
ÏϧÏÞßàpublic void lee( java.io.FileReader in ) throws IOException{
ÏϧÏϨ¹³´if (in.ready()){_
ÏϧÏϧÏ6¾¹íÏString lectura= (String) in;
ÏϧÏϧÏ6Ï}_
ÏϧÏϧÏö´else{
ÏϧÏϧϸ¾êîìthrow new Exception (IOException);
ÏϧÏϧÏÈÏ}
ÏϧÏÏ©} 

“ Nuestro problema es que no sabemos tratar las excepciones correctamente creo que deberíamos pedir una tutoria para repasar esto….” 

El apartado 3 los dividiremos en varios subapartados en los cuales vamos a ir implementando una interfaz gráfica mediante diferentes clases, partiremos de una clase base ComponenteGrafico, e iremos implementando otras clases que heredarán de esta siendo estas componentes y contenedores pero todas heredaran de “ComponenteGrafico” lo que nos permitirá reutilizar código. 

En el apartado 3.3 se pregunta si ¿Podría contener dicha clase GUIContenedor a un objeto de su misma clase, es decir, a un objeto GUIContenedor?
Nosotros pensamos que si ya que GuiContenedor hereda de ComponenteGrafico y el array que se crea es de objetos ComponenteGrafico por lo que si se podrá guardar en el.
 

Bueno y el viernes más….

Practica 4 Martes, Mar 25 2008 

Globalmente podemos destacar en esta práctica tres principales conceptos: 

1)       Herencia y polimorfismo:  Es crucial tener claro como funcionan, en resumen:

Superclase è Contendrá las características comunes a todas las clases que hereden de ella.

Subclase è Clase que hereda los métodos de la superclase.

Generalización è Cuando vamos de la clase inferior a la superior.

Especialización è Cuando vamos de la clase superior a  la inferior. 

2)       Modificadores: El manejo de los modificadores es una ayuda para caracterizar nuestras variables, permitiendo su acceso, o cambio de valor. Ejm:

private  (no permite q la clase derivada acceda)                              

protective  (solo pueden acceder las clases derivadas) 

3)       Constructores: El tener los conceptos claros acerca de los constructores y la herencia nos ahorraran valiosos minutos a la hora de corregir los errores de nuestros códigos. Destacamos:

* Los atributos se heredan, los constructores no.

* Los constructores no tienen tipo de retorno.                

* TRUCO:  CASTING è OBLIGATORIO AL BAJAR EN JERARQUIA, ENLACE DINAMICO.

miembro m = new Atributo();

atributo a = new Atributo();

a != m

m = a

a = (Atributo)m               

 * CONSEJO:  Para tener claro estos 3 conceptos os animamos a realizar los 7 ejercicios de la practica hasta el final, a continuación, os mostramos una pincelada de lo mas destacable. 

Esta práctica está basada en gran medida en la anterior, pero aquí introducimos una  nueva clase  “Miembro”, de esta clase derivan las demás (Atributo, Metodo) y de Metodo deriva Constructor, creándose así una jerarquía de clases que es el fin de esta práctica .

 La primera clase que creamos es Miembro, escribiendo su método constructor y el método  “toString( )” que espero que todo el mundo lo haya hecho bien ahora utilizando los métodos de la clase  StringBuffer. 

Creamos las clases Atributo y Metodo teniendo en cuenta que heredan de Miembro, y la clase Constructor que hereda de Metodo. Teniendo en cuenta que el método “toString ( )” de la clase Metodo y Constructor nos devolverá prácticamente lo mismo, lo que haremos será en el método “toString( )” de Constructor hacer una llamada a super. toString(), pero utilizando el método   “replaceAll(—,—)”    que nos permite cambiar el primer texto por el segundo, en este caso (Metodo por Constructor) .

 public String toString( ) {
// A IMPLEMENTAR
StringBuffer m  = new StringBuffer ( );
m.append (super.toString( ).replaceAll(“METODO”,”CONSTRUCTOR”));
return m.toString();
}
 

A continuación crearemos la clase “Clase”, que es la que sufre más cambios como dice la práctica, aquí creamos un array de miembros de manera que cuando creamos un objeto de esta clase (Clase), se almacenan los miembros que tiene la clase y unas variables que nos indican cuantos atributos, metodos y constructores tiene este objeto. De esta clase remarcar los métodos que devuelven un array de (atributos, metodos o constructores ), Para crear este método como podemos ver a continuación usamos el operador de java “instanceof” que nos permite comparar los objetos a ambos lados del operador, y en la siguiente línea fijarnos como debemos realizar un DownCasting, con (Atributo).

 public Atributo[] getAtributos() {
// A IMPLEMENTAR
Atributo [] atributo =new Atributo[numAtributos];
for (int i=0,j=0; i<miembros.length; i++){
if (miembros [i] instanceof Atributo){
atributo[j]=(Atributo) miembros[i];
j++;
}
}

Para terminar creamos unos objetos de las clases  (ClasePrueba y OtraClaseOPrueba), que nos deberán permitir obtener un resultado como el mostrado al final de la práctica, nosotros omitimos el nuestro porque en pantalla queda como diria un amigo nuestro (un batiburrillo de código). Nos vemos el viernes…

Practica 3 Miércoles, Mar 12 2008 

Para esta práctica hemos tenido un nuevo profesor (para algunos), para nosotros ya un viejo conocido. Casi toda la primera hora fue para resolver las preguntas de la introducción y la  explicación de la práctica insistiendo en el significado de que java “pase los argumentos por valor”, esto significa que java pasa una copia del argumento o parámetro, tendremos en cuenta que cuando trabajamos con objetos Java lo que pasa es una referencia a objetos (o una copia de esa referencia), que ¿Cómo os habeis quedado?, si, yo tambien me quedé con la misma cara de pasta de boniato, pero no era plan de hacerselo repetir al profesor por tercera vez.                En los ejercicios de la práctica nos encontramos diferentes clases, modificador, atributo, metodo constructor etc, en las que hay que implementar el método constructor() y un método toString(), (muy similares en casi todas las clases) que nos permitirá obtener información de las clases.               

Resaltar que nosotros el método toString lo realizamos así (más o menos): 

public String toString() {
       
  
    return “\n CONSTRUCTOR : NOMBRE= “+nombre+” MODIFICADOR DE ACCESO = “ +Modificador.toString(modificadores);      

} 

pero viendo ejercicios resueltos de años anteriores vemos que utilizan unos métodos de la clase “StringBuffer”, ni que decir que así queda mejor pero hay que conocerse estos métodos o echar en el API de java media vida………. 

public String toString() {
       
         StringBuffer str =
new StringBuffer ();
         str.append (
“Alias = “+alias);
         str.append (clase.toString());
       
        
return  str.toString();
      }//
(nosotros para la próxima ya lo haremos así)                

 Al final de la práctica se muestra como debería quedar al ejecutar el método PruebaObjetos, lo que veis a continuación es lo que nos sale a nosotros, juzgar vosotros mismos. 

C:\Documents and Settings\Jose Luis\Mis documentos\UC3M\Practicas OCA 07-08\P-3>java PruebaObjetos 

Alias = objeto1ClasePrueba 

ATRIBUTO : NOMBRE= atributoPublico TIPO = java.lang.String MODIFICADOR ACCESO = public 

ATRIBUTO : NOMBRE= atributoProtegido TIPO = int MODIFICADOR ACCESO = protected 

ATRIBUTO : NOMBRE= atributoPrivado TIPO = char MODIFICADOR ACCESO = private 

CONSTRUCTOR : NOMBRE= ClasePrueba MODIFICADOR DE ACCESO = public 

CONSTRUCTOR : NOMBRE= ClasePrueba MODIFICADOR DE ACCESO = public 

METODO : NOMBRE= metodoPublico TIPO DE RETORNO = void MODIFICADOR DE ACCESO = public 

METODO : NOMBRE= metodoProtegido TIPO DE RETORNO = void MODIFICADOR DE ACCESO = protected 

METODO : NOMBRE= metodoPrivado TIPO DE RETORNO = void MODIFICADOR DE ACCESO = private

// Dual para los siguientes objetoNClasePrueba


 
     También recomendamos echar un vistazo al paquete java.lang.reflect, y los métodos que aportan las clases Class, Field, Modifier, Constructor y Method (por ir conociendo un poco el API). No debemos olvidar de que todos los objetos en java heredan de la clase java.lang.Object y por ello estan dotados de un método getClass, cuya firma es public final Class getClass(). Este método nos devuelve un objeto java.lang.Class, que va a ser nuestro punto de entrada al API Reflection. Tendremos en cuenta que, los métodos de la API Reflection nos permiten acceder a los campos y métodos públicos.            Bueno y para ir terminando recordaros que  si alguno a estas alturas todavía está pensando que “estas prácticas no da tiempo hacerlas en clase” baja a la cruda realidad y empieza a echarle horas en casa porque si no te puedes encontrar ………..con el agua la cuello. PD: Para el que todavía no haya echo el comentario, que este os sirva de ayuda pero ¡solo Ayuda¡……….

Practica 2 Jueves, Mar 6 2008 

Destacamos en cada uno de los ejercicios de esta practica lo que nos ha parcesido mas importante:

EJERCICIO 1:

Class path ==> Variables de entorno dentro del sistema operativo.

Variables de entorno ==> Conjunto de valores dinámicos que normalmente afectan el comportamiento de los procesos.     

* Truco: %CLASSPATH% permite no borrar las entradas anteriores.

* Consejo: Configurar el CLASSPATH, compilar y ejecutar debe estar mas que superado para afrontar esta asignatura al igual que manejar el API como si fuera vuestra nueva doctrina, si no ir rezando lo que sepais.

EJERCICIO 2:
Asercion ==> Comprobacion de la sintaxis del codigo, las aserciones son útiles para especificar programas y para razonar la corrección de los mismos.
Trazas de depuracion ==> Comprobacion de los valores de las variables de codigo en la ejecucion del programa.

En nuestro ejercicio:

public class ErrorDivisión {public static void main(String[] args) {int a=3;int b=3;

int c=4;int d=0;System.err.println(“Empezando la depuración”);a+=b;

System.err.println(“Vamos a ver si el programa divide bien”);LogTrace.assertion( d!=0,“Error el divisor no puede ser cero” );  //Llamada a LogTraceb+=c/d;System.err.println(“El programa funciona bien”);}}

//Hemos insertado una traza de depuracion de la calse “Logtrace.java”.

//Donde LogTrace tendra por ejemplo esta forma.

public class LogTrace{public static void assertion(boolean condicion, String mensaje){  //Ejemplo de asercionif(condicion == false){System.out.println(mensaje);

System.exit(0);}}

}

* Truco: Para evitar los errores en el funcionamiento de los programas, suelen lanzarse varias versiones «beta» de cada programa, que son probadas hasta alcanzar la version definitiva.

* Consejo: Distinguir siempre que:

System.err ==> Informacion de error, implica:

Parameters:
err – the new standard error output stream.
Throws:
SecurityException – if a security manager exists and its checkPermission method doesn’t allow reassigning of the standard error output stream.

System.out ==> Informacion para mostrar el usuario

EJERCICIO 3:

Tratamiento de Excepciones y Errores, es vital para avanzar en OCA, asi que en este ejercicio destacamos que es impresindible tener claro como capturarlas.

Bloque try/catch ==> Significa poner la porcion de codigo que nos parece que puede dar algun error en el try, y la forma de tratarlo en el catch.

Constructor de FILE:

Constructor Summary
File(File parent, String child)
          Creates a new File instance from a parent abstract pathname and a child pathname string.
File(String pathname)
          Creates a new File instance by converting the given pathname string into an abstract pathname.
File(String parent, String child)
          Creates a new File instance from a parent pathname string and a child pathname string.
File(URI uri)
          Creates a new File instance by converting the given file: URI into an abstract pathname.

* Trucos: Ver Link

* Consejo para los profes: DESARROLLAR ESTE EJERCICIO EN CLASE YA QUE NO HEMOS PODIDO AVANZAR (CREO QUE HABLO POR UNOS CUANTOS)

EJERCICIO 4:

Que hacer con: ” java.lang.ArrayIndexOutOfBounds Exception”

Estas excepciones las podemos controlar de dos maneras, una con throws o si sabemos los margenes de nuestro array condicionarla con un if por ejemplo.

if(numero<0 || numero >10) 

throw new Exception(“Excede el tamaño del Array”);

* Truco: Recordar siempre que los array empiezan en la posicion 0.

* Consejo: La excepcionjava.lang.ArrayIndexOutOfBounds Exception” siempre es del tipo “NullPointerException”, asi que traduciendolo estais queriendo acceder a una posicion fuera de los limites del array.

EJERCICIO 5:

EN CONSTRUCCION

Práctica-1 Viernes, Feb 29 2008 

El primer viernes no pudimos venir a prácticas, asi que hemos tenido que realizar la práctica esta semana y poner el comentario un poco tarde.

La práctica 1 es la misma del año pasado asi que nos suena un poco (por desgracia), sobre las primeras preguntas comentar que usaremos como editor “PCGrasp”, para saber el path de la máquina virtual de java, en una ventana de MSDOS tecleamos “path” nos aparecen todos los path de los diversos programas nos fijaremos en el de java (C:\Archivos de programa\java\jdk1.6.0_01\bin)

Los ejercicios que se proponen nos permiten conocer la salidas y entradas estandar de la máquina, mediante objetos de las clases java.io establecemos una comunicación entre el usuario y la máquina con los métodos System.in y System.out.

En el apartado 3 se nos pregunta el porque de asignar a la variable b=-1, el motivo es que el método read () cuando lee un stream de entrada devuelve un valor entre 0 y 255, si no se ha introducido ningún dato devuelve un (-1).

Bienvenidos Lunes, Feb 25 2008 

pb250511.jpg

Hola somos Marco y Jose Luis, y acabamos de crear nuestro blog, esto es una prueba. Saludos a todos los que esteis en 5ª convocatoria y suerte.

« Entradas anteriores