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?

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.
newCria um novo objeto.
extendsIndica herança entre classes.
implementsIndica implementação de uma interface.

Tipos de Dados

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:

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:

Palavras Reservadas do Java

Palavra Reservada Descrição
abstractDefine uma classe abstrata.
assertUtilizado para criar afirmações no código.
booleanTipo de dado booleano (true ou false).
breakInterrompe loops ou switch-case.
byteTipo de dado numérico (8 bits).
caseDefine um bloco dentro de um switch.
catchCaptura exceções em um bloco try.
charTipo de dado para caracteres (16 bits).
classDefine uma classe.
constPalavra reservada (não utilizada).
continuePula para a próxima iteração de um loop.
defaultDefine um caso padrão em switch-case.
doExecuta um bloco de código antes da verificação do loop.
doubleTipo de dado de ponto flutuante (64 bits).
elseDefine um bloco de código alternativo em um if.
enumDefine um conjunto de constantes nomeadas.
extendsIndica herança entre classes.
finalDefine constantes ou impede herança/métodos sobrescritos.
finallyBloco sempre executado após try-catch.
floatTipo de dado de ponto flutuante (32 bits).
forEstrutura de repetição.
ifEstrutura condicional.
implementsIndica implementação de uma interface.
importImporta pacotes/classes.
instanceofVerifica se um objeto pertence a uma classe.
intTipo de dado numérico inteiro (32 bits).
interfaceDefine uma interface.
longTipo de dado numérico inteiro (64 bits).
nativeIndica um método nativo.
newCria um novo objeto.
nullIndica ausência de valor/referência.
packageDefine um pacote.
privateDefine um acesso restrito à classe.
protectedDefine um acesso dentro do pacote e subclasses.
publicDefine um acesso público.
returnRetorna um valor de um método.
shortTipo de dado numérico (16 bits).
staticDefine um membro compartilhado entre instâncias.
strictfpForça precisão específica em cálculos de ponto flutuante.
superChama a superclasse.
switchEstrutura condicional baseada em casos.
synchronizedControle de concorrência.
thisReferencia a própria instância da classe.
throwLança uma exceção.
throwsDeclara exceções que um método pode lançar.
transientIgnora um atributo durante a serialização.
tryDefine um bloco de código para capturar exceções.
voidIndica que um método não retorna valor.
volatileIndica que uma variável pode ser alterada por múltiplas threads.
whileEstrutura 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...)