A palavra -chave estática é uma palavra -chave que muitos amigos encontram ao escrever e ler código. É também um dos pontos de conhecimento que entrevistadores de grandes empresas gostam de perguntar durante as entrevistas. Vamos falar sobre o uso de palavras -chave estáticas e os mal -entendidos comuns. Por fim, listamos algumas perguntas comuns de teste sobre estática na entrevista por escrito. Aqui está o esboço do diretório deste artigo:
1. O objetivo das palavras -chave estáticas
2. conceitos errôneos de palavras -chave estáticas
3. Perguntas comuns da entrevista por escrito
Se houver alguma incorreção, espero entender e receber críticas e correções.
Por favor, respeite as realizações trabalhistas do autor. Por favor, indique o link original ao reimprimir:
http://www.cnblogs.com/dolphin0520/p/3799052.html
1. O objetivo das palavras -chave estáticas
"O método estático é um método sem esse. Os métodos não estáticos não podem ser chamados dentro do método estático, que por sua vez é possível. E o método estático pode ser chamado apenas através da própria classe sem criar nenhum objeto. Esse é realmente o principal objetivo do método estático".
Embora esta passagem ilustre apenas os recursos especiais do método estático, pode -se ver que a função básica da palavra -chave estática. Em suma, é descrito em uma frase:
É conveniente chamar (método/variável) sem criar um objeto.
Obviamente, métodos ou variáveis modificadas por palavras -chave estáticas não precisam confiar em objetos para acesso. Enquanto a classe for carregada, eles podem ser acessados através do nome da classe.
A estática pode ser usada para modificar os métodos dos membros da classe e as variáveis de membro da classe. Além disso, os blocos de código estático podem ser gravados para otimizar o desempenho do programa.
1) Método estático
O método estático é geralmente chamado de método estático. Como os métodos estáticos podem ser acessados sem depender de nenhum objeto, não há isso para métodos estáticos porque não depende de nenhum objeto. Como não há objetos, não existe essa coisa. E devido a esse recurso, variáveis não estáticas de membros e métodos não estáticos da classe não podem ser acessados em métodos estáticos, porque os métodos/variáveis não estáticos devem depender de objetos específicos a serem chamados.
Mas deve-se notar que, embora os métodos não estáticos e variáveis não estáticos não possam ser acessados em métodos estáticos, métodos/variáveis estáticos de membros podem ser acessados em métodos não estáticos. Vamos dar um exemplo simples:
No código acima, como o método Print2 existe independentemente do objeto, ele pode ser chamado diretamente pelo nome da classe. Se métodos/variáveis não estáticos puderem ser acessados em métodos estáticos, se houver a seguinte declaração no método principal:
MyObject.print2 ();
No momento, não há objeto, e o STR2 não existe, então haverá uma contradição. O mesmo vale para métodos. Como você não pode prever se as variáveis não estáticas de membros são acessadas no método Print1, também é proibido o acesso a métodos não estáticos de membros em métodos estáticos de membros.
E para métodos não estáticos de membros, é obviamente ilimitado acessar métodos/variáveis de membros estáticos.
Portanto, se você deseja chamar um método sem criar um objeto, poderá definir esse método como estático. Nosso método estático mais comum é o método principal. Quanto ao motivo pelo qual o método principal deve ser estático, está muito claro agora. Como o programa não cria nenhum objeto ao executar o método principal, ele só pode ser acessado através do nome da classe.
Lembre -se também de que, mesmo que não seja exibido como estático, o construtor da classe é na verdade um método estático.
2) variáveis estáticas
As variáveis estáticas também são chamadas de variáveis estáticas. A diferença entre variáveis estáticas e variáveis não estáticas é que as variáveis estáticas são compartilhadas por todos os objetos, com apenas uma cópia na memória, que será inicializada se e somente quando a classe for carregada pela primeira vez. As variáveis não estáticas são de propriedade de objetos e são inicializadas ao criar objetos. Existem várias cópias e as cópias pertencentes a cada objeto não se afetam.
A ordem de inicialização das variáveis estáticas do membro é inicializada na ordem definida.
3) bloco de código estático
Outra função -chave da palavra -chave estática é formar blocos de código estático para otimizar o desempenho do programa. O bloco estático pode ser colocado em qualquer lugar da classe e pode haver vários blocos estáticos na classe. Quando a classe for carregada pela primeira vez, cada bloco estático será executado na ordem dos blocos estáticos e será executado apenas uma vez.
A razão pela qual os blocos estáticos podem ser usados para otimizar o desempenho do programa é por causa de sua característica: eles serão executados apenas uma vez quando a classe for carregada. Aqui está um exemplo:
classe Pessoa {data privada BirthDate; Public Pessoa (data de nascimento) {this.birthdate = BIRVHATE;} boolean isbornboomer () {date startDate = date.valueof ("1946"); date enddate = date.Valueof ("1964); retorno birthdate.com (startdate)> 0 e date =. Isbornboomer está acostumado a se essa pessoa nasceu em 1946-1964. Toda vez que o isbornboomer é chamado, dois objetos serão gerados, o que causará desperdício de espaço. Se alterado para isso, será melhor:
classe Pessoa {data privada BirthDate; Data estática privada StartDate, enddate; static {startDate = date.Valueof ("1946"); enddate = date.valueof ("1964");} Public Pessoa (data de nascimento) {this.birthdate = BIRNIBATATE;} BOOLEAN ISBORNOMER () {this.birthdate = BIRNIBATE; aniversário.compareto (enddate) <0;}} Portanto, muitas vezes, algumas operações de inicialização que precisam ser executadas apenas uma vez serão colocadas no bloco de código estático.
2. conceitos errôneos de palavras -chave estáticas
1. A palavra -chave estática mudará os direitos de acesso dos membros da classe?
Alguns iniciantes confundirão estática em Java com funções de palavra -chave estática em C/C ++. Lembre -se de uma coisa aqui: ao contrário da estática em C/C ++, a palavra -chave estática em Java não afetará o escopo de variáveis ou métodos. Em Java, as únicas palavras -chave que podem afetar as permissões de acesso são privadas, públicas e protegidas (incluindo permissões de acesso ao pacote). Veja os seguintes exemplos para entender:
O erro imediato "Pessoa.
2. As variáveis estáticas podem ser acessadas através disso?
Embora não exista isso para métodos estáticos, as variáveis estáticas de membros podem ser acessadas com isso em métodos não estáticos? Vamos primeiro olhar para o exemplo a seguir. Qual é o resultado dessa saída de código?
classe pública principal {static int vale = 33; public static void main (string [] args) lança exceção {new main (). printValue ();} private void printValue () {int value = 3; system.out.println (this.value);}} 33
Esta é principalmente a principal equipe de observação para entender isso e estática. O que isso representa? Isso representa o objeto atual. Se o PrintValue for chamado através do novo principal (), o objeto atual será o objeto gerado pelo novo main (). A variável estática é apreciada pelo objeto, portanto, o valor disso. O valor no PrintValue é sem dúvida 33. O valor dentro do método PrintValue é uma variável local e não pode ser associado a isso, portanto, a saída é 33. Sempre se lembre de uma coisa aqui: embora as variáveis estáticas sejam independentes de objetos, eles não serem significados que não podem ser acessados por meio de objetos. Todos os métodos estáticos e variáveis estáticas podem ser acessadas através de objetos (desde que as permissões de acesso sejam suficientes).
3. Pode agir estático em variáveis locais?
Em C/C ++, a estática pode esconder variáveis locais, mas lembre -se de Java: a estática não pode ser usada para modificar variáveis locais. Não pergunte por que, esta é a disposição da sintaxe Java.
3. Perguntas comuns da entrevista por escrito
O seguinte lista algumas perguntas sobre palavras -chave estáticas que geralmente são encontradas na entrevista por escrito. Eles são apenas para referência. Se você tiver algum suplemento, sinta -se à vontade para deixar uma mensagem abaixo.
1. Qual é o resultado da saída do código a seguir?
public class Test estende a base {static {System.out.println ("test static");} public test () {System.out.println ("Test construtor");} public static void main (string [] args) {new Test ();}} base {static {System.out.printl) {new);}} base {static {System.out.printl) (new);}} base {static {System.out.printl) {new); Base () {System.out.println ("construtor de base");}} base estática base
Teste estático
Construtor de base
construtor de teste
Quanto ao motivo pelo qual esse resultado é, não vamos discutir primeiro. Vamos pensar no processo de execução específico deste código. No início da execução, devemos primeiro encontrar o método principal, porque o método principal é a entrada do programa, mas antes de executar o método principal, a classe de teste deve ser carregada primeiro. Ao carregar a classe de teste, verifica -se que a classe de teste herda da classe base, para que ele volte para carregar a classe base primeiro. Ao carregar a classe base, ele descobre que existe um bloco estático e executa o bloco estático. Depois que a classe base é carregada, a classe de teste continua a carregar e, em seguida, descobre que existem blocos estáticos na classe de teste, para que o bloco estático seja executado. Depois de carregar a classe necessária, o método principal começa a ser executado. Ao executar o novo teste () no método principal, o construtor da classe pai será chamado primeiro e depois o construtor próprio. Portanto, o resultado da saída acima é exibido.
2. Qual é o resultado de saída desse código?
public class Test {pessoa pessoa = nova pessoa ("teste"); static {System.out.println ("test static");} public test () {System.out.println ("teste construtor");} public static maid main (string [] args) {new myclass ();}} PSYSTATTS {STATS {SYMESTENT {SYMESTENT {SYMESTENT {SYMESTENT {SYMESTENT {SYMESTENT {SYMESTENT {SYMESTENT {SYMESTENT {SYMESTENT} Person(String str) {System.out.println("person "+str);}}class MyClass extends Test {Person person = new Person("MyClass");static{System.out.println("myclass static");}public MyClass() {System.out.println("myclass constructor");}} Teste estático 1
Teste estático 2
Embora não haja declarações no método principal, elas ainda serão lançadas, porque o motivo foi explicado acima. Além disso, o bloco estático pode aparecer em qualquer lugar da classe (desde que não esteja dentro do método, lembre -se de que nenhum método pode fazê -lo) e a execução é executada na ordem dos blocos estáticos.
O exposto acima é uma análise abrangente das palavras -chave estáticas em Java apresentado a você pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!