☕ Curso de Java
Este documento abrange desde os fundamentos da lógica de programação com Java até a construção de aplicações web complexas com Spring Boot e a utilização de bancos de dados NoSQL com MongoDB.
🧠 1. Lógica de Programação e Algoritmos com Java
Nesta primeira etapa, construímos a base do pensamento computacional, aprendendo a resolver problemas de forma estruturada utilizando a linguagem Java.
-
Conceitos de programação
- O que é um algoritmo? Um algoritmo é uma sequência de passos finita e ordenada, criada para resolver um problema específico. É como uma “receita de bolo” que o computador seguirá para executar uma tarefa.
-
Introdução à linguagem Java
- Java é uma linguagem de programação orientada a objetos, robusta e de alto desempenho. Sua principal característica é a portabilidade: o código escrito em Java pode ser executado em diferentes sistemas operacionais (Windows, macOS, Linux) sem modificação, graças à Máquina Virtual Java (JVM).
-
Estrutura Sequencial
- É a estrutura mais simples, onde as instruções são executadas uma após a outra, na ordem em que aparecem.
Exemplo prático: Soma de dois números.
package curso; import java.util.Scanner; public class Programa { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Digite o primeiro número: "); int numero1 = sc.nextInt(); System.out.print("Digite o segundo número: "); int numero2 = sc.nextInt(); int soma = numero1 + numero2; System.out.println("SOMA = " + soma); sc.close(); } } -
Estrutura Condicional
- Permite que o programa tome decisões e execute diferentes blocos de código com base em uma condição (verdadeira ou falsa). As palavras-chave principais são
if,elseeelse if.
Exemplo prático: Verificar se um aluno foi aprovado.
package curso; import java.util.Scanner; public class Programa { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Digite a nota final do aluno: "); double notaFinal = sc.nextDouble(); if (notaFinal >= 7.0) { System.out.println("Aluno Aprovado!"); } else { System.out.println("Aluno Reprovado."); } sc.close(); } } - Permite que o programa tome decisões e execute diferentes blocos de código com base em uma condição (verdadeira ou falsa). As palavras-chave principais são
-
Estruturas Repetitivas
- Usadas para executar um bloco de código várias vezes enquanto uma condição for verdadeira. As estruturas mais comuns são
while(enquanto) efor(para).
Exemplo prático: Tabuada de um número usando
for.package curso; import java.util.Scanner; public class Programa { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Digite um número para ver sua tabuada: "); int numero = sc.nextInt(); System.out.println("Tabuada de " + numero + ":"); for (int i = 1; i <= 10; i++) { int resultado = numero * i; System.out.println(numero + " x " + i + " = " + resultado); } sc.close(); } } - Usadas para executar um bloco de código várias vezes enquanto uma condição for verdadeira. As estruturas mais comuns são
📦 2. Java e Programação Orientada a Objetos (Parte 1)
Aqui, entramos no paradigma da Orientação a Objetos (POO), que nos permite modelar o mundo real em nosso código, criando sistemas mais organizados, reutilizáveis e fáceis de manter.
-
Introdução à Programação Orientada a Objetos (POO)
- A POO se baseia em quatro pilares fundamentais:
- Abstração: Focar nos aspectos essenciais de um objeto, ignorando detalhes irrelevantes.
- Encapsulamento: Agrupar atributos (dados) e métodos (comportamentos) dentro de uma classe, protegendo os dados de acessos indevidos.
- Herança: Permitir que uma classe (filha) herde atributos e métodos de outra classe (mãe), promovendo o reuso de código.
- Polimorfismo: Capacidade de um objeto de mesma classe se comportar de maneiras diferentes, geralmente por meio da sobrescrita de métodos.
- A POO se baseia em quatro pilares fundamentais:
-
Construtores, palavra
thise Sobrecarga- Construtor: É um método especial responsável por criar e inicializar um objeto.
this: É uma referência para o próprio objeto atual. É usado para desambiguar atributos de variáveis locais.- Sobrecarga: Permite ter múltiplos métodos com o mesmo nome na mesma classe, desde que suas assinaturas (quantidade ou tipo de parâmetros) sejam diferentes.
Exemplo prático: Classe
Produto.package entidades; public class Produto { public String nome; public double preco; public int quantidade; // Construtor padrão public Produto() { } // Construtor com parâmetros (Sobrecarga) public Produto(String nome, double preco, int quantidade) { this.nome = nome; // 'this' para diferenciar atributo de parâmetro this.preco = preco; this.quantidade = quantidade; } } -
Comportamento de memória, Arrays e Listas
- Memória: Em Java, a memória é dividida principalmente em Stack (para variáveis de tipo primitivo e referências de objetos) e Heap (onde os objetos são efetivamente armazenados).
- Arrays: São estruturas de dados de tamanho fixo para armazenar elementos do mesmo tipo.
- Listas (
ArrayList): São estruturas de dados dinâmicas (sem tamanho fixo) que oferecem mais flexibilidade que os arrays.
-
Tópicos especiais em Java
- Envolvem o uso de classes e recursos importantes do Java, como a manipulação de datas com
DateeCalendar, e a formatação de números e texto.
- Envolvem o uso de classes e recursos importantes do Java, como a manipulação de datas com
-
Enumerações e Composição
- Enumerações (
enum): Um tipo especial que permite a uma variável ter um valor de um conjunto pré-definido de constantes. Ex:StatusPedido.PROCESSANDO. - Composição: Um tipo de relacionamento onde um objeto complexo é “composto por” outros objetos mais simples. Ex: um
Pedidoé composto por umClientee uma lista deItensPedido.
- Enumerações (
-
Herança e Polimorfismo
- Conceitos centrais da POO que permitem criar hierarquias de classes e escrever um código mais flexível e genérico.
-
Tratamento de Exceções
- Mecanismo para lidar com erros em tempo de execução de forma controlada, usando os blocos
try-catch-finally. Isso evita que o programa pare de funcionar inesperadamente.
- Mecanismo para lidar com erros em tempo de execução de forma controlada, usando os blocos
⚙️ 3. Java: Programação Orientada a Objetos (Parte 2)
Avançamos em tópicos de POO e exploramos recursos modernos da linguagem para criar aplicações mais poderosas e eficientes.
- Trabalhando com Arquivos: Aprenda a ler e escrever dados em arquivos de texto (
.txt,.csv) usando as classes do pacotejava.io. - Interfaces: Define um “contrato” que uma classe deve seguir, especificando quais métodos ela deve implementar. É fundamental para o desacoplamento e para o polimorfismo.
- Generics, Set, Map:
- Generics: Permitem criar classes, interfaces e métodos que operam com tipos genéricos, aumentando a segurança e a reutilização do código.
- Set: Uma coleção que não permite elementos duplicados.
- Map: Uma coleção que armazena pares de chave-valor.
- Programação Funcional e Expressões Lambda: Introdução ao paradigma funcional em Java. As expressões Lambda permitem escrever código mais conciso e expressivo, especialmente ao trabalhar com coleções.
- Acesso a Banco de Dados com JDBC: O JDBC (Java Database Connectivity) é a API padrão do Java para se conectar e executar comandos em bancos de dados relacionais (como MySQL, PostgreSQL, etc.).
🏛️ Padrão MVC
O Model-View-Controller (MVC) é um padrão de arquitetura de software que divide a aplicação em três camadas interligadas, cada uma com sua responsabilidade:
- Model (Modelo): Representa os dados e a lógica de negócio da aplicação. É responsável por acessar e manipular as informações no banco de dados.
- View (Visão): É a camada de apresentação, responsável por exibir os dados ao usuário. Em aplicações web, geralmente é o HTML renderizado no navegador.
- Controller (Controlador): Atua como intermediário, recebendo as requisições do usuário, acionando a lógica de negócio no Model e direcionando a View apropriada para ser exibida.
🌐 4. PROJETO: Web Services com Spring Boot e JPA/Hibernate
Nesta fase, aplicamos todo o conhecimento para construir uma API RESTful completa usando as tecnologias mais demandadas no mercado.
- ORM com JPA / Hibernate: ORM (Mapeamento Objeto-Relacional) é uma técnica que converte dados entre o sistema de tipos de uma linguagem orientada a objetos (como classes Java) e um banco de dados relacional (tabelas). O JPA (Java Persistence API) é a especificação padrão para ORM em Java, e o Hibernate é a implementação mais popular.
- Padrão Camadas: Organização do projeto em camadas lógicas (ex:
Controller,Service,Repository) para separar responsabilidades e facilitar a manutenção. - Web e HTTP: Fundamentos do protocolo HTTP, que é a base da comunicação na web, e seus principais métodos (GET, POST, PUT, DELETE).
- REST / Web Services: Construção de APIs baseadas nos princípios REST (Representational State Transfer), que é o padrão de arquitetura predominante para criar serviços web escaláveis e interoperáveis.
- Modelo de Domínio Complexo: Mapeamento de relacionamentos complexos entre entidades, como um-para-muitos e muitos-para-muitos.
- Maven: Ferramenta de automação de compilação e gerenciamento de dependências. Ele baixa as bibliotecas necessárias (como o Spring Boot e o Hibernate) e empacota a aplicação.
- Banco de Dados H2: Um banco de dados em memória, escrito em Java. É ideal para ambientes de desenvolvimento e testes por ser rápido e fácil de configurar.
- Spring Data JPA: Facilita enormemente a criação da camada de acesso a dados, automatizando a implementação de operações de CRUD (Criar, Ler, Atualizar, Deletar).
- CRUD Completo: Implementação das quatro operações básicas de persistência de dados.
- Tratamento de Exceções: Criação de um sistema robusto para tratar erros de forma centralizada na API, retornando respostas HTTP adequadas.
🗄️ 5. NoSQL e MongoDB
Exploramos o mundo dos bancos de dados NoSQL, ideais para aplicações que exigem alta escalabilidade e flexibilidade no esquema de dados.
- Modelo de Domínio: Agregados e Desnormalização: Ao contrário dos bancos relacionais, o NoSQL favorece a desnormalização (duplicação controlada de dados) para otimizar a performance de leitura. Os dados são agrupados em agregados, que são conjuntos de objetos relacionados tratados como uma única unidade (ex: um post de blog com seus comentários embutidos).
- Padrão DTO (Data Transfer Object): Objeto simples usado para transferir dados entre as camadas da aplicação (ex: entre o Controller e o cliente da API), evitando a exposição direta das entidades do domínio.
- Spring Data MongoDB: Similar ao Spring Data JPA, mas oferece integração e abstração para trabalhar com o MongoDB, simplificando as operações de banco de dados.
- CRUD Completo: Implementação das operações básicas de persistência no MongoDB.
- Tratamento de Exceções: Adaptação do tratamento de erros para o contexto de um banco de dados NoSQL.
💻 Configurando o Ambiente de Desenvolvimento
Para acompanhar o curso, você precisará de um ambiente de desenvolvimento Java. As duas IDEs (Ambiente de Desenvolvimento Integrado) mais populares são o Visual Studio Code e o IntelliJ IDEA.
Usando o Visual Studio Code
- Instale o Java Development Kit (JDK): Baixe e instale a versão LTS mais recente do JDK (ex: OpenJDK 17 ou 21).
- Instale o VS Code: Baixe e instale o editor do site oficial.
- Instale o Pacote de Extensões Java: No VS Code, vá para a aba de Extensões e procure por
Extension Pack for Javada Microsoft. Instale este pacote, que inclui tudo o que você precisa para desenvolver em Java.
Usando o IntelliJ IDEA
- Instale o Java Development Kit (JDK): O processo é o mesmo descrito acima.
- Instale o IntelliJ IDEA: Baixe e instale a versão Community Edition (gratuita) do site oficial da JetBrains. O IntelliJ IDEA já vem com todo o suporte a Java, Maven e outras ferramentas integrado, tornando a configuração inicial muito simples.