Quais são as diferenças entre variáveis ​​de classe e variáveis ​​de instância em Java? [fechadas]


16

Eu sou muito novo em Java e quero entender a diferença entre variáveis ​​de classe e variáveis ​​de instância.

Por exemplo:

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

Como as variáveis ​​de instância e variáveis ​​de classe são diferentes umas das outras? Quais variáveis ​​aqui são variáveis ​​de classe e quais são variáveis ​​de instância? Como isso afeta o escopo?


1
Parece que você começou a ler The Java ™ Tutorials: Understanding Class Members, o que explica isso, mas ainda não o compreendeu completamente.

Respostas:


35

Ambos são variáveis ​​de membro , o que significa que ambos estão associados a uma classe. Agora, é claro, existem diferenças entre os dois:

Variáveis ​​de instância:

Essas variáveis ​​pertencem à instância de uma classe , portanto, um objeto. E toda instância dessa classe (objeto) tem sua própria cópia dessa variável. As alterações feitas na variável não refletem em outras instâncias dessa classe.

public class Product {
    public int Barcode;
}

Variáveis ​​de classe:

Também são conhecidas como variáveis ​​de membro estáticas e há apenas uma cópia dessa variável que é compartilhada com todas as instâncias dessa classe. Se forem feitas alterações nessa variável, todas as outras instâncias verão o efeito das alterações.

public class Product {
    public static int Barcode;
}

Exemplo 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;
}

A saída será:

123456

987654

Agora, altere a variável de instância para uma variável de classe, tornando-a 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;
    }
}

Usei métodos não estáticos para obter e definir o valor de Barcodepoder chamá-lo do objeto e não da classe. A saída será a seguinte:

987654

987654


Por que um exemplo de C # para uma pergunta sobre Java?
Basile Starynkevitch 12/08/2015

Meus pensamentos exactly.I só sei de programação Java não C #, então você não foi de muita ajuda
Skylar Adams

1
@BasileStarynkevitch Sou principalmente um desenvolvedor de C # e, como o princípio conta para ambos e é tão bom quanto o mesmo, rapidamente forneci um exemplo de C #, errado comigo, é claro. :) Mudei meu exemplo para Java.
Abbas

2
@ SkylarAdams Desculpe, assumi erroneamente rápido demais que quem conhece Java conhece C #. Mudei o exemplo para Java, espero que ajude.
Abbas

9
Para esse tipo de pergunta, eu acho que é irrelevante, se utilizando Java ou C #,
Thomas Junk

6

É explicado aqui (com um exemplo Bicycleclasse com variáveis classe numberOfBicyclesvariáveis e instância cadence, speed, gear& id):

Às vezes, você deseja ter variáveis ​​comuns a todos os objetos. Isso é realizado com o staticmodificador. Os campos que possuem o staticmodificador em sua declaração são chamados de campos estáticos ou variáveis ​​de classe. Eles estão associados à classe, e não a qualquer objeto. Cada instância da classe compartilha uma variável de classe, que está em um local fixo na memória. Qualquer objeto pode alterar o valor de uma variável de classe, mas as variáveis ​​de classe também podem ser manipuladas sem criar uma instância da classe.

Uma variável de classe (declarada static) é um local comum a todas as instâncias.

No exemplo, numberOfBicyclesé uma variável de classe (uma vez que é declarada static). Existe apenas uma variável (local), comum a todas as instâncias e à classe. Portanto, se você modificar numberOfBicyclesem um método, outros métodos verão o novo valor (mesmo para Bicycleobjetos diferentes )

Por outro lado, gear& idsão variáveis ​​de instância (porque sua declaração não possui staticmodificador). Todo Bicycleobjeto tem o seu próprio. Se você modificar gearpara alguns Bicycle a , e se b for outra instância, a modificação a.gearnão terá efeito sobreb.gear

Cada objeto Java é uma zona de memória distinta com alguns metadados (por exemplo, alguma referência à sua classe) e suas próprias variáveis ​​de instância (talvez herdadas de uma superclasse). Mas as variáveis ​​de classe são comuns à classe e compartilhadas por todas as instâncias.

Consulte também as páginas de variáveis ​​de objeto (ciência da computação) e instância .


4

Variável de instância:

  • Variáveis ​​de instância são declaradas em uma classe, mas fora de um método, construtor ou qualquer bloco.
  • A variável de instância pertence à instância de uma classe ou você pode dizer que a variável de instância pertence ao objeto.
  • A variável de instância possui um valor separado para cada instância da classe.

    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 acessar a variável de instância:

InstanceDemo demo = new InstanceDemo ();

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

Saída: 2, Teste

Variável de classe:

  • A variável de classe pertence à classe.
  • A variável de classe é criada adicionando a palavra-chave "estática" antes da variável.
  • Também chamada de variável estática.
  • E a variável de classe mais importante mantém um único valor compartilhado para todas as instâncias de uma classe, mesmo que não exista nenhum objeto de instância da classe.

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

Método para acessar a variável de classe:

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

Saída: 2

Breve diferença entre variável de classe e variável de instância:

  • Variáveis ​​de instância possuem valores separados para cada instância de uma classe. As variáveis ​​de classe mantêm um único valor compartilhado para todas as instâncias da classe, mesmo que não exista nenhum objeto de instância dessa classe.
  • Você usaria a palavra-chave estática para alterar uma variável de instância em uma variável de classe.
  • As variáveis ​​de instância e classe são declaradas no nível da classe, não nos métodos.

3

A diferença entre class variablese instancevariáveis ​​é simplesmente uma questão de who knows what?.

Um instance variablesó é conhecido (= ligado ) a essa instância concreta - daí o nome.

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

A definição de uma classe é como um modelo para a construção de objetos concretos . Talvez este ponto o confunda um pouco. Mas, escrevendo dessa maneira, cada variável seria vinculada ao seu objeto concreto: por exemplo, cada pessoa tem seu próprio firstName

A, class variablepor outro lado, é - como o nome diz - conhecido por todo e qualquer membro de uma classe; ou tecnicamente: é conhecido / vinculado no nível da classe . O exemplo típico é um contador de quantos objetos você criou - embora seja um exemplo muito problemático; mas isso não importa nesta fase inicial.

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

numberOfPersonsé declarado staticqual é a palavra-chave para distinguir entre class variablese instance variabes. A variável é declarada como as outras dentro da definição de classe. Mas a staticpalavra - chave sinaliza que é diferente.

  • firstName, lastNamesão variáveis ​​de instância e vinculados a essa instância concreta

  • numberOfPersons está vinculado à classe, para que cada instância possa acessar essa variável.

tl; dr

O local onde as variáveis ​​são definidas é a definição da classe.

As variáveis ​​de classe são conhecidas no / bound ao nível da classe, ou seja, cada instância concreta tem acesso a ela. Para definir uma variável de classe, você usa a palavra-chave static.

As variáveis ​​de instância são conhecidas apenas no nível da instância. Você os define sem a staticpalavra - chave.

Mais documentação para Java está aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.