Qual é o uso de uma variável estática privada em Java?

156

Se uma variável é declarada como public static varName;, então eu posso acessá-la de qualquer lugar como ClassName.varName. Também estou ciente de que membros estáticos são compartilhados por todas as instâncias de uma classe e não são realocados em cada instância.

Declarar uma variável private static varName;diferente de declarar uma variável private varName;?

Nos dois casos, ele não pode ser acessado como ClassName.varNameou a partir ClassInstance.varNamede qualquer outra classe.

Declarar a variável como estática fornece outras propriedades especiais?

Vaibhav Jani
fonte
5
Os nomes de variáveis ​​Java não podem conter traços (-).
Martijn Courteaux

Respostas:

127

Obviamente, ele pode ser acessado como ClassName.var_name, mas apenas de dentro da classe em que está definido - é porque está definido como private.

public staticou private staticvariáveis ​​são frequentemente usadas para constantes. Por exemplo, muitas pessoas não gostam de "codificar" constantes no código; eles gostam de criar um public staticou private staticvariável com um nome significativo e usá-lo em seu código, o que deve tornar o código mais legível. (Você também deve fazer essas constantes final).

Por exemplo:

public class Example {
    private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
    private final static String JDBC_USERNAME = "username";
    private final static String JDBC_PASSWORD = "password";

    public static void main(String[] args) {
        Connection conn = DriverManager.getConnection(JDBC_URL,
                                         JDBC_USERNAME, JDBC_PASSWORD);

        // ...
    }
}

Se você faz publicou privatedepende se deseja que as variáveis ​​sejam visíveis fora da classe ou não.

Jesper
fonte
6
O que é necessário acessar como ClassName.var_nam? Onde eu posso acessá-lo diretamente: var_namdentro da classe
Vaibhav Jani
12
Não é necessário acessá-lo pelo nome da classe, mas algumas pessoas pensam que é um bom estilo, para diferenciá-lo de uma variável não estática.
Jesper
5
o que é necessário para acessá-lo usando variável estática, podemos escrever "private final String JDBC_PASSWORD =" password ";" em vez de usar variável estática para essa sequência de senha.
chaitanya
48
@chaitanya É uma constante. Por que você deseja ter uma cópia da variável para cada instância da classe, tornando-a não estática?
Jesper
16
static é uma variável no nível da classe, o que é comum e existe apenas uma cópia para todas as instâncias dessa classe. A regra é aplicável, seja ela privada ou pública. private apenas diz que não quero que o mundo exterior corrompa meu valor de variável (para estática não final). Se uma estática é final, não há mal algum em torná-la pública, pois ninguém pode alterar seu valor.
precisa saber é o seguinte
94

Variáveis ​​estáticas têm um valor único para todas as instâncias de uma classe.

Se você fosse fazer algo como:

public class Person
{
    private static int numberOfEyes;
    private String name;
}

e então você queria mudar seu nome, tudo bem, meu nome permanece o mesmo. Se, no entanto, você quiser alterá-lo para ter 17 olhos, todos no mundo também terão 17 olhos.

TofuBeer
fonte
3
Isso não se aplica a variáveis ​​estáticas privadas, a menos que você também escreva métodos de acesso para a variável privada, porque eles não podem ser acessados ​​de fora da classe.
Ganesh Krishnan
2
Não é verdade @GaneshKrishnan, qualquer instância da classe tem acesso às duas variáveis. Naturalmente, você pode esperar que o autor da classe não faça algo bobo. Além disso, com reflexão e JNI, todas as apostas estão desativadas.
TofuBeer
46

As variáveis ​​estáticas privadas são úteis da mesma maneira que as variáveis ​​de instância privadas são úteis: elas armazenam estados que são acessados ​​apenas por código dentro da mesma classe. A acessibilidade (privada / pública / etc) e a natureza da instância / estática da variável são conceitos inteiramente ortogonais.

Eu evitaria pensar em variáveis ​​estáticas como sendo compartilhadas entre "todas as instâncias" da classe - o que sugere que deve haver pelo menos uma instância para que o estado esteja presente. Não - uma variável estática está associada ao próprio tipo em vez de quaisquer instâncias do tipo.

