Java Variáveis

Um programa precisa guardar coisas enquanto trabalha: o nome de uma cliente, a nota de uma prova, quantas maçãs sobraram na loja. Em Java, cada coisa guardada fica numa variável. Nesta aula você vai criar suas primeiras variáveis, mudar o valor delas, dar bons nomes e imprimi-las na tela.

Você vai aprender
  • O que é uma variável: uma caixa com etiqueta (o nome) e tipo (o que cabe nela).
  • Como declarar, atribuir e fazer as duas coisas na mesma linha.
  • Como mudar o valor de uma variável e criar várias de uma vez.
  • Quais nomes o Java aceita e quais nomes os programadores Java esperam ver.
  • Os erros mais comuns: usar antes de dar valor, criar duas vezes, errar o nome.

Todos os programas desta aula foram compilados e executados com o JDK 25 na máquina fictícia da Ana (usuária ana, computador notebook), na pasta ~/java. Se você ainda não sabe compilar, veja antes javac e java.


A ideia: uma caixa com etiqueta

Pense numa mudança de casa. Você guarda as coisas em caixas e escreve uma etiqueta em cada uma: "LIVROS", "PANELAS". Depois, quando quer as panelas, não precisa abrir todas as caixas: procura pela etiqueta.

Uma variável é isso: um espaço na memória do computador com uma etiqueta. Mas o Java acrescenta uma regra que muitas linguagens não têm: cada caixa tem um formato. Uma caixa feita para números inteiros não aceita texto; uma caixa feita para texto não aceita um número solto. Esse formato se chama tipo.

Parte da caixaNome técnicoExemplo
O formato (o que cabe dentro)tipoint (número inteiro), String (texto)
A etiquetanome (ou identificador)idade, nome
O que está guardado agoravalor29, "Ana"

O tipo nunca muda: uma caixa de inteiros é de inteiros para sempre. O valor pode mudar quantas vezes você quiser (por isso o nome "variável": o que está dentro varia).

Nesta aula vamos usar só três tipos, para não misturar assuntos. Os outros vêm nas próximas aulas.

TipoGuardaExemplos de valorAula
intNúmeros inteiros (sem vírgula)29, -5, 0int, long, short, byte
doubleNúmeros com parte decimal (com ponto, não vírgula)1.65, 9.90double e float
StringTexto, sempre entre aspas duplas"Ana", "maçã"Strings

int vem de integer ("inteiro"). String quer dizer "cordão, sequência": um texto é uma sequência de letras. Repare que String começa com letra maiúscula e int não; a explicação está em Tipos Primitivos.


1. Declarar: criar a caixa

Declarar uma variável é avisar ao Java: "quero uma caixa deste tipo, com esta etiqueta". Escreve-se o tipo, um espaço, o nome e um ponto e vírgula:

int idade;
int
O tipo: esta caixa guarda um número inteiro.
idade
O nome da variável, que você escolhe.
;
Termina a instrução, como o ponto final de uma frase (veja Sintaxe e Estrutura).

Depois dessa linha a caixa existe, mas ainda está vazia: nenhum valor foi colocado nela. Daqui a pouco você vai ver que o Java não deixa usar uma caixa vazia.

2. Atribuir: colocar um valor

Atribuir é colocar um valor na caixa. Usa-se o sinal =:

idade = 29;
idade
A caixa que vai receber o valor (sem o tipo: ela já foi declarada).
=
O operador de atribuição: "guarde o que está à direita na caixa da esquerda".
29
O valor guardado.
;
Fim da instrução.
Em Java, = não é "igual"

Na matemática, idade = 29 afirma que os dois lados são iguais. Em Java, é uma ordem: "pegue o 29 e guarde em idade". Leia sempre como "idade recebe 29". Para perguntar se dois valores são iguais, o Java usa == (dois sinais), assunto de Operadores de Comparação.

3. Declarar e atribuir na mesma linha

É o jeito mais comum: criar a caixa e já colocar o valor. O nome técnico é inicializar a variável (dar o valor inicial).

