URGENTE!!! diferencias entre static y final

Jorge
09 de Septiembre del 2005
alguien sabe cual es la diferencia de static y final y para que sirve cada una de ellas???
porfa respondadn luego...

justWannaHelp
09 de Septiembre del 2005
Bueno es que de hecho no tienen nada que ver una con la otra.

FINAL: es un atributo que le pones ya sea a una variable o a un metodo, para indicar que ya no puede ser cambiado una vez declarado.

En el caso de una variable, ej:

[public] final [static] int MY_INT_VAR = 154;

Su valor ya no puede ser cambiado una vez inicializado por lo que es útil para ciertos casos en los que deseas que una variable contenga un valor en el que quieras estar seguro que su valor es constante. Debido a esto, debes inicializarla al momento de declararla, o en el caso de las versiones mas recientes del JDK, dentro del constructor de la clase (por si quisieras que tuviera un valor constante al momento de crear el objeto.)

En el caso de un método, ej:

public final myFinalMethod() {
// put your code here
}

Esto es para evitar que el metodo sea sobreescrito ('overriden') por una subclase de la clase que contenga dicho metodo con el fin de preservar el comportamiento original deseado en la clase base.

TIP: Si te fijaste puse la variable final en mayusculas y con guiones para separar las palabras. Esto es una convencion extendida en la programacion de Java para indicar que una variable es final. Tambien, por lo general dicha var. es public y static (en un momento te explico lo de static). Ej: Clase de Java Color (de hecho esta clase es un excelente ejemplo para comprender el uso tanto de final como de static como lo veras en unos momentos) tiene una var. public final static para varios colores, como en Color.RED, Color.WHITE (¿te imaginas si dichas variables no fueran finales? algun bromista le pudiera asignar a RED un color BLUE, y viceversa. En cambio haciendolas finales te aseguras de que esto no suceda ;) ). Esta convencion no aplica para los metodos (aunque nada te impide hacerlo).

Veamos ahora el caso de static:

Cuando tu declaras una variable/metodo no-static, para poder usarlo fuera de la clase (siempre y cuando los atributos de acceso te lo permitan) tienes que hacer primero una instancia de la clase y luego accesar al metodo o variable, como en:

// int myVar = myObj.nonStaticVar; -- el compilador no te dejaria, primero tienes que
// crear el objeto
MyClass myObj = new MyClass();
myObj.nonStaticMethod();
int myVar = myObj.nonStaticVar;

Hay ocasiones en las que esto puede no ser muy ventajoso al momento de programar. Para ahorrarte ese paso de tener que tener el objeto para accesar a un var/metodo, declaralo static.


Espero haberte ayudado, saludos.

Sasi
09 de Septiembre del 2005
Static:
si una clase es static, todos los objetos que creemos de esa clase serán , en realidad, el mismo objeto.
Si en una clase no static, definimos un miembro static, significa que todos los objetos de esa clase utilizan el mismo miembro.

Sasi
09 de Septiembre del 2005
Static:

supongamamos que tenemos la clase trabajador. Trabajador tiene un atributo que es horas_trabajar. Este atributo es static.
Creamos los objetos Pepe y Juan. Si hacemos Pepe.horas_trabajar=10, significa q Pepe tiene que trabajar 10 horas. Pero como el atributo es static si hacemos juan.horas_trabajar, significa que juan tambien tiene que trabajar 10 horas.

maitri
09 de Septiembre del 2005
creo q es lo mismo, q sirven para declarar constantes, pero q si está dentro de un metodo (no en el cuerpo de la clase) no se puede poner static. creo no toi mu segura.

chuidiang
09 de Septiembre del 2005
final es para constantes. Si declaras una variable final y le das un valor, no puees volver a cambiarlo. Si declaras un metodo final, ninguna clase hija puede redefinirlo.

class A
{
public final int a = 3;
public final void metodo() {...}
}
...
A objeto = new A();
objeto.a = 7; // esto da error

class B extends A
{
public void metodo() {...} // Da error.
}
static hace que el atributo sea compartido por todas las instancias de la clase. Si declaras un atributo static, todas las instancias de esa clase comparten ese atributo, si lo cambias en una de ellas, todas ven el cambio en su propio atributo. Si haces un método static, puedes usarlo sin necesidad de instanciar la clase (idem con un atributo).

class A
{
public static int a;
public static void metodo (...)
}

A o1 = new A();
A o2 = new A();
o1.a = 44; // ahora o2.a también vale 44
A.a = 23; // ahora o1.a y o2.a valen 23
A.metodo();

Resumen:
final quiere decir que no se puede cambiar
static quiere decir compartido por todas las instancias de la clase y que existe incluso antes de instanciar la clase.

Se bueno.