Portanto, sempre que você desejar algum estado associado ao tipo, em vez de qualquer instância específica, e desejar manter esse estado privado (talvez permitindo acesso controlado por propriedades, por exemplo), faz sentido ter uma variável estática privada.

Como um aparte, eu recomendo fortemente que o único tipo de variáveis ​​que você torna públicas (ou mesmo não privadas) sejam constantes - variáveis ​​finais estáticas de tipos imutáveis. Todo o resto deve ser privado para separar a API e a implementação (entre outras coisas).

Jon Skeet
fonte
Você pode explicar um pouco mais sobre a diferença de acesso a variáveis ​​privadas estáticas e privadas não estáticas em uma classe?
Dharmendra 02/09
1
@Dharmendra: Não está claro para mim o que você quer dizer. A parte privada é irrelevante - o que exatamente o confunde sobre a diferença entre variáveis ​​estáticas e variáveis ​​de instância?
Jon Skeet
Qual é a diferença de acessibilidade quando usamos variáveis ​​estáticas e não estáticas na classe única em que são declaradas?
Dharmendra
2
@YogGuru: Não vejo a relevância da pergunta. Torne-o privado, se desejar que seja privado, e estático, se quiser que seja estático. Eles são ortogonais.
Jon Skeet
1
@ryvantage: Não, de jeito nenhum. Um método estático pode acessá-lo sem problemas.
Jon Skeet
11

Bem, você está certo, variáveis ​​estáticas públicas são usadas sem criar uma instância da classe, mas variáveis ​​estáticas privadas não são. A principal diferença entre eles e onde eu uso as variáveis ​​estáticas privadas é quando você precisa usar uma variável em uma função estática. Para as funções estáticas, você só pode usar variáveis ​​estáticas, tornando-as privadas para não acessá-las de outras classes. Esse é o único caso para o qual uso a estática privada.

Aqui está um exemplo:

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}
Farid Farhat
fonte
3
Eu acho que gosto mais desta resposta. +1. O único momento em que faz sentido usar a estática em uma variável privada é se um método estático a acessa.
Mukus
Sem dar à classe um nome adequado, você realmente não pode dizer se esse é um caso de uso válido. Por exemplo, se a classe fosse chamada Person, provavelmente seria um bug, porque você não poderia ter várias pessoas de diferentes faixas etárias (se esse fosse um caso de uso pretendido).
precisa saber é o seguinte
Eu concordo @Mukus. Essa pode ser a única resposta real para essa pergunta. Acho que o OP já entende a estática, mas as pessoas parecem querer explicá-lo novamente. Ele está perguntando sobre um cenário específico. A capacidade de acessar variáveis ​​em métodos estáticos é a funcionalidade que o 'private static' adiciona. Eu só quero acrescentar que ele também permite acesso CLASSES estático aninhado às variáveis.
Pinkerton
1
E a memória? Com estático, você criaria apenas uma cópia para a classe em vez de uma cópia para cada instância. E, obviamente, com uma constante, você só precisaria de uma cópia para a aula. Isso economiza memória?
Pinkerton
1
Eu procurei por isso. A resposta à minha pergunta anterior é: sim, ele economiza memória
Pinkerton
8

Bem, private staticvariáveis ​​podem ser usadas para compartilhar dados entre instâncias dessa classe. Enquanto você estiver certo, não podemos acessar as private staticvariáveis ​​usando construções como ClassName.memberou, ClassInstance.membermas o membro sempre estará visível nos métodos dessa classe ou nas instâncias dessa classe. Portanto, as instâncias dessa classe sempre poderão se referir ao membro.

Swaranga Sarma
fonte
6

Qual é o uso de uma variável de classe estática privada?

Digamos que você tenha um livro da biblioteca Classe. Cada vez que você cria um novo livro, deseja atribuir a ele um ID exclusivo. Uma maneira é simplesmente começar em 0 e aumentar o número de identificação. Mas como todos os outros livros sabem o último número de identificação criado? Simples, salve-o como uma variável estática. Os clientes precisam saber que o número de identificação interno real é para cada livro? Não. Essa informação é privada.

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

