Java Palavras-chave
Palavras-chave são as palavras que o Java usa na própria gramática: class, if, return… Você não pode usá-las como nome de variável, método ou classe. Esta página lista todas as do Java 25, agrupadas pelo assunto, com o que cada uma faz, um exemplo curto e a aula onde ela é explicada.
- As 51 palavras reservadas (50 palavras e o
_), por assunto. - As 17 palavras contextuais (
var,record,sealed,yield,when…), que só são especiais em certos lugares. true,falseenull, que não são palavras-chave, mas também são proibidas como nomes.- O que o
javacdiz quando você usa uma palavra-chave como nome.
Dois tipos de palavra-chave
Desde o Java 17, a especificação da linguagem separa as palavras-chave em dois grupos:
| Tipo | Regra | Exemplo |
|---|---|---|
| Reservada | Proibida como nome em qualquer lugar. | int class = 3; não compila. |
| Contextual | Especial só em certas posições; no resto, é um nome comum. Assim o Java ganhou palavras novas (var, record…) sem quebrar programas antigos que já usavam esses nomes. | int record = 16; compila; record Ponto(int x, int y) {} declara um record. |
Prova no laboratório: todas estas variáveis têm nome de palavra contextual, e o programa compila e roda.
public class Main {
public static void main(String[] args) {
String var = "var é contextual";
int record = 16;
int yield = 14;
int when = 21;
int sealed = 17;
var permits = "também";
System.out.println(var + " " + record + " " + yield + " " + when + " " + sealed + " " + permits);
}
}
$ java Main.java var é contextual 16 14 21 17 também
Poder, pode. Mas não faça: um leitor vai estranhar uma variável chamada var.
Palavras reservadas
São 51: 50 palavras e o _. Todas em minúsculas: Class e INT não são palavras-chave (o Java diferencia maiúsculas de minúsculas).
Tipos primitivos e void
| Palavra | O que faz | Exemplo | Aula |
|---|---|---|---|
boolean | Tipo lógico: true ou false. | boolean aprovado = nota >= 7; | char e boolean |
byte | Inteiro de 8 bits (-128 a 127). | byte b = 100; | Inteiros |
short | Inteiro de 16 bits (-32.768 a 32.767). | short s = 3000; | Inteiros |
int | Inteiro de 32 bits, o mais usado (cerca de ±2,1 bilhões). | int idade = 29; | Inteiros |
long | Inteiro de 64 bits. Literal com L no fim. | long populacao = 8_000_000_000L; | Inteiros |
float | Decimal de 32 bits. Literal com f. | float f = 1.5f; | double e float |
double | Decimal de 64 bits, o padrão para números com vírgula. | double preco = 9.90; | double e float |
char | Um caractere Unicode (16 bits), entre aspas simples. | char letra = 'A'; | char e boolean |
void | "Vazio": o método não devolve nada. | void mostrar() { … } | Métodos |
Decisões e repetições
| Palavra | O que faz | Exemplo | Aula |
|---|---|---|---|
if | Executa um bloco se a condição for verdadeira. | if (nota >= 7) { … } | if, else |
else | O caminho do "senão". | } else { … } | if, else |
switch | Escolhe entre vários casos pelo valor. | switch (dia) { … } | switch |
case | Um caso do switch. | case 1 -> "domingo"; | switch com setas |
default | O caso "qualquer outro" do switch. Também marca métodos com corpo numa interface. | default -> "inválido"; | switch, Interfaces |
while | Repete enquanto a condição for verdadeira. | while (x < 10) { x++; } | while |
do | Começa um do-while: roda pelo menos uma vez. | do { … } while (resp.equals("s")); | while e do-while |
for | Laço com contador, ou o for-each. | for (int i = 0; i < 5; i++) | for, for-each |
break | Sai do laço ou do switch antigo. | if (achou) break; | break e continue |
continue | Pula para a próxima volta do laço. | if (i % 2 == 0) continue; | break e continue |
return | Sai do método, devolvendo um valor (ou nada, em void). | return a + b; | Valores de Retorno |
assert | Confere uma condição durante o desenvolvimento; só é verificada com java -ea. | assert idade >= 0 : "idade negativa"; | Depurar |
Classes, objetos e tipos
| Palavra | O que faz | Exemplo | Aula |
|---|---|---|---|
class | Declara uma classe. | public class Conta { … } | Classes e Objetos |
interface | Declara uma interface (um contrato de métodos). | interface Pagavel { … } | Interfaces |
enum | Declara um tipo com uma lista fechada de constantes. Java 5+ | enum Nivel { FACIL, DIFICIL } | Enums |
extends | Herda de uma classe (ou interface estende interface). | class Aluno extends Pessoa | Herança |
implements | Diz que a classe cumpre uma ou mais interfaces. | class Pix implements Pagavel | Interfaces |
new | Cria um objeto (ou array). | new Conta("Ana") | Classes e Objetos |
this | O próprio objeto; também chama outro construtor da mesma classe. | this.nome = nome; | this |
super | A classe mãe: seu construtor ou seus métodos. | super(nome); | super |
instanceof | Testa se um objeto é de um tipo (e, desde o 16, já cria a variável). | if (f instanceof Circulo c) | Pattern Matching |
Modificadores
| Palavra | O que faz | Exemplo | Aula |
|---|---|---|---|
public | Visível de qualquer lugar. | public void depositar(…) | Modificadores de Acesso |
protected | Visível no pacote e nas subclasses. | protected String nome; | Modificadores de Acesso |
private | Visível só dentro da própria classe. | private double saldo; | Modificadores de Acesso |
static | Pertence à classe, não a cada objeto. | static int contador; | static |
final | Não muda mais: variável constante, método que não pode ser sobrescrito, classe que não pode ser herdada. | final double PI = 3.14; | final, Constantes |
abstract | Classe que não pode ser instanciada / método sem corpo, que as filhas implementam. | abstract double area(); | Classes Abstratas |
synchronized | Só uma thread por vez executa o método ou bloco. | synchronized void somar() | synchronized e Locks |
volatile | A variável é sempre lida da memória principal, visível para todas as threads. | volatile boolean parar; | synchronized e Locks |
transient | O atributo é ignorado na serialização (quando o objeto vira bytes). | transient String senha; | — |
native | O método é implementado em outra linguagem (C), fora da JVM. | native int ler(); | — |
strictfp | Obsoleta: desde o Java 17 toda conta de ponto flutuante já é "estrita". Ainda é reservada, mas não faz nada. | strictfp class Calculo | Métodos de Math |
Exceções
| Palavra | O que faz | Exemplo | Aula |
|---|---|---|---|
try | Bloco onde uma exceção pode acontecer; também abre recursos (try-with-resources). | try { … } | try e catch |
catch | Captura e trata uma exceção. | catch (IOException e) { … } | try e catch |
finally | Bloco que roda sempre, com ou sem exceção. | finally { fechar(); } | finally |
throw | Lança uma exceção agora. | throw new IllegalArgumentException("…"); | throw e throws |
throws | Na assinatura: o método pode lançar essas exceções. | void ler() throws IOException | throw e throws |
Pacotes e módulos
| Palavra | O que faz | Exemplo | Aula |
|---|---|---|---|
package | Diz a que pacote o arquivo pertence (primeira linha). | package br.com.ana.banco; | Pacotes e import |
import | Traz classes de outros pacotes para usar pelo nome curto. | import java.util.List; | Pacotes e import |
Sem uso e o _
| Palavra | O que faz | Exemplo | Aula |
|---|---|---|---|
const | Nada. Reservada desde o Java 1.0 para evitar confusão com C/C++, mas nunca usada. Em Java, constante é static final. | — | Constantes |
goto | Nada. Reservada e nunca usada. Para sair de laços aninhados, use break com rótulo. | — | break e continue |
_ | Variável sem nome: "aqui vai uma variável, mas eu não vou usá-la". Java 22+ (antes, desde o 9, era só proibido). | for (Forma _ : formas) contador++; | Novidades do 17 ao 25 |
Experimente: palavras-chave são sempre minúsculas. Declare int Class = 1 (com C maiúsculo) no JShell e veja que funciona; depois mostre Class == 1.
int Class = 1 Class == 1
Palavras contextuais
Só têm significado especial na posição em que aparecem. A coluna "Desde" mostra a versão em que cada uma passou a valer.
| Palavra | Desde | O que faz | Exemplo | Aula |
|---|---|---|---|---|
var | 10 | Deixa o compilador descobrir o tipo da variável local pelo valor. | var lista = new ArrayList<String>(); | var |
yield | 14 | Entrega o valor de um bloco { } dentro de um switch expressão. | default -> { log(); yield 0; } | switch com Setas |
record | 16 | Declara uma classe só de dados, com construtor, acessores, equals e toString prontos. | record Ponto(int x, int y) { } | Records |
sealed | 17 | A classe ou interface só pode ser estendida pelas classes listadas. | sealed interface Forma permits Circulo, Quadrado { } | Classes Seladas |
permits | 17 | A lista de quem pode estender uma classe selada. | permits Circulo, Quadrado | Classes Seladas |
non-sealed | 17 | Uma filha de selada que volta a aceitar qualquer filha. A única palavra-chave com hífen. | non-sealed class Poligono extends Forma | Classes Seladas |
when | 21 | Condição extra (guarda) num case com padrão. | case Circulo c when c.raio() == 0 -> 0; | Pattern Matching |
module | 9 | Declara um módulo em module-info.java (e, no 25, import module java.base;). | module br.com.ana.loja { … } | Módulos |
open | 9 | Módulo aberto à reflexão por completo. | open module br.com.ana.loja { } | Módulos |
requires | 9 | O módulo depende de outro. | requires java.sql; | Módulos |
transitive | 9 | Quem depende de mim também recebe essa dependência. | requires transitive java.sql; | Módulos |
exports | 9 | Deixa um pacote visível para outros módulos. | exports br.com.ana.loja.api; | Módulos |
opens | 9 | Abre um pacote para reflexão. | opens br.com.ana.loja.modelo; | Módulos |
to | 9 | Restringe exports/opens a módulos específicos. | exports a.b to c.d; | Módulos |
uses | 9 | O módulo consome um serviço. | uses br.com.ana.Pagamento; | Módulos |
provides | 9 | O módulo fornece uma implementação de serviço… | provides Pagamento with Pix; | Módulos |
with | 9 | …com esta classe. | with Pix; | Módulos |
Um programa que usa sealed, permits, record, when, var, yield e _ de uma vez:
import java.util.List;
public class Main {
sealed interface Forma permits Circulo, Quadrado { }
record Circulo(double raio) implements Forma { }
record Quadrado(double lado) implements Forma { }
static double area(Forma f) {
return switch (f) {
case Circulo c when c.raio() == 0 -> 0;
case Circulo c -> Math.PI * c.raio() * c.raio();
case Quadrado q -> q.lado() * q.lado();
};
}
public static void main(String[] args) {
var formas = List.of(new Circulo(1), new Quadrado(2), new Circulo(0));
int contador = 0;
for (Forma _ : formas) {
contador++;
}
for (var f : formas) {
System.out.println(f + " -> " + area(f));
}
String tamanho = switch (contador) {
case 0 -> "nenhuma";
default -> {
String t = contador + " formas";
yield t;
}
};
System.out.println(tamanho);
}
}
$ java Main.java Circulo[raio=1.0] -> 3.141592653589793 Quadrado[lado=2.0] -> 4.0 Circulo[raio=0.0] -> 0.0 3 formas
true, false e null
Tecnicamente, não são palavras-chave: são literais (valores escritos direto no código), como 42 ou "Ana". Mas também são proibidos como nomes.
| Literal | O que é | Exemplo | Aula |
|---|---|---|---|
true | O valor verdadeiro de um boolean. | boolean ligado = true; | Expressões Booleanas |
false | O valor falso. | boolean ligado = false; | Expressões Booleanas |
null | "Nenhum objeto": uma referência que não aponta para nada. Chamar um método nela dá NullPointerException. | String nome = null; | Exceções Comuns |
Quando dá errado
Estes códigos têm erros de propósito.
int class = 3;
System.out.println(class);
$ java Main.java
Main.java:3: error: not a statement
int class = 3;
^
Main.java:3: error: ';' expected
int class = 3;
^
Main.java:3: error: <identifier> expected
int class = 3;
^
Main.java:4: error: illegal start of expression
System.out.println(class);
^
Main.java:4: error: <identifier> expected
System.out.println(class);
^
5 errors
error: compilation failed
O javac não diz "class é palavra reservada": ele se perde e mostra uma cascata de erros (not a statement, ';' expected, <identifier> expected). Quando um erro aponta para uma linha que parece perfeita, confira se algum nome é palavra-chave. Com goto, const e até true, a mensagem é a mesma:
$ java Main.java
Main.java:3: error: not a statement
int goto = 3;
^
Main.java:3: error: ';' expected
int goto = 3;
^
2 errors
error: compilation failed
$ java Main.java
Main.java:2: error: 'var' not allowed here
static class var { }
^
as of release 10, 'var' is a restricted type name and cannot be used for type declarations
1 error
error: compilation failed
"Desde a versão 10, var é um nome de tipo restrito e não pode ser usado para declarar tipos." Variável chamada var pode; classe chamada var, não. Com o _ é parecido: dá para declarar, mas não para ler:
$ java Main.java
Main.java:4: error: underscore not allowed here
System.out.println(_);
^
1 error
error: compilation failed
Missão: este programa não compila porque usa duas palavras reservadas como nomes de variável. Troque os nomes (por exemplo, novo e padrao) e faça-o mostrar Total: 30.
public class Main {
public static void main(String[] args) {
int new = 10;
int default = 20;
System.out.println("Total: " + (new + default));
}
}
public class Main {
public static void main(String[] args) {
int novo = 10;
int padrao = 20;
System.out.println("Total: " + (novo + padrao));
}
}
Exercícios
1. Qual destas linhas compila?
2. O que const faz em Java?
3. Em que versão o when passou a valer nos case do switch?
Complete a declaração da classe selada:
Resumo
- 51 palavras reservadas (50 palavras e o
_), proibidas como nomes em qualquer lugar;constegotonão fazem nada;strictfpestá obsoleta. - 17 palavras contextuais (
var,yield,record,sealed,non-sealed,permits,whene as 10 de módulos), especiais só em certas posições. true,falseenullsão literais, também proibidos como nomes.- Usar uma palavra reservada como nome dá erros confusos (
not a statement,';' expected); desconfie dos nomes.