¿Cuáles son las diferencias entre las variables de clase y las variables de instancia en Java? [cerrado]

16

Soy muy nuevo en Java y quiero entender la diferencia entre las variables de clase y las variables de instancia.

Por ejemplo:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

¿Cómo son las variables de instancia y las variables de clase diferentes entre sí? ¿Qué variables aquí son variables de clase y cuáles son variables de instancia? ¿Cómo afecta esto al alcance?

Skylar Adams
fuente
1
Parece que ha comenzado a leer Los Tutoriales de Java ™: Comprender a los Miembros de la Clase que explican esto, pero no lo han comprendido completamente.

Respuestas:

35

Ambos son miembros variables , lo que significa que ambas están asociadas con una clase. Ahora, por supuesto, hay diferencias entre los dos:

Variables de instancia:

Estas variables pertenecen a la instancia de una clase , por lo tanto, 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 solo 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, cambie 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;
    }
}

Utilicé métodos no estáticos para obtener y establecer el valor de Barcodepoder llamarlo desde el objeto y no desde la clase. La salida será la siguiente:

987654

987654

Abbas
fuente
¿Por qué un ejemplo de C # para una pregunta de Java?
Basile Starynkevitch
Mis pensamientos exactamente. Solo sé que la programación de Java no es C #, por lo que no ha sido de mucha ayuda
Skylar Adams
1
@BasileStarynkevitch Soy principalmente un desarrollador de C # y dado que el principio cuenta para ambos y es tan bueno como el mismo, rápidamente proporcioné un ejemplo de C #, por supuesto equivocado de mi parte. :) Cambié mi ejemplo a Java.
Abbas
2
@SkylarAdams Lo siento, asumí erróneamente demasiado rápido que cualquiera que conozca Java, conoce C #. Cambié el ejemplo a uno de Java, espero que ayude.
Abbas
99
Para este tipo de pregunta, creo que es irrelevante, ya sea que use Java o C #,
Thomas Junk
6

Se explica aquí (con un ejemplo Bicyclede clase con variables de clase numberOfBicyclesvariables de instancia y cadence, speed, geary id):

A veces, desea tener variables que sean comunes a todos los objetos. Esto se logra con el staticmodificador. Los campos que tienen el staticmodificador en su declaración se denominan campos estáticos o variables de clase. Están asociados con la clase, en lugar de con cualquier objeto. Cada instancia de la clase comparte una variable de clase, que se encuentra 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 manipularse sin crear una instancia de la clase.

Una variable de clase (declarada static) es una ubicación común a todas las instancias.

En el ejemplo, numberOfBicycleses una variable de clase (ya que se declara static). Solo hay una de esas variables (es decir, ubicación) común a todas las instancias y a la clase. Entonces, si modifica numberOfBicyclesen un método, otros métodos verían el nuevo valor (incluso para diferentes Bicycleobjetos)

En contraste, gear& idson variables de instancia (porque su declaración no tiene staticmodificador). Cada Bicycleobjeto tiene su propio. Si modifica gearpara alguna Bicycle a , y si b es otra instancia, la modificación a.gearno tiene efecto enb.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 Objetos (ciencias de la computación) e wikipages variables de instancia.

Basile Starynkevitch
fuente
4

Instancia variable:

  • 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 puede decir que la variable de instancia pertenece al objeto.
  • La variable de instancia tiene un valor separado de cada instancia de la clase.

    Class InstanceDemo {
    
         // this instance variable is visible for any child class.
           public String name = "Testing";
    
         // count variable is visible in Demo class only.
           private int count = 2;
    }

Método para acceder a la variable de instancia:

InstanceDemo demo = new InstanceDemo ();

System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );

Salida: 2, Pruebas

Variable de clase:

  • La variable de clase pertenece a la clase.
  • La variable de clase se crea agregando la palabra clave "estática" antes de la variable.
  • También se llama variable estática.
  • Y la variable de clase más importante mantiene un único valor compartido para todas las instancias de una clase, incluso si no existe ningún objeto de instancia de la clase.

        Class ClassDemo {
    
         // count variable is Same for all instance of this class
           public static int count = 2;
    }

Método para acceder a la variable de clase:

System.out.println("Access Class variable: " + ClassDemo.count );
//class variable is directly refer with class name

Salida: 2

Breve diferencia entre la variable de clase y la variable de instancia:

  • Las variables de instancia tienen valores separados para cada instancia de una clase. Las variables de clase mantienen un único valor compartido para todas las instancias de la clase, incluso si no existe ningún objeto de instancia de esa clase.
  • Usaría la palabra clave estática para cambiar una variable de instancia en una variable de clase.
  • Tanto las variables de instancia como de clase se declaran a nivel de clase, no dentro de los métodos.
Garg's
fuente
3

La diferencia entre class variablesy instancevariables, es simplemente una cuestión de who knows what?.

Un instance variablesólo es conocida (= obligado ) para que el hormigón ejemplo - de ahí el nombre.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
  }

La definición de una clase es como un plano para construir objetos concretos . Quizás este punto te confunda un poco. Pero escribiéndolo de esta manera, cada variable estaría vinculada a su objeto concreto: por ejemplo, cada persona tiene su propio nombre

A, class variablepor otro lado, es, como su nombre lo indica, conocido por todos y cada uno de los miembros de una clase; o técnicamente: es conocido / vinculado a nivel de clase . El ejemplo típico es un contador de cuántos objetos ha creado, aunque es un ejemplo muy problemático; pero eso no importa en esta etapa temprana.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
       static int numberOfPersons = 0
  }

numberOfPersonsse declara staticcuál es la palabra clave para distingush entre class variablesy instance variabes. La variable se declara como las demás dentro de la definición de clase. Pero la staticpalabra clave indica que es diferente.

  • firstName, lastNameson variables de instancia y están vinculadas a esa instancia concreta

  • numberOfPersons está vinculado a la clase, de modo que cada instancia pueda acceder a esta variable.

tl; dr

El lugar donde se definen las variables es la definición de clase.

Las variables de clase se conocen en / vinculadas al nivel de clase, es decir, cada instancia concreta tiene acceso a ella. Para definir una variable de clase, usa la palabra clave static.

Las variables de instancia solo se conocen a nivel de instancia. Los define sin la staticpalabra clave.

Más documentación para Java está aquí

Thomas Junk
fuente