"O professor simplesmente não consegue sair da rotina. Antigos professores acostumados a dar palestras são sempre assim. Não há nada que ele possa lhe dizer que você não encontre nos livros. Você não aprende a nadar ouvindo às palestras de natação. As palestras só são úteis quando você está familiarizado com o assunto e sabe quase tanto quanto seu professor."

"Ainda assim, suas lições são úteis."

"Sim. Quero dizer, esperamos que sejam. Quanto mais perspectivas sobre o assunto você ouvir, mais perto você chegará da verdade. Quando você ouvir apenas uma, tudo o que você pode fazer é acreditar ou não. OK, vamos voltar aos negócios."

"Vamos ver uma foto que mostrei a você antes."


public class Variables

{
   private static String TEXT = "The end.";
  ┗━━━━━━━━━━━━━━━━━━━┛
   public static void main (String[] args)
                          ┗━━━━━━━┛
  {
     System.out.println("Hi");
     String s = "Hi!";
   ┏┗━━━━┛
    System.out.println(s);
    if (args != NULL)
    {
       String s2 = s;
      ┗━━━━┛
   
      System.out.println(s2);
     
    }
    Variables variables = new Variables();
    System.out.println(variables.instanceVariable);
    System.out.println(TEXT);
   
  }
 
   public String instanceVariable;
  ┗━━━━━━━━━━━━━━━┛
   public Variables()
   {
      instanceVariable = "Instance variable test.";
   }
}

1. Uma variável declarada em um método existe (é visível) desde o início de sua declaração até o final do método.

2. Uma variável declarada em um bloco de código existe até o final do bloco de código.

3. Os parâmetros de um método existem até que o método retorne.

4. As variáveis ​​em um objeto existem durante todo o tempo de vida do objeto que as contém. Sua visibilidade também é governada por modificadores de acesso especiais.

5. As variáveis ​​estáticas (classe) existem durante todo o tempo em que o programa está sendo executado. Sua visibilidade também é definida por modificadores de acesso."

"Certo. Eu me lembro dessa foto."

"Ótimo. Deixe-me lembrá-lo sobre alguns pontos-chave."

"Todas as variáveis ​​declaradas dentro dos métodos existem (são visíveis) desde o ponto em que são declaradas até o final do método (Exemplo 1)."

"Se uma variável é declarada em um bloco de código, ela existe até o final do bloco de código (Exemplo 2)."

"Se uma variável é um parâmetro de método, ela existe (é visível) em todo o corpo do método (Exemplo 3)."

"Se uma variável é uma variável de instância (Exemplo 4), ela está vinculada a um determinado objeto e existe enquanto o objeto existir. Se nenhum objeto existir, então não há instâncias da variável. Você pode acessar a variável (ou seja, a variável é visível) de todos os métodos da classe, independentemente de terem sido declarados antes ou depois dela. Uma nova variável é criada para cada objeto. Ela é independente de outros objetos. Você não pode acessar uma variável de instância de métodos estáticos . "

"Se uma variável é declarada como estática, ou seja, marcada com a palavra-chave static , ela existe enquanto sua classe existir. A JVM geralmente carrega uma classe na memória em seu primeiro uso. Isso também é quando as variáveis ​​estáticas são inicializadas."

Mais sobre escopo variável - 1

"O exemplo acima declara a classe Cat, que possui quatro variáveis: a, b, s (variáveis ​​não estáticas) e count (uma variável estática). Se criarmos vários objetos dessa classe (digamos, três), cada um deles eles conterão suas próprias instâncias das variáveis ​​não estáticas da classe. Uma variável estática é compartilhada por todos os objetos de uma classe. Tecnicamente falando, ela nem mesmo está dentro desses objetos, já que existia antes mesmo de qualquer objeto Cat ser criado."

"Aqui está o que acontece se declararmos variável sestática:"

Mais sobre escopo variável - 2

"OK. Acho que entendi."

"Você pode declarar variáveis ​​com o mesmo nome?"

"Não dentro de um método. Todas as variáveis ​​declaradas dentro de um método devem ter nomes exclusivos. Os argumentos de um método também são considerados variáveis ​​locais."

"E as variáveis ​​de membros?"

"As variáveis ​​de membro também devem ser exclusivas para cada classe."

"Mas há uma exceção: os nomes das variáveis ​​locais e variáveis ​​de membro podem ser idênticos. "

"Se alterarmos tal variável, qual das duas variáveis ​​com nomes idênticos será alterada?"

"Se houver várias variáveis ​​visíveis (acessíveis) em nosso código - digamos, uma variável de instância e uma variável local - a variável local será acessada."

Exemplo com duas variáveis ​​de contagem
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"Este código declara duas variáveis ​​de contagem. A linha 3 declara uma variável de instância e a linha 8 – uma variável local ."

"Aqui está o que acontece quando o método run é executado:"

"Na linha 7, acessamos a variável de instância e atribuímos o valor 15 a ela"

"Na linha 8, declaramos (criamos) uma nova variável local : count. Ela mascara a variável de instância. A variável local é o que todos os códigos subsequentes no método verão (acessar)."

"Entendi."

"A variável local mascara a variável de instância. Em outras palavras, a variável local é aquela a ser acessada. No entanto, você também pode acessar a variável de instância. É apenas um pouco mais complicado fazer isso."

Variável estática (classe)
ClassName.variableName

// Here are some examples:
Cat.catsCount
Variável não estática (instância)
this.variableName

// Here are some examples:
this.catsCount

"O que mais você pode me dizer sobre métodos estáticos e variáveis ​​estáticas?"

"Métodos e variáveis ​​estáticos não estão ligados a objetos da classe, eles estão ligados à própria classe. Se criarmos dez objetos Variables (veja o exemplo no início deste nível), teremos dez variáveis ​​instanceVariable (uma para cada objeto) e apenas uma variável compartilhada (estática) TEXT ."

"Eu tenho uma pergunta."

"Qual é a diferença entre métodos estáticos e não estáticos?"

"Vamos dar uma olhada em como um método não estático funciona:"

Como é o código
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
O que realmente acontece
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"Quando você chama um método usando <object> dot <method name> , na verdade você está chamando um método de classe e passando o mesmo objeto como o primeiro argumento. Dentro do método, o objeto é chamado 'this' . Todas as operações no método são executados neste objeto e seus dados."

"Uau! Então é assim que tudo funciona!"

"E é assim que um método estático funciona."

Como é o código
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
O que realmente acontece
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"Quando você chama um método estático, nenhum objeto é passado para ele. Em outras palavras, 'this' é igual a null . É por isso que um método estático não pode acessar variáveis ​​e métodos não estáticos (já que não tem 'this' para passar a esses métodos)."

"Hmmm. Acho que entendi. Pelo menos um pouco."

"E aí vem o tio Diego... e suas tarefas."