0% acharam este documento útil (0 voto)
5 visualizações29 páginas

Plano Estudos Java

O documento apresenta um plano de estudos de Java para iniciantes, dividido em quatro semanas, abordando conceitos fundamentais e prática constante. Cada semana contém tópicos diários, exercícios e mini-projetos para consolidar o aprendizado. O foco é em programação básica, estruturas de controle, orientação a objetos e conceitos avançados como polimorfismo e interfaces.

Enviado por

juanlucas-santos
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
5 visualizações29 páginas

Plano Estudos Java

O documento apresenta um plano de estudos de Java para iniciantes, dividido em quatro semanas, abordando conceitos fundamentais e prática constante. Cada semana contém tópicos diários, exercícios e mini-projetos para consolidar o aprendizado. O foco é em programação básica, estruturas de controle, orientação a objetos e conceitos avançados como polimorfismo e interfaces.

Enviado por

juanlucas-santos
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 29

Plano de Estudos de Java para Iniciantes

Este plano de estudos foi elaborado para guiá-lo no aprendizado de Java do zero, com
foco em conceitos fundamentais e prática constante. O cronograma está dividido em 4
semanas, com tópicos diários, exercícios e mini-projetos semanais para consolidar o
conhecimento.

Semana 1: Primeiros Passos em Java

Objetivo: Compreender os conceitos básicos de programação e a sintaxe fundamental


do Java.

Dia 1: Introdução ao Java e Ambiente de Desenvolvimento

Teoria:
* O que é Java? História e aplicações.
* JVM, JRE e JDK (explicação das abreviações).
* Instalação do JDK e configuração do ambiente (variáveis de ambiente).
* Primeiro programa Java: "Hello, World!".
* Estrutura básica de um programa Java: public static void main(String[] args) .

Abreviações:
* JVM (Java Virtual Machine): Máquina virtual que executa o bytecode Java. É a
responsável por tornar o Java uma linguagem "write once, run anywhere" (escreva uma
vez, execute em qualquer lugar).
* JRE (Java Runtime Environment): Ambiente de tempo de execução Java. Contém a
JVM e as bibliotecas necessárias para executar aplicações Java.
* JDK (Java Development Kit): Kit de desenvolvimento Java. Inclui o JRE, o
compilador Java ( javac ) e outras ferramentas para desenvolver aplicações Java.

Exemplo de Código: Hello, World!

public class HelloWorld {


public static void main(String[] args) {
System.out.println("Olá, Mundo!"); // Imprime a mensagem no console
}
}

Exercícios:
1. Instale o JDK em seu computador e configure as variáveis de ambiente.
2. Crie um programa Java que imprima seu nome completo no console.
Dia 2: Variáveis, Tipos de Dados e Operadores

Teoria:
* Declaração e inicialização de variáveis.
* Tipos de dados primitivos (int, double, boolean, char, etc.) e seus usos.
* Operadores aritméticos (+, -, *, /, %), de atribuição (=, +=, etc.), relacionais (==, !=, <, >,
<=, >=) e lógicos (&&, ||, !).
* Conversão de tipos (casting).

Exemplo de Código: Variáveis e Operadores

public class CalculadoraSimples {


public static void main(String[] args) {
int numero1 = 10;
int numero2 = 5;

int soma = numero1 + numero2;


int subtracao = numero1 - numero2;
int multiplicacao = numero1 * numero2;
double divisao = (double) numero1 / numero2; // Casting para obter resultado
decimal

System.out.println("Soma: " + soma);


System.out.println("Subtração: " + subtracao);
System.out.println("Multiplicação: " + multiplicacao);
System.out.println("Divisão: " + divisao);

boolean maiorQue = numero1 > numero2;


System.out.println("Numero1 é maior que Numero2? " + maiorQue);
}
}

Exercícios:
1. Crie um programa que declare duas variáveis do tipo double , calcule a média entre
elas e imprima o resultado.
2. Escreva um programa que calcule o resto da divisão de dois números inteiros e
verifique se o resultado é par ou ímpar (usando operador de módulo e condicional).

Dia 3: Estruturas Condicionais (if, else if, else, switch)

Teoria:
* Tomada de decisões com if , else if e else .
* Operadores lógicos para combinar condições.
* Estrutura switch para múltiplas opções.

Exemplo de Código: Condicionais


public class VerificadorIdade {
public static void main(String[] args) {
int idade = 18;

if (idade >= 18) {


System.out.println("Você é maior de idade.");
} else {
System.out.println("Você é menor de idade.");
}

String diaDaSemana = "Terça";

switch (diaDaSemana) {
case "Segunda":
System.out.println("Dia de começar a semana!");
break;
case "Terça":
case "Quarta":
case "Quinta":
System.out.println("Meio da semana.");
break;
case "Sexta":
System.out.println("Sextou!");
break;
default:
System.out.println("Fim de semana.");
}
}
}

Exercícios:
1. Crie um programa que receba a nota de um aluno (0 a 100) e imprima se ele foi
aprovado (>= 70), em recuperação (>= 50 e < 70) ou reprovado (< 50).
2. Escreva um programa que, dado um número de 1 a 7, imprima o dia da semana
correspondente (1 para Domingo, 2 para Segunda, etc.) usando a estrutura switch .

Dia 4: Estruturas de Repetição (for, while, do-while)

Teoria:
* Laço for para iterações com número conhecido de repetições.
* Laço while para repetições baseadas em uma condição.
* Laço do-while para garantir que o bloco de código seja executado pelo menos uma
vez.
* Instruções break e continue .

Exemplo de Código: Laços de Repetição


public class ContagemRegressiva {
public static void main(String[] args) {
// Loop for
for (int i = 5; i > 0; i--) {
System.out.println("Contagem regressiva: " + i);
}

// Loop while
int contador = 0;
while (contador < 3) {
System.out.println("Contador while: " + contador);
contador++;
}

// Loop do-while
int j = 0;
do {
System.out.println("Contador do-while: " + j);
j++;
} while (j < 2);
}
}

