HI!!!Bienvenidos a la tercera práctica “ocareña”. Comenzamos con unos buenos ánimos ya que el profe nos dijo que, después de haber visto los blogs, se ha dado cuenta de que tenemos un nivel muy bajo para aprobar esta asignatura. Cosa que se cumple en general de la clase y creo que es cierta, en ella me incluyo, pero podemos aprender!! NOS OS DESANIMEIS COMPAÑEROS, SI NOS ESFORZAMOS LO CONSEGUIREMOS!! J Esto quedó demostrado en cuanto empezamos con el EJERCICIO 0.
Las preguntas nos parecieron fáciles de contestar. La verdad, es que a la pregunta ¿cuáles son los modificadores de acceso de los atributos? nosotros contestamos:”public y private”, sin saber que static TAMBIÉN es un modificador de acceso. Ante dudas generales se explicó en clase los distintos modificadores de acceso que hay y para que sirven. En resumen, en clase se dijo que los atributos x e y son privados (su modificador de acceso es private), es decir, que sólo se pueden utilizar en la propia clase. Esto sirve, aparte de para respetar la encapsulación, para cuando vendas el programa que no te lo copien (razonamiento antiguo pero que a día de hoy todavía sigue siendo válido), y principalmente para que no cambien los valores del atributo. Lo mejor es poner atributos privados y hacer métodos get() y set(), así nadie puede modificar el valor de x e y, no se nos trastocará nada.
El atributo contador es publico (public), e indica que cualquier otra clase tiene acceso a él. Poniendo un atributo public cualquiera desde fuera puede consultarlo y modificarlo. Sirve porque sino hay peligro de que la gente lo toque, pues se puede dejar que lo cambien. Pero hay que tener cuidado, ya que, por ejemplo, puede llegar alguien y poner un valor negativo donde no se puede,… Además, contador cuenta con otro modificador de acceso, estático (static). Sirve para que cada vez que se haga algo con contador, el valor se cambia y se guarda en el atributo contador. Si se cambia la variable static se propaga el cambio a todas las clases. El atributo contador cuenta cuantos (parece un trabalenguas jeje) objetos del tipo Punto se han creado; si por ejemplo tenemos contador=7, podemos pensar que habrá 7 o menos objetos del tipo Punto pero no más, cayendo en un grave error. Depende de cómo esté utilizándose contador, porque si en un lado aumenta cada vez que se crea un objeto Punto pero más tarde, en otro lado, le restan 5, ya no es un valor fiable.
A raíz de esto salió en clase el tema de cómo destruir un objeto, pues bien, se hace eliminando su referencia pero no siempre es así. El trabajo lo hace el recolector de basura liberando la memoria que ocupaba ese objeto. Hay un contador de referencias a objetos (distinto del atributo contador de antes, no confundirse gente). Cada objeto tiene su contador, el cual java mira cada determinado tiempo, y si algún contador está en 0, sabe que no lo vas a usar, por el simple hecho de que no tienes ninguna referencia apuntando a él, y entonces lo borra. El método finalize es lo último que ejecuta el recolector antes de “matar” al objeto. Pero tu nunca lo llamas, lo llama el recolector.
Dicho de una forma más técnica, hemos adaptado una explicación de un libro para dejarlo bien claro: Las variables no son objetos en sí mismos, sino que referencian o dan nombres a los objetos, por lo que se pueden utilizar varias variables o nombres para hacer referencia a un objeto. A partir de estas variables se puede referenciar a los objetos y acceder a sus métodos y atributos. Varios lenguajes orientados a objetos tienen asociado el concepto de destructor, es como la operación inversa del constructor, lleva a cabo una finalización de un objeto. Esta finalización suele consistir en la liberación de recursos (memoria principalmente, aunque también pueden ser archivos conexiones,etc) que un objeto obtiene a lo largo de su vida. En java el concepto de destructor no existe en realidad ya que la liberación de memoria la lleva a cabo el recolector de basura (garbage collector, que es parte de la máquina virtual de java). Este recolector monitoriza los objetos y cuando hay alguno que no tiene ningún nombre, es decir, un objeto al que nadie referencia, libera la memoria. Dado que existe la posibilidad de tener otro tipo de recursos, además de la memoria, el recolector de basura llama a un método que tienen todos los objetos llamado finalize que permite implementar y realizar una liberación de recursos.
Después nos “pegamos” con los constructores. Nos aconsejaron colocar siempre un constructor vacío. En este caso sería:
| public Punto( ){ Punto nuevo = new Punto(0.0,0.0);} |
Y se utilizaría así: Punto b=new Punto( );
Los constructores, se ve, que no retornan nada.
En relación al método toString( ), al poner la sentencia System.out.print(), se llama automáticamente al toString( ), por eso al hacer este método necesita llamarse así. En el prueba Punto, por tanto, da igual hacer: System.out.print(“Punto”+p1.toString()); que hacer: System.out.print(“Punto”+p1);
Un consejo que nos dieron, es que no repitamos código porque si algo está mal, hay que cambiarlo de todas partes, y es más difícil encontrar el error.
Por último de este ejercicio, el profe nos preguntó si en Java se pasan los argumentos por valores o por referencias. Tenemos que investigarlo buscando en el google.
Con esto estuvimos una hora de clase. La verdad es que, en mi opinión hacia falta comentarlas, ya que la gente no sabía responderlas y se comentaron bastantes cosas que ayudan a programar y que desconocíamos hasta ese día.
A continuación hicimos una clase pruebaObjeto con la que trasteamos y probamos los diferentes métodos de la clase Punto y las maneras de llamarlos desde una prueba.
| // Clase Punto // (c) 2007 IT ÏÕÖ×public class Punto { ÏϧÏíÏprivate double x; ÏϧÏíÏprivate double y; Ïϧ ÏϧÏíÏpublic static int contador = 0; Ïϧ Ïϧ// Constructor ÏϧÏÞßàpublic Punto(double x, double y) { ÏϧÏϨ¹¹Ïthis.x = x; ÏϧÏϨ¹¹Ïthis.y = y; ÏϧÏϨ¹¹Ïcontador++; ÏϧÏÏ©} Ïϧ Ïϧ// toString: devuelve una cadena con la representación del objeto ÏϧÏÞßàpublic String toString() { ÏϧÏϧ// el signo + para cadenas no significa “suma matemática” sino concatenación Ïϧ¹Ĺ¹Ïreturn “(“+x+“, “+y+“)”; ÏϧÏÏ©} Ïϧ Ïϧ// devuelve la distancia al origen Ïϧ// NOTA: se podría haber hecho con la distancia a (0,0): Ïϧ// return calcularDistancia(new Punto(0,0)); ÏϧÏÞßàpublic double distanciaAlOrigen() { Ïϧ¹Ĺ¹Ïreturn Math.sqrt(x*x+ y*y); ÏϧÏÏ©} Ïϧ Ïϧ// métodos de acceso ÏϧÏÞßàpublic double getX() { Ïϧ¹Ĺ¹Ïreturn x; ÏϧÏÏ©} ÏϧÏÞßàpublic double getY() { Ïϧ¹Ĺ¹Ïreturn y; ÏϧÏÏ©} Ïϧ Ïϧ// devuelve la distancia a otro punto ÏϧÏÞßàpublic double calcularDistancia(Punto otroPunto) { ÏϧÏϨ¹íÏdouble x1; ÏϧÏϨ¹íÏdouble y1; ÏϧÏϧ ÏϧÏϨ¹¹Ïx1 = x-otroPunto.getX(); ÏϧÏϨ¹¹Ïy1 = y-otroPunto.getY(); ÏϧÏϧ Ïϧ¹Ĺ¹Ïreturn Math.sqrt(x1*x1+y1*y1); ÏϧÏÏ©} Ïϧ ÏÏ©} |
Luego nos pidieron que implementemos la clase PruebaObjeto :
| ×public class PruebaObjeto Ïϧ{ ÏϧÏÞßàpublic static void main(String[] args) ÏϧÏϧ{ ÏϧÏϨ¹íÏPunto p1=new Punto ((Math.random()*10), (Math.random()*10)); ÏϧÏϨ¹íÏPunto p2=new Punto ((Math.random()*10), (Math.random()*10)); ÏϧÏϧ ÏϧÏϨ¹¹ÏSystem.out.println(“P1 tiene los siguiente valores: “+p1); ÏϧÏϨ¹¹ÏSystem.out.println(“P2 tiene los siguiente valores: “+p2); ÏϧÏϨ¹¹ÏSystem.out.println(“Coordenada X de P1 es: “+p1.getX()); ÏϧÏϨ¹¹ÏSystem.out.println(“Coordenada Y de P1 es: “+p1.getY()); ÏϧÏϨ¹¹ÏSystem.out.println(“Distancia al origen de P1 es: “+p1.distanciaAlOrigen()); ÏϧÏϨ¹¹ÏSystem.out.println(“Distancia entre P1 y P2 es: “+p1.calcularDistancia(p2)); ÏϧÏϨ¹¹ÏSystem.out.println(“Puntos utilizados: “+p2.contador); ÏϧÏϧ ÏϧÏϧ ÏϧÏÏ©} ÏÏ©} |
Y la ejecución seria si:

Después llegamos a la introducción. En ella había que hacer una clase atributo, método, constructor, método, clase,… No entendíamos nada!! No sabíamos ni por donde empezar. Alberto nos dijo que pensamos por ejemplo en un coche para realizar este ejercicio, pero fue demasiado complicado para nosotros. Tenemos el concepto de coche, de cómo funciona, su color, forma,… y también tenemos la de las clases, métodos, atributos,.. Pero es bastante más abstracto para poner esto en programación ya que no es algo con lo que convivamos diariamente, como un coche, ni podemos ver ni tocar.
Total, que este ejercicio no fuimos capaces de sacarlo. Estábamos desconcertados y de tan desconcertados a poco nos tiramos de lo pelos!! Nota: si veis a un chico y una chica calvos por la uni no os asusteis por favor, saludarnos y solidarizaos con nosotros. Graciaaaaas
Esta práctica no nos cundió mucho porque nos quedamos atascados y se dedico mucho tiempo en clase en el ejercicio 0 pero creemos que era necesario.
Eso es todo amigos!!