Diario de un Aprendiz de Java

Friday, October 19, 2007

Operador instanceof

El operador instanceof sirve para consultar si un objecto es una instancia de una clase determinada, o de su padre. Por ejemplo, si tenemos la clase Punto :

import java.lang.Math;

public class Punto {
     protected int x, y;

     public Punto ( int x, int y ) {
         this.x = x;
         this.y = y;
     }

     // Devuelve la distancia al eje de coordenadas
     public float distancia() {
         return Math.sqrt(Math.pow(x,2.0)+Math.pow(y,2.0));
     }
}


Y luego la clase Punto3D, que hereda a Punto y extiende sus atributos, a parte de sobreescribir el método distancia :

import java.lang.Math;

public class Punto3D extends Punto {
     private int z;

     public Punto3D ( int x, int y, int z ) {
         super(x,y);
         this.z = z;
     }

     // Devuelve la distancia al eje de coordenadas
     public float distancia() {
         return Math.sqrt(Math.pow(x,2.0)+Math.pow(y,2.0)+Math.pow(z,2.0));
     }
}


Como vemos, sobreescribimos el método distancia() en Punto3D para que devuelva la distancia al eje de coordenadas de una posición en el espacio tridimensional.

Si tenemos que escribir algún método general, que pueda tratar tanto con Puntos como con Puntos3D, posiblemente deberemos hacer algún casting de objetos, y para saber con que clase instanciada estamos tratando deberemos usar el operador instanceof.

public class Main {
     public Main() {
     }

     public static boolean is3D(Punto p) {
         return (p instanceof Punto3D);
     }

     public static void main(String[] args) {
         Punto p2 = new Punto(0,0);
         Punto p3 = new Punto3D(0,0,10);

         System.out.println(is3D(p2));
     }
}


Como vemos, esto devuelve un false, puesto que p2 no es una instancia de Punto3D. Obviamente, una llamada a is3D con p3 como parámetro si que devolvería un valor verdadero! Pero, y si hacemos p3 instanceof Punto, que devolvera? En este caso, un true, puesto que todo objeto también es instancia de su padre.

Labels:

Sunday, October 14, 2007

Punteros de java

Saturday, October 06, 2007

He vuelto!

Que nostalgia! Hace más de dos años que no escribía en este blog. Durante este tiempo mi vida a dado giros importantes; dejé Java y la programación orientada a objetos de lado, acabé el bachillerato y llegué a la universidad. Exactamente a la UIB, dónde estoy cursando segundo de Ingeniería Técnica en Informática de Sistemas.

Vuelvo para quedarme. Me ha dado el empujón necesario para retomar este blog la asignatura de Tecnología de la Programación, dónde nos enseñan algo programación orientada a objetos, complejidad algoritmica y demás, con Java como envoltorio.

Contaré mis aventuras y desventuras con Java y la programación orientada objetos en general, espero ser útil para alguien y que escribir aquí me ayude también a mi. Saludos!

Labels:

Wednesday, June 22, 2005

Convertir cadenas en enteros

A veces, necesitamos convertir una cadena que contenga cifras en un número. Por ejemplo, si pasamos un valor como parametro en tiempo de ejecución, y queremos operar con el, lo tendremos que transformar en entero. Para ello he escrito este código :

class Array {
  public static int stringToInt(String cadena) {
   int resultado = 0, x, longi = cadena.length();
   for(x = 0; x < longi; x++) {
    resultado += ( ((int) cadena.charAt(x)) - 48 ) * (Math.pow(10,longi - 1 - x));
   }
   return resultado;
  }

  public static void main(String[] args) {
   System.out.println(stringToInt(args[0]));
  }
}

Tuesday, June 21, 2005

Scaffolding

En el post anterior he publicado un código que implementa un método que duplica un array de enteros. Realmente he publicado una clase entera, que contiene el método citado, y el método main. Dentro del método main, he escrito un codigo que hace una prueba del método cloneArray, para comprobar que realmente funciona.

El código que escribes cuando estás desarrollando una aplicación, pero que realmente no tiene otra utilidad que la de asegurar al programador que su código hace lo que tiene que hacer, se llama código andamio (en inglés, scaffloding).