Exercícios:
1. Crie um programa que imprima todos os números pares de 1 a 20 usando um laço
for .
2. Escreva um programa que solicite ao usuário um número inteiro positivo. O programa
deve continuar pedindo até que um número positivo seja inserido, usando um laço do-
while .

Dia 5: Arrays e Métodos

Teoria:
* O que são arrays? Declaração, inicialização e acesso a elementos.
* Arrays unidimensionais.
* Introdução a métodos (funções): declaração, parâmetros e retorno.
* Chamada de métodos.

Exemplo de Código: Arrays e Métodos

public class ManipuladorArray {

public static void main(String[] args) {


int[] numeros = {10, 20, 30, 40, 50};

System.out.println("Primeiro elemento: " + numeros[0]);


System.out.println("Terceiro elemento: " + numeros[2]);
// Chamando um método
imprimirArray(numeros);

int somaTotal = somarElementos(numeros);


System.out.println("Soma total dos elementos: " + somaTotal);
}

// Método para imprimir elementos de um array


public static void imprimirArray(int[] arr) {
System.out.println("Elementos do array:");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

// Método para somar elementos de um array


public static int somarElementos(int[] arr) {
int soma = 0;
for (int numero : arr) {
soma += numero;
}
return soma;
}
}

Exercícios:
1. Crie um programa que declare um array de strings com 5 nomes. Imprima cada nome
do array usando um laço for-each .
2. Escreva um método que receba um array de inteiros como parâmetro e retorne o
maior valor presente no array. Teste o método em seu programa principal.

Mini-Projeto da Semana 1: Sistema de Notas Simples

Objetivo: Desenvolver um programa que permita ao usuário inserir notas de alunos,


calcular a média e informar se o aluno foi aprovado ou reprovado.

Requisitos:
1. O programa deve solicitar ao usuário o número de notas a serem inseridas.
2. Em seguida, deve solicitar cada nota individualmente.
3. As notas devem ser armazenadas em um array.
4. O programa deve calcular a média das notas.
5. Com base na média, deve informar se o aluno foi aprovado (média >= 70) ou
reprovado.
6. Utilize estruturas condicionais e de repetição aprendidas durante a semana.
7. Crie um método para calcular a média das notas.
Semana 2: Orientação a Objetos e Classes Essenciais

Objetivo: Introduzir os conceitos fundamentais de Orientação a Objetos (POO) em Java


e explorar algumas classes essenciais.

Dia 6: Introdução à Orientação a Objetos (POO) e Classes

Teoria:
* O que é POO? Pilares: Encapsulamento, Herança, Polimorfismo, Abstração.
* Conceito de Classe e Objeto.
* Definição de atributos (variáveis de instância) e métodos (comportamentos).
* Construtores: criação de objetos.
* Palavra-chave this .

Exemplo de Código: Classe Carro

public class Carro {


// Atributos
String marca;
String modelo;
int ano;

// Construtor
public Carro(String marca, String modelo, int ano) {
this.marca = marca;
this.modelo = modelo;
this.ano = ano;
}

// Método
public void exibirDetalhes() {
System.out.println("Marca: " + marca + ", Modelo: " + modelo + ", Ano: " + ano);
}

public static void main(String[] args) {


// Criando objetos (instâncias da classe Carro)
Carro meuCarro = new Carro("Toyota", "Corolla", 2022);
Carro outroCarro = new Carro("Honda", "Civic", 2020);

meuCarro.exibirDetalhes();
outroCarro.exibirDetalhes();
}
}

Exercícios:
1. Crie uma classe Pessoa com atributos nome , idade e cidade . Adicione um
construtor e um método apresentar() que imprima os detalhes da pessoa.
2. Crie dois objetos da classe Pessoa e chame o método apresentar() para cada um.

Dia 7: Encapsulamento e Modificadores de Acesso

Teoria:
* Conceito de Encapsulamento: proteger os dados e expor apenas o necessário.
* Modificadores de acesso: public , private , protected , default (package-private).
* Métodos getters e setters para acessar e modificar atributos privados.

Exemplo de Código: Encapsulamento com ContaBancaria

public class ContaBancaria {


private String numeroConta;
private double saldo;

public ContaBancaria(String numeroConta, double saldoInicial) {


this.numeroConta = numeroConta;
this.saldo = saldoInicial;
}

// Getter para numeroConta


public String getNumeroConta() {
return numeroConta;
}

// Getter para saldo


public double getSaldo() {
return saldo;
}

// Setter para saldo (exemplo simples, em um sistema real teria validações)


public void depositar(double valor) {
if (valor > 0) {
this.saldo += valor;
System.out.println("Depósito de " + valor + " realizado. Novo saldo: " +
this.saldo);
} else {
System.out.println("Valor de depósito inválido.");
}
}

public void sacar(double valor) {


if (valor > 0 && valor <= this.saldo) {
this.saldo -= valor;
System.out.println("Saque de " + valor + " realizado. Novo saldo: " +
this.saldo);
} else {
System.out.println("Saque inválido ou saldo insuficiente.");
}
}

public static void main(String[] args) {


ContaBancaria minhaConta = new ContaBancaria("12345-6", 1000.0);
System.out.println("Número da Conta: " + minhaConta.getNumeroConta());
System.out.println("Saldo Inicial: " + minhaConta.getSaldo());

minhaConta.depositar(200.0);
minhaConta.sacar(50.0);
minhaConta.sacar(1500.0); // Tentativa de saque inválido
}
}

Exercícios:
1. Modifique a classe Pessoa do Dia 6 para que os atributos nome , idade e cidade
sejam private . Adicione getters e setters para cada um.
2. Crie um método fazerAniversario() na classe Pessoa que aumente a idade em 1.
Garanta que a idade não possa ser definida para um valor negativo usando o setter .

Dia 8: Herança

Teoria:
* Conceito de Herança: reutilização de código e hierarquia de classes.
* Palavras-chave extends e super .
* Sobrescrita de métodos ( @Override ).
* Classes Object (classe pai de todas as classes em Java).

Exemplo de Código: Herança com Animal e Cachorro

public class Animal {


String nome;

public Animal(String nome) {


this.nome = nome;
}

public void fazerSom() {


System.out.println("Animal fazendo som.");
}
}

public class Cachorro extends Animal {


String raca;

public Cachorro(String nome, String raca) {


super(nome); // Chama o construtor da classe pai (Animal)
this.raca = raca;
}

@Override
public void fazerSom() {
System.out.println("Latido!");
}

public void abanarRabo() {


System.out.println(nome + " está abanando o rabo.");
}

public static void main(String[] args) {


Animal meuAnimal = new Animal("Bicho");
meuAnimal.fazerSom();

Cachorro meuCachorro = new Cachorro("Rex", "Labrador");


meuCachorro.fazerSom(); // Chama o método sobrescrito
meuCachorro.abanarRabo();
System.out.println("Nome do cachorro: " + meuCachorro.nome + ", Raça: " +
meuCachorro.raca);
}
}

Exercícios:
1. Crie uma classe Veiculo com atributos marca e ano . Crie um método acelerar() .
2. Crie uma classe CarroEsportivo que herde de Veiculo . Adicione um atributo
velocidadeMaxima e sobrescreva o método acelerar() para imprimir uma mensagem
diferente.

Dia 9: Polimorfismo e Classes Abstratas/Interfaces

Teoria:
* Conceito de Polimorfismo: um objeto pode assumir muitas formas.
* Polimorfismo em tempo de compilação (sobrecarga de métodos).
* Polimorfismo em tempo de execução (sobrescrita de métodos).
* Classes Abstratas: o que são, quando usar, métodos abstratos.
* Interfaces: o que são, quando usar, diferença para classes abstratas.

Exemplo de Código: Polimorfismo com Formas

// Interface
interface Forma {
double calcularArea();
}

// Classe Concreta implementando a interface


class Circulo implements Forma {
double raio;

public Circulo(double raio) {


this.raio = raio;
}

@Override
public double calcularArea() {
return Math.PI * raio * raio;
}
}

// Classe Abstrata
abstract class Quadrilatero implements Forma {
// Atributos e métodos comuns a todos os quadriláteros
double lado1, lado2, lado3, lado4;

public Quadrilatero(double l1, double l2, double l3, double l4) {


this.lado1 = l1;
this.lado2 = l2;
this.lado3 = l3;
this.lado4 = l4;
}

// Método abstrato (deve ser implementado pelas subclasses)


public abstract void exibirTipo();
}

// Classe Concreta herdando de classe abstrata


class Retangulo extends Quadrilatero {
double largura;
double altura;

public Retangulo(double largura, double altura) {


super(largura, altura, largura, altura); // Lados do retângulo
this.largura = largura;
this.altura = altura;
}

@Override
public double calcularArea() {
return largura * altura;
}

@Override
public void exibirTipo() {
System.out.println("Sou um Retângulo.");
}
}

public class TestePolimorfismo {


public static void main(String[] args) {
Forma circulo = new Circulo(5.0);
Forma retangulo = new Retangulo(4.0, 6.0);

System.out.println("Área do Círculo: " + circulo.calcularArea());


System.out.println("Área do Retângulo: " + retangulo.calcularArea());

// Polimorfismo com array de Formas


Forma[] formas = new Forma[2];
formas[0] = new Circulo(3.0);
formas[1] = new Retangulo(2.0, 5.0);

for (Forma f : formas) {


System.out.println("Área: " + f.calcularArea());
if (f instanceof Retangulo) {
((Retangulo) f).exibirTipo(); // Downcasting para chamar método específico
}
}
}
}

Exercícios:
1. Crie uma interface Acao com um método executar() . Crie duas classes que
implementem essa interface: Caminhar e Correr . No método main , crie objetos de
ambas as classes e chame executar() .
2. Crie uma classe abstrata Funcionario com atributos nome e salario e um método
abstrato calcularSalarioAnual() . Crie duas classes concretas que herdem de
Funcionario : Gerente e Desenvolvedor , implementando o método abstrato de forma
diferente para cada um.

Dia 10: Classes Essenciais (String, Math, Scanner)

Teoria:
* Classe String : imutabilidade, métodos úteis (length, charAt, substring, equals, etc.).
* Classe Math : métodos para operações matemáticas (sqrt, pow, random, etc.).
* Classe Scanner : entrada de dados do usuário via console.

Exemplo de Código: Uso de Classes Essenciais

import java.util.Scanner; // Importa a classe Scanner

public class ExemploClassesEssenciais {


public static void main(String[] args) {
// Classe String
String saudacao = "Olá, Java!";
System.out.println("Tamanho da string: " + saudacao.length());
System.out.println("Caractere na posição 4: " + saudacao.charAt(4));
System.out.println("Substring: " + saudacao.substring(5, 9));
System.out.println("Comparação: " + saudacao.equals("Olá, java!"));

// Classe Math
double raizQuadrada = Math.sqrt(25.0);
System.out.println("Raiz quadrada de 25: " + raizQuadrada);
double potencia = Math.pow(2, 3);
System.out.println("2 elevado a 3: " + potencia);
int numeroAleatorio = (int) (Math.random() * 100); // Gera número entre 0 e 99
System.out.println("Número aleatório: " + numeroAleatorio);

// Classe Scanner
Scanner scanner = new Scanner(System.in); // Cria um objeto Scanner

System.out.print("Digite seu nome: ");


String nomeUsuario = scanner.nextLine(); // Lê a linha inteira
System.out.println("Olá, " + nomeUsuario + "!");

System.out.print("Digite sua idade: ");


int idadeUsuario = scanner.nextInt(); // Lê um inteiro
System.out.println("Sua idade é: " + idadeUsuario);

scanner.close(); // Fecha o scanner para liberar recursos


}
}

Exercícios:
1. Crie um programa que solicite ao usuário uma frase e conte quantas vezes a letra 'a'
(maiúscula ou minúscula) aparece na frase.
2. Escreva um programa que simule um jogo de adivinhação. O programa deve gerar um
número aleatório entre 1 e 100. O usuário tenta adivinhar o número, e o programa
informa se o palpite foi muito alto, muito baixo ou correto. O jogo continua até o usuário
acertar.

Mini-Projeto da Semana 2: Sistema de Gerenciamento de Biblioteca Simples

Objetivo: Desenvolver um sistema básico para gerenciar livros em uma biblioteca,


aplicando os conceitos de POO.

Requisitos:
1. Crie uma classe Livro com atributos titulo , autor , anoPublicacao e disponivel
(boolean).
2. A classe Livro deve ter um construtor e métodos getters para todos os atributos.
Adicione um método emprestar() que mude o status disponivel para false e um
método devolver() que mude para true .
3. Crie uma classe Biblioteca que contenha um array de objetos Livro .
4. A classe Biblioteca deve ter métodos para:
* adicionarLivro(Livro livro) : adiciona um livro ao array.
* listarLivros() : imprime os detalhes de todos os livros na biblioteca.
* buscarLivroPorTitulo(String titulo) : busca um livro pelo título e retorna o objeto
Livro (ou null se não encontrado).
* emprestarLivro(String titulo) : busca o livro e, se disponível, o empresta.
* devolverLivro(String titulo) : busca o livro e o devolve.
5. No método main , crie uma instância da Biblioteca , adicione alguns livros, liste-os,
tente emprestar e devolver livros, e demonstre a funcionalidade de busca.

Semana 3: Coleções, Exceções e Entrada/Saída

Objetivo: Aprofundar o conhecimento em estruturas de dados com as Collections API,


aprender a lidar com erros usando exceções e manipular arquivos.

Dia 11: Collections API - Listas

Teoria:
* Introdução às Collections API: List , Set , Map .
* Interface List : ArrayList e LinkedList .
* Adicionar, remover, acessar e iterar elementos em listas.
* Diferenças entre ArrayList e LinkedList .

Exemplo de Código: ArrayList

import java.util.ArrayList;
import java.util.List;

public class ExemploArrayList {


public static void main(String[] args) {
// Criando um ArrayList de Strings
List<String> nomes = new ArrayList<>();

// Adicionando elementos
nomes.add("Alice");
nomes.add("Bob");
nomes.add("Charlie");
nomes.add(1, "David"); // Adiciona na posição 1

System.out.println("Lista de nomes: " + nomes);

// Acessando elementos
System.out.println("Primeiro nome: " + nomes.get(0));

// Removendo elementos
nomes.remove("Bob"); // Remove pelo valor
nomes.remove(0); // Remove pelo índice (Alice)

System.out.println("Lista após remoções: " + nomes);

// Iterando sobre a lista


System.out.println("Elementos restantes:");
for (String nome : nomes) {
System.out.println(nome);
}

// Verificando se a lista contém um elemento


System.out.println("Contém Charlie? " + nomes.contains("Charlie"));
System.out.println("Tamanho da lista: " + nomes.size());
}
}

Exercícios:
1. Crie um ArrayList de números inteiros. Adicione 5 números, remova o terceiro
elemento e imprima a lista resultante.
2. Escreva um programa que leia uma lista de palavras do usuário até que ele digite
"fim". Armazene as palavras em um ArrayList e, ao final, imprima todas as palavras em
ordem alfabética.

Dia 12: Collections API - Sets e Maps

Teoria:
* Interface Set : HashSet e LinkedHashSet .
* Características de um Set : não permite elementos duplicados, não garante ordem.
* Interface Map : HashMap e LinkedHashMap .
* Características de um Map : armazena pares chave-valor, chaves únicas.

Exemplo de Código: HashSet e HashMap

import java.util.HashSet;
import java.util.HashMap;
import java.util.Set;
import java.util.Map;

public class ExemploSetMap {


public static void main(String[] args) {
// Exemplo de HashSet
Set<String> frutas = new HashSet<>();
frutas.add("Maçã");
frutas.add("Banana");
frutas.add("Laranja");
frutas.add("Maçã"); // Tentando adicionar duplicata, será ignorada
System.out.println("Set de frutas: " + frutas);
System.out.println("Contém Banana? " + frutas.contains("Banana"));

// Exemplo de HashMap
Map<String, Integer> idades = new HashMap<>();
idades.put("João", 30);
idades.put("Maria", 25);
idades.put("Pedro", 35);
idades.put("João", 31); // Atualiza o valor para a chave "João"

System.out.println("Map de idades: " + idades);


System.out.println("Idade de Maria: " + idades.get("Maria"));

// Iterando sobre as chaves de um Map


System.out.println("Nomes no Map:");
for (String nome : idades.keySet()) {
System.out.println(nome);
}

// Iterando sobre os valores de um Map


System.out.println("Idades no Map:");
for (Integer idade : idades.values()) {
System.out.println(idade);
}

// Iterando sobre as entradas (chave-valor) de um Map


System.out.println("Entradas no Map:");
for (Map.Entry<String, Integer> entrada : idades.entrySet()) {
System.out.println(entrada.getKey() + " = " + entrada.getValue());
}
}
}

Exercícios:
1. Crie um HashSet de números inteiros. Adicione alguns números, incluindo
duplicatas, e imprima o Set para verificar que as duplicatas foram ignoradas.
2. Crie um HashMap onde a chave é o nome de um país (String) e o valor é sua capital
(String). Adicione 3-4 pares país-capital e, em seguida, solicite ao usuário um país e
imprima sua capital. Se o país não for encontrado, informe ao usuário.

Dia 13: Tratamento de Exceções

Teoria:
* O que são exceções? Erros em tempo de execução.
* Tipos de exceções: Checked vs. Unchecked (RuntimeException).
* Blocos try-catch-finally .
* Lançando exceções ( throw e throws ).
* Criando exceções personalizadas.
Exemplo de Código: Tratamento de Exceções

import java.util.InputMismatchException;
import java.util.Scanner;

public class ExemploExcecoes {


public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

try {
System.out.print("Digite um número inteiro: ");
int numero = scanner.nextInt();
System.out.println("Número digitado: " + numero);

int resultadoDivisao = 10 / numero;


System.out.println("10 dividido por " + numero + " = " + resultadoDivisao);

} catch (InputMismatchException e) {
System.err.println("Erro: Entrada inválida. Por favor, digite um número
inteiro.");
// e.printStackTrace(); // Para depuração
} catch (ArithmeticException e) {
System.err.println("Erro: Divisão por zero não é permitida.");
} catch (Exception e) { // Captura qualquer outra exceção
System.err.println("Ocorreu um erro inesperado: " + e.getMessage());
} finally {
System.out.println("Bloco finally sempre é executado.");
scanner.close();
}

System.out.println("Programa continua após o tratamento de exceção.");

// Exemplo de lançamento de exceção


try {
validarIdade(15);
} catch (IllegalArgumentException e) {
System.err.println("Erro ao validar idade: " + e.getMessage());
}
}

public static void validarIdade(int idade) throws IllegalArgumentException {


if (idade < 18) {
throw new IllegalArgumentException("Idade deve ser maior ou igual a 18.");
}
System.out.println("Idade válida: " + idade);
}
}

Exercícios:
1. Crie um programa que solicite ao usuário dois números. Realize a divisão do primeiro
pelo segundo. Utilize try-catch para tratar a exceção de ArithmeticException (divisão
por zero) e InputMismatchException (entrada não numérica).
2. Escreva um método que receba um array de inteiros e um índice. O método deve
retornar o elemento no índice especificado. Utilize try-catch para tratar a exceção
ArrayIndexOutOfBoundsException caso o índice seja inválido.

Dia 14: Entrada e Saída (I/O) de Arquivos

Teoria:
* Conceitos básicos de I/O: InputStream , OutputStream , Reader , Writer .
* Leitura de arquivos de texto: FileReader , BufferedReader .
* Escrita em arquivos de texto: FileWriter , BufferedWriter , PrintWriter .
* Tratamento de IOException .
* try-with-resources para fechar recursos automaticamente.

Exemplo de Código: Leitura e Escrita de Arquivos

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class ExemploIOArquivos {


private static final String NOME_ARQUIVO = "meu_arquivo.txt";

public static void main(String[] args) {


// Escrevendo no arquivo
try (PrintWriter writer = new PrintWriter(new BufferedWriter(new
FileWriter(NOME_ARQUIVO)))) {
writer.println("Esta é a primeira linha.");
writer.println("Esta é a segunda linha.");
writer.printf("Número: %d%n", 123);
System.out.println("Dados escritos no arquivo: " + NOME_ARQUIVO);
} catch (IOException e) {
System.err.println("Erro ao escrever no arquivo: " + e.getMessage());
}

// Lendo do arquivo
try (BufferedReader reader = new BufferedReader(new
FileReader(NOME_ARQUIVO))) {
String linha;
System.out.println("\nConteúdo do arquivo " + NOME_ARQUIVO + ":");
while ((linha = reader.readLine()) != null) {
System.out.println(linha);
}
} catch (IOException e) {
System.err.println("Erro ao ler do arquivo: " + e.getMessage());
}
}
}

Exercícios:
1. Crie um programa que solicite ao usuário algumas linhas de texto. O programa deve
salvar essas linhas em um arquivo chamado saida.txt . O usuário deve digitar "fim" para
parar a entrada.
2. Escreva um programa que leia o conteúdo do arquivo saida.txt criado no exercício
anterior e imprima cada linha no console, numerando-as (ex: "1: Esta é a primeira
linha.").

Dia 15: Classes Utilitárias e Data/Hora

Teoria:
* java.util.Arrays : métodos para manipular arrays (sort, fill, copyOf, etc.).
* java.util.Collections : métodos utilitários para coleções (sort, shuffle, reverse, etc.).
* API de Data e Hora (Java 8+): LocalDate , LocalTime , LocalDateTime , Duration ,
Period , DateTimeFormatter .

Exemplo de Código: Data/Hora e Utilitários

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

public class ExemploDataHoraUtilitarios {


public static void main(String[] args) {
// Exemplo com Arrays
int[] numeros = {5, 2, 8, 1, 9};
Arrays.sort(numeros);
System.out.println("Array ordenado: " + Arrays.toString(numeros));

// Exemplo com Collections


List<String> nomes = new ArrayList<>(Arrays.asList("Maria", "João", "Ana"));
Collections.sort(nomes);
System.out.println("Lista de nomes ordenada: " + nomes);
Collections.reverse(nomes);
System.out.println("Lista de nomes invertida: " + nomes);

// Exemplo com LocalDate, LocalTime, LocalDateTime


LocalDate hoje = LocalDate.now();
System.out.println("Hoje: " + hoje);

LocalTime agora = LocalTime.now();


System.out.println("Agora: " + agora);

LocalDateTime dataHoraAtual = LocalDateTime.now();


System.out.println("Data e Hora Atual: " + dataHoraAtual);

LocalDate dataEspecifica = LocalDate.of(2025, 12, 25);


System.out.println("Natal de 2025: " + dataEspecifica);

// Formatando data e hora


DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy
HH:mm:ss");
String dataHoraFormatada = dataHoraAtual.format(formatter);
System.out.println("Data e Hora Formatada: " + dataHoraFormatada);

// Adicionando/Subtraindo tempo
LocalDate amanha = hoje.plusDays(1);
System.out.println("Amanhã: " + amanha);

LocalTime daquiUmaHora = agora.plusHours(1);


System.out.println("Daqui a uma hora: " + daquiUmaHora);
}
}

Exercícios:
1. Crie um programa que declare um array de 10 números inteiros aleatórios. Ordene o
array e imprima-o. Em seguida, embaralhe o array e imprima-o novamente.
2. Escreva um programa que calcule a sua idade exata em anos, meses e dias, dada a
sua data de nascimento e a data atual. Utilize a API de Data e Hora do Java 8+.

Mini-Projeto da Semana 3: Gerenciador de Tarefas com Persistência

Objetivo: Desenvolver um aplicativo de linha de comando para gerenciar tarefas, com a


capacidade de salvar e carregar as tarefas de um arquivo.

Requisitos:
1. Crie uma classe Tarefa com atributos descricao (String), dataVencimento
(LocalDate) e concluida (boolean).
2. A classe Tarefa deve ter um construtor e métodos getters e setters apropriados.
3. Crie uma classe GerenciadorTarefas que utilize um ArrayList<Tarefa> para
armazenar as tarefas.
4. O GerenciadorTarefas deve ter métodos para:
* adicionarTarefa(String descricao, LocalDate dataVencimento)
* listarTarefas() : imprime todas as tarefas, indicando se estão concluídas e a data de
vencimento.
* marcarTarefaConcluida(int indice)
* removerTarefa(int indice)
* salvarTarefas(String nomeArquivo) : salva as tarefas em um arquivo de texto (um
formato simples, como CSV ou um por linha).
* carregarTarefas(String nomeArquivo) : carrega as tarefas de um arquivo de texto.
5. No método main , implemente um menu interativo que permita ao usuário:
* Adicionar nova tarefa.
* Listar todas as tarefas.
* Marcar tarefa como concluída.
* Remover tarefa.
* Salvar tarefas em arquivo.
* Carregar tarefas de arquivo.
* Sair do programa.
6. Utilize tratamento de exceções para lidar com entradas inválidas do usuário e erros
de I/O.

Semana 4: Programação Avançada e Tópicos Complementares

Objetivo: Explorar tópicos mais avançados como Generics, Streams API, Programação
Funcional e introdução a JDBC para interação com banco de dados.

Dia 16: Generics

Teoria:
* O que são Generics? Vantagens: segurança de tipo em tempo de compilação,
eliminação de casts, reutilização de código.
* Classes e interfaces genéricas.
* Métodos genéricos.
* Wildcards ( ? ).

Exemplo de Código: Classe Caixa Genérica

// Classe genérica
public class Caixa<T> {
private T conteudo;

public Caixa(T conteudo) {


this.conteudo = conteudo;
}

public T getConteudo() {
return conteudo;
}
public void setConteudo(T conteudo) {
this.conteudo = conteudo;
}

// Método genérico
public static <U> void imprimirConteudo(Caixa<U> caixa) {
System.out.println("Conteúdo da caixa: " + caixa.getConteudo());
}

public static void main(String[] args) {


Caixa<String> caixaString = new Caixa<>("Olá, Generics!");
System.out.println("Conteúdo da caixa de String: " +
caixaString.getConteudo());

Caixa<Integer> caixaInteger = new Caixa<>(123);


System.out.println("Conteúdo da caixa de Integer: " +
caixaInteger.getConteudo());

imprimirConteudo(caixaString);
imprimirConteudo(caixaInteger);

// Exemplo com wildcard


Caixa<? extends Number> caixaNumero = new Caixa<>(10.5);
// caixaNumero.setConteudo(20); // Erro de compilação: não pode adicionar com
wildcard extends
System.out.println("Conteúdo da caixa de Número: " +
caixaNumero.getConteudo());
}
}

Exercícios:
1. Crie uma classe genérica Par<K, V> que armazene um par de valores (chave e valor).
Crie um construtor e métodos getK() e getV() .
2. Escreva um método genérico trocarElementos(List<T> lista, int i, int j) que troque
dois elementos de posição em uma lista genérica.

Dia 17: Streams API (Java 8+)

Teoria:
* Introdução à Streams API: processamento de coleções de forma declarativa e
funcional.
* Operações intermediárias (filter, map, sorted, distinct, limit, skip).
* Operações terminais (forEach, collect, reduce, count, min, max, anyMatch, allMatch,
noneMatch).
* Construindo pipelines de Stream.

Exemplo de Código: Streams API


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ExemploStreamsAPI {


public static void main(String[] args) {
List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// Filtrar números pares e multiplicar por 2


List<Integer> numerosParesDobrados = numeros.stream()
.filter(n -> n % 2 == 0) // Operação intermediária: filtra
pares
.map(n -> n * 2) // Operação intermediária: dobra o
valor
.collect(Collectors.toList()); // Operação terminal: coleta
em uma nova lista

System.out.println("Números pares dobrados: " + numerosParesDobrados);

// Somar todos os números


int soma = numeros.stream()
.reduce(0, (a, b) -> a + b); // Operação terminal: reduz para um único
valor
System.out.println("Soma de todos os números: " + soma);

// Contar números maiores que 5


long countMaioresQueCinco = numeros.stream()
.filter(n -> n > 5)
.count(); // Operação terminal: conta elementos
System.out.println("Quantidade de números maiores que 5: " +
countMaioresQueCinco);

List<String> palavras = Arrays.asList("java", "stream", "api", "programacao",


"funcional");

// Converter para maiúsculas e ordenar


List<String> palavrasMaiusculasOrdenadas = palavras.stream()
.map(String::toUpperCase) // Referência de método
.sorted()
.collect(Collectors.toList());
System.out.println("Palavras em maiúsculas e ordenadas: " +
palavrasMaiusculasOrdenadas);
}
}

Exercícios:
1. Dada uma lista de strings, use Streams para filtrar apenas as strings que começam
com a letra 'A' e, em seguida, imprima-as em ordem alfabética.
2. Dada uma lista de objetos Produto (com atributos nome e preco ), use Streams
para calcular o preço total de todos os produtos que custam mais de R$ 50,00.

Dia 18: Programação Funcional e Expressões Lambda

Teoria:
* Conceitos de Programação Funcional: funções como cidadãos de primeira classe,
imutabilidade, efeitos colaterais.
* Expressões Lambda (Java 8+): sintaxe e uso.
* Interfaces Funcionais ( @FunctionalInterface ).
* Referências de Método.

Exemplo de Código: Expressões Lambda

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;

public class ExemploLambda {

public static void main(String[] args) {


List<String> nomes = Arrays.asList("Ana", "Bruno", "Carlos", "Daniela");

// Usando expressão lambda com forEach


System.out.println("Imprimindo nomes com lambda:");
nomes.forEach(nome -> System.out.println(nome));

// Usando expressão lambda para filtrar e imprimir


System.out.println("Nomes que começam com 'A':");
nomes.stream()
.filter(nome -> nome.startsWith("A"))
.forEach(System.out::println); // Referência de método

// Interface funcional personalizada


OperacaoMatematica soma = (a, b) -> a + b;
OperacaoMatematica multiplicacao = (a, b) -> a * b;

System.out.println("Soma: " + soma.calcular(5, 3));


System.out.println("Multiplicação: " + multiplicacao.calcular(5, 3));

// Exemplo de Predicate (interface funcional)


Predicate<Integer> isPar = numero -> numero % 2 == 0;
System.out.println("10 é par? " + isPar.test(10));
System.out.println("7 é par? " + isPar.test(7));

// Exemplo de Consumer (interface funcional)


Consumer<String> imprimirMaiusculo = texto ->
System.out.println(texto.toUpperCase());
imprimirMaiusculo.accept("hello world");
}
}

@FunctionalInterface
interface OperacaoMatematica {
int calcular(int a, int b);
}

Exercícios:
1. Crie uma interface funcional VerificadorString com um método boolean
verificar(String s) . Implemente-a usando uma expressão lambda para verificar se uma
string é vazia.
2. Dada uma lista de números, use forEach com uma expressão lambda para imprimir
o quadrado de cada número.

Dia 19: Introdução a JDBC (Java Database Connectivity)

Teoria:
* O que é JDBC? Conectando Java a bancos de dados.
* Driver JDBC.
* Classes principais: Connection , Statement , PreparedStatement , ResultSet .
* Executando consultas SQL (SELECT, INSERT, UPDATE, DELETE).
* Tratamento de SQLException .

Exemplo de Código: JDBC Básico (SQLite)

(Nota: Para rodar este exemplo, você precisará adicionar a dependência do driver SQLite
ao seu projeto. Se estiver usando Maven, adicione ao pom.xml :)

<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.45.1.0</version>
</dependency>

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ExemploJDBC {


private static final String URL = "jdbc:sqlite:meubanco.db"; // Conecta a um
arquivo SQLite

public static void main(String[] args) {


try {
// 1. Carregar o driver (não é estritamente necessário para JDBC 4.0+)
// Class.forName("org.sqlite.JDBC");

// 2. Estabelecer a conexão
Connection conn = DriverManager.getConnection(URL);
System.out.println("Conexão com o banco de dados estabelecida.");

// 3. Criar uma tabela (se não existir)


Statement stmt = conn.createStatement();
String sqlCreateTable = "CREATE TABLE IF NOT EXISTS usuarios (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"nome TEXT NOT NULL," +
"idade INTEGER);";
stmt.execute(sqlCreateTable);
System.out.println("Tabela 'usuarios' verificada/criada.");

// 4. Inserir dados
String sqlInsert = "INSERT INTO usuarios(nome, idade) VALUES(?, ?)";
PreparedStatement pstmtInsert = conn.prepareStatement(sqlInsert);
pstmtInsert.setString(1, "Alice");
pstmtInsert.setInt(2, 30);
pstmtInsert.executeUpdate();

pstmtInsert.setString(1, "Bob");
pstmtInsert.setInt(2, 25);
pstmtInsert.executeUpdate();
System.out.println("Dados inseridos.");

// 5. Consultar dados
String sqlSelect = "SELECT id, nome, idade FROM usuarios";
ResultSet rs = stmt.executeQuery(sqlSelect);

System.out.println("\nUsuários no banco de dados:");


while (rs.next()) {
System.out.println("ID: " + rs.getInt("id") +
", Nome: " + rs.getString("nome") +
", Idade: " + rs.getInt("idade"));
}

// 6. Atualizar dados
String sqlUpdate = "UPDATE usuarios SET idade = ? WHERE nome = ?";
PreparedStatement pstmtUpdate = conn.prepareStatement(sqlUpdate);
pstmtUpdate.setInt(1, 31);
pstmtUpdate.setString(2, "Alice");
pstmtUpdate.executeUpdate();
System.out.println("\nDados atualizados.");

// 7. Deletar dados
String sqlDelete = "DELETE FROM usuarios WHERE nome = ?";
PreparedStatement pstmtDelete = conn.prepareStatement(sqlDelete);
pstmtDelete.setString(1, "Bob");
pstmtDelete.executeUpdate();
System.out.println("Dados deletados.");

// Consultar novamente para verificar


rs = stmt.executeQuery(sqlSelect);
System.out.println("\nUsuários restantes:");
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id") +
", Nome: " + rs.getString("nome") +
", Idade: " + rs.getInt("idade"));
}

// 8. Fechar recursos
rs.close();
stmt.close();
pstmtInsert.close();
pstmtUpdate.close();
pstmtDelete.close();
conn.close();
System.out.println("Conexão e recursos fechados.");

} catch (SQLException e) {
System.err.println("Erro de SQL: " + e.getMessage());
} catch (Exception e) {
System.err.println("Ocorreu um erro inesperado: " + e.getMessage());
}
}
}

