G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 4: Elementos relacionados con la orientación a objeto tema_siguiente
  1. Objetos y clases.
  2. Estructura de la definición de una clase.
  3. Herencia.
  4. Encapsulamiento (ámbitos de accesibilidad).
  5. El bloque static y los atributos static y final.
  6. Instanciación, inicialización y eliminación de objetos.[ejercicios]
  7. Clases y métodos abstractos.[ejercicios]
  8. Interfaces.[ejercicios]
  9. Polimorfismo.
  10. Arrays*.[ejercicios]
  11. Enumeraciones.

4.5- El bloque static y los atributos static y final

Palabras reservadas en Java
abstractbooleanbreakbytecasecatch
charclassconst*continuedefaultdo
doubleelseextendsfinalfinallyfloat
forgoto*ifimplementsimportinstanceof
intinterfacelongnativenewpackage
privateprotectedpublicreturnshortstatic
strictfp**superswitchsynchronizedthisthrow
throwstransienttryvoidvolatilewhile

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
}

Siguiente punto: 4.6- Instanciación, inicialización y eliminación de objetos


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.