Constantes

"Amigo, você sabia que em Java nem todas as variáveis ​​podem ser alteradas?"

"Que tal, Kim? Na verdade, a própria palavra 'variável' fala de mudança."

"Não há dúvida disso. Como muitas outras linguagens de programação, Java possui constantes , ou seja, variáveis ​​cujos valores não podem ser alterados . E a própria palavra 'constante' fala de constância."

"E para que servem?"

"Geralmente, eles são usados ​​para algum tipo de coisa fundamental, como o número Piou o número de dias nos meses do ano. Dito isso, em princípio, um programador pode tornar qualquer variável uma constante, se ele decidir fazer isso assim é necessário."

"Você quer dizer como um nome, a cor de um carro ou o nome de um dia da semana?"

"Você tem a ideia certa. Qualquer coisa que não deva ser mudada."

"E como são essas constantes em Java?"

"Java tem uma palavra-chave especial para eles: final. Criar uma variável imutável parece o mesmo que criar uma comum. A única diferença é que antes do tipo da variável você precisa escrever a palavra final, assim:

final Type name = value;

"O que acontece se você criar uma constante e depois tentar atribuir um valor diferente a ela?"

"Essa é a pergunta certa a se fazer! E a resposta certa é esta: se você tentar atribuir um valor diferente a uma finalvariável, seu programa simplesmente não compilará."

"E se você declarar uma finalvariável, mas não atribuir um valor a ela?"

"Não adianta fazer isso, então também não é permitido em Java. Uma finalvariável deve ser inicializada quando for declarada, ou seja, você deve atribuir um valor a ela. Há uma exceção a essa regra: você pode mover a inicialização de uma variável de classe estática em um construtor, mas você aprenderá sobre isso mais tarde.

"Dito isso, nem tudo o que existe finalé uma constante. Para reduzir o número de palavras-chave, os desenvolvedores Java usam a palavra para finalmais do que apenas declarar constantes . declarado como não pode ser herdado."finalfinalfinal

"Uh... Substituído? Herdado? Que idioma você está falando agora?"

"A linguagem da programação orientada a objetos. Você aprenderá muito em breve. Até então, apenas aproveite a bela terminologia."

"Ok. Então, finalpode ser colocado antes de variáveis, classes e métodos, e essa palavra-chave os torna imutáveis ​​em algum sentido?"

"Sim. Além disso, o finalmodificador pode ser adicionado antes de quaisquer variáveis: variáveis ​​locais, parâmetros de método, campos de classe e variáveis ​​de classe estáticas.

"Aqui está o importante a lembrar: finalantes de um nome de variável, é apenas uma proteção contra qualquer alteração nessa variável . Se uma variável armazena uma referência a um objeto, o objeto ainda pode ser alterado."

"Eu não entendo muito bem."

"Você vai entender muito em breve. Aqui está um exemplo:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Criamos uma matriz.

Isso não é permitido: a datavariável é declarada como final.

Mas você pode fazer isso.
E também isso.

"Entendi. Isso é complicado."

Constantes globais

"O que você acha que são as constantes globais?"

"Eu acho que constantes globais são provavelmente como variáveis ​​globais, apenas constantes?"

"Exatamente. Se você precisar declarar constantes globais em seu programa, crie variáveis ​​de classe estáticas e torne-as publice final. Há um estilo especial para os nomes de tais variáveis: elas são escritas em letras maiúsculas, com um caractere de sublinhado usado para palavras separadas.

Exemplos:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}

sombreamento variável

"Como eu disse antes, você não pode criar múltiplas variáveis ​​locais com os mesmos nomes em um único método. Em métodos diferentes, você pode."

"Eu sei que!"

"Mas o que você provavelmente não sabe é que variáveis ​​em uma classe e variáveis ​​locais em um método podem ter o mesmo nome.

Exemplo:

Código Visibilidade variável
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}

count, sum
count, sum
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

"No addmétodo, declaramos uma variável local chamada sum. Até o final do método, ela sombreia (ou mascara ) a sumvariável de instância."

"Hmm... eu diria que, de certa forma, esse é o comportamento esperado."

"Mas isso não é o fim da história. Acontece que se uma variável de instância é sombreada por uma variável local, ainda há uma maneira de se referir à variável de instância dentro do método. Fazemos isso escrevendo a palavra-chave antes de seu thisnome :

this.name

"Aqui está um exemplo em que o conflito de nomes foi resolvido com sucesso:

Código Visibilidade variável
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}

this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

As variáveis count​​e sumestão disponíveis em qualquer lugar com ou sem a thispalavra-chave. Nas linhas em que a sumvariável local acompanha a sumvariável de instância, a sumvariável de instância só pode ser acessada usando a thispalavra-chave.

"Obviamente, vou precisar praticar isso."

"Você vai conseguir."

"E se uma variável de classe estática estiver sombreada em vez de apenas uma variável de instância (não estática)? Você não pode acessá-la por meio de this?"

"Você está certo. A palavra-chave this não funcionará. Você precisa se referir a ela por meio do nome da classe:

ClassName.name

Exemplo:

Código Visibilidade variável
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

"Atenção: você pode acessar as variáveis count​​e sumestáticas em qualquer lugar com ou sem usar o nome da classe Solutioncomo prefixo. Nas linhas em que a sumvariável local acompanha a sumvariável de instância, o acesso à sumvariável de classe só é possível usando Solutioncomo prefixo.

Variáveis ​​dentro de um forloop

"E mais um fato pequeno, mas interessante. Há também um lugar onde uma variável é declarada de uma maneira especial — estou falando dentro de um forloop ." Normalmente, um forloop tem uma countervariável entre parênteses. E qual será a visibilidade dessa variável? Afinal, não está no corpo do loop. É todo o método? Ou não?"

"Já ouvi algo sobre isso. Pelo que entendi, uma variável declarada no cabeçalho de um forloop é visível apenas no corpo do loop e no cabeçalho do forloop ."

"Muito bem, Amigo. Mas ainda assim, dê uma olhada em um exemplo para reforçar este material:

Código Visibilidade variável
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

"Então você está dizendo que no meu código eu poderia escrever vários loops um após o outro com uma variável de contador com o mesmo nome e não haverá problemas?"

"Não haveria problemas. Aqui, veja:

Código Visibilidade variável
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i--)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a