Introdução
Classes
Em Java, uma classe é como um molde ou receita para criar objetos que representam coisas ou conceitos do mundo real. A linguagem já traz muitas classes prontas, cada uma feita para um propósito específico, e você também pode criar suas próprias classes para desenvolver soluções, definindo os dados e comportamentos que fazem sentido para o problema que quer resolver.
Não é nenhuma surpresa que a linguagem Java é composta exclusivamente por classes que se tornarão objetos mediante o recurso de instanciação (criação de objetos).
Nesta jornada iremos conhecer as classes mais relevantes e o que elas podem oferecer ao longo de sua jornada em desenvolvimento.
Documentação
A linguagem Java contém um arsenal poderosíssimo no que se refere a documentação de suas classes que compõem todo o seu ecossistema.
O que devemos compreender é que a cada versão, novas classes surgirão além de novos recursos nas classes já existentes. Então, você deve estar ciente de qual versão do Java você irá utilizar em seus projetos.

Pacotes na linguagem Java
O que são pacotes
Pacotes (packages) são mecanismos de organização da linguagem Java utilizados para agrupar classes e interfaces relacionadas dentro de um mesmo namespace.
Eles funcionam de forma semelhante a pastas em um sistema de arquivos, ajudando a estruturar e organizar o código-fonte.
Cada classe em Java pertence a um pacote, que define seu contexto e evita conflitos de nomes entre classes com a mesma denominação.
Importância do uso de pacotes
O uso de pacotes traz diversos benefícios:
- Organização do código: facilita a navegação e manutenção de projetos grandes
- Reutilização: permite compartilhar bibliotecas e módulos de forma estruturada
- Evita conflitos de nomes: classes com o mesmo nome podem existir em pacotes diferentes
- Controle de acesso: influencia a visibilidade de classes, métodos e atributos
- Padronização: favorece convenções e boas práticas da linguagem
Estrutura de pacotes na plataforma Java
A própria plataforma Java é organizada em pacotes bem definidos, cada um com responsabilidades específicas.
Exemplo de pacotes nativos do Java:
| Pacote | Descrição |
|---|---|
| java.lang | Pacote que contém as principais classes da linguagem, como Object, String, Long e etc |
| java.io | Pacote que centraliza todas as classes relacionadas a trabalhar com leitura e escrita de arquivos |
| java.time | Pacote introduzido recentemente para provê recursos de manipulação de datas e horas na linguagem |
| java.util | Pacote onde podemos encontrar classes úteis em sua maioria com recursos estáticos |
Ilustração da hierarquia de pacotes
A hierarquia de pacotes segue uma estrutura em árvore:
java
├── lang
│ ├── String
│ ├── System
│ └── Math
├── util
│ ├── List
│ ├── Map
│ └── Scanner
└── time
└── LocalDate
Pacotes de fornecedores adicionais
Além dos pacotes nativos, é comum utilizar bibliotecas de terceiros, que seguem convenções próprias de organização.
Exemplos de pacotes de fornecedores:
org.springframework
├── context
├── web
└── data
com.fasterxml.jackson
├── core
└── databind
org.apache.commons
├── lang3
└── io
Esses pacotes indicam:
- A origem da biblioteca (organização ou empresa)
- O domínio funcional das classes
- A separação clara entre módulos
Convenção de nomenclatura de pacotes
A convenção mais comum é utilizar o domínio da empresa invertido, seguido da estrutura do projeto:
com.empresa.projeto.modulo
Exemplo:
com.exemplo.sistema.usuario
Considerações
Pacotes são essenciais para manter aplicações Java organizadas, escaláveis e fáceis de manter. Identificar corretamente os pacotes e compreender sua hierarquia ajuda o desenvolvedor a entender rapidamente a origem, responsabilidade e uso das classes dentro de um projeto ou biblioteca.
Claro 🙂 vamos direto ao ponto, no mesmo tom conceitual do seu material.
Nome qualificado
Em Java, o nome qualificado (fully qualified name) é o nome completo de uma classe, incluindo todo o caminho do pacote ao qual ela pertence.
Ele identifica uma classe de forma única dentro da aplicação ou da plataforma Java.
Estrutura do nome qualificado
A estrutura de um nome qualificado é composta por:
pacote.subpacote.Classe
Exemplo:
java.lang.String
java.util.List
java.time.LocalDate
Importância do nome qualificado
O uso do nome qualificado é importante porque:
- Elimina ambiguidades entre classes com o mesmo nome
- Permite ao compilador localizar exatamente qual classe deve ser utilizada
- Torna explícita a origem da classe
- Facilita a leitura e compreensão do código em cenários específicos
Conflito de nomes
Quando duas classes possuem o mesmo nome simples, mas pertencem a pacotes diferentes, o nome qualificado resolve o conflito.
Exemplo:
java.util.Date
java.sql.Date
Uso explícito:
java.util.Date dataUtil = new java.util.Date();
java.sql.Date dataSql = new java.sql.Date(System.currentTimeMillis());
Relação com o import
Ao utilizar a instrução import, é possível referenciar a classe pelo nome simples, evitando o uso constante do nome qualificado.
import java.util.List;
List<String> nomes = new ArrayList<>();
Sem import, o nome qualificado deve ser usado:
java.util.List<String> nomes = new java.util.ArrayList<>();
Considerações finais
O nome qualificado garante a identificação única de uma classe dentro do ecossistema Java. Compreender esse conceito é essencial para trabalhar com múltiplos pacotes, bibliotecas externas e projetos de grande porte.
Classes com o mesmo nome em pacotes diferentes
| Nome da Classe | Pacote | Finalidade principal |
|---|---|---|
Date | java.util.Date | Representação geral de data e hora |
Date | java.sql.Date | Representação de data para uso com bancos de dados |
List | java.util.List | Interface para listas ordenadas |
List | java.awt.List | Componente gráfico de lista (AWT) |
Timer | java.util.Timer | Agendamento de tarefas |
Timer | javax.swing.Timer | Temporizador para interfaces gráficas |
File | java.io.File | Representação de arquivos e diretórios |
File | java.awt.FileDialog* | Diálogo gráfico para seleção de arquivos |
Debug
Acompanhar o estado de nossos objetos, o valor das nossas variáveis e até aonde o nosso programa está executado sem erros, é algo extremamente importante para garantir a integridade do algoritmo implementado.
System
Classe utilitária responsável por fornecer acesso a recursos fundamentais do ambiente de execução Java.