"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."
"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 s
estática:"
"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."
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)
|
Variável não estática (instância)
|
"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
|
O que realmente acontece
|
"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
|
O que realmente acontece
|
"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."
GO TO FULL VERSION