Este é um exemplo artificial, mas tenho certeza de que você pode pensar facilmente nos casos em que deseja que todas as instâncias de classe tenham acesso a informações comuns que devem ser mantidas em sigilo por todos os outros. Ou mesmo se você não puder, é uma boa prática de programação tornar as coisas o mais privadas possível. E se você acidentalmente tornasse público esse campo de numBooks, mesmo que os usuários do livro não devessem fazer nada com ele. Alguém poderia alterar o número de livros sem criar um novo livro.

Muito sorrateira!

iheanyi
fonte
6

Declarar uma variável private static varName;diferente de declarar uma variável private varName;?

Sim, ambos são diferentes. E o primeiro é chamado class variableporque possui um valor único para isso, classenquanto o outro é chamado instance variableporque pode conter um valor diferente para diferente instances(Objects). O primeiro é criado apenas uma vez na jvm e o outro é criado uma vez por instância, ou seja, se você tiver 10 instâncias, terá 10 diferentes private varName;na jvm.

Declarar a variável como staticlhe dá outras propriedades especiais?

Sim, variáveis ​​estáticas obtêm algumas propriedades diferentes das variáveis ​​de instância normais. Já mencionei alguns e vamos ver alguns aqui: class variables(variáveis ​​de instância declaradas como estáticas) podem ser acessadas diretamente usando o nome da classe como ClassName.varName. E qualquer objeto dessa classe pode acessar e modificar seu valor, ao contrário das variáveis ​​de instância que são acessadas apenas por seus respectivos objetos. Variáveis ​​de classe podem ser usadas em métodos estáticos.

Qual é o uso de a private static variableem Java?

Logicamente, private static variablenão é diferente do que public static variableo primeiro oferece mais controle. IMO, você pode literalmente substituir public static variablepor private static variablecom a ajuda de public staticmétodos get e set.

Uma área amplamente usada private static variableé na implementação de Singletonpadrões simples, onde você terá apenas uma instância dessa classe no mundo inteiro. Aqui, o staticidentificador desempenha um papel crucial para tornar essa instância única acessível pelo mundo exterior (é claro que o método público getter estático também desempenha um papel principal).

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
avr
fonte
4

A palavra-chave privada será usada para o acesso à variável dentro da classe e mantendo estática no sentido em que também podemos acessar a variável no método estático, mas a variável de referência não pode acessar no método estático.

Raam
fonte
3

Outra perspectiva:

  1. Uma classe e sua instância são duas coisas diferentes no tempo de execução. Uma informação de classe é "compartilhada" por todas as instâncias dessa classe.
  2. As variáveis ​​de classe não estática pertencem às instâncias e a variável estática pertence à classe.
  3. Assim como as variáveis ​​de uma instância podem ser privadas ou públicas, as variáveis ​​estáticas também podem ser privadas ou públicas.
Santosh
fonte
1

Quando em um método estático você usa uma variável, a variável também deve ser estática como exemplo:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
Neifen
fonte
3
Bem, a menos que seu método tenha uma referência a uma instância da classe, é claro.
Jon Skeet
1

Variáveis ​​estáticas são aquelas que são comuns a todas as instâncias de uma classe .. se uma instância a alterar .. o valor da variável estática será atualizado para todas as outras instâncias

Nagesh Tripathi
fonte
1

Para algumas pessoas, isso faz mais sentido se elas virem em algumas linguagens diferentes, então escrevi um exemplo em Java e PHP na minha página, onde explico alguns desses modificadores. Você pode estar pensando sobre isso incorretamente.

Você deve olhar para os meus exemplos, se não fizer sentido abaixo. Vá aqui http://www.siteconsortium.com/h/D0000D.php

O ponto principal é que é exatamente exatamente o que diz ser. É uma variável de membro estática que é privada. Por exemplo, se você deseja criar um objeto Singleton, por que você deseja tornar pública a variável SingletonExample.instance. Se você fez uma pessoa que estava usando a classe, poderia substituir o valor facilmente.

Isso é tudo.

    classe pública SingletonExample {
      instância estática privada SingletonExample = null;
      valor int estático privado = 0;
      private SingletonExample () {
        ++ this.value;
      }
      public estático SingletonExample getInstance () {
        if (instância! = nula)
        instância de retorno;
        sincronizado (SingletonExample.class) {
        instance = new SingletonExample ();
        instância de retorno;
        }
      }
      public void printValue () {
        System.out.print (this.value);
      }

      public static void main (String [] args) {
        Instância SingletonExample = getInstance ();
        instance.printValue ();
        instância = getInstance ();
        instance.printValue ();
         }
    }