String nome = "Ana";
String
O tipo: texto.
nome
O nome da variável.
=
Recebe.
"Ana"
O valor. Texto em Java vai sempre entre aspas duplas; as aspas não fazem parte do valor.
;
Fim da instrução.

Agora as três coisas juntas num programa completo. As variáveis ficam dentro do main, entre as chaves, porque é ali que o programa começa (veja Olá, Mundo):

public class Main {
    public static void main(String[] args) {
        int idade;
        idade = 29;
        String nome = "Ana";
        System.out.println(nome);
        System.out.println(idade);
    }
}
LinhaO que faz
int idade;Declara uma caixa de inteiros chamada idade. Ainda vazia.
idade = 29;Guarda 29 na caixa idade.
String nome = "Ana";Declara e inicializa: cria a caixa de texto nome já com "Ana".
System.out.println(nome);Mostra na tela o valor de nome.
System.out.println(idade);Mostra o valor de idade.
$ javac Main.java && java Main
Ana
29

O println não mostrou a palavra "nome": mostrou o que está dentro da caixa nome. Quando você escreve o nome de uma variável sem aspas, o Java vai buscar o valor dela. Com aspas, seria só o texto: System.out.println("nome"); mostra nome.

Brinque com o código: troque "Ana" pelo seu nome e 29 pela sua idade. Depois apague a linha idade = 29; e rode de novo para ver o que o Java diz.

public class Main {
    public static void main(String[] args) {
        int idade;
        idade = 29;
        String nome = "Ana";
        System.out.println(nome);
        System.out.println(idade);
    }
}

4. Mudar o valor

Uma variável guarda um valor por vez. Quando você atribui de novo, o valor antigo é jogado fora e o novo ocupa o lugar. Repare que, para mudar, não se repete o tipo: a caixa já existe.

public class Main {
    public static void main(String[] args) {
        int pontos = 10;
        System.out.println(pontos);
        pontos = 25;
        System.out.println(pontos);
        pontos = pontos + 5;
        System.out.println(pontos);
    }
}
$ javac Main.java && java Main
10
25
30

A última atribuição, pontos = pontos + 5;, assusta quem vem da matemática ("pontos igual a pontos mais cinco?"). Lembre que = é "recebe" e que o Java faz primeiro o lado direito:

  1. Calcula pontos + 5 usando o valor atual: 25 + 5 dá 30.
  2. Guarda o 30 na caixa pontos, no lugar do 25.

Esse "pegar o valor atual e somar" é tão comum que existe um atalho, pontos += 5;, explicado em Operadores de Atribuição.

Copiar o valor de uma variável para outra

Do lado direito do = pode vir outra variável. O Java copia o valor; as duas caixas continuam independentes:

int notaAna = 8;
int notaBruno = notaAna;   // notaBruno recebe uma cópia do 8
notaAna = 10;              // muda só a da Ana
// agora: notaAna vale 10 e notaBruno continua 8

As linhas que começam com // são comentários: o Java as ignora; servem para explicar o código a quem lê.


5. Várias variáveis na mesma linha

Quando várias variáveis têm o mesmo tipo, dá para declará-las numa linha só, separadas por vírgula:

public class Main {
    public static void main(String[] args) {
        int macas = 3, peras = 5, uvas = 12;
        System.out.println(macas);
        System.out.println(peras);
        System.out.println(uvas);
        int x, y, z;
        x = y = z = 0;
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
    }
}
$ javac Main.java && java Main
3
5
12
0
0
0
int
O tipo vale para todas as variáveis da linha.
macas = 3,
Primeira variável, já com valor. A vírgula separa da próxima.
peras = 5,
Segunda.
uvas = 12;
Terceira; o ; encerra a linha.

A linha x = y = z = 0; é uma atribuição em cadeia: o Java resolve da direita para a esquerda (z recebe 0, depois y recebe o valor de z, depois x). Funciona, mas use com moderação.

Qual forma usar?