Por ejemplo, toda la clase main del código del otro post. O unas lineas de código que impriman el int que devuelve un método que acabas de hacer;

public static int sumarDosInts(int a, int b) {
  return a + b;
}

public static void main(String[] args) {
  //Código andamio
  System.out.println("El resultado tiene que ser siete : " + sumarDosInts(5,2));
}


El código andamio es una buena manera de asegurarse de hacer lo correcto, aunque algunas veces puede engañar. Seguro que muchos de vosotros lo usabais sin saber que se llamaba así, como yo :)

Jugando con arrays

Enunciado
As an exercise, qrite a method called cloneArray that takes an array of integers as parameter, creates a new array that is the same size, copies the elements from the first array into the new one, and then returns a reference to the new array.

Codigo
class Array {
  public static int[] cloneArray(int[] aCopiar) {
   int[] copiado = new int[aCopiar.length];
   for(int contador = aCopiar.length; contador > 0; contador --) {
    copiado[contador - 1] = aCopiar[contador - 1];
   }
   return copiado;
  }

  public static void main(String[] args) {
   int[] unArray = new int[4];
   unArray[0] = 12;
   unArray[1] = 24 / unArray[0];
   unArray[2] = unArray[1] * 3;
   unArray[3] = 5;
   int[] otroArrayIgual = cloneArray(unArray);
   System.out.println("Esto es igual a 5 ... " + otroArrayIgual[3]);
  }
}

Sunday, June 19, 2005

Glosario

Instancia : Un miembro de una clase. Todos los objetos son instancias.

Constructor : Un método especial que inicia las variables de instancia de un objeto recien creado.

Clase de arranque (startup class) : La clase que contiene el método main a partir del qual empieza el flujo de código.

Función : Un método cuyo resultado depende únicamente de sus parámetros, y no tien otro cometido que devolver un valor. Por ejemplo :
int suma(int a, int b) {
   return a + b;
}


Programación funcional : Estilo de programación en el que la mayoría de métodos son funciones.

Modificador : Método que cambia uno o más de los objetos que recibe como parámetros, y normalmente devuelve un void.

Método de relleno (fill-in method) : Un tipo de método que coge un objeto vacio como parámetro y "rellena" sus variables de instancia en lugar de generar un valor de retorno.

[*]Parte del glosario del tema 9 del líbro How to Think Like a Computer Scientist, Java Edition.

Thursday, June 16, 2005

Divine Law

Sigo leyendo el libro de Allen B. Downey, How to think like a Computer Scientist, y me encanta.
Se vé que el autor está muy rodado en el mundo de la enseñanza, y explica las cosas de forma muy clara y amena.
Me he reido a carcajada limpia con la clasificación que hace en el capítulo cuarto de tipos de convenciones usadas en los codigos fuente, que según él se clasifican en

· Ley divina (divine law). En este subgrupo se incluyen todos aquellos hechos que derivan de las matemáticas o la lógica, como que una comparación entre dos números iguales sea cierta (5 == 5). El ejemplo que el pone es que la suma es conmutativa. Todas las "leyes divinas" están presentes en todos los lenguajes de programación, no solo en Java.
· Normas de Java (rules of Java). Aquellas peculiaridades sintácticas y semánticas de Java frente a los otros lenguajes de programación, como que el símbolo '+' sirva para concatenar dos cadenas, además de para sumar dos números. O que la palabra reservada 'extends' sirva para indicar una herencia.
· Estilo y convención (style and convention). Todas esas "normas no escritas" que hacen el codigo entendible para el ojo humano. Por nombrar algunas, las convenciones a la hora de nombrar clases/variables/métodos, el uso del tabulador y/o espacios para hacer un código estructurado, etc ...

Personalmente creo que es una clasificación muy acertada. Además nos sirve para recordar, una vez más, que el codigo debe ser limpio y ordenado, en la medida de lo posible.

[OFFTOPIC] Nadie me ha comentado aún nada de las librerías 2D, y sigo más perdido que un pulpo en un garaje. En un foro me han hablado de AWT y SWING, pero si os digo la verdad, no me lo he mirado demasiado. ¿Alguna opinión?