Exercícios:
1. Modifique o exemplo de JDBC para inserir mais 3 usuários na tabela usuarios .
2. Adicione uma funcionalidade para buscar um usuário pelo id e imprimir seus
detalhes.

Dia 20: Tópicos Avançados e Próximos Passos

Teoria:
* Introdução a Threads e Concorrência (conceitos básicos).
* Programação Assíncrona (Future, CompletableFuture - breve introdução).
* Introdução a Frameworks (Spring Boot, Hibernate - o que são e para que servem).
* Ferramentas de Build (Maven/Gradle - breve introdução).
* Testes Unitários (JUnit - conceitos básicos).

Exemplo de Código: Threads Básicas


public class ExemploThreads {

public static void main(String[] args) {


// Criando uma thread estendendo a classe Thread
MinhaThread thread1 = new MinhaThread("Thread 1");
thread1.start(); // Inicia a execução da thread

// Criando uma thread implementando a interface Runnable


Thread thread2 = new Thread(new MinhaRunnable("Thread 2"));
thread2.start();

System.out.println("Thread principal finalizada.");


}
}

class MinhaThread extends Thread {


private String nome;

public MinhaThread(String nome) {


this.nome = nome;
}

@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(nome + ": Contagem = " + i);
try {
Thread.sleep(500); // Pausa a thread por 500 milissegundos
} catch (InterruptedException e) {
System.out.println(nome + " foi interrompida.");
}
}
System.out.println(nome + " finalizou.");
}
}