JTHouseCat
fonte
1

Se você usar variáveis ​​estáticas privadas em sua classe, as classes internas estáticas da sua classe poderão alcançar suas variáveis. Isso é perfeitamente bom para segurança de contexto.

Erdal76t
fonte
0

Se uma variável é definida como estática pública, pode ser acessada através do nome da classe a partir de qualquer classe.

Normalmente, as funções são definidas como estáticas públicas, que podem ser acessadas apenas chamando o nome da classe de implementação.

Um exemplo muito bom disso é o sleep()método na classe Thread

Thread.sleep(2500);

Se uma variável for definida como estática privada, ela poderá ser acessada apenas dentro dessa classe, portanto, nenhum nome de classe será necessário ou você ainda poderá usar o nome da classe (até você). A diferença entre var_name privado e estático privado var_name é que variáveis ​​estáticas privadas podem ser acessadas apenas por métodos estáticos da classe, enquanto variáveis ​​privadas podem ser acessadas por qualquer método dessa classe (exceto métodos estáticos)

Um exemplo muito bom disso é ao definir conexões ou constantes do banco de dados que requerem declarar a variável como estática privada.

Outro exemplo comum é

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
ron_ron
fonte
0

Sou novo em Java, mas uma maneira de usar variáveis ​​estáticas, como suponho que muitas pessoas fazem, é contar o número de instâncias da classe. por exemplo:

public Class Company {
    private static int numCompanies;

    public static int getNumCompanies(){
        return numCompanies;
    }
}

Então você pode sysout:

Company.getNumCompanies();

Você também pode obter acesso a numCompanies de cada instância da classe (que eu não entendo completamente), mas não será "de maneira estática". Não tenho idéia se essa é a melhor prática ou não, mas faz sentido para mim.

pyetti
fonte
0

*) Se uma variável é declarada como privada, ela não é visível fora da classe. Isso é chamado de ocultação de dados.

*) Se uma variável é declarada como estática, o valor da variável é o mesmo para todas as instâncias e não precisamos criar um objeto para chamá-la de variável.

classname.variablename;

Deepak Bala
fonte
0

A variável estática privada também será compartilhada na subclasse. Se você alterou uma subclasse e a outra subclasse obterá o valor alterado, nesse caso, pode não ser o que você espera.

public class PrivateStatic {

private static int var = 10;
public void setVar(int newVal) {
    var = newVal;
}

public int getVar() {
    return var;
}

public static void main(String... args) {
    PrivateStatic p1 = new Sub1();
    System.out.println(PrivateStatic.var);
    p1.setVar(200);

    PrivateStatic p2 = new Sub2();
    System.out.println(p2.getVar());
}
}


class Sub1 extends PrivateStatic {

}

class Sub2 extends PrivateStatic {
}
djiao
fonte
0

ThreadLocalvariáveis ​​são normalmente implementadas como private static. Dessa maneira, eles não estão vinculados à classe e cada thread tem sua própria referência ao seu próprio objeto "ThreadLocal".

Mehmet Erdemsoy
fonte
3
Eu não entendo essa resposta. O que você quer dizer?
H.Rabiee
-1

No exemplo a seguir, eyeé alterado pelo PersonB, enquanto legpermanece o mesmo. Isso ocorre porque uma variável privada faz uma cópia de si mesma para o método, para que seu valor original permaneça o mesmo; enquanto um valor estático privado possui apenas uma cópia para todos os métodos a serem compartilhados, a edição de seu valor alterará seu valor original.

public class test {
private static int eye=2;
private int leg=3;

public test (int eyes, int legs){
    eye = eyes;
    leg=leg;
}

public test (){
}

public void print(){
    System.out.println(eye);
    System.out.println(leg);
}

public static void main(String[] args){
    test PersonA = new test();      
    test PersonB = new test(14,8);
    PersonA.print();    
}

}

> 14 3

Yiqin Dai
fonte