1. Constantes

Muitas outras linguagens de programação possuem constantes , ou seja, variáveis ​​cujos valores não podem ser alterados . Normalmente, 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 transformar qualquer variável em uma constante, se decidir que isso é necessário.

Então, como você declara uma variável imutável (constante) em Java? Existe uma palavra-chave especial para isso: 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;

Se você tentar atribuir um valor diferente a uma finalvariável, seu programa simplesmente não será compilado.

Uma finalvariável deve ser inicializada (um valor deve ser atribuído a ela) quando é declarada. Há uma exceção a essa regra: você pode mover a inicialização de uma variável de classe estática para um construtor. Mas você aprenderá sobre isso no Nível 10 .

Para reduzir o número de palavras-chave, os desenvolvedores Java usam a palavra finalpara mais do que apenas declarar constantes. finaltambém pode se aplicar a métodos e até classes. Os métodos declarados como finalnão podem ser substituídos e uma classe declarada como finalnão pode ser herdada.

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.

Observe que finalantes de um nome de variável é apenas uma proteção contra quaisquer alterações nessa variável . Se uma variável armazena uma referência a um objeto, o objeto ainda pode ser alterado.

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.

Constantes globais

Se você decidir declarar constantes globais em seu programa, precisará criar variáveis ​​de classe estáticas e torná-las publicand final. Existe um estilo especial para os nomes dessas variáveis: elas são escritas em letras maiúsculas, com um caractere de sublinhado usado para separar as palavras.

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;
}


2. Sombreamento variável

Como dissemos antes, você não pode criar várias variáveis ​​locais com o mesmo nome no mesmo método. Em diferentes métodos, você pode.

Mas aqui está o que você provavelmente não sabe: variáveis ​​de instância e variáveis ​​de método local 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
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, ele sombreia (ou mascara ) a sumvariável de instância.

Ok, você diz, isso é de se esperar em algum sentido. Mas isso não é o fim da história. Acontece que se uma variável de instância for 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 thispalavra-chave antes de seu nome:

this.name

Aqui está um exemplo onde 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.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 sum estão disponíveis em qualquer lugar com ou sem a thispalavra-chave. Nas linhas em que a sum variável local acompanha a sumvariável de instância, a sum variável de instância só pode ser acessada usando a thispalavra-chave.

Se uma variável de classe estática em vez de uma variável de instância estiver sombreada, você precisará acessá-la por meio do nome da classe em vez da thispalavra-chave:

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

Você pode acessar as variáveis count ​​e sum está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 à sum variável de instância só é possível usando Solutioncomo prefixo.



3. 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 — dentro de um forloop .

Você deve se lembrar que um forloop normalmente tem uma variável de contador 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?

A resposta correta é: uma variável declarada no cabeçalho de um forloop é visível apenas no corpo do loop e no cabeçalho do forloop .

Exemplo:

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

Portanto, você sempre pode escrever loops um após o outro em seu código e usar variáveis ​​de contador com o mesmo nome — isso não criará nenhum problema.

Exemplo:

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