FormaExemploQuando usar
Declarar e atribuir juntoint idade = 29;Quase sempre. Você já sabe o valor inicial.
Declarar e atribuir depoisint idade; … idade = 29;O valor só será conhecido mais adiante (depois de um if, por exemplo).
Várias numa linhaint a = 1, b = 2;Poucas variáveis do mesmo tipo, muito relacionadas (x, y). Em geral, uma por linha é mais fácil de ler.
Atribuição em cadeiax = y = 0;Raramente: zerar várias de uma vez.

6. Nomes de variáveis

O nome é a etiqueta da caixa. O Java tem regras (se você quebrar, não compila) e a comunidade tem convenções (se você quebrar, compila, mas o código fica com cara de amador).

Regras (obrigatórias)

  • Pode ter letras, dígitos, _ (sublinhado) e $.
  • Não pode começar com dígito: nota2 vale, 2nota não.
  • Não pode ter espaço nem hífen: nota final e nota-final não valem.
  • Não pode ser uma palavra reservada do Java: class, int, public, new… (lista em Palavras-chave).
  • Maiúsculas e minúsculas são diferentes: nota, Nota e NOTA são três variáveis distintas.

Este programa compila: todos os nomes seguem as regras (inclusive o acento de médiaDaTurma, porque o Java aceita letras de qualquer idioma).

public class Main {
    public static void main(String[] args) {
        int nota = 7;
        int Nota = 9;
        int notaFinal = 8;
        int _nota = 5;
        int $nota = 6;
        int nota2 = 10;
        int médiaDaTurma = 7;
        System.out.println(nota + " " + Nota + " " + notaFinal + " " + _nota + " " + $nota + " " + nota2 + " " + médiaDaTurma);
    }
}
$ javac Main.java && java Main
7 9 8 5 6 10 7

Compilar, compila. Mas só nota, notaFinal e nota2 seguem as convenções abaixo; os outros nomes confundem quem lê.

Convenções (o que todo programador Java espera)

ConvençãoBomEvite
camelCase: começa minúscula; cada palavra nova começa maiúscula (as "corcovas do camelo")notaFinal, precoComDescontoNotaFinal, nota_final, notafinal
Nome que diz o que guardaidade, totalDeMacasx, n1, coisa
Sem $ e sem _ no começonota$nota, _nota
Sem acentos e sem ç (por segurança, em equipes e arquivos com codificação diferente)media, precomédia, preço

Nomes curtos como i, x e y são aceitos quando o sentido é óbvio: o contador de um for ou coordenadas de um ponto. Constantes têm outra convenção (TAXA_DE_JUROS), vista em Constantes.

Missão: este código tem um nome inválido e não compila. Clique em Rodar, leia o erro e corrija o nome seguindo a convenção camelCase.

public class Main {
    public static void main(String[] args) {
        String fruta-preferida = "Laranja";
        System.out.println(fruta-preferida);
    }
}
public class Main {
    public static void main(String[] args) {
        String frutaPreferida = "Laranja";
        System.out.println(frutaPreferida);
    }
}

7. Imprimir variáveis

Você já usou System.out.println(variavel). Quase sempre, porém, queremos o valor no meio de um texto. Para isso, o + entre um texto e uma variável cola os dois (isso se chama concatenação, com aula própria em Concatenação):

public class Main {
    public static void main(String[] args) {
        String nome = "Ana";
        int idade = 29;
        double altura = 1.65;
        System.out.println(nome);
        System.out.println("Idade: " + idade);
        System.out.println(nome + " tem " + idade + " anos e " + altura + " m de altura.");
        System.out.print("Sem pular linha... ");
        System.out.println(idade);
        System.out.println("nome");
    }
}
$ javac Main.java && java Main
Ana
Idade: 29
Ana tem 29 anos e 1.65 m de altura.
Sem pular linha... 29
nome
LinhaSaídaPor quê
println("Idade: " + idade)Idade: 29O texto "Idade: " (com o espaço no fim) foi colado ao valor 29.
println(nome + " tem " + idade + …)Ana tem 29 anos e 1.65 m de altura.Vários pedaços colados. Os espaços vêm de dentro das aspas: " tem ".
print("Sem pular linha... ")(nada pula)print não pula linha; o println seguinte continua na mesma linha. Veja Saída: print e println.
println("nome")nomeCom aspas é texto, não variável.
Esqueceu o espaço?

