Soy muy nuevo en Java y quiero entender la diferencia entre variables de clase y variables de instancia.
Por ejemplo:
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
¿En qué se diferencian las variables de instancia y las de clase? ¿Qué variables son de clase y cuáles de instancia? ¿Cómo afecta esto al ámbito de aplicación?
Ambas son variables member, lo que significa que ambas están asociadas a una clase. Ahora, por supuesto, hay diferencias entre las dos:
Variables de instancia:
Estas variables pertenecen a la instancia de una clase, por tanto a un objeto. Y cada instancia de esa clase (objeto) tiene su propia copia de esa variable. Los cambios realizados en la variable no se reflejan en otras instancias de esa clase.
public class Product {
public int Barcode;
}
Variables de clase:
También se conocen como variables miembro estáticas y sólo hay una copia de esa variable que se comparte con todas las instancias de esa clase. Si se realizan cambios en esa variable, todas las demás instancias verán el efecto de los cambios.
public class Product {
public static int Barcode;
}
Ejemplo completo:
// INSTANCE VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.Barcode = 123456;
Product prod2 = new Product();
prod2.Barcode = 987654;
System.out.println(prod1.Barcode);
System.out.println(prod2.Barcode);
}
}
public class Product {
public int Barcode;
}
La salida será:
123456
987654
Ahora, cambia la variable de instancia a una variable de clase haciéndola estática:
//CLASS VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.setBarcode(123456);
Product prod2 = new Product();
prod2.setBarcode(987654);
System.out.println(prod1.getBarcode());
System.out.println(prod2.getBarcode());
}
}
public class Product {
public static int Barcode;
public int getBarcode() {
return Barcode;
}
public void setBarcode(int value){
Barcode = value;
}
}
He utilizado métodos no estáticos para obtener y establecer el valor de Barcode
para poder llamarlo desde el objeto y no desde la clase. La salida será la siguiente:
987654
987654
Se explica aquí (con una clase de ejemplo Bicicleta
con la variable de clase númeroDeBicicletas
y las variables de instancia cadencia
, velocidad
, marcha
& id
):
A veces, quieres tener variables que son comunes a todos los objetos. Esto se consigue con el modificador static
. Los campos que tienen el modificador static
en su declaración se llaman campos estáticos o variables de clase. Están asociados a la clase, en lugar de a cualquier objeto. Cada instancia de la clase comparte una variable de clase, que está en una ubicación fija en la memoria. Cualquier objeto puede cambiar el valor de una variable de clase, pero las variables de clase también pueden ser manipuladas sin crear una instancia de la clase.
Una variable de clase (declarada estática
) es una ubicación común a todas las instancias.
En el ejemplo, númeroDeBicicletas
es una variable de clase (ya que está declarada estática
). Sólo hay una variable de este tipo (es decir, la ubicación) común a todas las instancias y a la clase. Así que si modificas numberOfBicycles
en un método, otros métodos verán el nuevo valor (incluso para diferentes objetos Bicycle
)
En cambio, gear
& id
son variables de instancia(porque su declaración no tiene el modificador
static). Cada objeto
Bicicletatiene la suya propia. Si modificas
gearpara alguna
Bicicleta` a, y si b* es otra instancia, la modificación de a.gear
no tiene efecto sobre b.gear
.
Cada objeto Java es una zona de memoria distinta con algunos metadatos (por ejemplo, alguna referencia a su clase) y sus propias variables de instancia (quizás heredadas de una superclase). Pero las variables de clase son comunes a la clase y compartidas por todas las instancias.
Ver también wikipages Objeto (informática) & Variable de instancia.
Variable de instancia:
Las variables de instancia se declaran en una clase, pero fuera de un método constructor o cualquier bloque.
La variable de instancia pertenece a la instancia de una clase o se puede decir que la variable de instancia pertenece al objeto.
La variable de instancia tiene un valor separado para cada instancia de la clase. la clase.
Clase InstanceDemo {
// esta variable de instancia es visible para cualquier clase hija.
public String name = "Prueba";
// la variable count es visible sólo en la clase Demo.
private int count = 2;
}
Método para acceder a la variable de instancia:
InstanceDemo demo = new InstanceDemo ();
System.out.println("Accede a la variable de instancia: " + demo.count + " , "+demo.name );
Salida: 2 , Probando
Variable de clase:
La variable de clase pertenece a la clase.
La variable de clase se crea añadiendo la palabra clave "static" antes de la variable.
También se llama variable estática.
Y lo más importante es que la variable de clase mantiene un único valor compartido para todas las instancias de una clase, incluso si no existe ningún objeto de instancia de la clase existe.
Clase ClassDemo {
// la variable count es la misma para todas las instancias de esta clase
public static int count = 2;
}
Método para acceder a la variable de la clase:
System.out.println("Acceder a la variable de clase: " + ClassDemo.count ); //la variable de clase se refiere directamente con el nombre de la clase
Salida: 2
Breve diferencia entre una variable de clase y una variable de instancia: