Para ser específico, eu estava tentando este código:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Mas deu o erro
Não é possível acessar o campo não estático no método estático principal
Então eu mudei a declaração de clock
para isso:
static Clock clock = new Clock();
E funcionou. O que significa colocar essa palavra-chave antes da declaração? O que exatamente ele fará e / ou restringirá em termos do que pode ser feito com esse objeto?
java
static
oop
language-features
restriction
Click Voto a favor
fonte
fonte
Respostas:
static
membros pertencem à classe em vez de uma instância específica.Isso significa que existe apenas uma instância de um
static
campo [1], mesmo que você crie um milhão de instâncias da classe ou não crie nenhuma. Será compartilhado por todas as instâncias.Como os
static
métodos também não pertencem a uma instância específica, eles não podem se referir aos membros da instância. No exemplo dado,main
não sabe a qual instância daHello
classe (e, portanto, a qual instância daClock
classe) ela deve se referir.static
membros podem se referir apenas astatic
membros. Os membros da instância podem, é claro, acessarstatic
membros.Nota lateral: Obviamente, os
static
membros podem acessar os membros da instância por meio de uma referência a objeto .Exemplo:
[1]: Dependendo das características do tempo de execução, ele pode ser um por ClassLoader ou AppDomain ou thread, mas isso não vem ao caso.
fonte
Isso significa que há apenas uma instância de "clock" no Hello, não uma por cada instância separada da classe "Hello", ou mais, significa que haverá uma referência de "clock" comumente compartilhada entre todas as instâncias de a classe "Olá".
Portanto, se você fizesse um "novo Olá" em qualquer lugar do seu código: A- no primeiro cenário (antes da alteração, sem usar "estático"), ele criaria um novo relógio toda vez que um "novo Olá" fosse chamado, mas B- no segundo cenário (após a alteração, usando "estático"), cada instância "nova Hello" ainda compartilharia e usaria a referência inicial e o mesmo "clock" criado pela primeira vez.
A menos que você precise de "relógio" em algum lugar fora do main, isso também funcionaria:
fonte
main()
rotina deve ser independente.main
método apenas porque o OP o fez. Se, em vez disso, fosse um método público chamado de outro lugar e a classe Hello fosse instanciada mais de uma vez, ela poderia criar uma instância Clock para cada instância Hello, a menos queclock
fosse estático.A
static
palavra-chave significa que algo (um campo, método ou classe aninhada) está relacionado ao tipo e não a uma instância específica do tipo. Por exemplo, alguém chamaMath.sin(...)
sem nenhuma instância daMath
classe e, de fato, você não pode criar uma instância daMath
classe.Para obter mais informações, consulte o bit relevante do Java Tutorial da Oracle .
Nota
Infelizmente, o Java permite acessar membros estáticos como se fossem membros da instância, por exemplo
Isso torna olhar como se
sleep
é um método de instância, mas na verdade é um método estático - ele sempre faz com que o sono thread atual. É uma prática recomendada deixar isso claro no código de chamada:fonte
System.out
como um nome de tipo para mim.A
static
palavra-chave em Java significa que a variável ou função é compartilhada entre todas as instâncias dessa classe, pois pertence ao tipo , não aos objetos reais.Portanto, se você possui uma variável:
private static int i = 0;
e você a incrementa (i++
) em uma instância, a alteração será refletida em todas as instâncias.i
agora será 1 em todas as instâncias.Métodos estáticos podem ser usados sem instanciar um objeto.
fonte
Uso básico de membros estáticos ...
É assim que você pode ter valores compartilhados em todos os membros da classe sem enviar a instância da classe Hello para outra classe. E com estática, você não precisa criar uma instância de classe.
Você pode chamar valores ou métodos estáticos pelo nome da classe:
fonte
Estático significa que você não precisa criar uma instância da classe para usar os métodos ou variáveis associadas à classe. No seu exemplo, você pode chamar:
diretamente, em vez de:
De dentro de um método estático (que pertence a uma classe), você não pode acessar nenhum membro que não seja estático, pois seus valores dependem da instanciação da classe. Um objeto Clock não estático, que é um membro da instância, teria um valor / referência diferente para cada instância da sua classe Hello e, portanto, você não poderia acessá-lo a partir da parte estática da classe.
fonte
Estático em Java:
Static é um modificador sem acesso. A palavra-chave estática pertence à classe e não à instância da classe. pode ser usado para anexar uma variável ou método a uma classe.
A palavra-chave estática PODE ser usada com:
Método
Variável
Classe aninhada dentro de outra Classe
Bloco de Inicialização
NÃO PODE ser usado com:
Classe (não aninhada)
Construtor
Interfaces
Método Classe interna local (diferença e classe aninhada)
Métodos de classe interna
Variáveis de instância
Variáveis locais
Exemplo:
Imagine o exemplo a seguir, que possui uma variável de instância denominada count, que é incrementada no construtor:
Resultado:
Como a variável de instância obtém a memória no momento da criação do objeto, cada objeto terá a cópia da variável de instância; se for incrementada, ela não será refletida em outros objetos.
Agora, se alterarmos a contagem de variáveis de instância para estática , o programa produzirá uma saída diferente:
Resultado:
Nesse caso, a variável estática obterá a memória apenas uma vez; se algum objeto alterar o valor da variável estática, ele manterá seu valor.
Estática com final:
A variável global que é declarada como final e estática permanece inalterada para toda a execução. Porque, os membros estáticos são armazenados na memória da classe e são carregados apenas uma vez em toda a execução. Eles são comuns a todos os objetos da classe. Se você declarar variáveis estáticas como finais, nenhum dos objetos poderá alterar seu valor, pois é final. Portanto, variáveis declaradas como final e estática são algumas vezes chamadas de constantes. Todos os campos das interfaces são referidos como constantes, porque são finais e estáticos por padrão.
Recurso de imagem: Estática final
fonte
Para adicionar às respostas existentes, deixe-me tentar com uma imagem:
Uma taxa de juros de 2% é aplicada a TODAS as contas de poupança. Portanto, é estático .
Um equilíbrio deve ser indivíduo , por isso é não estática.
fonte
Até agora, essa discussão ignorou as considerações sobre o carregador de classes. A rigor, os campos estáticos Java são compartilhados entre todas as instâncias de uma classe para um determinado carregador de classes .
fonte
Um campo pode ser atribuído à classe ou a uma instância de uma classe. Por padrão, os campos são variáveis de instância. O uso
static
do campo se torna uma variável de classe, portanto, existe um e apenas umclock
. Se você fizer alterações em um lugar, é visível em qualquer lugar. Variáveis de instância são alteradas independentemente uma da outra.fonte
A palavra
static
- chave é usada para indicar um campo ou método como pertencente à própria classe e não à instância. Usando seu código, se o objetoClock
for estático, todas as instâncias daHello
classe compartilharão esseClock
membro de dados (campo) em comum. Se você o tornar não estático, cada instância individual deHello
poderá ter umClock
campo exclusivo .O problema é que você adicionou um método principal à sua classe
Hello
para poder executar o código. O problema aqui é que o método principal é estático e, como tal, não pode se referir a campos ou métodos não estáticos dentro dele. Você pode resolver isso de duas maneiras:Hello
estáticos todos os campos e métodos da classe para que possam ser referidos dentro do método principal . Isso realmente não é uma coisa boa a se fazer (ou a razão errada para tornar um campo e / ou um método estático)Hello
classe dentro do método principal e acesse todos os seus campos e métodos da maneira como eles foram planejados.Para você, isso significa a seguinte alteração no seu código:
fonte
Em Java, a
static
palavra - chave pode ser simplesmente considerada como indicando o seguinte:Se você pensar
static
dessa maneira, fica mais fácil entender seu uso nos vários contextos em que é encontrado:Um
static
campo é um campo que pertence à classe e não a qualquer instância específicaUm
static
método é um método que não tem noção dethis
; é definido na classe e não conhece nenhuma instância específica dessa classe, a menos que uma referência seja passada a elaUma
static
classe membro é uma classe aninhada sem nenhuma noção ou conhecimento de uma instância de sua classe envolvente (a menos que uma referência a uma instância de classe envolvente seja passada a ela)fonte
Static torna o membro do relógio um membro da classe em vez de um membro da instância. Sem a palavra-chave estática, você precisaria criar uma instância da classe Hello (que possui uma variável de membro do clock) - por exemplo
fonte
métodos estáticos não usam variáveis de instância da classe em que estão definidos. Uma explicação muito boa da diferença pode ser encontrada nesta página
fonte
Eu desenvolvi um gosto por métodos estáticos (somente, se possível) nas classes "auxiliares".
A classe de chamada não precisa criar outra variável de membro (instância) da classe auxiliar. Você acabou de chamar os métodos da classe auxiliar. Também a classe auxiliar foi aprimorada porque você não precisa mais de um construtor e não precisa de variáveis de membro (instância).
Provavelmente existem outras vantagens.
fonte
fonte
Também pode pensar em membros estáticos que não possuem um ponteiro "this". Eles são compartilhados entre todas as instâncias.
fonte
Noções básicas sobre conceitos estáticos
Segunda classe
fonte
main()
é um método estático que possui duas restrições fundamentais:this()
esuper()
não pode ser usado em contexto estático.fonte
Variáveis estáticas Só podem ser acessadas em métodos estáticos; portanto, quando declaramos as variáveis estáticas, esses métodos getter e setter serão métodos estáticos
métodos estáticos é um nível de classe que podemos acessar usando o nome da classe
A seguir, exemplo de Getters e Setters de variáveis estáticas:
fonte
Uma pergunta foi feita aqui sobre a escolha da palavra 'estático' para esse conceito. Foi enganado por essa pergunta, mas não acho que a etimologia tenha sido claramente abordada. Assim...
É devido à reutilização de palavras-chave, começando com C.
Considere declarações de dados em C (dentro de um corpo de função):
A variável foo é criada na pilha quando a função é inserida (e destruída quando a função termina). Por outro lado, o bar está sempre lá, então é 'estático' no sentido do inglês comum - não vai a lugar nenhum.
Java e linguagens semelhantes têm o mesmo conceito para dados. Os dados podem ser alocados por instância da classe (por objeto) ou uma vez para toda a classe. Como o Java pretende ter uma sintaxe familiar para programadores de C / C ++, a palavra-chave 'estática' é apropriada aqui.
Por fim, chegamos aos métodos.
Conceitualmente, existe uma instância de foo () para todas as instâncias da classe C. Há apenas uma instância de bar () para toda a classe C. Isso é paralelo ao caso que discutimos para dados e, portanto, usando 'static 'é novamente uma escolha sensata, especialmente se você não deseja adicionar mais palavras-chave reservadas ao seu idioma.
fonte