"Idade:" + idade mostra Idade:29, tudo grudado. O + cola exatamente o que está nas aspas; os espaços são responsabilidade sua.


Quando dá errado

Os erros abaixo são os mais comuns com variáveis. Em todos, o javac recusa o programa e nada é executado. A mensagem vem em inglês e segue o mesmo formato: arquivo:linha: error: descrição, a linha com problema e um ^ apontando o lugar (veja Lendo Erros do javac).

"variable saldo might not have been initialized"
public class Main {
    public static void main(String[] args) {
        int saldo;
        System.out.println(saldo);
    }
}
$ javac Main.java
Main.java:4: error: variable saldo might not have been initialized
        System.out.println(saldo);
                           ^
1 error

O que quer dizer: "a variável saldo pode não ter sido inicializada". A caixa foi criada (linha 3), mas nada foi guardado nela antes de você tentar ler o valor (linha 4). Algumas linguagens usam um valor qualquer; o Java prefere recusar, porque usar um valor que você nunca definiu é sempre um erro de lógica.

Como consertar: dê um valor antes de usar: int saldo = 0;, ou atribua saldo = 150; antes do println.

"variable idade is already defined in method main(String[])"
public class Main {
    public static void main(String[] args) {
        int idade = 29;
        int idade = 30;
        System.out.println(idade);
    }
}
$ javac Main.java
Main.java:4: error: variable idade is already defined in method main(String[])
        int idade = 30;
            ^
1 error

O que quer dizer: "a variável idade já está definida no método main". Escrever o tipo na frente (int idade) é criar uma caixa nova, e já existe uma caixa com essa etiqueta no mesmo lugar.

Como consertar: se a ideia era mudar o valor, tire o tipo: idade = 30;. Se era outra informação, use outro nome: int idadeDoBruno = 30;.

"cannot find symbol" (nome digitado diferente)
public class Main {
    public static void main(String[] args) {
        int idade = 29;
        System.out.println(Idade);
    }
}
$ javac Main.java
Main.java:4: error: cannot find symbol
        System.out.println(Idade);
                           ^
  symbol:   variable Idade
  location: class Main
1 error

O que quer dizer: "não encontrei o símbolo". symbol: variable Idade diz o que ele procurou; location: class Main, onde. A variável se chama idade (minúscula); Idade é outro nome, que não existe.

Como consertar: escreva o nome exatamente como na declaração, com as mesmas maiúsculas e minúsculas. O mesmo erro aparece se você usar uma variável antes da linha que a declara.

Nome começando com dígito: "not a statement" e "';' expected"
public class Main {
    public static void main(String[] args) {
        int 2nota = 7;
    }
}
$ javac Main.java
Main.java:3: error: not a statement
        int 2nota = 7;
        ^
Main.java:3: error: ';' expected
        int 2nota = 7;
           ^
2 errors

O que quer dizer: ao ver um dígito, o Java acha que começou um número, não um nome, e se perde. Por isso as mensagens não falam em "nome inválido". Com hífen (int nota-final = 7;) a confusão é parecida: error: ';' expected apontando para o -, que ele leu como um sinal de menos. Com uma palavra reservada (int class = 7;) aparecem três erros, entre eles <identifier> expected ("esperava um nome").

Como consertar: quando o erro aponta para o nome de uma variável que você acabou de criar, confira as regras de nome: nota2, notaFinal, classe.

"incompatible types: String cannot be converted to int"
public class Main {
    public static void main(String[] args) {
        int idade = "vinte e nove";
    }
}
$ javac Main.java
Main.java:3: error: incompatible types: String cannot be converted to int
        int idade = "vinte e nove";
                    ^
