Java: Documentação.
Introdução ao Java
Java é uma linguagem de programação orientada a objetos, de alto nível e multiplataforma, amplamente utilizada para desenvolvimento de aplicações empresariais, web, desktop e mobile.
Para que serve o Java?
- Aplicações Web: Desenvolvimento de sistemas robustos com Spring e Jakarta EE.
- Desenvolvimento Mobile: Aplicações Android com Java e Kotlin.
- Sistemas Corporativos: Softwares empresariais e sistemas de grande porte.
- Jogos: Desenvolvimento de jogos com a biblioteca LibGDX.
- IoT e Computação Embarcada: Dispositivos inteligentes e automação.
Instalação
Para começar a programar em Java, instale o JDK (Java Development Kit). Baixe a versão mais recente do site oficial da Oracle ou use o OpenJDK:
sudo apt install openjdk-17-jdk
Verifique a instalação com:
java -version
Principais Comandos Java
| Comando | Descrição |
|---|---|
| System.out.println() | Exibe uma mensagem no console. |
| Scanner input = new Scanner(System.in) | Recebe entrada do usuário. |
| new | Cria um novo objeto. |
| extends | Indica herança entre classes. |
| implements | Indica implementação de uma interface. |
Tipos de Dados
- int: Números inteiros.
- double: Números decimais.
- boolean: Verdadeiro ou falso.
- char: Um único caractere.
- String: Sequência de caracteres.
Exemplo de Código
public class Main {
public static void main(String[] args) {
System.out.println("Olá, Mundo!");
}
}
Orientada a Objetos
Java é uma linguagem totalmente orientada a objetos. Isso significa que tudo em Java é um objeto, exceto os tipos primitivos. Os pilares da orientação a objetos são:
- Encapsulamento: Esconder detalhes internos de uma classe e expor apenas o necessário.
- Herança: Permite que uma classe herde atributos e métodos de outra classe.
- Polimorfismo: Permite que objetos de diferentes classes sejam tratados como objetos de uma classe base.
- Abstração: Simplificar a complexidade ao focar apenas nos aspectos essenciais.
class Animal {
void fazerSom() {
System.out.println("Som do animal");
}
}
class Cachorro extends Animal {
@Override
void fazerSom() {
System.out.println("Au Au!");
}
}
public class Main {
public static void main(String[] args) {
Animal meuCachorro = new Cachorro();
meuCachorro.fazerSom(); // Au Au!
}
}
Multiplataforma
Java é multiplataforma porque o código-fonte é compilado para um formato intermediário chamado bytecode, que pode ser executado em qualquer dispositivo que tenha uma Java Virtual Machine (JVM).
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Gerenciamento de Memória
Java possui um sistema de coleta de lixo (garbage collection) que gerencia automaticamente a alocação e liberação de memória.
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 1000000; i++) {
String temp = new String("Objeto " + i);
}
// O garbage collector libera a memória dos objetos não utilizados
}
}
Biblioteca Padrão Rica
A Java Standard Library é uma coleção de classes e métodos prontos para uso, como estruturas de dados, manipulação de arquivos, redes e utilitários.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList lista = new ArrayList<>();
lista.add("Java");
lista.add("Python");
System.out.println(lista); // [Java, Python]
}
}
Segurança
Java foi projetado com segurança em mente. A JVM possui um gerenciador de segurança (Security Manager) que controla o acesso a recursos do sistema.
public class Main {
public static void main(String[] args) {
System.setSecurityManager(new SecurityManager());
try {
System.out.println("Tentando acessar arquivo...");
new java.io.FileInputStream("arquivo.txt");
} catch (Exception e) {
System.out.println("Acesso negado: " + e.getMessage());
}
}
}
Concorrência
Java possui suporte nativo para programação concorrente, permitindo que múltiplas tarefas sejam executadas simultaneamente.
public class Main {
public static void main(String[] args) {
Runnable tarefa = () -> {
System.out.println("Thread em execução");
};
Thread thread = new Thread(tarefa);
thread.start();
}
}
Frameworks e Bibliotecas
Java possui um ecossistema rico de frameworks e bibliotecas, como Spring, Hibernate e Apache Struts.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@GetMapping("/")
public String hello() {
return "Olá, Spring Boot!";
}
}
Comunidade e Ecossistema
Java tem uma das maiores comunidades de desenvolvedores do mundo, com muitos recursos de aprendizado, ferramentas de desenvolvimento avançadas e bibliotecas de código aberto.
Aplicações
Java é usado em uma ampla variedade de aplicações, desde aplicações web e móveis (Android) até sistemas embarcados e grandes sistemas empresariais.
Versões
Java é atualizado regularmente. A versão mais recente (em outubro de 2023) é o Java 21, que trouxe novos recursos como Pattern Matching, Virtual Threads e Records.
public record Pessoa(String nome, int idade) {}
public class Main {
public static void main(String[] args) {
Pessoa pessoa = new Pessoa("João", 25);
System.out.println(pessoa.nome()); // João
System.out.println(pessoa.idade()); // 25
}
}
Ferramentas de Desenvolvimento
As principais ferramentas para desenvolvimento em Java são:
- Eclipse: IDE popular e extensível.
- IntelliJ IDEA: IDE poderosa e moderna.
- NetBeans: IDE oficial da Apache.
- Maven/Gradle: Ferramentas de automação de build.
Palavras Reservadas do Java
| Palavra Reservada | Descrição |
|---|---|
| abstract | Define uma classe abstrata. |
| assert | Utilizado para criar afirmações no código. |
| boolean | Tipo de dado booleano (true ou false). |
| break | Interrompe loops ou switch-case. |
| byte | Tipo de dado numérico (8 bits). |
| case | Define um bloco dentro de um switch. |
| catch | Captura exceções em um bloco try. |
| char | Tipo de dado para caracteres (16 bits). |
| class | Define uma classe. |
| const | Palavra reservada (não utilizada). |
| continue | Pula para a próxima iteração de um loop. |
| default | Define um caso padrão em switch-case. |
| do | Executa um bloco de código antes da verificação do loop. |
| double | Tipo de dado de ponto flutuante (64 bits). |
| else | Define um bloco de código alternativo em um if. |
| enum | Define um conjunto de constantes nomeadas. |
| extends | Indica herança entre classes. |
| final | Define constantes ou impede herança/métodos sobrescritos. |
| finally | Bloco sempre executado após try-catch. |
| float | Tipo de dado de ponto flutuante (32 bits). |
| for | Estrutura de repetição. |
| if | Estrutura condicional. |
| implements | Indica implementação de uma interface. |
| import | Importa pacotes/classes. |
| instanceof | Verifica se um objeto pertence a uma classe. |
| int | Tipo de dado numérico inteiro (32 bits). |
| interface | Define uma interface. |
| long | Tipo de dado numérico inteiro (64 bits). |
| native | Indica um método nativo. |
| new | Cria um novo objeto. |
| null | Indica ausência de valor/referência. |
| package | Define um pacote. |
| private | Define um acesso restrito à classe. |
| protected | Define um acesso dentro do pacote e subclasses. |
| public | Define um acesso público. |
| return | Retorna um valor de um método. |
| short | Tipo de dado numérico (16 bits). |
| static | Define um membro compartilhado entre instâncias. |
| strictfp | Força precisão específica em cálculos de ponto flutuante. |
| super | Chama a superclasse. |
| switch | Estrutura condicional baseada em casos. |
| synchronized | Controle de concorrência. |
| this | Referencia a própria instância da classe. |
| throw | Lança uma exceção. |
| throws | Declara exceções que um método pode lançar. |
| transient | Ignora um atributo durante a serialização. |
| try | Define um bloco de código para capturar exceções. |
| void | Indica que um método não retorna valor. |
| volatile | Indica que uma variável pode ser alterada por múltiplas threads. |
| while | Estrutura de repetição. |
Classes, Métodos e Estruturas de Controle
Classes
Uma classe em Java é um modelo para criar objetos. Ela define atributos e métodos que os objetos terão. Exemplo:
class Animal {
String nome;
void emitirSom() {
System.out.println("Som genérico");
}
}
Métodos
Métodos são blocos de código que executam uma tarefa específica. Eles podem ter parâmetros e retornar valores.
class Calculadora {
int somar(int a, int b) {
return a + b;
}
}
Estruturas de Controle
Java possui estruturas de controle como:
Condicionais
if (idade >= 18) {
System.out.println("Maior de idade");
} else {
System.out.println("Menor de idade");
}
Laços de Repetição
for (int i = 0; i < 5; i++) {
System.out.println("Número: " + i);
}
while (contador < 5) {
System.out.println("Contando: " + contador);
contador++;
}
Esses elementos são essenciais para a programação em Java, permitindo criar códigos organizados e eficientes.
Conclusão
Dominar o uso de classes, métodos e estruturas de controle é fundamental para se tornar um programador Java eficiente. As classes permitem organizar o código de forma modular, os métodos encapsulam comportamentos específicos, e as estruturas de controle garantem a lógica e o fluxo do programa. Com esses conceitos bem compreendidos, você estará preparado para desenvolver aplicações robustas, escaláveis e de fácil manutenção em Java. Continue praticando e explorando os recursos da linguagem para aprimorar suas habilidades!
Projeto CRUD com Spring Boot
Estrutura de Diretórios
src/
├─ main/
│ ├─ java/com/exemplo/crud/
│ │ ├─ CrudApplication.java
│ │ ├─ model/Item.java
│ │ ├─ repository/ItemRepository.java
│ │ ├─ service/ItemService.java
│ │ └─ controller/ItemController.java
│ └─ resources/
│ └─ application.properties
Model
package com.exemplo.crud.model;
import jakarta.persistence.*;
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String descricao;
// Getters e Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public String getDescricao() { return descricao; }
public void setDescricao(String descricao) { this.descricao = descricao; }
}
Repository
package com.exemplo.crud.repository;
import com.exemplo.crud.model.Item;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ItemRepository extends JpaRepository<Item, Long> {
}
Service
package com.exemplo.crud.service;
import com.exemplo.crud.model.Item;
import com.exemplo.crud.repository.ItemRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class ItemService {
private final ItemRepository itemRepository;
public ItemService(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
}
public List<Item> listarTodos() {
return itemRepository.findAll();
}
public Optional<Item> buscarPorId(Long id) {
return itemRepository.findById(id);
}
public Item salvar(Item item) {
return itemRepository.save(item);
}
public void excluir(Long id) {
itemRepository.deleteById(id);
}
}
Controller
package com.exemplo.crud.controller;
import com.exemplo.crud.model.Item;
import com.exemplo.crud.service.ItemService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/itens")
public class ItemController {
private final ItemService itemService;
public ItemController(ItemService itemService) {
this.itemService = itemService;
}
@GetMapping
public List<Item> listar() {
return itemService.listarTodos();
}
@GetMapping("/{id}")
public ResponseEntity<Item> buscar(@PathVariable Long id) {
return itemService.buscarPorId(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping
public Item criar(@RequestBody Item item) {
return itemService.salvar(item);
}
@PutMapping("/{id}")
public ResponseEntity<Item> atualizar(@PathVariable Long id, @RequestBody Item itemAtualizado) {
return itemService.buscarPorId(id)
.map(item -> {
item.setNome(itemAtualizado.getNome());
item.setDescricao(itemAtualizado.getDescricao());
return ResponseEntity.ok(itemService.salvar(item));
})
.orElse(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> excluir(@PathVariable Long id) {
if (itemService.buscarPorId(id).isPresent()) {
itemService.excluir(id);
return ResponseEntity.noContent().build();
}
return ResponseEntity.notFound().build();
}
}
Configurações do Banco de Dados
spring.datasource.url=jdbc:h2:mem:cruddb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.jpa.show-sql=true
Rodando a Aplicação
Use o comando abaixo no terminal para iniciar a aplicação:
./mvnw spring-boot:run
Ou rode diretamente pela sua IDE (IntelliJ, VS Code, Eclipse...)