class MinhaRunnable implements Runnable {


private String nome;

public MinhaRunnable(String nome) {


this.nome = nome;
}

@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(nome + ": Contagem = " + i);
try {
Thread.sleep(700); // Pausa a thread por 700 milissegundos
} catch (InterruptedException e) {
System.out.println(nome + " foi interrompida.");
}
}
System.out.println(nome + " finalizou.");
}
}

Exercícios:
1. Crie um programa que simule o download de 3 arquivos grandes em paralelo usando
Threads. Cada thread deve "baixar" um arquivo e imprimir uma mensagem quando
terminar.
2. Pesquise sobre o que é o Spring Boot e o Hibernate. Escreva um pequeno resumo (1-2
parágrafos) sobre a função de cada um no desenvolvimento Java.

Mini-Projeto da Semana 4: Aplicação de Linha de Comando com JDBC e Streams

Objetivo: Desenvolver uma aplicação de linha de comando que gerencie uma lista de
produtos, utilizando JDBC para persistência em banco de dados e Streams para
processamento de dados.

Requisitos:
1. Crie uma tabela produtos no banco de dados (SQLite, por exemplo) com colunas id
(PRIMARY KEY), nome (TEXT), preco (REAL) e quantidade (INTEGER).
2. Crie uma classe Produto com atributos correspondentes e métodos getters e
setters .
3. Crie uma classe ProdutoDAO (Data Access Object) que encapsule as operações de
banco de dados para a entidade Produto :
* adicionarProduto(Produto produto)
* listarTodosProdutos() : retorna uma List<Produto> .
* buscarProdutoPorId(int id) : retorna um Produto .
* atualizarProduto(Produto produto)
* deletarProduto(int id)
4. No método main , implemente um menu interativo que permita ao usuário:
* Adicionar novo produto.
* Listar todos os produtos (utilize Streams para filtrar e/ou ordenar a exibição, por
exemplo, produtos com estoque baixo).
* Buscar produto por ID.
* Atualizar produto (preço ou quantidade).
* Deletar produto.
* Sair do programa.
5. Utilize try-with-resources para gerenciar as conexões JDBC e tratamento de exceções
para erros de banco de dados e entrada do usuário.
6. Explore o uso de Streams para operações como:
* Calcular o valor total do estoque.
* Listar produtos com preço acima de um determinado valor.
* Encontrar o produto mais caro/barato.

