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.varName
ou a partir ClassInstance.varName
de qualquer outra classe.
Declarar a variável como estática fornece outras propriedades especiais?
Respostas:
Obviamente, ele pode ser acessado como
ClassName.var_name
, mas apenas de dentro da classe em que está definido - é porque está definido comoprivate
.public static
ouprivate static
variáveis são frequentemente usadas para constantes. Por exemplo, muitas pessoas não gostam de "codificar" constantes no código; eles gostam de criar umpublic static
ouprivate static
variá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 constantesfinal
).Por exemplo:
Se você faz
public
ouprivate
depende se deseja que as variáveis sejam visíveis fora da classe ou não.fonte
ClassName.var_nam
? Onde eu posso acessá-lo diretamente:var_nam
dentro da classeVariáveis estáticas têm um valor único para todas as instâncias de uma classe.
Se você fosse fazer algo como:
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.
fonte
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).
fonte
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:
fonte
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).Bem,
private static
variáveis podem ser usadas para compartilhar dados entre instâncias dessa classe. Enquanto você estiver certo, não podemos acessar asprivate static
variáveis usando construções comoClassName.member
ou,ClassInstance.member
mas 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.fonte
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.
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!
fonte
Sim, ambos são diferentes. E o primeiro é chamado
class variable
porque possui um valor único para isso,class
enquanto o outro é chamadoinstance variable
porque pode conter um valor diferente para diferenteinstances(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 diferentesprivate varName;
na jvm.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 comoClassName.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.Logicamente,
private static variable
não é diferente do quepublic static variable
o primeiro oferece mais controle. IMO, você pode literalmente substituirpublic static variable
porprivate static variable
com a ajuda depublic static
métodos get e set.Uma área amplamente usada
private static variable
é na implementação deSingleton
padrões simples, onde você terá apenas uma instância dessa classe no mundo inteiro. Aqui, ostatic
identificador 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).fonte
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.
fonte
Outra perspectiva:
fonte
Quando em um método estático você usa uma variável, a variável também deve ser estática como exemplo:
fonte
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
fonte
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.
fonte
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.
fonte
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 ThreadSe 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 é
fonte
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:
Então você pode sysout:
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.
fonte
*) 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;
fonte
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.
fonte
ThreadLocal
variáveis são normalmente implementadas comoprivate 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".fonte
No exemplo a seguir,
eye
é alterado pelo PersonB, enquantoleg
permanece 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.}
fonte