Palabras reservadas en Java |
abstract | boolean | break | byte | case | catch |
char | class | const* | continue | default | do |
double | else | extends | final | finally | float |
for | goto* | if | implements | import | instanceof |
int | interface | long | native | new | package |
private | protected | public | return | short | static |
strictfp** | super | switch | synchronized | this | throw |
throws | transient | try | void | volatile | while |
El atributo "final"
puede ser aplicado tanto a clases como a sus elementos (variables y métodos).
En todo caso indica que una vez definido el elemanto a que se aplica, este no puede volverse a definir. El
significado de esto para las clases se entiende como que una clase "final" no puede tener subclases; en el
caso de las variables quiere decir que una vez que toman valor, este no puede alterarse (es el método, por tanto,
de definir constantes); y por último, en el caso de los métodos indica que no pueden ser redefinidos en una
subclase.
La palabra reservada static
tiene dos utilidades que veremos a continuación. En todo caso su
significado es el de asociar el elemento al que se aplica con la clase en lugar de hacerlo con los objetos
que puedan crearse de la misma. Cuando se declara un elemento dentro de una clase, se entiende que dicho elemento
es parte componente de la estructura de los objetos que se instanciarán de ella a no ser que se aplique el
atributo static
. Cuando hablamos de objetos y clases vimos como en memoria se encontraban los
diferentes objetos instanciados de cada clase así como una cierta estructura asociada a cada clase; es en esta
estructura donde se encuentran los elementos marcados como static
.
Deciamos que static
tiene dos utilidades en java. La primera de ellas será la de actuar como
atributo aplicable a cualquier campo o método. Respecto a los campos, el significado es claramente el indicado: el
campo residirá en la estructura de la clase, no como un elemento propio de cada objeto instanciado. En el caso
de los métodos (que ya residen en todo caso en el espacio de la clase) se trata de indicar que no estan ligados
a objetos, es decir no se invocan a través de un objeto y no actuan sobre un objeto, sino que se invocan a través
de la clase. El siguiente ejemplo aclara esto; en el se usa el atributo static
para mantener un contador
asociado a la clase que se manejará mediante métodos tambien independientes de los objetos.
1-
2-
3-
4-
5-
6-
|
public class ClaseA {
private static int cont=0;
public static inc() {cont++;}
public static dec() {cont--;}
// el resto de la definición de la clase
}
|
|
1-
2-
3-
|
//Dentro de un bloque de código cualquiera...
ClaseA objetoA=new ClaseA(); //se genera el objeto de clase "ClaseA"
ClaseA.inc() //y se aumenta el contador asociado a la clase
|
|
La segunda aplicación del término static
hace referencia a la posibilidad de definir un bloque de
código con la función de inicializar la clase. Cuando se requiere un primer objeto de una clase, la máquina virtual
lee la clase (de un disco, una máquina remota, o donde quiera que este establecido que se encuentre) y comienza por
establecer la estructura asociada a la clase e inicializarla ejecutando el código expresado en el bloque
static
; una vez hecho esto instanciara el objeto requerido y
lo inicializará. Para posteriores instanciaciones de objetos, la clase ya existe en memoria por lo que el proceso
no incluye los dos primeros pasos. Como ejemplo podemos plantear el mismo anterior -el contador- en el caso
en que no se inicialice a cero sino que dependa de algun modo de otro objeto:
1-
2-
3-
4-
5-
6-
7-
|
public class ClaseA {
private static int cont;
public static inc() {cont++;}
public static dec() {cont--;}
static {cont=(otroObjeto.offset()>0)?otroObjeto.offset():0;}
// el resto de la definición de la clase
}
|