Recursos Adicionais em Português

Para complementar seus estudos, sugerimos os seguintes recursos:

Tutoriais e Artigos:

• Guia Completo de Java: Aprenda a Linguagem de Programação Java - DevMedia


• Programação Java para iniciantes: o que fazer e por onde começar - CodeGym
• Curso Completo de Java para Iniciantes - Java Progressivo

Vídeos e Cursos em Vídeo:

• Curso de PROGRAMAÇÃO JAVA para INICIANTES - YouTube (Guanabara)


• Java Básico [40 Horas] - Curso em Vídeo (Guanabara)
• Do Zero ao Júnior em JAVA - CURSO COMPLETO - YouTube
• Java para iniciantes | Microsoft Learn

Observações Finais:

• Pratique Diariamente: A consistência é chave no aprendizado de programação.


Tente dedicar um tempo todos os dias para estudar e praticar.
• Não Tenha Medo de Errar: Erros fazem parte do processo. Aprenda com eles e não
desanime.
• Construa Projetos Pessoais: Além dos mini-projetos, tente aplicar o que aprendeu
em ideias próprias. Isso ajuda a solidificar o conhecimento e a construir um
portfólio.
• Participe de Comunidades: Fóruns online, grupos de estudo e comunidades de
desenvolvedores são ótimos lugares para tirar dúvidas, compartilhar
conhecimento e se manter motivado.
• Mantenha-se Atualizado: A tecnologia está sempre evoluindo. Acompanhe blogs,
notícias e novas versões do Java.

Esperamos que este plano de estudos seja um excelente ponto de partida para sua
jornada no mundo Java! Boa sorte e bons estudos!

Você também pode gostar

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy