Variables Miembro Una clase en Java puede
contener variables y métodos. Las variables pueden ser tipos primitivos como int, char,
etc. Los métodos son funciones.
Por ejemplo, en el siguiente trozo de código
podemos observarlo:
public class MiClase {
int i;
public MiClase() {
i = 10;
}
public void Suma_a_i( int j ) {
int suma;
suma = i + j;
}
}
La clase MiClase contiene una variable (i) y dos métodos, MiClase()
que es el constructor de la clase y Suma_a_i( int
j ).
La declaración de una variable miembro
aparece dentro del cuerpo de la clase, pero fuera del cuerpo de cualquier método de esa
clase. Si se declara dentro de un métodos, será una variable local del método y no una
variable miembro de la clase. En el ejemplo anterior, i es una variable miembro de la clase y suma es una
variable local del método Suma_ a_i().
El tipo de una variable determina los
valores que se le pueden asignar y las operaciones que se pueden realizar con ella.
El nombre de una variable ha de ser un
identificador válido en Java. Por convenio, los programadores Java empiezan los nombres
de variables con una letra minúscula, pero no es imprescindible. Los nombres de las
variables han de ser únicos dentro de la clase y se permite que haya variables y métodos
con el mismo nombre, a diferencia de C++, en donde se produce un error de compilación si
se da este caso.
Para los programadores C++, se pueden señalar
algunas diferencias entre Java y C++ respecto a la sintaxis e interpretación en la
declaración de variables miembro de una clase, como son:
- En los dos lenguajes se permite la declaración de variables miembro estáticas con una
sintaxis parecida, aunque en C++, se deben redeclarar estas variables fuera de la
definición de la clase utilizando el nombre de la clase, el nombre de la variable y el
operador de ámbito
- En los dos lenguajes se permite la utilización de modificadores de acceso a las
variables miembro utilizando las palabras clave public, private y protected, aunque la sintaxis e interpretación son diferentes en
los dos lenguajes
-
Los dos lenguajes reconocen la palabra clave volatile, aunque Java la ignora
-
C++ no reconoce las palabras clave transient y final, utilizadas en la declaración de variables miembro en
Java
Aparte de las diferencias de sintaxis
anteriores, Java permite la inicialización de variables miembro de tipos primitivos en el
momento de la declaración y esto no es posible en C++.
La sintaxis completa de la declaración de una
variable miembro de una clase en Java sería:
[especificador_de_acceso][static][final][transient][volatile]
tipo nombreVariable [= valor_inicial];
Ambito
de una Variable
Los bloques de sentencias compuestas en Java se
delimitan con dos llaves. Las variables de Java sólo son válidas desde el punto donde
están declaradas hasta el final de la sentencia compuesta que la engloba. Se pueden
anidar estas sentencias compuestas, y cada una puede contener su propio conjunto de
declaraciones de variables locales. Sin embargo, no se puede declarar una variable con el
mismo nombre que una de ámbito exterior.
El siguiente ejemplo intenta declarar dos
variables separadas con el mismo nombre. En C y C++ son distintas, porque están
declaradas dentro de ámbitos diferentes. En Java, esto es ilegal.
class Ambito {
int i = 1; // ámbito exterior
{ // crea un nuevo ámbito
int i = 2; // error de compilación
}
}
Variables de Instancia
La declaración de una variable miembro dentro
de la definición de una clase sin anteponerle la palabra clave static, hace que
sea una variable de instancia en todos los objetos de la clase. El significado de
variable de instancia sería, más o menos, que cualquier objeto instanciado de esa clase
contiene su propia copia de toda variable de instancia. Si se examinara la zona de memoria
reservada a cada objeto de la clase, se encontraría la reserva realizada para todas las
variables de instancia de la clase. En otras palabras, como un objeto es una instancia de
una clase, y como cada objeto tiene su propia copia de un dato miembro particular de la
clase, entonces se puede denominar a ese dato miembro como variable de instancia.
En Java, se accede a las variables de instancia
asociadas a un objeto determinado utilizando el nombre del objeto, el operador punto (.) y el nombre de
la variable:
miObjeto.miVariableDeInstancia;
En C++, se puede acceder a las variables de
instancia de un objeto a través de la misma sintaxis, pero también utilizando el
operador flecha (->), que utiliza como origen una variable puntero que apunta al
objeto:
miVariablePuntero->miVariableDeInstancia;
Variables Estáticas
La declaración de un dato miembro de una clase
usando static, crea una variable de clase o variable estática de la clase. El
significado de variable estática es que todas las instancias de la clase (todos los
objetos instanciados de la clase) contienen la mismas variables de clase o estáticas. En
otras palabras, en un momento determinado se puede querer crear una clase en la que el
valor de una variable de instancia sea el mismo (y de hecho sea la misma variable) para
todos los objetos instanciados a partir de esa clase. Es decir, que exista una única
copia de la variable de instancia, entonces es cuando debe usarse la palabra clave static.
class Documento extends Pagina {
static int version = 10;
}
El valor de la variable version será el
mismo para cualquier objeto instanciado de la clase Documento. Siempre que un
objeto instanciado de Documento cambie la variable version, ésta cambiará para todos los objetos.
En C++, es necesario redeclarar todas las
variables estáticas fuera de la definición de la clase, produciendo una variable pseudo-global,
es decir, una variable que es global en lo que a los objetos de esa clase se refiere.
Si se examinara en este caso la zona de memoria
reservada por el sistema para cada objeto, se encontraría con que todos los objetos
comparten la misma zona de memoria para cada una de las variables estáticas, por ello se
llaman también variables de clase, porque son comunes a la clase, a todos los
objetos instanciados de la clase.
Tanto en Java como en C++, se puede acceder a
las variables de clase utilizando el nombre de la clase y el nombre de la variable, no es
necesario instanciar ningún objeto de la clase para acceder a las variables de clase.
En C++, a las variables de clase se accede
utilizando el operador de ámbito junto con el nombre de la clase y el nombre de la
variable:
miVariable::miVariableDeClase;
En Java, a las variables de clase se accede
utilizando el nombre de la clase, el nombre de la variable y el operador punto (.). La siguiente
línea de código, ya archivista, se utiliza para acceder a la variable out de la clase System.
En el proceso, se accede al método println() de la variable de clase que presenta
una cadena en el dispositivo estándar de salida.
System.out.println( "Hola, Mundo" );
Es importante recordar que todos los objetos de
la clase comparten las misma variables de clase, porque si alguno de ellos modifica alguna
de esas variables de clase, quedarán modificadas para todos los objetos de la clase. Esto
puede utilizarse como una forma de comunicación entre objetos.
Constantes
En Java, se utiliza la palabra clave final para indicar
que una variable debe comportarse como si fuese constante, significando con esto
que no se permite su modificación una vez que haya sido declarada e inicializada.
Como es una constante, se le ha de proporcionar
un valor en el momento en que se declare, por ejemplo:
class Elipse {
final float PI = 3.14159;
. . .
}
Si se intenta modificar el valor de una
variable final desde el código de la aplicación, se generará un error de
compilación.
Si se usa la palabra clave final
con una variable o clase estática, se pueden crear constantes de clase,
haciendo de esto modo un uso altamente eficiente de la memoria, porque
no se necesitarían múltiples copias de las constantes.
La palabra clave final también se puede aplicar a
métodos, significando en este caso que los métodos no pueden ser sobreescritos. |