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.

Nesta página

Dois tipos de palavra-chave

Desde o Java 17, a especificação da linguagem separa as palavras-chave em dois grupos:

TipoRegraExemplo
ReservadaProibida como nome em qualquer lugar.int class = 3; não compila.
ContextualEspecial 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

PalavraO que fazExemploAula
booleanTipo lógico: true ou false.boolean aprovado = nota >= 7;char e boolean
byteInteiro de 8 bits (-128 a 127).byte b = 100;Inteiros
shortInteiro de 16 bits (-32.768 a 32.767).short s = 3000;Inteiros
intInteiro de 32 bits, o mais usado (cerca de ±2,1 bilhões).int idade = 29;Inteiros
longInteiro de 64 bits. Literal com L no fim.long populacao = 8_000_000_000L;Inteiros
floatDecimal de 32 bits. Literal com f.float f = 1.5f;double e float
doubleDecimal de 64 bits, o padrão para números com vírgula.double preco = 9.90;double e float
charUm 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

PalavraO que fazExemploAula
ifExecuta um bloco se a condição for verdadeira.if (nota >= 7) { … }if, else
elseO caminho do "senão".} else { … }if, else
switchEscolhe entre vários casos pelo valor.switch (dia) { … }switch
caseUm caso do switch.case 1 -> "domingo";switch com setas
defaultO caso "qualquer outro" do switch. Também marca métodos com corpo numa interface.default -> "inválido";switch, Interfaces
whileRepete enquanto a condição for verdadeira.while (x < 10) { x++; }while
doComeça um do-while: roda pelo menos uma vez.do { … } while (resp.equals("s"));while e do-while
forLaço com contador, ou o for-each.for (int i = 0; i < 5; i++)for, for-each
breakSai do laço ou do switch antigo.if (achou) break;break e continue
continuePula para a próxima volta do laço.if (i % 2 == 0) continue;break e continue
returnSai do método, devolvendo um valor (ou nada, em void).return a + b;Valores de Retorno
assertConfere uma condição durante o desenvolvimento; só é verificada com java -ea.assert idade >= 0 : "idade negativa";Depurar

Classes, objetos e tipos

PalavraO que fazExemploAula
classDeclara uma classe.public class Conta { … }Classes e Objetos
interfaceDeclara uma interface (um contrato de métodos).interface Pagavel { … }Interfaces
enumDeclara um tipo com uma lista fechada de constantes. Java 5+enum Nivel { FACIL, DIFICIL }Enums
extendsHerda de uma classe (ou interface estende interface).class Aluno extends PessoaHerança
implementsDiz que a classe cumpre uma ou mais interfaces.class Pix implements PagavelInterfaces
newCria um objeto (ou array).new Conta("Ana")Classes e Objetos
thisO próprio objeto; também chama outro construtor da mesma classe.this.nome = nome;this
superA classe mãe: seu construtor ou seus métodos.super(nome);super
instanceofTesta se um objeto é de um tipo (e, desde o 16, já cria a variável).if (f instanceof Circulo c)Pattern Matching

Modificadores

PalavraO que fazExemploAula
publicVisível de qualquer lugar.public void depositar(…)Modificadores de Acesso
protectedVisível no pacote e nas subclasses.protected String nome;Modificadores de Acesso
privateVisível só dentro da própria classe.private double saldo;Modificadores de Acesso
staticPertence à classe, não a cada objeto.static int contador;static
finalNã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
abstractClasse que não pode ser instanciada / método sem corpo, que as filhas implementam.abstract double area();Classes Abstratas
synchronizedSó uma thread por vez executa o método ou bloco.synchronized void somar()synchronized e Locks
volatileA variável é sempre lida da memória principal, visível para todas as threads.volatile boolean parar;synchronized e Locks
transientO atributo é ignorado na serialização (quando o objeto vira bytes).transient String senha;—
nativeO método é implementado em outra linguagem (C), fora da JVM.native int ler();—
strictfpObsoleta: desde o Java 17 toda conta de ponto flutuante já é "estrita". Ainda é reservada, mas não faz nada.strictfp class CalculoMétodos de Math

Exceções

PalavraO que fazExemploAula
tryBloco onde uma exceção pode acontecer; também abre recursos (try-with-resources).try { … }try e catch
catchCaptura e trata uma exceção.catch (IOException e) { … }try e catch
finallyBloco que roda sempre, com ou sem exceção.finally { fechar(); }finally
throwLança uma exceção agora.throw new IllegalArgumentException("…");throw e throws
throwsNa assinatura: o método pode lançar essas exceções.void ler() throws IOExceptionthrow e throws

Pacotes e módulos

PalavraO que fazExemploAula
packageDiz a que pacote o arquivo pertence (primeira linha).package br.com.ana.banco;Pacotes e import
importTraz classes de outros pacotes para usar pelo nome curto.import java.util.List;Pacotes e import

Sem uso e o _

PalavraO que fazExemploAula
constNada. Reservada desde o Java 1.0 para evitar confusão com C/C++, mas nunca usada. Em Java, constante é static final.—Constantes
gotoNada. 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.

PalavraDesdeO que fazExemploAula
var10Deixa o compilador descobrir o tipo da variável local pelo valor.var lista = new ArrayList<String>();var
yield14Entrega o valor de um bloco { } dentro de um switch expressão.default -> { log(); yield 0; }switch com Setas
record16Declara uma classe só de dados, com construtor, acessores, equals e toString prontos.record Ponto(int x, int y) { }Records
sealed17A classe ou interface só pode ser estendida pelas classes listadas.sealed interface Forma permits Circulo, Quadrado { }Classes Seladas
permits17A lista de quem pode estender uma classe selada.permits Circulo, QuadradoClasses Seladas
non-sealed17Uma filha de selada que volta a aceitar qualquer filha. A única palavra-chave com hífen.non-sealed class Poligono extends FormaClasses Seladas
when21Condição extra (guarda) num case com padrão.case Circulo c when c.raio() == 0 -> 0;Pattern Matching
module9Declara um módulo em module-info.java (e, no 25, import module java.base;).module br.com.ana.loja { … }Módulos
open9Módulo aberto à reflexão por completo.open module br.com.ana.loja { }Módulos
requires9O módulo depende de outro.requires java.sql;Módulos
transitive9Quem depende de mim também recebe essa dependência.requires transitive java.sql;Módulos
exports9Deixa um pacote visível para outros módulos.exports br.com.ana.loja.api;Módulos
opens9Abre um pacote para reflexão.opens br.com.ana.loja.modelo;Módulos
to9Restringe exports/opens a módulos específicos.exports a.b to c.d;Módulos
uses9O módulo consome um serviço.uses br.com.ana.Pagamento;Módulos
provides9O módulo fornece uma implementação de serviço…provides Pagamento with Pix;Módulos
with9…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.

LiteralO que éExemploAula
trueO valor verdadeiro de um boolean.boolean ligado = true;Expressões Booleanas
falseO 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

Uma palavra reservada como nome de variável

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
Uma palavra contextual onde ela é especial
$ 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:

interface Forma Circulo, Quadrado { }

Resumo

  • 51 palavras reservadas (50 palavras e o _), proibidas como nomes em qualquer lugar; const e goto não fazem nada; strictfp está obsoleta.
  • 17 palavras contextuais (var, yield, record, sealed, non-sealed, permits, when e as 10 de módulos), especiais só em certas posições.
  • true, false e null são literais, também proibidos como nomes.
  • Usar uma palavra reservada como nome dá erros confusos (not a statement, ';' expected); desconfie dos nomes.