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.
- 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 caixa | Nome técnico | Exemplo |
|---|---|---|
| O formato (o que cabe dentro) | tipo | int (número inteiro), String (texto) |
| A etiqueta | nome (ou identificador) | idade, nome |
| O que está guardado agora | valor | 29, "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.
| Tipo | Guarda | Exemplos de valor | Aula |
|---|---|---|---|
int | Números inteiros (sem vírgula) | 29, -5, 0 | int, long, short, byte |
double | Números com parte decimal (com ponto, não vírgula) | 1.65, 9.90 | double e float |
String | Texto, 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.
= 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);
}
}
| Linha | O 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:
- Calcula
pontos + 5usando o valor atual:25 + 5dá30. - Guarda o
30na caixapontos, no lugar do25.
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?
| Forma | Exemplo | Quando usar |
|---|---|---|
| Declarar e atribuir junto | int idade = 29; | Quase sempre. Você já sabe o valor inicial. |
| Declarar e atribuir depois | int idade; … idade = 29; | O valor só será conhecido mais adiante (depois de um if, por exemplo). |
| Várias numa linha | int 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 cadeia | x = 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:
nota2vale,2notanão. - Não pode ter espaço nem hífen:
nota finalenota-finalnã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,NotaeNOTAsã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ção | Bom | Evite |
|---|---|---|
| camelCase: começa minúscula; cada palavra nova começa maiúscula (as "corcovas do camelo") | notaFinal, precoComDesconto | NotaFinal, nota_final, notafinal |
| Nome que diz o que guarda | idade, totalDeMacas | x, n1, coisa |
Sem $ e sem _ no começo | nota | $nota, _nota |
Sem acentos e sem ç (por segurança, em equipes e arquivos com codificação diferente) | media, preco | mé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
| Linha | Saída | Por quê |
|---|---|---|
println("Idade: " + idade) | Idade: 29 | O 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") | nome | Com aspas é texto, não variável. |
"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).
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.
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;.
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.
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.
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.
$ 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
| Forma | Nome | Exemplo |
|---|---|---|
tipo nome; | Declaração | int idade; |
nome = valor; | Atribuição | idade = 29; |
tipo nome = valor; | Declaração com inicialização | String nome = "Ana"; |
nome = nome + n; | Usar o valor atual para calcular o novo | pontos = pontos + 5; |
tipo a = 1, b = 2; | Várias do mesmo tipo | int macas = 3, peras = 5; |
a = b = valor; | Atribuição em cadeia | x = y = 0; |
"texto" + variavel | Concatenação (imprimir junto) | "Idade: " + idade |
var nome = valor; | Tipo descoberto pelo Java | Veja var |
final tipo NOME = valor; | Variável que não muda | Veja Constantes |
Exercícios
1. Declarar e inicializar
Complete para criar uma variável inteira quantidade com o valor 12:
2. Texto
Complete para guardar o texto Manga na variável 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:
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:camelCasedescritivo. - Para mostrar uma variável no meio de um texto:
"Idade: " + idade.