1 error

O que quer dizer: "tipos incompatíveis: String não pode ser convertido em int". A caixa é de inteiros e você tentou guardar um texto. É o tipo protegendo você. O mesmo acontece com int idade = "29";: com aspas, "29" é texto, não número.

Como consertar: guarde um valor do tipo certo (int idade = 29;) ou mude o tipo da variável. Para transformar o texto "29" no número 29, veja Conversão de Tipos.

Esqueceu o ponto e vírgula: "';' expected"
$ javac Main.java
Main.java:3: error: ';' expected
        int idade = 29
                      ^
1 error

O que quer dizer: o ^ aponta para o fim da linha 3, onde faltou o ;. Toda declaração e toda atribuição terminam com ponto e vírgula.

Missão (provoque o erro): mude o programa para que o javac reclame might not have been initialized. Dica: deixe a variável estoque declarada, mas sem valor.

public class Main {
    public static void main(String[] args) {
        int estoque = 40;
        System.out.println("Estoque: " + estoque);
    }
}
public class Main {
    public static void main(String[] args) {
        int estoque;
        System.out.println("Estoque: " + estoque);
    }
}

Referência

FormaNomeExemplo
tipo nome;Declaraçãoint idade;
nome = valor;Atribuiçãoidade = 29;
tipo nome = valor;Declaração com inicializaçãoString nome = "Ana";
nome = nome + n;Usar o valor atual para calcular o novopontos = pontos + 5;
tipo a = 1, b = 2;Várias do mesmo tipoint macas = 3, peras = 5;
a = b = valor;Atribuição em cadeiax = y = 0;
"texto" + variavelConcatenação (imprimir junto)"Idade: " + idade
var nome = valor;Tipo descoberto pelo JavaVeja var
final tipo NOME = valor;Variável que não mudaVeja Constantes

Exercícios

1. Declarar e inicializar

Complete para criar uma variável inteira quantidade com o valor 12:

quantidade = 12;

2. Texto

Complete para guardar o texto Manga na variável fruta:

String fruta = ;

3. Mudar o valor

A variável int saldo = 100; já existe. Complete a linha que muda o valor para 80 (sem criar outra variável):

4. Imprimir com texto

Com int idade = 29;, complete para a tela mostrar Tenho 29 anos:

System.out.println("Tenho " idade + " anos");

5. Qual destes nomes de variável não compila?

6. Depois de int a = 5; a = a + 3; a = 2;, quanto vale a?

7. O javac mostrou variable total is already defined in method main(String[]). O que você fez?

8. Com String nome = "Ana";, o que System.out.println("nome"); mostra?

Missão final: crie as variáveis String nome com "Ana", int quantidade com 12 e double total com 30.0, e use-as num único println para mostrar exatamente: Ana comprou 12 mangas por 30.0 reais

public class Main {
    public static void main(String[] args) {
        // crie as três variáveis aqui

        // e mostre a frase aqui
    }
}
public class Main {
    public static void main(String[] args) {
        String nome = "Ana";
        int quantidade = 12;
        double total = 30.0;
        System.out.println(nome + " comprou " + quantidade + " mangas por " + total + " reais");
    }
}

Resumo

  • Variável = caixa com tipo (o que cabe), nome (a etiqueta) e valor (o que está dentro agora).
  • Declarar: int idade;. Atribuir: idade = 29;. Os dois juntos: int idade = 29;.
  • = quer dizer "recebe". O lado direito é calculado primeiro: pontos = pontos + 5;.
  • Para mudar o valor, não repita o tipo; repetir cria outra variável e dá already defined.
  • Usar antes de dar valor dá might not have been initialized; errar o nome dá cannot find symbol.
  • Nomes: letras, dígitos, _ e $, sem começar com dígito, sem espaço, sem palavra reservada. Convenção: camelCase descritivo.
  • Para mostrar uma variável no meio de um texto: "Idade: " + idade.