Documentos de Académico
Documentos de Profesional
Documentos de Cultura
nextUniqueID++;
return thisID;
Esta definición de clase dice que un objeto de la clase Student incluirá unas
variables instanciables llamadas name, test1, test2, y test3, e incluirá un
método instanciable llamado getAverage(). Los names, IDs y tests en los
diferentes objetos tendrán, normalmente, valores diferentes. Cuando para un
estudiante en particular se llame al método getAverage()calculará el promedio del
estudiante, usando las notas de sus exámenes.
Por otra parte, nextUniqueID y getUniqueID() son miembros static de la clase
Student. Esto quiere decir que solo hay una copia de la variable nextUniqueID y
pertenece a la clase. De forma similar, getUniqueID esta asociado a la clase, y
no a una instancia particular. No tiene sentido, y puede ser un error de sintaxis,
el que getUniqueID() se refiera a una variable instanciable como name. Un
método static no forma parte del objeto y no tiene accedo directo a las variables
instanciables que están dentro de un objeto.
El método getUniqueID() puede ser llamado desde fuera de la clase usando el
nombre «Student.getUniqueID()» indicando su pertenencia a la clase Student.
Esto se puede hacer tanto si existan como si no existen instancias de la clase .
El método getAverage(), por otra parte, solo puede ser llamado cuando existe
algún objeto de la clase Student. Si std es tal objeto, entonces el método puede
llamarse usando el nombre «std.getAverage()» indicando que el método
pertenece al objeto std las variables instanciables de std pueden ser
mencionadas como std.name, std.ID, std.test1, std.test2, y std.test3.
(Con esto, es posible pensar que un método o una variable static en una clase se
comparte por todas las instancias de la clase. Basado en ese razonamiento, Java
le va a permitir referirse a los miembros static tanto a través de los objetos, como
a través del propio nombre de clase. Esto es, si std es una instancia de la clase
Student es correcto el referirse a std.getUniqueID() en lugar de
Student.getUniqueID(). Sin embargo, pienso que esa sintaxis solo puede
aumentar la confusión y les animo a que la ignoren.
Creo que vale la pena hablar algo sobre la presencia de la variable
static nextUniqueID. Dado que es una variable static solo existe una versión de
esa variable y solo existe mientras el programa esta funcionando.(Las instancias
de las variables, por otra parte, aparecen y desaparecen cuando los objetos se
crean o se destruyen).
Al empezar el programa, se almacena en la variable Student.nextUniqueID el
valor inicial 1. Cada vez que se llama al método static Student.getUniqueID se
incrementa el valor de nextUniqueID. Ahora bien, dado que nextUniqueID como
privado, es completamente inaccesible desde fuera de la clase Student. Podemos
ver todo lo que se puede hacer con esa variable examinando la clase Student.
Esto es la mejor garantía de que solo hay una manera de cambiar el valor de
nextUniqueID y es llamando al método getUniqueID(). Podría ser interesante que
otras variables como las instanciables test1, test2 y test3 tuvieran una protección
similar. Volverá al tema de controlar el acceso a las variables, mas tarde.
Hasta ahora hemos hablado de que los objetos pueden ser creados usando las
clases como plantilla, pero no hemos hablado de como crear los objetos en los
programas. Si tiene una clase, como Student, puede declarar una variable de esa
clase:
Student std; //declarar variable std como de tipo Student
Sin embargo, declarar una variable no crea un objeto.Esto es un punto muy
importante, que queda definido con la siguiente Afirmación Muy Importante:
En Java, una variable no puede almacenar un objeto.
La variable sólo puede almacenar la referencia al objeto.
Debe pensar que los objetos deben estar flotando independientes por la memoria
del ordenador. (De hecho, los objetos viven en una parte de la memoria llamada
heap.) En lugar del objeto en si mismo, lo que se guarda en la variable es la
información necesaria para encontrar ese objeto en la memoria. Esta información
se llama referencia o puntero al objeto. En efecto, la referencia a un objeto es la
dirección de la posición de la memoria donde se almacena el objeto. Cuando usa
una variable tipo objeto, el ordenador emplea la referencia que esta en la variable
para poder encontrar el objeto real.
Los objetos realmente se crean con un operador llamado new, que crea el objeto
y devuelve la referencia al objeto. Por ejemplo, asumiendo que std es una variable
del tipo Student,
std = new Student();
creará un nuevo objeto del tipo Student y guardará la referencia a este objeto
en la variable std. Se puede acceder a las variables y métodos instanciables del
objeto por medio de std,como «std.test1».
Para una variable como std , cuyo tipo esta definido por una clase, el no referirse
a ningún objeto no está inicializada. En ese caso se dice que std guarda una
referencia nula. En Java la referencia nula debe ser escrita como «null». Puede
asignar una referencia nula a la variable std diciendo:
std = null;
y puede comprobar si el valor de la variable es nulo
if (std == null) .. ..
// y la inicializa con la
// objeto nuevo.
// a nulo. (automaticamente)
std.ID = Student.getUniqueID();