Udemy Java
Udemy Java
Exemplo:
Algoritmo:
1) Colocar a roupa em um recipiente
2) Colocar um pouco de sabão e amaciante
3) Encher de água
4) Mexer tudo até dissolver todo o sabão
5) Deixar de molho por vinte minutos
6) Esfregar a roupa
7) Enxaguar
8) Torcer
Automação
Consiste em utilizar máquina(s) para executar o procedimento
desejado de forma automática ou semiautomática.
Algoritmo:
Computador
• Hardware - parte física (a máquina em si)
Resumo da aula
• Algoritmo: sequência finita de instruções para se resolver um problema
• Automação: quando uma máquina realiza o algoritmo
• Computador:
• hardware / software
• máquina que automatiza algoritmos (de cálculo)
• Programa de computador: algoritmo executado pelo computador
O que é preciso para se fazer um
programa de computador?
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Léxica
Diz respeito à correção das palavras "isoladas" (ortografia).
cachorro main
caxorro maim
Sintática
Diz respeito à correção das sentenças (gramática).
Linguagem de programação
Media = 4.5
Solução em linguagem C
Solução em linguagem C++
Solução em linguagem C#
Solução em linguagem Java
Resumo da aula
• Linguagem: conjunto de regras léxicas e sintáticas para se escrever
um programa
• Léxica = ortografia. Palavras isoladas.
• Sintática = gramática. Sentença como um todo.
Exemplos:
Resumo da aula
• IDE: é um conjunto de softwares utilizado para a construção de
programas
• C/C++ : Code Blocks
• Java : Eclipse, NetBeans
• C# : Microsoft Visual Studio
Interpretação
Interpretador:
interpretação
Código fonte Execução
análise léxica
+
análise sintática
+
geração de código
SOB DEMANDA
Vantagens
Compilação:
• velocidade do programa
• expressividade da linguagem
Bytecode
Código fonte Código fonte (código precompilado)
Resumo da aula
• Tipos de código
• Código fonte
• Código objeto / bytecode
• Modelos de execução:
• Compilação
• Gerador de código
• Interpretação
• Abordagem híbrida
• Máquina virtual
Curso Java COMPLETO
Capítulo: Introdução à linguagem Java
http://educandoweb.com.br
Prof. Dr. Nelio Alves
http://www.oracle.com/technetwork/java/javase
O que é Java?
• Linguagem de programação (regras sintáticas)
Aspectos notáveis
• Código compilado para bytecode e
executado em máquina virtual (JVM)
• Portável, segura, robusta
• Roda em vários tipos de dispositivos
• Domina o mercado corporativo desde
o fim do século 20
• Padrão Android por muitos anos
Edições
• Java ME - Java Micro Edition - dispositivos embarcados e móveis - IoT
• http://www.oracle.com/technetwork/java/javame
Plataforma Java SE
• Documentação
• https://docs.oracle.com/en/java/javase/11/
Plataforma Java SE
• JVM - Java Virtual Machine
• Máquina virtual do Java - necessário para executar sistemas Java
Compilação e interpretação
• Linguagens compiladas: C, C++
int main() {
double x, y, average;
compilador 1
compilador 3
compilador 2
<?php
print "Enter first number: ";
$x = trim(fgets(STDIN));
print "Enter second number: ";
$y = trim(fgets(STDIN));
$average = ($x + $y) / 2;
print "Average = $average";
?>
import java.util.Scanner;
Java Virtual Machine (JVM)
public class Program {
public static void main(String[] args) { "platform agnostic"
Scanner sc = new Scanner(System.in); compilador
double x, y, average;
System.out.print("Enter first number: ");
Bytecode
x = sc.nextInt();
System.out.print("Enter second number: ");
y = sc.nextInt();
average = (x + y) / 2.0;
System.out.printf("Average = %.2f%n", average);
sc.close();
}
}
Modelo de execução
package course;
Compilação just-in-time
Máquina Virtual Java
(JIT)
JVM
Mais rápido que a
interpretação
Código de máquina
Estrutura de uma aplicação Java
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Class
Class
Class
Class Class
Class
Class Class
package = agrupamento LÓGICO de classes relacionadas
Entities Services
Class Class
Class
Class
Class Repositories
Class
Financial Graphics
Class Class
Aplicação = Agrupamento de módulo relacionados
• Mudar o layout: Window -> Perspective -> Open Perspective -> Java
• Criar classe:
• Botão direito na pasta "src" -> New -> Class
• Package: deixe em branco
• Nome da classe: Main (com M maiúsculo)
• Marque a opção: public static void main(String[] args)
Expressões aritméticas
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Expressões aritméticas
4+5 resultado 9
Operadores aritméticos
Operador Significado
+ adição
C, C++, - subtração
Java, C# * multiplicação
/ divisão
% resto da divisão ("mod")
1º lugar: * / %
Precedência:
2º lugar: + -
Exemplos de expressões aritméticas
2*6/3 Resultado = 4
3+2*4 Resultado = 11
(3 + 2) * 4 Resultado = 20
60 / (3 + 2) * 4 Resultado = 48
60 / ((3 + 2) * 4) Resultado = 3
19 % 5 Resultado = 4
Pois:
14 3 19 5
2 4 4 3
Variáveis e tipos primitivos em
Java
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Visão geral
• Um programa de computador em execução lida com dados
• Em VARIÁVEIS!
Variáveis
Definição informal:
Em programação, uma variável é uma porção de memória (RAM) utilizada para armazenar
dados durante a execução dos programas.
Memória RAM:
(8 Giga Bytes)
Desenho 3 5000.0
esquemático:
x salario
"Maria"
nome
Declaração de variáveis
Sintaxe:
Memória RAM
<tipo> <nome> = <valor inicial>;
(opcional)
25 1.68 F
Exemplos:
int idade = 25; idade altura sexo
double altura = 1.68;
char sexo = 'F';
Veja: unicode-table.com
String - cadeia de caracteres (palavras ou textos)
Exemplo: 'a' = '\u0061'
2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 28 = 256 possibilidades
Nomes de variáveis
• Não pode começar com dígito: use uma letra ou _
• Não pode ter espaço em branco
• Não usar acentos ou til
• Sugestão: use o padrão "camel case"
Errado: Correto:
Resumo da aula
• Conceito informal
• Declaração de variáveis: <tipo> <nome> = valor;
• Tipos primitivos:
• Números inteiros: byte, short, int, long
• Números com ponto flutuante: float, double
• Valor verdade: boolean
• Um caractere Unicode: char
• Tipo String: cadeia de caracteres (palavras, textos)
• Nomes de variáveis / padrão camel case
As três operações básicas de
programação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Usuário Programa
(dentro de variáveis)
Também chamada de
LEITURA:
Processamento de dados
O processamento de
dados se dá por um
comando chamado
ATRIBUIÇÃO
media = (x + y) / 2.0;
Saída de dados Dispositivo de SAÍDA
Programa Usuário
Também chamada de
ESCRITA:
Programa Usuário
Também chamada de
ESCRITA:
System.out.print("Bom dia!");
System.out.println("Bom dia!");
Para escrever o conteúdo de uma variável de
algum tipo básico
Suponha uma variável tipo int declarada e iniciada:
int y = 32;
Memória RAM
System.out.println(y);
32
y
System.out.println(x);
System.out.printf("%.2f%n", x);
Localidade do
System.out.printf("%.4f%n", x); sistema
ATENÇÃO:
Para considerar o separador de decimais como ponto, ANTES da declaração do Scanner, faça:
Locale.setDefault(Locale.US);
Para concatenar vários elementos em um
mesmo comando de escrita
Regra geral para print e println:
%n = quebra de linha
System.out.printf("RESULTADO = %.2f metros%n", x);
%n = quebra de linha
String nome = "Maria";
int idade = 31;
double renda = 4000.0;
System.out.printf("%s tem %d anos e ganha R$ %.2f reais%n", nome, idade, renda);
Resumo da aula
• System.out.print
• System.out.println
• System.out.printf
• %d
• %f
• %s
• %n
• Locale
• Como concatenar vários elementos em um mesmo comando de escrita
• Exemplos
Exercício de fixação
Em um novo programa, inicie as Em seguida, usando os valores das variáveis, produza a
seguintes variáveis: seguinte saída na tela do console:
String product1 = "Computer"; Products:
String product2 = "Office desk"; Computer, which price is $ 2100,00
Office desk, which price is $ 650,50
int age = 30;
int code = 5290;
char gender = 'F'; Record: 30 years old, code 5290 and gender: F
import java.util.Locale;
System.out.println("Products:");
System.out.printf("%s, which price is $ %.2f%n", product1, price1);
System.out.printf("%s, which price is $ %.2f%n", product2, price2);
System.out.println();
System.out.printf("Record: %d years old, code %d and gender: %c%n", age, code, gender);
System.out.println();
System.out.printf("Measue with eight decimal places: %.8f%n", measure);
System.out.printf("Rouded (three decimal places): %.3f%n", measure);
Locale.setDefault(Locale.US);
System.out.printf("US decimal point: %.3f%n", measure);
}
}
• Comentários de linha:
• Começam com //
• Atalhos:
• Importar classes: CTRL + SHIFT + O
• Autoendentação: CTRL + SHIFT + F
• sysout CTRL + espaço
Processamento de dados em
Java, Casting
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Processamento de dados
Comando de atribuição.
Sintaxe: REGRA:
1) A expressão é calculada
<variável> = <expressão>;
2) O resultado da expressão é
armazenado na variável
Lê-se “recebe”
Exemplo 1
int x, y;
x = 5;
y = 2 * x;
System.out.println(x);
System.out.println(y);
Exemplo 2
int x;
double y;
x = 5;
y = 2 * x;
System.out.println(x);
System.out.println(y);
b=6
Exemplo 3
h=5
b = 6.0; ( + )
= ×ℎ
B = 8.0; 2
h = 5.0;
No exemplo:
area = (b + B) / 2.0 * h; (6 + 8)
= ×5
2
System.out.println(area); 14
= × 5 = 7 × 5 = 35
2
double b, B, h, area; Boa prática:
a = 5;
b = 2;
resultado = a / b;
System.out.println(resultado);
Casting
É a conversão explícita de um tipo para outro.
a = 5;
b = 2;
resultado = a / b;
System.out.println(resultado);
Exemplo 4
int a, b;
double resultado;
a = 5;
b = 2;
resultado = (double) a / b;
System.out.println(resultado);
Exemplo 5
double a;
int b;
a = 5.0;
b = a;
System.out.println(b);
Usuário Programa
(dentro de variáveis)
Também chamada de
LEITURA:
int x;
Memória RAM
32
x
32 ENTER
Scanner
Para fazer entrada de dados, nós vamos criar um objeto do tipo
"Scanner" da seguinte forma:
String x;
x = sc.next();
Memória RAM
"Maria"
x
Para ler um número inteiro
Suponha uma variável tipo int declarada:
int x;
x = sc.nextInt();
Memória RAM
10
double x;
x = sc.nextDouble();
Localidade do sistema
ATENÇÃO:
Para considerar o separador de decimais como ponto, ANTES da declaração do Scanner, faça:
Locale.setDefault(Locale.US);
Para ler um caractere
Suponha uma variável tipo char declarada:
char x;
x = sc.next().charAt(0);
x = sc.next();
y = sc.nextInt();
z = sc.nextDouble();
Para ler um texto ATÉ A QUEBRA DE LINHA
import java.util.Scanner;
s1 = sc.nextLine();
s2 = sc.nextLine();
s3 = sc.nextLine();
System.out.println("DADOS DIGITADOS:");
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
sc.close();
}
}
Exemplo Significado
A = Math.sqrt(x); Variável A recebe a raiz quadrada de x
A = Math.pow(x, y); Variável A recebe o resultado de x elevado a y
A = Math.abs(x); Variável A recebe o valor absoluto de x
double x = 3.0;
double y = 4.0;
double z = -5.0;
double A, B, C;
A = Math.sqrt(x);
B = Math.sqrt(y);
C = Math.sqrt(25.0);
System.out.println("Raiz quadrada de " + x + " = " + A);
System.out.println("Raiz quadrada de " + y + " = " + B);
System.out.println("Raiz quadrada de 25 = " + C);
A = Math.pow(x, y);
B = Math.pow(x, 2.0);
C = Math.pow(5.0, 2.0);
System.out.println(x + " elevado a " + y + " = " + A);
System.out.println(x + " elevado ao quadrado = " + B);
System.out.println("5 elevado ao quadrado = " + C);
A = Math.abs(y);
B = Math.abs(z);
System.out.println("Valor absoluto de " + y + " = " + A);
System.out.println("Valor absoluto de " + z + " = " + B);
}
}
Incluindo funções em expressões maiores
Funções matemáticas
• sqrt – raiz quadrada
• pow – potenciação
• abs – valor absoluto
• Exemplos
Expressões comparativas
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Expressões comparativas
Operadores comparativos
Operador Significado
> maior
C, C++, < menor
Java, C# >= maior ou igual
<= menor ou igual
== igual
!= diferente
Exemplos de expressões comparativas
(suponha x igual a 5)
X>0 Resultado: V
X == 3 Resultado: F
10 <= 30 Resultado: V
X != 2 Resultado: V
Expressões lógicas
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Expressões lógicas
Operadores lógicos
Operador Significado
C, C++, && E
Java, C# || OU
! NÃO
Ideia por trás do operador "E"
Você pode obter uma habilitação de motorista se:
V F
X > 0 && X != 3 Resultado: V
V V
X <= 20 && X == 10 && X != 3 Resultado: F
V F V
Tabela verdade do operador "E"
A B A && B
F F F
F V F
V F F
V V V
• For idoso(a),
OU Pelo menos uma
• For uma pessoa com deficiência, condição deve
OU ser verdadeira!
• For uma gestante
Exemplos de expressões lógicas
(suponha x igual a 5)
X == 10 || X <= 20 Resultado: V
F V
X > 0 || X != 3 Resultado: V
V V
X <= 0 || X != 3 || X != 5 Resultado: V
F V F
A B A || B
F F F
F V V
V F V
V V V
Ideia por trás do operador "NÃO"
Você tem direito a receber uma bolsa de estudos se você:
NÃO O operador
• Possuir renda maior que $ 3000,00
"NÃO" inverte a
condição
João José
$ 5000,00 $ 2000,00
V
Exemplos de expressões lógicas
(suponha x igual a 5)
V F
F
V
A !A
F V
V F
Estrutura condicional
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Conceito
Estrutura condicional:
condição
Simples:
REGRA:
if ( <condição> ) {
<comando 1>
V: executa o bloco de comandos
<comando 2>
F: pula o bloco de comandos
}
Importante:
Repare na endentação!
Composta:
if ( <condição> ) {
<comando 1> REGRA:
<comando 2>
}
else { V: executa somente o bloco do if
<comando 3> F: executa somente o bloco do else
<comando 4>
}
Importante:
Repare na endentação!
E se eu tiver mais de duas possibilidades?
Entrada Saída
22 Valor a pagar: R$ 50.00
Entrada Saída
103 Valor a pagar: R$ 56.00
a += b; a = a + b;
a -= b; a = a - b;
a *= b; a = a * b;
a /= b; a = a / b;
a %= b; a = a % b;
import java.util.Locale;
import java.util.Scanner;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
sc.close();
}
}
Problema exemplo
Fazer um programa para ler um valor inteiro de 1 a 7 representando um
dia da semana (sendo 1=domingo, 2=segunda, e assim por diante).
Escrever na tela o dia da semana correspondente, conforme exemplos.
Entrada Saída
1 Dia da semana: domingo
Entrada Saída
4 Dia da semana: quarta
Entrada Saída
9 Dia da semana: valor inválido
import java.util.Scanner;
import java.util.Scanner;
public class Main {
public class Main {
public static void main(String[] args) {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int x = sc.nextInt();
String dia;
String dia;
switch (x) {
if (x == 1) {
case 1:
dia = "domingo";
dia = "domingo";
}
break;
else if (x == 2) {
case 2:
dia = "segunda";
dia = "segunda";
}
break;
else if (x == 3) {
case 3:
dia = "terca";
dia = "terca";
}
break;
else if (x == 4) {
case 4:
dia = "quarta";
dia = "quarta";
}
break;
else if (x == 5) {
case 5:
dia = "quinta";
dia = "quinta";
}
break;
else if (x == 6) {
case 6:
dia = "sexta";
dia = "sexta";
}
break;
else if (x == 7) {
case 7:
dia = "sabado";
dia = "sabado";
}
break;
else {
default:
dia = "valor invalido";
dia = "valor invalido";
}
break;
}
System.out.println("Dia da semana: " + dia);
sc.close();
System.out.println("Dia da semana: " + dia);
}
sc.close();
}
}
}
Sintaxe do switch-case
switch ( expressão ) {
case valor1:
comando1
comando2
break;
case valor2:
comando3
comando4
break;
default:
comando5
comando6
break;
}
Expressão condicional ternária
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Sintaxe:
( condição ) ? valor_se_verdadeiro : valor_se_falso
Exemplos:
( 2 > 4 ) ? 50 : 80 80
Escopo e inicialização
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Checklist
• Escopo de uma variável: é a região do programa onde a variável é
válida, ou seja, onde ela pode ser referenciada.
Demo
double price = sc.nextDouble();
System.out.println(discount);
Curso Java COMPLETO
Capítulo: Estruturas repetitivas
http://educandoweb.com.br
Prof. Dr. Nelio Alves
import java.util.Locale;
import java.util.Scanner;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
sc.close();
}
}
Estrutura repetitiva "enquanto"
(while)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Resumo da aula
• Estrutura repetitiva "enquanto"
• Recomendada quando não se sabe previamente a quantidade de
repetições
• Regra:
• V: executa e volta
• F: pula fora
Exercício de testes de mesa com
while
http://educandoweb.com.br
Prof. Dr. Nelio Alves
x = 5; x = 2; x = 100;
y = 0; y = 0; y = 100;
while (x > 2) { while (x <60) { while (x != y) {
System.out.print(x); System.out.println(x); System.out.print("olha");
y = y + x; x = x * 2; x = Math.sqrt(y);
x = x - 1; y = y + 10; }
} }
x = 0; x = 2; x = 4;
while (x < 5) { y = 10; y = 0;
y = x * 3; System.out.println("Olá"); i = 0;
System.out.print(y); while (x < y) { while (i < x) {
x = x + 1; System.out.println(x + "-" + y); i = i + 1;
} x = x * 2; y = y + i;
System.out.println("Fim"); y = y + 1; System.out.print(i);
} System.out.println(y);
}
Estrutura repetitiva "para" (for)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Estrutura repetitiva "para"
Sintaxe / regra
Valor de i: 0
for (int i=0; i<5; i++) { Valor de i: 1
System.out.println("Valor de i: " + i); Valor de i: 2
} Valor de i: 3
Valor de i: 4
Contagem regressiva
Resultado na tela:
Valor de i: 4
for (int i=4; i>=0; i--) { Valor de i: 3
System.out.println("Valor de i: " + i); Valor de i: 2
} Valor de i: 1
Valor de i: 0
Resumo da aula
• Estrutura repetitiva "para"
• Usar quando se sabe previamente a quantidade de repetições
• Ótimo para fazer contagens (progressiva ou regressiva)
• Regra:
Executa somente V: executa e volta Executa toda vez
na primeira vez F: pula fora depois de voltar
x = 4; x = 4; x = 8;
y = 0; y = 0; y = 3;
for (i=0; i<x; i++) { for (i=0; i<x; i++) { for (i=0; y<x; i++){
System.out.print(i); y = y + i; x = x – 2;
System.out.println(x); } y = y + 1;
y = y + 10; System.out.println(y); System.out.println(i);
} }
Estrutura repetitiva "faça-
enquanto"
http://educandoweb.com.br
Prof. Dr. Nelio Alves
do { Regra:
comando 1
comando 2
} while ( condição ); V: volta
F: pula fora
Problema exemplo:
Fórmula: = + 32
Exemplo:
Digite a temperatura em Celsius: 30.0
Equivalente em Fahrenheit: 86.0
Deseja repetir (s/n)? s
Digite a temperatura em Celsius: 21.0
Equivalente em Fahrenheit: 69.8
Deseja repetir (s/n)? s
Digite a temperatura em Celsius: -10.5
Equivalente em Fahrenheit: 13.1
Deseja repetir (s/n)? n
Resumo da aula
• Estrutura repetitiva "faça-enquanto" do {
comando 1
• O bloco de comandos executa pelo menos comando 2
uma vez, pois a condição é verificada no final.
} while ( condição );
• Regra:
• V: volta
• F: pula fora
import java.util.Locale;
import java.util.Scanner;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
char resp;
do {
System.out.print("Digite a temperatura em Celsius: ");
double C = sc.nextDouble();
double F = 9.0 * C / 5.0 + 32.0;
System.out.printf("Equivalente em Fahrenheit: %.1f%n", F);
System.out.print("Deseja repetir (s/n)? ");
resp = sc.next().charAt(0);
} while (resp != 'n');
sc.close();
}
}
Curso Java COMPLETO
Capítulo: Outros tópicos básicos sobre Java
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Errado: Correto:
Convenções
• Camel Case: lastName
• pacotes
• atributos
• métodos
• variáveis e parâmetros
Operadores bitwise
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Operadores bitwise
Operador Significado
& Operação "E" bit a bit
| Operação "OU" bit a bit
^ Operação "OU-exclusivo" bit a bit
C1 C2 C1 E C2 C1 C2 C1 OU C2 C1 C2 C1 XOR C2
F F F F F F F F F
F V F F V V F V V
V F F V F V V F V
V V V V V V V V F
Demo
&: 0001 1000 (24)
(89) 0101 1001
|: 0111 1101 (125)
(60) 0011 1100 ^: 0110 0101 (101)
int n1 = 89;
int n2 = 60;
System.out.println(n1 & n2);
System.out.println(n1 | n2);
System.out.println(n1 ^ n2);
Aplicação comum: verificar bit
package course;
import java.util.Scanner;
sc.close();
}
}
Funções interessantes para String
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Checklist
• Formatar: toLowerCase(), toUpperCase(), trim()
• Recortar: substring(inicio), substring(inicio, fim)
• Substituir: Replace(char, char), Replace(string, string)
• Buscar: IndexOf, LastIndexOf
• str.Split(" ")
String original = "abcde FGHIJ ABC abc DEFG ";
Operação split
String s = "potato apple lemon";
0 "potato"
1 "apple"
2 "lemon"
"potato apple lemon" vect
s
Comentários em Java (básico)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
package course;
import java.util.Locale;
import java.util.Scanner;
/*
Este programa calcula as raízes de uma equação do segundo grau
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
double a, b, c, delta;
Funções
• Representam um processamento que possui um significado
• Math.sqrt(double)
• System.out.println(string)
Exemplo:
package course;
import java.util.Scanner;
sc.close();
}
}
package course;
import java.util.Scanner;
showResult(higher);
sc.close();
}
Curso
Programação Orientada a
Objetos com Java
Capítulo: Classes, atributos, métodos, membros estáticos
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
04/08/2018
Problema exemplo
Fazer um programa para ler as medidas dos lados de dois triângulos X e Y (suponha medidas
válidas). Em seguida, mostrar o valor das áreas dos dois triângulos e dizer qual dos dois triângulos
possui a maior área.
A fórmula para calcular a área de um triângulo a partir das medidas de seus lados a, b e c é a
seguinte (fórmula de Heron):
abc
area p ( p a )( p b)( p c ) onde p
2
Exemplo:
Enter the measures of triangle X:
3.00
4.00
5.00
Enter the measures of triangle Y:
7.50
4.50
4.02
Triangle X area: 6.0000
Triangle Y area: 7.5638
Larger area: Y
package application;
import java.util.Locale;
import java.util.Scanner;
sc.close();
}
}
2
04/08/2018
Discussão
Memória:
Triângulo é uma entidade com três
atributos: a, b, c.
3.00 4.00 5.00
Estamos usando três variáveis distintas
aX bX cX
para representar cada triângulo:
3
04/08/2018
Classe
• É um tipo estruturado que pode conter (membros):
• Atributos (dados / campos)
• Métodos (funções / operações)
• Exemplos:
• Entidades: Produto, Cliente, Triangulo
• Serviços: ProdutoService, ClienteService, EmailService, StorageService
• Controladores: ProdutoController, ClienteController
• Utilitários: Calculadora, Compactador
• Outros (views, repositórios, gerenciadores, etc.)
package entities;
public double a;
public double b;
public double c;
}
Triangle x, y;
x = new Triangle();
y = new Triangle();
double aX, bX, cX, aY, bY, cY;
aX bX cX a b c
aY bY cY a b c
4
04/08/2018
package application;
import java.util.Locale;
import java.util.Scanner;
import entities.Triangle;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
Triangle x, y;
x = new Triangle();
y = new Triangle();
Memória
Stack Heap
areaX areaY p
0x100358:
0x100358
y x A B C
5
04/08/2018
A B C A B C
6
04/08/2018
Discussão
Memória:
Com o uso de CLASSE, agora nós temos uma
variável composta do tipo "Triangle" para
representar cada triângulo:
x 3.0 4.0 5.0
Triangle x, y; a b c
x = new Triangle();
y = new Triangle();
y 7.5 4.5 4.02
package application;
import java.util.Locale;
import java.util.Scanner;
import entities.Triangle;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
Triangle x, y;
x = new Triangle();
y = new Triangle();
7
04/08/2018
package entities;
public double a;
public double b;
public double c;
package entities;
pacote da classe
public class Triangle {
Nome da classe
public double a;
public double b;
public double c; Atributos da classe
O prefixo "public"
indica que o
atributo ou public double area() {
método pode ser double p = (a + b + c) / 2.0;
usado em outros
arquivos return Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
} Corpo do
método
8
04/08/2018
Nome da classe
Atributos da classe
Métodos da classe
Discussão
9
04/08/2018
Começando a resolver um
segundo problema exemplo
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Outro exemplo
Fazer um programa para ler os dados de um produto em estoque (nome, preço e
quantidade no estoque). Em seguida:
• Mostrar os dados do produto (nome, preço, quantidade no estoque, valor total no
estoque)
• Realizar uma entrada no estoque e mostrar novamente os dados do produto
• Realizar uma saída no estoque e mostrar novamente os dados do produto
10
04/08/2018
Example:
Example:
11
04/08/2018
Object e toString
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Discussão
• Toda classe em Java é uma subclasse da classe Object
12
04/08/2018
package entities;
Finalizando o programa
http://educandoweb.com.br
Prof. Dr. Nelio Alves
13
04/08/2018
package application;
import java.util.Locale;
import java.util.Scanner;
import entities.Product;
System.out.println();
System.out.println("Product data: " + product);
System.out.println();
System.out.print("Enter the number of products to be added in stock: ");
int quantity = sc.nextInt();
product.addProducts(quantity);
System.out.println();
System.out.println("Updated data: " + product);
System.out.println();
System.out.print("Enter the number of products to be removed from stock: ");
quantity = sc.nextInt();
product.removeProducts(quantity);
System.out.println();
System.out.println("Updated data: " + product);
sc.close();
}
}
Exercícios de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
14
04/08/2018
Exercício 1
Fazer um programa para ler os valores da largura e altura
de um retângulo. Em seguida, mostrar na tela o valor de
sua área, perímetro e diagonal. Usar uma classe como
mostrado no projeto ao lado.
Exemplo:
Enter rectangle width and height:
3.00
4.00
AREA = 12.00
PERIMETER = 14.00
DIAGONAL = 5.00
Exercício 2
Fazer um programa para ler os dados de um funcionário (nome, salário bruto e imposto). Em
seguida, mostrar os dados do funcionário (nome e salário líquido). Em seguida, aumentar o
salário do funcionário com base em uma porcentagem dada (somente o salário bruto é
afetado pela porcentagem) e mostrar novamente os dados do funcionário. Use a classe
projetada abaixo.
Exemplo:
Name: Joao Silva
Gross salary: 6000.00
Tax: 1000.00
15
04/08/2018
Exercício 3
Fazer um programa para ler o nome de um aluno e as três notas que ele obteve nos três trimestres do ano
(primeiro trimestre vale 30 e o segundo e terceiro valem 35 cada). Ao final, mostrar qual a nota final do aluno no
ano. Dizer também se o aluno está aprovado (PASS) ou não (FAILED) e, em caso negativo, quantos pontos faltam
para o aluno obter o mínimo para ser aprovado (que é 60% da nota). Você deve criar uma classe Student para
resolver este problema.
Exemplos:
Entrada: Saída:
Alex Green FINAL GRADE = 90.00
27.00 PASS
31.00
32.00
Entrada: Saída:
Alex Green FINAL GRADE = 52.00
17.00 FAILED
20.00 MISSING 8.00 POINTS
15.00
16
04/08/2018
membros
=
atributos e métodos
Membros estáticos
• Também chamados membros de classe
• Em oposição a membros e instância
• Aplicações comuns:
• Classes utilitárias Math.sqrt(double)
• Declaração de constantes
• Uma classe que possui somente membros estáticos, pode ser uma classe
estática também. Esta classe não poderá ser instanciada.
17
04/08/2018
Triangle x, y;
x = new Triangle();
y = new Triangle();
Problema exemplo
Fazer um programa para ler um valor numérico qualquer, e daí mostrar
quanto seria o valor de uma circunferência e do volume de uma esfera
para um raio daquele valor. Informar também o valor de PI com duas
casas decimais.
Exemplo:
Enter radius: 3.0
Circumference: 18.85
Volume: 113.10
PI value: 3.14
18
04/08/2018
Checklist
• Versão 1: métodos na própria classe do programa
• Nota: dentro de um método estático você não pode chamar membros de
instância da mesma classe.
package application;
import java.util.Locale;
import java.util.Scanner;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
double c = circumference(radius);
sc.close();
}
19
04/08/2018
package util;
double c = calc.circumference(radius);
double v = calc.volume(radius);
20
04/08/2018
Discussão
• No problema dos triângulos, cada • Já no caso da calculadora, os valores dos
triângulo possui sua área. cálculos não mudam para calculadoras
diferentes, ou seja, são cálculos estáticos. O
• Area() é uma operação concernente ao valor de Pi também é estático.
objeto: cada triângulo possui sua área.
package util;
double c = Calculator.circumference(radius);
double v = Calculator.volume(radius);
21
04/08/2018
Exercício de fixação
Faça um programa para ler a cotação do dólar, e depois um valor em dólares a ser comprado por
uma pessoa em reais. Informar quantos reais a pessoa vai pagar pelos dólares, considerando ainda
que a pessoa terá que pagar 6% de IOF sobre o valor em dólar. Criar uma classe CurrencyConverter
para ser responsável pelos cálculos.
Exemplo:
What is the dollar price? 3.10
How many dollars will be bought? 200.00
Amount to be paid in reais = 657.20
package application;
import java.util.Locale;
import java.util.Scanner;
import util.CurrencyConverter;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
sc.close();
}
}
22
26/06/2018
Curso
Programação Orientada a
Objetos com Java
Capítulo: Construtores, palavra this, sobrecarga, encapsulamento
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Construtores
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
26/06/2018
Construtor
• É uma operação especial da classe, que executa no momento da
instanciação do objeto
• Usos comuns:
• Iniciar valores dos atributos
• Permitir ou obrigar que o objeto receba dados / dependências no momento de sua
instanciação (injeção de dependência)
Problema exemplo
Enter product data:
Name: TV
Price: 900.00
Quantity in stock: 10
2
26/06/2018
package application;
import java.util.Locale;
import java.util.Scanner;
import entities.Product;
System.out.println();
System.out.println("Product data: " + product);
System.out.println();
System.out.print("Enter the number of products to be added in stock: ");
int quantity = sc.nextInt();
product.addProducts(quantity);
System.out.println();
System.out.println("Updated data: " + product);
System.out.println();
System.out.print("Enter the number of products to be removed from stock: ");
quantity = sc.nextInt();
product.removeProducts(quantity);
System.out.println();
System.out.println("Updated data: " + product);
sc.close();
}
}
package entities;
3
26/06/2018
Proposta de melhoria
Quando executamos o comando abaixo, instanciamos um produto "product" com
seus atributos “vazios”:
Memória:
Entretanto, faz sentido um produto que não tem nome? Faz sentido um produto que
não tem preço?
Com o intuito de evitar a existência de produtos sem nome e sem preço, é possível
fazer com que seja “obrigatória” a iniciação desses valores?
package entities;
4
26/06/2018
Palavra this
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Palavra this
• É uma referência para o próprio objeto
• Usos comuns:
• Diferenciar atributos de variáveis locais
• Passar o próprio objeto como argumento na chamada de um método ou
construtor
5
26/06/2018
Memória
"TV"
name
(...)
(...)
6
26/06/2018
Sobrecarga
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Sobrecarga
• É um recurso que uma classe possui de oferecer mais de uma
operação com o mesmo nome, porém com diferentes listas de
parâmetros.
7
26/06/2018
Proposta de melhoria
• Vamos criar um construtor opcional, o qual recebe apenas nome e
preço do produto. A quantidade em estoque deste novo produto, por
padrão, deverá então ser iniciada com o valor zero.
package entities;
public Product() {
}
8
26/06/2018
Encapsulamento
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Encapsulamento
Analogia:
• É um princípio que consiste em
esconder detalhes de implementação
de uma classe, expondo apenas
operações seguras e que mantenham
os objetos em um estado consistente.
9
26/06/2018
10
26/06/2018
package entities;
public Product() {
}
(...)
Gerando automaticamente
construtores, getters e setters
com Eclipse
http://educandoweb.com.br
Prof. Dr. Nelio Alves
11
26/06/2018
Comandos
• Botão direito -> Source -> Generate Constructor using Fields
Modificadores de acesso
http://educandoweb.com.br
Prof. Dr. Nelio Alves
12
26/06/2018
Modificadores de acesso
• https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
• public: o membro é acessado por todas classes (ao menos que ele resida em
um módulo diferente que não exporte o pacote onde ele está)
https://stackoverflow.com/questions/215497/in-java-difference-between-package-private-public-protected-and-private
13
26/06/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Em um banco, para se cadastrar uma conta bancária, é necessário informar o número da conta, o nome do
titular da conta, e o valor de depósito inicial que o titular depositou ao abrir a conta. Este valor de depósito
inicial, entretanto, é opcional, ou seja: se o titular não tiver dinheiro a depositar no momento de abrir sua
conta, o depósito inicial não será feito e o saldo inicial da conta será, naturalmente, zero.
Importante: uma vez que uma conta bancária foi aberta, o número da conta nunca poderá ser alterado. Já
o nome do titular pode ser alterado (pois uma pessoa pode mudar de nome por ocasião de casamento, por
exemplo).
Por fim, o saldo da conta não pode ser alterado livremente. É preciso haver um mecanismo para proteger
isso. O saldo só aumenta por meio de depósitos, e só diminui por meio de saques. Para cada saque
realizado, o banco cobra uma taxa de $ 5.00. Nota: a conta pode ficar com saldo negativo se o saldo não for
suficiente para realizar o saque e/ou pagar a taxa.
Você deve fazer um programa que realize o cadastro de uma conta, dando opção para que seja ou não
informado o valor de depósito inicial. Em seguida, realizar um depósito e depois um saque, sempre
mostrando os dados da conta após cada operação.
14
26/06/2018
EXAMPLE 1
Account data:
Account 8532, Holder: Alex Green, Balance: $ 500.00
EXAMPLE 2
Account data:
Account 7801, Holder: Maria Brown, Balance: $ 0.00
15
26/06/2018
https://github.com/acenelio/encapsulation1-java
16
21/07/2018
Curso
Programação Orientada a
Objetos com Java
Capítulo: Comportamento de memória, arrays, listas
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
21/07/2018
Memória
Product p1, p2;
Stack Heap
p1 = new Product("TV", 900.00, 0); 0x100358:
0x100358 TV 900 0
p2 = p1;
p1
p2 = p1; 0x100358
"p2 passa a apontar para onde
p1 aponta" p2
Desenho simplificado
Memória
Product p1, p2;
Stack Heap
p1 = new Product("TV", 900.00, 0);
p1 TV 900 0
p2 = p1;
p2
2
21/07/2018
Valor "null"
Tipos referência aceitam o valor "null", que indica que a variável aponta pra ninguém.
Memória
Product p1, p2;
Stack Heap
p1 = new Product("TV", 900.00, 0); 0x100358:
0x100358 TV 900 0
p2 = null;
p1
p2
Memória
double x, y;
Stack Heap
x = 10;
10
y = x;
x
y = x; 10
"y recebe uma CÓPIA de x"
y
3
21/07/2018
int p;
System.out.println(p); // erro: variável não iniciada
p = 10;
System.out.println(p);
4
21/07/2018
Valores padrão
• Quando alocamos (new) qualquer tipo estruturado (classe ou array),
são atribuídos valores padrão aos seus elementos
• números: 0
• boolean: false
• char: caractere código 0
• objeto: null
Memória:
Objetos não utilizados são desalocados em um "Objetos" são desalocados imediatamente quando
momento próximo pelo garbage collector seu escopo de execução é finalizado
5
21/07/2018
Desalocação de memória -
garbage collector e escopo local
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Garbage collector
• É um processo que automatiza o gerenciamento de memória de um
programa em execução
6
21/07/2018
Memória
Product p1, p2;
Stack Heap
p1 = new Product("TV", 900.00, 0);
p1 TV 900 0
p2 = new Product("Mouse", 30.00, 0);
p2 Mouse 30 0
Será desalocado
Desalocação por garbage collector pelo garbage
collector
Memória
Product p1, p2;
Stack Heap
p1 = new Product("TV", 900.00, 0);
p1 TV 900 0
p2 = new Product("Mouse", 30.00, 0);
p2 Mouse 30 0
p1 = p2;
7
21/07/2018
Memória
void method1() {
int x = 10; Stack Heap
if (x > 0) { method1 scope
int y = 20;
} if scope
10
System.out.println(x);
} x 20
y
Memória
void method1() {
int x = 10; Stack Heap
if (x > 0) { method1 scope
int y = 20;
}
10
System.out.println(x);
} x
8
21/07/2018
Memória
void method1() {
int x = 10; Stack Heap
if (x > 0) {
int y = 20;
}
System.out.println(x);
}
Outro exemplo
Product method2() {
Product prod = new Product("TV", 900.0, 0);
p
return prod;
}
9
21/07/2018
Outro exemplo
method2 scope
Product method2() {
Product prod = new Product("TV", 900.0, 0);
p
return prod;
} TV 900 0
prod
Outro exemplo
Product method2() {
Product prod = new Product("TV", 900.0, 0); p
return prod;
} TV 900 0
10
21/07/2018
Resumo
• Objetos alocados dinamicamente, quando não possuem mais
referência para eles, serão desalocados pelo garbage collector
Vetores - Parte 1
http://educandoweb.com.br
Prof. Dr. Nelio Alves
11
21/07/2018
Checklist
• Revisão do conceito de vetor
• Declaração e instanciação
• Manipulação de vetor de elementos tipo valor (tipo primitivo)
• Manipulação de vetor de elementos tipo referência (classe)
• Acesso aos elementos
• Propriedade length
Vetores
• Em programação, "vetor" é o nome dado a arranjos unidimensionais
myVect
• Arranjo (array) é uma estrutura de dados:
• Homogênea (dados do mesmo tipo)
• Ordenada (elementos acessados por meio de posições) 0 1.72
0
• Alocada de uma vez só, em um bloco contíguo de memória
1 1.56
0
• Vantagens: 2 1.80
0
• Acesso imediato aos elementos pela sua posição
• Desvantagens:
• Tamanho fixo
• Dificuldade para se realizar inserções e deleções
12
21/07/2018
Problema exemplo 1
Example
Input: Output:
3 AVERAGE HEIGHT = 1.69
1.72
1.56
1.80
13
21/07/2018
Memória
Stack Heap
0 0
1.72
3 vect
1 1.56
0
n
2 1.80
0
package application;
import java.util.Locale;
import java.util.Scanner;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double[] vect = new double[n];
sc.close();
}
}
14
21/07/2018
Vetores - Parte 2
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Problema exemplo 2
15
21/07/2018
Example
Input: Output:
3 AVERAGE PRICE = 700.00
TV
900.00
Fryer
400.00
Stove
800.00
Memória
Stack Heap
3 vect 0
n 1
16
21/07/2018
Memória
Stack Heap
3 vect 0 TV 900.0
n 1 Fryer 400.0
2 Stove 800.0
package application;
import java.util.Locale;
import java.util.Scanner;
import entities.Product;
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Product[] vect = new Product[n];
sc.close();
}
}
17
21/07/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Fazer um programa que inicie com todos os dez quartos vazios, e depois
leia uma quantidade N representando o número de estudantes que vão
alugar quartos (N pode ser de 1 a 10). Em seguida, registre o aluguel dos
N estudantes. Para cada registro de aluguel, informar o nome e email do
estudante, bem como qual dos quartos ele escolheu (de 0 a 9). Suponha
que seja escolhido um quarto vago. Ao final, seu programa deve imprimir
um relatório de todas ocupações do pensionato, por ordem de quarto,
conforme exemplo.
18
21/07/2018
Rent #1:
Name: Maria Green
Email: [email protected]
Room: 5
Rent #2:
Name: Marco Antonio
Email: [email protected]
Room: 1
Rent #3:
Name: Alex Brown
Email: [email protected]
Room: 8
Busy rooms:
1: Marco Antonio, [email protected]
5: Maria Green, [email protected]
8: Alex Brown, [email protected]
19
21/07/2018
package entities;
package application;
import java.text.ParseException;
import java.util.Scanner;
import entities.Rent;
System.out.println();
System.out.println("Busy rooms:");
for (int i=0; i<10; i++) {
if (vect[i] != null) {
System.out.println(i + ": " + vect[i]);
}
}
sc.close();
}
}
20
21/07/2018
Boxing
• É o processo de conversão de um objeto tipo valor para um objeto
tipo referência compatível
Memória
Stack Heap
int x = 20;
20 20
Object obj = x; x
obj
21
21/07/2018
Unboxing
• É o processo de conversão de um objeto tipo referência para um
objeto tipo valor compatível
Memória
20 20 20
Object obj = x;
x y
obj
int y = (int) obj;
Wrapper classes
• São classes equivalentes aos tipos primitivos
22
21/07/2018
Demo
Integer x = 10;
int y = x * 2;
(...)
23
21/07/2018
Sintaxe:
Demo
Leitura: "para cada objeto 'obj' contido em vect, faça:"
24
21/07/2018
Listas - Parte 1
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Checklist
• Conceito de lista
• Demo
• Referência: https://docs.oracle.com/javase/10/docs/api/java/util/List.html
• Assuntos pendentes:
• interfaces
• generics
• predicados (lambda)
25
21/07/2018
myList
• Vantagens: 0 1.72
0
• Tamanho variável
• Facilidade para se realizar inserções e deleções 1 1.56
0
• Desvantagens:
• Acesso sequencial aos elementos * 2 1.80
0
(desenho simplificado)
Listas - Parte 2
http://educandoweb.com.br
Prof. Dr. Nelio Alves
26
21/07/2018
Demo
• Tamanho da lista: size()
• Obter o elemento de uma posição: get(position)
• Inserir elemento na lista: add(obj), add(int, obj)
• Remover elementos da lista: remove(obj), remove(int), removeIf(Predicate)
• Encontrar posição de elemento: indexOf(obj), lastIndexOf(obj)
• Filtrar lista com base em predicado:
List<Integer> result = list.stream().filter(x -> x > 4).collect(Collectors.toList());
• Assuntos pendentes:
• interfaces
• generics
• predicados (lambda)
package application;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
list.add("Maria");
list.add("Alex");
list.add("Bob");
list.add("Anna");
list.add(2, "Marco");
System.out.println(list.size());
for (String x : list) {
System.out.println(x);
}
System.out.println("---------------------");
list.removeIf(x -> x.charAt(0) == 'M');
for (String x : list) {
System.out.println(x);
}
System.out.println("---------------------");
System.out.println("Index of Bob: " + list.indexOf("Bob"));
System.out.println("Index of Marco: " + list.indexOf("Marco"));
System.out.println("---------------------");
List<String> result = list.stream().filter(x -> x.charAt(0) == 'A').collect(Collectors.toList());
for (String x : result) {
System.out.println(x);
}
System.out.println("---------------------");
String name = list.stream().filter(x -> x.charAt(0) == 'J').findFirst().orElse(null);
System.out.println(name);
}
}
27
21/07/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Fazer um programa para ler um número inteiro N e depois os dados (id, nome e salario) de
N funcionários. Não deve haver repetição de id.
Lembre-se de aplicar a técnica de encapsulamento para não permitir que o salário possa
ser mudado livremente. Um salário só pode ser aumentado com base em uma operação de
aumento por porcentagem dada.
28
21/07/2018
Emplyoee #1:
Id: 333
Name: Maria Brown
Salary: 4000.00
Emplyoee #2:
Id: 536
Name: Alex Grey
Salary: 3000.00
Emplyoee #3:
Id: 772
Name: Bob Green
Salary: 5000.00
List of employees:
333, Maria Brown, 4000.00
536, Alex Grey, 3300.00
772, Bob Green, 5000.00
Emplyoee #1:
Id: 333
Name: Maria Brown
Salary: 4000.00
Emplyoee #2:
Id: 536
Name: Alex Grey
Salary: 3000.00
List of employees:
333, Maria Brown, 4000.00
536, Alex Grey, 3000.00
29
21/07/2018
https://github.com/acenelio/list1-java
Matrizes
http://educandoweb.com.br
Prof. Dr. Nelio Alves
30
21/07/2018
Checklist
• Revisão do conceito de matriz
• Declaração e instanciação
• Acesso aos elementos / como percorrer uma matriz
• Propriedade length
Matrizes
• Em programação, "matriz" é o nome dado a arranjos bidimensionais
• Atenção: "vetor de vetores"
myMat
• Arranjo (array) é uma estrutura de dados:
• Homogênea (dados do mesmo tipo) 0 1 2 3
• Ordenada (elementos acessados por meio de posições)
0 3.5 17.0 12.3 8.2
• Alocada de uma vez só, em um bloco contíguo de memória
1 4.1 6.2 7.5 2.9
31
21/07/2018
Exercício resolvido
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Exercício resolvido
32
21/07/2018
Example
Input: Output:
3 Main diagonal:
5 -3 10 5 8 -4
15 8 2 Negative numbers = 2
7 9 -4
https://github.com/acenelio/matrix1-java
Memória
Stack Heap
0 1 2
3
0 5 -3 10
mat
n
1 15 8 2
2 7 9 -4
33
21/07/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
34
21/07/2018
Example
3 4
10 8 15 12
21 11 23 8
14 5 13 19
8
Position 0,1:
Left: 10
Right: 15
Down: 11
Position 1,3:
Left: 23
Up: 12
Down: 19
https://github.com/acenelio/matrix2-java
35
15/08/2018
Date
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
15/08/2018
Date
Representa um INSTANTE
Pacote java.util
https://docs.oracle.com/javase/10/docs/api/java/util/Date.html
SimpleDateFormat
• https://docs.oracle.com/javase/10/docs/api/java/text/SimpleDateFormat.html
2
15/08/2018
• Exemplo: "2018-06-25T15:42:07Z"
• Date y3 = Date.from(Instant.parse("2018-06-25T15:42:07Z"));
Date y1 = sdf1.parse("25/06/2018");
Date y2 = sdf2.parse("25/06/2018 15:42:07");
Date y3 = Date.from(Instant.parse("2018-06-25T15:42:07Z"));
3
15/08/2018
Date d = Date.from(Instant.parse("2018-06-25T15:42:07Z"));
System.out.println(sdf.format(d));
System.out.println(sdf.format(d));
4
15/08/2018
Date d = Date.from(Instant.parse("2018-06-25T15:42:07Z"));
System.out.println(sdf.format(d));
5
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Objetivo geral:
Oferecer um breve nivelamento sobre aspectos teóricos e procedimentos básicos de Git e Github
necessários para acompanhar os projetos do curso
Vamos abordar: usuário único / branch único
GIT - é um sistema de versionamento: você controla as modificações de um projeto por meio de versões
chamadas "commits".
Um projeto controlado pelo Git é chamado de repositório de versionamento. Tipicamente uma cópia "oficial" do
repositório fica salvo em um servidor (repositório remoto). Cada pessoa que trabalha no projeto pode fazer uma
cópia do repositório para seu computador (repositório local). A pessoa então faz suas alterações no projeto (novos
commits) e depois salva as alterações no servidor.
Operações principais:
O Git pode ser usado por ou por terminal de comando, ou por um aplicativo gráfico.
Download: https://git-scm.com
Opções recomendadas:
Use Vim as Git's default editor
Use Git from the Windows Command Prompt
Use the OpenSSL library
Checkout Windows-style, commit Unity-style line endings
Use MinTTY
DESMARCAR: Enable Git Credential Manager
Demo - criar um novo projeto
Passos:
1. Crie um novo projeto no seu ambiente de desenvolvimento
Inicia um novo
git init repositório local na
pasta do seu projeto
Associa seu repositório
git remote add origin https://github.com/acenelio/meuprojeto.git local ao repositório
ATENÇÃO: troque pelo caminho do seu repositório do Github remoto, com o apelido
de "origin"
git pull origin master Atualiza seu repositório
local em relação ao
ATENÇÃO: este comando só é necessário se você criou o .gitignore pelo Github repositório remoto
git status Verifica arquivos
Adiciona todos arquivos
git add .
ao stage
Salva uma nova versão
git commit -m "Projeto criado"
do projeto
git push -u origin master Envia o repositório local
para o repositório
Nota: nas próximas vezes basta fazer: git push remoto
Arquivo .gitignore
Checklist:
Pra quê serve o arquivo .gitignore?
Como saber o que colocar no arquivo .gitignore?
Demo - Trabalhando com um projeto existente
Passos:
git push
Importante entender - a sequência de commits deve ser respeitada
POR EXEMPLO:
Suponha que o repositório do seu computador estava em uma versão atrasada em relação ao Github, daí você
esquece de atualizá-lo (git pull origin master) e faz algumas alterações.
PROBLEMA COMANDO
git clean -df
Quero desfazer tudo que eu fiz desde o último commit
git checkout -- .
Preciso remover o último commit, porém mantendo os
git reset --soft HEAD~1
arquivos do jeito que estão.
Preciso remover o último commit, inclusive as
git reset --hard HEAD~1
alterações nos arquivos.
Quero alterar temporariamente os arquivos do projeto
de modo a ficarem no estado do commit informado.
git checkout <código do commit>
ATENÇÃO: não podem haver modificações não
commitadas no projeto.
EXEMPLO: git checkout e8a52f3
NOTA: para voltar ao último commit faça:
git checkout master
Preciso apagar o último commit no Github git push -f origin HEAD^:master
Quero mudar o meu repositório remoto "origin" git remote set-url origin https://github.com/acenelio/novoprojeto.git
Entrei no VIM por engano. Como sair? Tecle ESC, depois digite :q! e tecle ENTER
26/06/2018
Curso
Programação Orientada a
Objetos com Java
Capítulo: Enumerações, composição
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Enumerações
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
26/06/2018
Checklist
• Definição / discussão
• Exemplo: estados de um pedido
• Conversão de string para enum
• Representação UML
Enumerações
• É um tipo especial que serve para especificar de forma literal um
conjunto de constantes relacionadas
• Referência: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
2
26/06/2018
Exemplo
Ciclo de vida de
um pedido.
(...)
https://github.com/acenelio/enum1-java
3
26/06/2018
Notação UML
4
26/06/2018
Categorias de classes
• Em um sistema orientado a objetos, de modo geral "tudo" é objeto.
Services Repositories
5
26/06/2018
Entities
Services
6
26/06/2018
Composição
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Composição
• É um tipo de associação que permite que um objeto contenha outro
• Vantagens
• Organização: divisão de responsabilidades
• Coesão
• Flexibilidade
• Reuso
7
26/06/2018
Entities
Services
8
26/06/2018
Exercício resolvido 1
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Ler os dados de um trabalhador com N contratos (N fornecido pelo usuário). Depois, solicitar
do usuário um mês e mostrar qual foi o salário do funcionário nesse mês, conforme exemplo
(próxima página).
9
26/06/2018
https://github.com/acenelio/composition1-java
Objects in memory:
10
26/06/2018
Objects in memory:
11
26/06/2018
Console output:
https://github.com/acenelio/composition2-java
12
26/06/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Ler os dados de um pedido com N itens (N fornecido pelo usuário). Depois, mostrar um
sumário do pedido conforme exemplo (próxima página). Nota: o instante do pedido deve ser
o instante do sistema: new Date()
13
26/06/2018
ORDER SUMMARY:
Order moment: 20/04/2018 11:25:09
Order status: PROCESSING
Client: Alex Green (15/03/1985) - [email protected]
Order items:
TV, $1000.00, Quantity: 1, Subtotal: $1000.00
Mouse, $40.00, Quantity: 2, Subtotal: $80.00
Total price: $1080.00
https://github.com/acenelio/composition3-java
14
21/07/2018
Curso
Programação Orientada a
Objetos com Java
Capítulo: Herança e polimorfismo
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Herança
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
21/07/2018
Herança
• É um tipo de associação que permite que uma classe herde todos dados e
comportamentos de outra
• Definições importantes
• Vantagens
• Reuso
• Polimorfismo
• Sintaxe
• class A extends B
Exemplo
Suponha um negócio de banco que possui uma conta comum e uma conta para
empresas, sendo que a conta para empresa possui todos membros da conta
comum, mais um limite de empréstimo e uma operação de realizar empréstimo.
2
21/07/2018
Definições importantes
• Relação "é-um"
• Generalização/especialização
• Herança / extensão
3
21/07/2018
Demo
Vamos implementar as classes
Account e BusinessAccount e fazer
alguns testes.
4
21/07/2018
https://github.com/acenelio/inheritance1-java
Upcasting e downcasting
http://educandoweb.com.br
Prof. Dr. Nelio Alves
5
21/07/2018
Checklist
• Upcasting
• Casting da subclasse para superclasse
• Uso comum: polimorfismo
• Downcasting
• Casting da superclasse para subclasse
• Palavra instanceof
• Uso comum: métodos que recebem parâmetros genéricos (ex: Equals)
Example
https://github.com/acenelio/inheritance2-java
6
21/07/2018
// UPCASTING
// DOWNCASTING
7
21/07/2018
Sobreposição ou sobrescrita
• É a implementação de um método de uma superclasse na subclasse
Exemplo
Suponha que a operação de
saque possui uma taxa no valor
de 5.0. Entretanto, se a conta
for do tipo poupança, esta taxa
não deve ser cobrada.
Resposta: sobrescrevendo o
método withdraw na subclasse
SavingsAccount
8
21/07/2018
Account:
SavingsAccount:
@Override
public void withdraw(double amount) {
balance -= amount;
}
Palavra super
Exemplo: suponha que, na classe BusinessAccount, a regra para saque seja realizar o
saque normalmente da superclasse, e descontar mais 2.0.
@Override
public void withdraw(double amount) {
super.withdraw(amount);
balance -= 2.0;
}
9
21/07/2018
private Integernumber;
private String holder;
private Double balance;
https://github.com/acenelio/inheritance3-java
10
21/07/2018
11
21/07/2018
@Override
public final void withdraw(double amount) {
balance -= amount;
}
12
21/07/2018
Pra quê?
• Segurança: dependendo das regras do negócio, às vezes é desejável
garantir que uma classe não seja herdada, ou que um método não
seja sobreposto.
• Geralmente convém acrescentar final em métodos sobrepostos, pois
sobreposições múltiplas podem ser uma porta de entrada para
inconsistências
Introdução ao polimorfismo
http://educandoweb.com.br
Prof. Dr. Nelio Alves
13
21/07/2018
Pilares da OOP
• Encapsulamento
• Herança
• Polimorfismo
Polimorfismo
Em Programação Orientada a Objetos, polimorfismo é recurso que
permite que variáveis de um mesmo tipo mais genérico possam
apontar para objetos de tipos específicos diferentes, tendo assim
comportamentos diferentes conforme cada tipo específico.
x.withdraw(50.0);
y.withdraw(50.0);
14
21/07/2018
Account:
public void withdraw(double amount) {
balance -= amount + 5.0;
Account x = new Account(1020, "Alex", 1000.0);
}
Account y = new SavingsAccount(1023, "Maria", 1000.0, 0.01);
x.withdraw(50.0); SavingsAccount:
y.withdraw(50.0); @Override
public void withdraw(double amount) {
balance -= amount;
}
Memória
Stack Heap
Importante entender
• A associação do tipo específico com o tipo genérico é feita em tempo de
execução (upcasting).
x.withdraw(50.0);
y.withdraw(50.0);
15
21/07/2018
Exercício resolvido
http://educandoweb.com.br
Prof. Dr. Nelio Alves
16
21/07/2018
PAYMENTS:
Alex - $ 1000.00
Bob - $ 1720.00
Maria - $ 1200.00
https://github.com/acenelio/inheritance4-java
17
21/07/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
18
21/07/2018
PRICE TAGS:
Tablet $ 280.00 (Customs fee: $ 20.00)
Notebook $ 1100.00
Iphone (used) $ 400.00 (Manufacture date: 15/03/2017)
https://github.com/acenelio/inheritance5-java
Classes abstratas
http://educandoweb.com.br
Prof. Dr. Nelio Alves
19
21/07/2018
Classes abstratas
• São classes que não podem ser instanciadas
Exemplo
Suponha que em um negócio relacionado a banco, apenas
contas poupança e contas para empresas são permitidas.
Não existe conta comum.
20
21/07/2018
Questionamento
• Se a classe Account não pode ser instanciada, por
que simplesmente não criar somente SavingsAccount
e BusinessAccount?
• Resposta:
• Reuso
• Polimorfismo: a superclasse classe genérica nos permite tratar
de forma fácil e uniforme todos os tipos de conta, inclusive
com polimorfismo se for o caso (como fizemos nos últimos
exercícios). Por exemplo, você pode colocar todos tipos de
contas em uma mesma coleção.
https://github.com/acenelio/inheritance6-java
Métodos abstratos
http://educandoweb.com.br
Prof. Dr. Nelio Alves
21
21/07/2018
Métodos abstratos
• São métodos que não possuem implementação.
• Exercício resolvido
SHAPE AREAS:
20.00
28.27
https://github.com/acenelio/inheritance7-java
22
21/07/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Fazer um programa para ler os dados de N contribuintes (N fornecido pelo usuário), os quais
podem ser pessoa física ou pessoa jurídica, e depois mostrar o valor do imposto pago por cada um,
bem como o total de imposto arrecadado.
Os dados de pessoa física são: nome, renda anual e gastos com saúde. Os dados de pessoa jurídica
são nome, renda anual e número de funcionários. As regras para cálculo de imposto são as
seguintes:
Pessoa física: pessoas cuja renda foi abaixo de 20000.00 pagam 15% de imposto. Pessoas com
renda de 20000.00 em diante pagam 25% de imposto. Se a pessoa teve gastos com saúde, 50%
destes gastos são abatidos no imposto.
Exemplo: uma pessoa cuja renda foi 50000.00 e teve 2000.00 em gastos com saúde, o imposto
fica: (50000 * 25%) - (2000 * 50%) = 11500.00
Pessoa jurídica: pessoas jurídicas pagam 16% de imposto. Porém, se a empresa possuir mais de 10
funcionários, ela paga 14% de imposto.
Exemplo: uma empresa cuja renda foi 400000.00 e possui 25 funcionários, o imposto fica:
400000 * 14% = 56000.00
23
21/07/2018
TAXES PAID:
Alex: $ 11500.00
SoftTech: $ 56000.00
Bob: $ 29500.00
Correção
https://github.com/acenelio/inheritance8-java
24
Curso: Programação Orientada a Objetos com Java
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Objetivo geral:
System design
https://github.com/acenelio/chess-system-design
Checklist:
Github: create a new project
o NOTE: choose .gitignore type as Java
Open a terminal in project folder, and perform the following commands:
git init
git remote add origin https://github.com/acenelio/chess-system-java.git
git pull origin master
git add .
git commit -m "Project created"
git push -u origin master
Checklist:
Class Position [public]
OOP Topics:
o Encapsulation
o Constructors
o ToString (Object / overriding)
Starting to implement Board and Piece
Checklist:
Classes Piece, Board [public]
OOP Topics:
o Associations
o Encapsulation / Access Modifiers
Data Structures Topics:
o Matrix
8 - - - - - - - -
7 - - - - - - - -
6 - - - - - - - -
5 - - - - - - - -
4 - - - - - - - -
3 - - - - - - - -
2 - - - - - - - -
1 - - - - - - - -
a b c d e f g h
Checklist:
Methods: Board.Piece(row, column) and Board.Piece(position)
Enum Chess.Color
Class Chess.ChessPiece [public]
Class Chess.ChessMatch [public]
Class ChessConsole.UI
OOP Topics:
o Enumerations
o Encapsulation / Access Modifiers
o Inheritance
o Downcasting
o Static members
o Layers pattern
Data Structures Topics:
o Matrix
Checklist:
Method: Board.PlacePiece(piece, position)
Classes: Rook, King [public]
Method: ChessMatch.InitialSetup
OOP Topics:
o Inheritance
o Overriding
o Polymorphism (ToString)
BoardException and defensive programming
Checklist:
Class BoardException [public]
Methods: Board.PositionExists, Board.ThereIsAPiece
Implement defensive programming in Board methods
OOP Topics:
o Exceptions
o Constructors (a string must be informed to the exception)
Checklist:
Class ChessException [public]
Class ChessPosition [public]
Refactor ChessMatch.InitialSetup
OOP Topics:
o Exceptions
o Encapsulation
o Constructors (a string must be informed to the exception)
o Overriding
o Static members
o Layers pattern
Color in terminal:
Windows: Git Bash
Mac: Google "osx terminal color"
Checklist:
Place more pieces on the board
Distinguish piece colors in UI.PrintPiece method
Moving pieces
Checklist:
Method Board.RemovePiece
Method UI.ReadChessPosition
Method ChessMatch.PerformChessMove
o Method ChessMatch.MakeMove
o Method ChessMatch.ValidadeSourcePosition
Write basic logic on Program.cs
OOP Topics:
o Exceptions
o Encapsulation
Handling exceptions and clearing screen
// https://stackoverflow.com/questions/2979383/java-clear-the-console
public static void clearScreen() {
System.out.print("\033[H\033[2J");
System.out.flush();
}
Checklist:
ChessException
InputMismatchException
Possible moves of a piece
Checklist:
Methods in Piece:
o PossibleMoves [abstract]
o PossibleMove
o IsThereAnyPossibleMove
Basic PossibleMove implementation for Rook and King
Update ChessMatch.ValidadeSourcePosition
OOP Topics:
o Abstract method / class
o Exceptions
Implementing possible moves of Rook
Checklist:
Method ChessPiece.IsThereOpponentPiece(position) [protected]
Implement Rook.PossibleMoves
Method ChessMatch.ValidateTargetPosition
OOP Topics:
o Polymorphism
o Encapsulation / access modifiers [protected]
o Exceptions
Checklist:
Method ChessMatch.PossibleMoves
Method UI.PrintBoard [overload]
Refactor main program logic
OOP Topics:
o Overloading
Checklist:
Method King.CanMove(position) [private]
Implement King.PossibleMoves
OOP Topics:
o Encapsulation
o Polymorphism
Checklist:
Class ChessMatch:
o Properties Turn, CurrentPlayer [private set]
o Method NextTurn [private]
o Update PerformChessMove
o Update ValidadeSourcePosition
Method UI.PrintMatch
OOP Topics:
o Encapsulation
o Exceptions
Handling captured pieces
Checklist:
Method UI.PrintCapturedPieces
Update UI.PrintMatch
Update Program logic
Lists in ChessMatch: _piecesOnTheBoard, _capturedPieces
o Update constructor
o Update PlaceNewPiece
o Update MakeMove
OOP Topics:
o Encapsulation
o Constructors
Data Structures Topics:
o List
Check logic
Rules:
Check means your king is under threat by at least one opponent piece
You can't put yourself in check
Checklist:
Property ChessPiece.ChessPosition [get]
Class ChessMatch:
o Method UndoMove
o Property Check [private set]
o Method Opponent [private]
o Method King(color) [private]
o Method TestCheck
o Update PerformChessMove
Update UI.PrintMatch
Checkmate logic
Checklist:
Class ChessMatch:
o Property Checkmate [private set]
o Method TestCheckmate [private]
o Update PerformChessMove
Update UI.PrintMatch
Update Program logic
Piece move count
Checklist:
Class ChessPiece:
o Property MoveCount [private set]
o Method IncreaseMoveCount [internal]
o Method DecreaseMoveCount [internal]
Class ChessMatch:
o Update MakeMove
o Update UndoMove
OOP Topics:
o Encapsulation
Pawn
Checklist:
Class Pawn
Update ChessMatch.InitialSetup
OOP Topics:
o Encapsulation
o Inheritance
o Polymorphism
Bishop
Checklist:
Class Bishop
Update ChessMatch.InitialSetup
OOP Topics:
o Encapsulation
o Inheritance
o Polymorphism
Knight
Checklist:
Class Knight
Update ChessMatch.InitialSetup
OOP Topics:
o Encapsulation
o Inheritance
o Polymorphism
Queen
Checklist:
Class Queen
Update ChessMatch.InitialSetup
OOP Topics:
o Encapsulation
o Inheritance
o Polymorphism
Checklist:
Update King
Update ChessMatch.MakeMove
Update ChessMatch.UndoMove
Special move - En Passant
Checklist:
Register a pawn which can be captured by en passant on next turn
o Property ChessMatch.EnPassantVulnerable
o Update ChessMatch.PerformChessMove
Update Pawn.PossibleMoves
Update ChessMatch.MakeMove
Update ChessMatch.UndoMove
Update ChessMatch.InitialSetup
Checklist:
Property ChessMatch.Promoted
Update ChessMatch.PerformChessMove
Method ChessMatch.ReplacePromotedPiece
Update Program logic
26/06/2018
Curso
Programação Orientada a
Objetos com Java
Capítulo: Trabalhando com arquivos
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
26/06/2018
Classes
• File - Representação abstrata de um arquivo e seu caminho
• https://docs.oracle.com/javase/10/docs/api/java/io/File.html
• IOException (Exception)
• https://docs.oracle.com/javase/10/docs/api/java/io/IOException.html
package application;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
2
26/06/2018
FileReader e BufferedReader
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Classes
• FileReader (stream de leitura de caracteres a partir de arquivos)
• https://docs.oracle.com/javase/10/docs/api/java/io/FileReader.html
• https://stackoverflow.com/questions/9648811/specific-difference-between-
bufferedreader-and-filereader
3
26/06/2018
package application;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
try {
fr = new FileReader(path);
br = new BufferedReader(fr);
Bloco try-with-resources
http://educandoweb.com.br
Prof. Dr. Nelio Alves
4
26/06/2018
Bloco try-with-resources
• É um bloco try que declara um ou mais recursos, e garante que esses
recursos serão fechados ao final do bloco
• https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
package application;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
5
26/06/2018
FileWriter e BufferedWriter
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Classes
• FileWriter (stream de escrita de caracteres em de arquivos)
• https://docs.oracle.com/javase/10/docs/api/java/io/FileWriter.html
6
26/06/2018
package application;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
String[] lines = new String[] { "Good morning", "Good afternoon", "Good night" };
} catch (IOException e) {
e.printStackTrace();
}
}
}
7
26/06/2018
package application;
import java.io.File;
import java.util.Scanner;
sc.close();
}
}
Informações do caminho do
arquivo
http://educandoweb.com.br
Prof. Dr. Nelio Alves
8
26/06/2018
package application;
import java.io.File;
import java.util.Scanner;
sc.close();
}
}
Exercício proposto
http://educandoweb.com.br
Prof. Dr. Nelio Alves
9
26/06/2018
Example:
TV LED,1290.99,1 TV LED,1290.99
Video Game Chair,350.50,3 Video Game Chair,1051.50
Iphone X,900.00,2 Iphone X,1800.00
Samsung Galaxy 9,850.00,2 Samsung Galaxy 9,1700.00
https://github.com/acenelio/files1-java
10
15/08/2018
Curso
Programação Orientada a
Objetos com Java
Capítulo: Interfaces
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Interfaces
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
15/08/2018
Aviso
• A partir do Java 8, interfaces podem ter "default methods" ou
"defender methods"
Interface
Interface é um tipo que define um conjunto de operações que uma
classe deve implementar.
2
15/08/2018
Problema exemplo
Uma locadora brasileira de carros cobra um valor por hora para locações de até
12 horas. Porém, se a duração da locação ultrapassar 12 horas, a locação será
cobrada com base em um valor diário. Além do valor da locação, é acrescido no
preço o valor do imposto conforme regras do país que, no caso do Brasil, é 20%
para valores até 100.00, ou 15% para valores acima de 100.00. Fazer um
programa que lê os dados da locação (modelo do carro, instante inicial e final da
locação), bem como o valor por hora e o valor diário de locação. O programa
deve então gerar a nota de pagamento (contendo valor da locação, valor do
imposto e valor total do pagamento) e informar os dados na tela. Veja os
exemplos.
Example 1:
Enter rental data
Car model: Civic
Pickup (dd/MM/yyyy hh:mm): 25/06/2018 10:30
Return (dd/MM/yyyy hh:mm): 25/06/2018 14:40
Enter price per hour: 10.00
Enter price per day: 130.00
INVOICE:
Basic payment: 50.00
Tax: 10.00
Total payment: 60.00
Calculations:
3
15/08/2018
Example 2:
Enter rental data
Car model: Civic
Pickup (dd/MM/yyyy hh:mm): 25/06/2018 10:30
Return (dd/MM/yyyy hh:mm): 27/06/2018 11:40
Enter price per hour: 10.00
Enter price per day: 130.00
INVOICE:
Basic payment: 390.00
Tax: 58.50
Total payment: 448.50
Calculations:
Solução do problema
http://educandoweb.com.br
Prof. Dr. Nelio Alves
4
15/08/2018
Services Repositories
Entities
5
15/08/2018
Services
6
15/08/2018
7
15/08/2018
Projeto no Github
https://github.com/acenelio/interfaces1-java
8
15/08/2018
• Acoplamento forte
• A classe RentalService conhece a dependência concreta
• Se a classe concreta mudar, é preciso mudar a classe RentalService
class RentalService {
(...)
• Acoplamento fraco
• A classe RentalService não conhece a dependência concreta
• Se a classe concreta mudar, a classe RentalService não muda nada
class RentalService {
(...)
9
15/08/2018
(...)
upcasting
class RentalService {
Inversão de controle
• Inversão de controle
Padrão de desenvolvimento que consiste em retirar da classe a
responsabilidade de instanciar suas dependências.
• Injeção de dependência
É uma forma de realizar a inversão de controle: um componente externo
instancia a dependência, que é então injetada no objeto "pai". Pode ser
implementada de várias formas:
• Construtor
• Classe de instanciação (builder / factory)
• Container / framework
10
15/08/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
A empresa utiliza um serviço de pagamento online para realizar o pagamento das parcelas.
Os serviços de pagamento online tipicamente cobram um juro mensal, bem como uma taxa
por pagamento. Por enquanto, o serviço contratado pela empresa é o do Paypal, que aplica
juros simples de 1% a cada parcela, mais uma taxa de pagamento de 2%.
Fazer um programa para ler os dados de um contrato (número do contrato, data do contrato,
e valor total do contrato). Em seguida, o programa deve ler o número de meses para
parcelamento do contrato, e daí gerar os registros de parcelas a serem pagas (data e valor),
sendo a primeira parcela a ser paga um mês após a data do contrato, a segunda parcela dois
meses após o contrato e assim por diante. Mostrar os dados das parcelas na tela.
11
15/08/2018
Example:
Enter contract data
Number: 8028
Date (dd/MM/yyyy): 25/06/2018
Contract value: 600.00
Enter number of installments: 3
Installments:
25/07/2018 - 206.04
25/08/2018 - 208.08
25/09/2018 - 210.12
12
15/08/2018
Repositório Github
https://github.com/acenelio/interfaces4-java
13
15/08/2018
14
15/08/2018
Diferença fundamental
• Herança => reuso
• Interface => contrato a ser cumprido
https://github.com/acenelio/interfaces2-java
15
15/08/2018
Outro exemplo
https://github.com/acenelio/springboot2-ionic-backend/tree/master/src/main/java/com/nelioalves/cursomc/services
16
15/08/2018
Problema do diamante
A herança múltipla pode gerar o
problema do diamante: uma
ambiguidade causada pela
existência do mesmo método em
mais de uma superclasse.
ATENÇÃO:
https://github.com/acenelio/interfaces3-java
17
15/08/2018
Interface Comparable
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Interface Comparable
https://docs.oracle.com/javase/10/docs/api/java/lang/Comparable.html
18
15/08/2018
Problema motivador
Faça um programa para ler um arquivo contendo nomes de pessoas (um nome por
linha), armazenando-os em uma lista. Depois, ordenar os dados dessa lista e mostra-los
ordenadamente na tela. Nota: o caminho do arquivo pode ser informado "hardcode".
Maria Brown
Alex Green
Bob Grey
Anna White
Alex Black
Eduardo Rose
Willian Red
Marta Blue
Alex Brown
package application;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
19
15/08/2018
Outro problema
Faça um programa para ler um arquivo contendo funcionários (nome e salário) no
formato .csv, armazenando-os em uma lista. Depois, ordenar a lista por nome e mostrar
o resultado na tela. Nota: o caminho do arquivo pode ser informado "hardcode".
Maria Brown,4300.00
Alex Green,3100.00
Bob Grey,3100.00
Anna White,3500.00
Alex Black,2450.00
Eduardo Rose,4390.00
Willian Red,2900.00
Marta Blue,6100.00
Alex Brown,5000.00
Interface Comparable
public interface Comparable<T> { System.out.println("maria".compareTo("alex"));
int compareTo(T o); System.out.println("alex".compareTo("maria"));
} System.out.println("maria".compareTo("maria"));
Output:
12
-12
0
https://docs.oracle.com/javase/10/docs/api/java/lang/Comparable.html
Method compareTo:
Parameters:
o - the object to be compared.
Returns:
a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.
20
15/08/2018
package application;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import entities.Employee;
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package entities;
@Override
public int compareTo(Employee other) {
return name.compareTo(other.getName());
}
}
21
15/08/2018
Default methods
http://educandoweb.com.br
Prof. Dr. Nelio Alves
• Outras vantagens:
• Manter a retrocompatibilidade com sistemas existentes
• Permitir que "interfaces funcionais" (que devem conter apenas um método)
possam prover outras operações padrão reutilizáveis
22
15/08/2018
Problema exemplo
Veja o exemplo.
Example
Amount: 200.00
Months: 3
Payment after 3 months:
212.24
https://github.com/acenelio/interfaces5-java
23
15/08/2018
Amount: 200.00
Months: 3
Payment after 3 months:
206.06
https://github.com/acenelio/interfaces5-java
24
15/08/2018
Considerações importantes
• Sim: agora as interfaces podem prover reuso
25
Curso
Programação Orientada a
Objetos com Java
Capítulo: Generics, Set, Map
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Introdução aos Generics
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Generics
• Generics permitem que classes, interfaces e métodos possam ser
parametrizados por tipo. Seus benefícios são:
• Reuso
• Type safety
• Performance
https://github.com/acenelio/generics1-java
Genéricos delimitados
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Problema
Uma empresa de consultoria deseja avaliar a performance de produtos,
funcionários, dentre outras coisas. Um dos cálculos que ela precisa é encontrar
o maior dentre um conjunto de elementos. Fazer um programa que leia um
conjunto de produtos a partir de um arquivo, conforme exemplo, e depois
mostre o mais caro deles.
Criar um serviço de cálculo:
Computer,890.50
IPhone X,910.00
Tablet,550.00
Most expensive:
IPhone, 910.00
Nota: Java possui:
https://github.com/acenelio/generics2-java Collections.max(list)
package services;
import java.util.List;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.List;
O compilador não sabe qual é o tipo específico do qual a lista foi instanciada.
Curingas delimitados (bounded
wildcards)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Problema 1
Vamos fazer um método para retornar a soma das áreas de uma lista de
figuras.
https://github.com/acenelio/generics4-java
Problema 2 (princípio get/put)
Vamos fazer um método que copia os elementos de uma lista para uma
outra lista que pode ser mais genérica que a primeira.
copy(myInts, myObjs);
copy(myDoubles, myObjs);
https://stackoverflow.com/questions/1368166/what-is-a-difference-between-super-e-and-extends-e
Java wrapper types (próximos exemplos)
Princípio get/put - covariância
List<Integer> intList = new ArrayList<Integer>();
intList.add(10);
intList.add(5);
Number x = list.get(0);
get - OK
put - ERROR
Princípio get/put - contravariância
List<Object> myObjs = new ArrayList<Object>();
myObjs.add("Maria");
myObjs.add("Alex");
myNums.add(10);
myNums.add(3.14);
get - ERROR
put - OK
package application;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
copy(myInts, myObjs);
printList(myObjs);
copy(myDoubles, myObjs);
printList(myObjs);
}
public static void copy(List<? extends Number> source, List<? super Number> destiny) {
for(Number number : source) {
destiny.add(number);
}
}
String a = "Maria";
String b = "Alex";
System.out.println(a.equals(b));
HashCode
Método que retorna um número inteiro representando um código gerado
a partir das informações do objeto
String a = "Maria";
String b = "Alex";
System.out.println(a.hashCode());
System.out.println(b.hashCode());
Regra de ouro do HashCode
• Se o hashCode de dois objetos for diferente, então os dois objetos são
diferentes
• https://docs.oracle.com/javase/10/docs/api/java/util/Set.html
Alguns métodos importantes
• add(obj), remove(obj), contains(obj)
• Baseado em equals e hashCode
• Se equals e hashCode não existir, é usada comparação de ponteiros
• clear()
• size()
• removeIf(predicate)
import java.util.HashSet;
import java.util.Set;
import Entities.Product;
set.add("TV");
set.add("Notebook");
set.add("Tablet");
System.out.println(set.contains("Notebook"));
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
//union
Set<Integer> c = new TreeSet<>(a);
c.addAll(b);
System.out.println(c);
//intersection
Set<Integer> d = new TreeSet<>(a);
d.retainAll(b);
System.out.println(d);
//difference
Set<Integer> e = new TreeSet<>(a);
e.removeAll(b);
System.out.println(e);
}
}
Como Set testa igualdade?
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Como as coleções Hash testam igualdade?
• Se hashCode e equals estiverem implementados:
• Primeiro hashCode. Se der igual, usa equals para confirmar.
import java.util.HashSet;
import java.util.Set;
import Entities.Product;
System.out.println(set.contains(prod));
}
}
package entities;
import java.util.Set;
import java.util.TreeSet;
import Entities.Product;
@Override
public String toString() {
return "Product [name=" + name + ", price=" + price + "]";
}
@Override
public int compareTo(Product other) {
return name.toUpperCase().compareTo(other.getName().toUpperCase());
}
}
Exercício resolvido (Set)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Problema exemplo
Um site de internet registra um log de acessos dos usuários. Um
registro de log consiste no nome de usuário (apenas uma palavra) e o
instante em que o usuário acessou o site no padrão ISO 8601,
separados por espaço, conforme exemplo. Fazer um programa que leia
o log de acessos a partir de um arquivo, e daí informe quantos usuários
distintos acessaram o site.
Example
input file:
amanda 2018-08-26T20:45:08Z
alex86 2018-08-26T21:49:37Z
bobbrown 2018-08-27T03:19:13Z
amanda 2018-08-27T08:11:00Z
jeniffer3 2018-08-27T09:19:24Z
alex86 2018-08-27T22:39:52Z
amanda 2018-08-28T07:42:19Z
Execution:
Enter file full path: c:\temp\in.txt
Total users: 4
https://github.com/acenelio/set1-java
Exercício proposto (Set)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Em um portal de cursos online, cada usuário possui um código único, representado por
um número inteiro.
Cada instrutor do portal pode ter vários cursos, sendo que um mesmo aluno pode se
matricular em quantos cursos quiser. Assim, o número total de alunos de um instrutor não
é simplesmente a soma dos alunos de todos os cursos que ele possui, pois pode haver
alunos repetidos em mais de um curso.
O instrutor Alex possui três cursos A, B e C, e deseja saber seu número total de alunos.
Seu programa deve ler os alunos dos cursos A, B e C do instrutor Alex, depois mostrar a
quantidade total e alunos dele, conforme exemplo.
https://github.com/acenelio/set2-java
Example:
• Principais implementações:
• HashMap - mais rápido (operações O(1) em tabela hash) e não ordenado
• TreeMap - mais lento (operações O(log(n)) em árvore rubro-negra) e ordenado pelo
compareTo do objeto (ou Comparator)
• LinkedHashMap - velocidade intermediária e elementos na ordem em que são adicionados
Alguns métodos importantes
• put(key, value), remove(key), containsKey(key), get(key)
• Baseado em equals e hashCode
• Se equals e hashCode não existir, é usada comparação de ponteiros
• clear()
• size()
import java.util.Map;
import java.util.TreeMap;
cookies.put("username", "maria");
cookies.put("email", "[email protected]");
cookies.put("phone", "99771122");
cookies.remove("email");
cookies.put("phone", "99771133");
System.out.println("ALL COOKIES:");
for (String key : cookies.keySet()) {
System.out.println(key + ": " + cookies.get(key));
}
}
}
Demo 2
package application;
import java.util.HashMap;
import java.util.Map;
import Entities.Product;
stock.put(p1, 10000.0);
stock.put(p2, 20000.0);
stock.put(p3, 15000.0);
Execution:
Enter file full path: c:\temp\in.txt
Alex Blue: 76
Maria Green: 71
Bob Brown: 61
Solução do exercício
https://github.com/acenelio/map1-java
26/06/2018
Curso
Programação Orientada a
Objetos com Java
Capítulo: Programação Funcional e Expressões Lambda
http://educandoweb.com.br
Prof. Dr. Nelio Alves
1
26/06/2018
Problema
• Suponha uma classe Product com os atributos name e price.
Comparator
https://docs.oracle.com/javase/10/docs/api/java/util/Comparator.html
2
26/06/2018
Resumo da aula
• Comparator objeto de classe separada
https://github.com/acenelio/lambda1-java
3
26/06/2018
Paradigmas de programação
• Imperativo (C, Pascal, Fortran, Cobol)
• Orientado a objetos (C++, Object Pascal, Java (< 8), C# (< 3))
• Lógico (Prolog)
Programação Programação
Imperativa Funcional
comandos expressões
Como se descreve algo a ser computado (*)
("como" - imperativa) ("o quê" - declarativa)
Funções possuem transparência referencial
fraco forte
(ausência de efeitos colaterais)
Objetos imutáveis (*) raro comum
Funções são objetos de primeira ordem não sim
Expressividade / código conciso baixa alta
Tipagem dinâmica / inferência de tipos raro comum
4
26/06/2018
Transparência referencial
Uma função possui transparência referencial se seu resultado for sempre o mesmo
para os mesmos dados de entrada. Benefícios: simplicidade e previsibilidade.
package application;
import java.util.Arrays;
Isso significa que funções podem, por exemplo, serem passadas como parâmetros de
métodos, bem como retornadas como resultado de métodos.
list.sort(Program::compareProducts);
Sintaxe:
Classe::método
list.forEach(System.out::println);
}
}
5
26/06/2018
list.forEach(System.out::println);
}
Integer sum = 0;
for (Integer x : list) {
sum += x;
}
vs.
Integer sum = list.stream().reduce(0, Integer::sum);
6
26/06/2018
(...)
list.sort(Program::compareProducts);
(...)
Resumo da aula
7
26/06/2018
Interface funcional
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Interface funcional
É uma interface que possui um único método abstrato. Suas
implementações serão tratadas como expressões lambda.
public class MyComparator implements Comparator<Product> {
@Override
public int compare(Product p1, Product p2) {
return p1.getName().toUpperCase().compareTo(p2.getName().toUpperCase());
}
}
(...)
list.sort(new MyComparator());
8
26/06/2018
• Function
• https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
• Consumer
• https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
• Nota: ao contrário das outras interfaces funcionais, no caso do Consumer, é
esperado ele possa gerar efeitos colaterais
9
26/06/2018
Predicate
https://docs.oracle.com/javase/10/docs/api/java/util/function/Predicate.html
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, remova da
lista somente aqueles cujo preço mínimo seja 100.
https://github.com/acenelio/lambda2-java
10
26/06/2018
Versões:
• Implementação da interface
11
26/06/2018
Consumer
https://docs.oracle.com/javase/10/docs/api/java/util/function/Consumer.html
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, aumente o
preço dos produtos em 10%.
https://github.com/acenelio/lambda3-java
12
26/06/2018
Function
https://docs.oracle.com/javase/10/docs/api/java/util/function/Function.html
R apply(T t);
}
13
26/06/2018
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, gere uma
nova lista contendo os nomes dos produtos em caixa alta.
https://github.com/acenelio/lambda4-java
• Conversões:
14
26/06/2018
Recordando
• removeIf(Predicate)
• foreach(Consumer)
• map(Function)
15
26/06/2018
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, calcule a
soma dos preços somente dos produtos cujo nome começa com "T".
https://github.com/acenelio/lambda5-java
Stream
http://educandoweb.com.br
Prof. Dr. Nelio Alves
16
26/06/2018
Stream
• É uma sequencia de elementos advinda de uma fonte de dados que
oferece suporte a "operações agregadas".
• Fonte de dados: coleção, array, função de iteração, recurso de E/S
• Sugestão de leitura:
http://www.oracle.com/technetwork/pt/articles/java/streams-api-java-8-3410098-ptb.html
Características
• Stream é uma solução para processar sequências de dados de forma:
• Declarativa (iteração interna: escondida do programador)
• Parallel-friendly (imutável -> thread safe)
• Sem efeitos colaterais
• Sob demanda (lazy evaluation)
17
26/06/2018
• Operação intermediária:
• Produz uma nova streams (encadeamento)
• Só executa quando uma operação terminal é invocada (lazy evaluation)
• Operação terminal:
• Produz um objeto não-stream (coleção ou outro)
• Determina o fim do processamento da stream
Operações intermediárias
• filter
• map
• flatmap
• peek
• distinct
• sorted
• skip
• limit (*)
* short-circuit
18
26/06/2018
Operações terminais
• forEach
• forEachOrdered
• toArray
• reduce
• collect
• min
• max
• count
• anyMatch (*)
• allMatch (*)
• noneMatch (*)
• findFirst (*)
• findAny (*)
* short-circuit
19
26/06/2018
Stream<Long> st4 = Stream.iterate(new long[]{ 0L, 1L }, p->new long[]{ p[1], p[0]+p[1] }).map(p -> p[0]);
System.out.println(Arrays.toString(st4.limit(10).toArray()));
Pipeline (demo)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
20
26/06/2018
Demo - pipeline
21
26/06/2018
https://github.com/acenelio/lambda6-java
Input file:
Tv,900.00
Mouse,50.00
Tablet,350.50
HD Case,80.90
Computer,850.00
Monitor,290.00
Execution:
Enter full file path: c:\temp\in.txt
Average price: 420.23
Tablet
Mouse
Monitor
HD Case
https://github.com/acenelio/lambda6-java
22
26/06/2018
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
https://github.com/acenelio/lambda7-java
23
26/06/2018
Input file:
Maria,[email protected],3200.00
Alex,[email protected],1900.00
Marco,[email protected],1700.00
Bob,[email protected],3500.00
Anna,[email protected],2800.00
Execution:
Enter full file path: c:\temp\in.txt
Enter salary: 2000.00
Email of people whose salary is more than 2000.00:
[email protected]
[email protected]
[email protected]
Sum of salary of people whose name starts with 'M': 4900.00
https://github.com/acenelio/lambda7-java
24
Curso: Programação Orientada a Objetos com Java
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Objetivo geral:
JDBC (Java Database Connectivity): API padrão do Java para acesso a dados
Páginas oficiais:
o https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/
o https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html
Pacotes: java.sql e javax.sql (API suplementar para servidores)
Instalação das ferramentas:
Checklist:
Usando o MySQL Workbench, crie uma base de dados chamada "coursejdbc"
Baixar o MySQL Java Connector
Caso ainda não exista, criar uma User Library contendo o arquivo .jar do driver do MySQL
o Window -> Preferences -> Java -> Build path -> User Libraries
o Dê o nome da User Library de MySQLConnector
o Add external JARs -> (localize o arquivo jar)
Criar um novo Java Project
o Acrescentar a User Library MySQLConnector ao projeto
Na pasta raiz do projeto, criar um arquivo "db.properties" contendo os dados de conexão:
user=developer
password=1234567
dburl=jdbc:mysql://localhost:3306/coursejdbc
useSSL=false
No pacote "db", criar uma exceção personalizada DbException
No pacote "db", criar uma classe DB com métodos estáticos auxiliares
o Obter e fechar uma conexão com o banco
API:
Statement
ResultSet
o first() [move para posição 1, se houver]
o beforeFirst() [move para posição 0]
o next() [move para o próximo, retorna false se já estiver no último]
o absolute(int) [move para a posição dada, lembrando que dados reais começam em 1]
Checklist:
Usar o script SQL para criar a base de dados "coursejdbc"
Fazer um pequeno programa para recuperar os departamentos
Na classe DB, criar métodos auxiliares estáticos para fechar ResultSet e Statement
API:
PreparedStatement
executeUpdate
Statement.RETURN_GENERATED_KEYS
getGeneratedKeys
Checklist:
Inserção simples com preparedStatement
Inserção com recuperação de Id
Checklist:
Criar DbIntegrityException
Tratar a exceção de integridade referencial
Demo: transações
Referências: https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.4.0/product-overview/acid.html
API:
setAutoCommit(false)
commit()
rollback()
Padrão de projeto DAO (Data Access Object)
Referências:
https://www.devmedia.com.br/dao-pattern-persistencia-de-dados-utilizando-o-padrao-dao/30999
https://www.oracle.com/technetwork/java/dataaccessobject-138824.html
Project: http://github.com/acenelio/demo-dao-jdbc
Checklist:
Github: create a new project
o NOTE: choose .gitignore type as Java
Eclipse: create new java project with MySQLConnector library
o Copy db package and db.properties from: https://github.com/acenelio/jdbc5
Create local repository and push to Github:
git init
git remote add origin https://github.com/acenelio/jdbc-dao-demo.git
git pull origin master
git add .
git commit -m "Project created"
git push -u origin master
(video)
(video)
(video)
findById implementation
SQL Query:
Reusing instantiation
SQL Query:
INCORRECT
CORRECT
findAll implementation
SQL Query:
SQL Query:
update implementation
SQL Query:
UPDATE seller
SET Name = ?, Email = ?, BirthDate = ?, BaseSalary = ?, DepartmentId = ?
WHERE Id = ?
delete implementation
SQL Query:
Checklist:
DepartmentDaoJDBC
DaoFactory
Program2
http://github.com/acenelio/demo-dao-jdbc
Curso: Java COMPLETO - Programação Orientada a Objetos + Projetos
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Objetivo geral:
JavaFX é o sucessor do Swing e Java AWT para interfaces gráficas com Java
Uma tela JavaFX pode ser montada via código Java, ou via código FXML
Preparação do Eclipse
Checklist:
Baixar o JavaFX SDK: https://gluonhq.com/products/javafx/
o Salvar em uma pasta "fácil", de preferência com nome sem espaços
Exemplo: C:\java-libs
Checklist:
Criação do projeto:
o File -> New -> Other -> JavaFX Project
o Dê um nome ao projeto e clique Next
o Na aba Libraries, selecione Modulepath, clique Add Library, e selecione JavaFX
o Clique Finish
o Module Info: Don't Create
Configuração do build:
o Botão direito no projeto -> Run As -> Run Configurations -> Arguments -> VM Arguments
o Copiar o conteúdo abaixo, adaptando para sua pasta:
package application;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
Testando o FXML
Projeto: https://github.com/acenelio/javafx1
Checklist:
Criar um pacote gui
Criar um FXML no projeto: Botão direito no pacote gui -> New -> Other -> New FXML Document
o Nome: View
Abra o FXML no SceneBuilder: Botão direito -> Open in SceneBuilder
Observe as guias: Library, Document e Inspector
o Inspector -> Layout: defina largura e altura, depois salve
o Library -> Control: acrescente alguns controles (ex: TextField, Button)
De volta ao Eclipse, na classe Main, refazer o método start:
@Override
public void start(Stage stage) {
try {
Parent parent = FXMLLoader.load(getClass().getResource("/gui/View.fxml"));
Scene scene = new Scene(parent);
stage.setScene(scene);
stage.show();
}
catch (IOException e) {
e.printStackTrace();
}
}
Tratando eventos com JavaFX
Projeto: https://github.com/acenelio/javafx2
Checklist:
Crie uma classe controladora da sua view (ex: ViewController.java)
No controlador:
o Criar um atributo correspondente ao controle desejado e anotá-lo com @FXML
o Criar um método para tratar o evento desejado do controle e anotá-lo com @FXML
DICA: quando mudar algo no SceneBuilder, use Project -> Clean no Eclipse para forçar a atualização do projeto
Mostrando Alert
Projeto: https://github.com/acenelio/javafx3
package gui.util;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
public static void showAlert(String title, String header, String content, AlertType type) {
Alert alert = new Alert(type);
alert.setTitle(title);
alert.setHeaderText(header);
alert.setContentText(content);
alert.show();
}
}
Projeto: https://github.com/acenelio/javafx4
Checklist:
Desenhar tela no SceneBuilder (usar um label para resultado)
o Propriedade "promptText"
Criar um controller e implementar código para mostrar a soma
o Tratar exceção NumberFormatException
De volta ao Scene Builder, fazer as associações de id e evento
DICA: quando mudar algo no SceneBuilder, use Project -> Clean no Eclipse para forçar a atualização do projeto
Limitações para TextField e Initializable
Projeto: https://github.com/acenelio/javafx5
Referências: https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/Initializable.html
Checklist:
Criar classe utilitária Constraints
Fazer o controlador implementar a interface Initializable
package gui.util;
import javafx.scene.control.TextField;
ComboBox
Projeto: https://github.com/acenelio/javafx6
Checklist:
Propriedade Prompt Text
Usar tipo genérico, por exemplo: ComboBox<Person>
ObservableList<Person>, ObservableSet<Person>, ObservableMap<Person>
o Para criar um ObservableList: FXCollections.observableList(list)
ComboBox.setItems(observableList)
Nota: o combo box, por padrão, mostra o toString do objeto
Para obter o elemento selecionado: comboBox.getSelectionModel().getSelectedItem()
Para acessar a coleção: comboBox.getItems()
Para definir o que mostrar na comboBox:
comboBox.setCellFactory(factory);
comboBox.setButtonCell(factory.call(null));
Checklist:
AnchorPane
GridPane
SplitPane
VBox & HBox
BorderPane
ScrollPane
https://www.udemy.com/user/nelio-alves
Prof. Dr. Nelio Alves
Java Persistence API (JPA) é a especificação padrão da plataforma Java EE (pacote javax.persistence) para
mapeamento objeto-relacional e persistência de dados.
Para trabalhar com JPA é preciso incluir no projeto uma implementação da API (ex: Hibernate).
Principais classes:
EntityManager
https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html
Um objeto EntityManager encapsula uma conexão com a base de dados e serve para efetuar operações de
acesso a dados (inserção, remoção, deleção, atualização) em entidades (clientes, produtos, pedidos, etc.)
por ele monitoradas em um mesmo contexto de persistência.
Escopo: tipicamente mantem-se uma instância única de EntityManager para cada thread do sistema (no caso
de aplicações web, para cada requisição ao sistema).
EntityManagerFactory
https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManagerFactory.html
Escopo: tipicamente mantem-se uma instância única de EntityManagerFactory para toda aplicação.
3) Criando uma aplicação simples
Passos:
2) Crie o projeto
File -> New -> Java Project
package dominio;
import (...)
(...)
Passos:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.12.Final</version>
</dependency>
package dominio;
import (...)
@Entity
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
(...)
Objetivos
Criar projeto Spring Boot Java
Implementar modelo de domínio
Estruturar camadas lógicas: resource, service, repository
Configurar banco de dados de teste (H2)
Povoar o banco de dados
CRUD - Create, Retrieve, Update, Delete
Tratamento de exceções
Github:
https://github.com/acenelio/workshop-springboot2-jpa
Domain Model
Domain Instance
Logical Layers
Project created
Checklist:
File -> New -> Spring Starter Project
o Maven
o Java 11
o Packing JAR
o Dependencies: Spring Web Starter
Checklist:
JPA & H2 dependencies
application.properties
application-test.properties
Entity: JPA mapping
Dependencies:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
application.properties:
spring.profiles.active=test
spring.jpa.open-in-view=true
application-test.properties:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
Checklist:
UserRepository extends JPARepository<User, Long>
Configuration class for "test" profile
@Autowired UserRepository
Instantiate objects in memory
Persist objects
Objects:
User u1 = new User(null, "Maria Brown", "[email protected]", "988888888", "123456");
User u2 = new User(null, "Alex Green", "[email protected]", "977777777", "123456");
Objects:
Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"), u1);
Order o2 = new Order(null, Instant.parse("2019-07-21T03:42:10Z"), u2);
Order o3 = new Order(null, Instant.parse("2019-07-22T15:21:22Z"), u1);
OrderStatus enum
Category
Objects:
Category cat1 = new Category(null, "Electronics");
Category cat2 = new Category(null, "Books");
Category cat3 = new Category(null, "Computers");
Product
Objects:
Product p1 = new Product(null, "The Lord of the Rings", "Lorem ipsum dolor sit amet, consectetur.", 90.5, "");
Product p2 = new Product(null, "Smart TV", "Nulla eu imperdiet purus. Maecenas ante.", 2190.0, "");
Product p3 = new Product(null, "Macbook Pro", "Nam eleifend maximus tortor, at mollis.", 1250.0, "");
Product p4 = new Product(null, "PC Gamer", "Donec aliquet odio ac rhoncus cursus.", 1200.0, "");
Product p5 = new Product(null, "Rails for Dummies", "Cras fringilla convallis sem vel faucibus.", 100.99, "");
Checklist:
OrderItemPK
OrderItem
Order one-to-many association
Seed
Objects:
OrderItem oi1 = new OrderItem(o1, p1, 2, p1.getPrice());
OrderItem oi2 = new OrderItem(o1, p3, 1, p3.getPrice());
OrderItem oi3 = new OrderItem(o2, p3, 2, p3.getPrice());
OrderItem oi4 = new OrderItem(o3, p5, 2, p5.getPrice());
Checklist:
UserService
UserResource
Test:
{
"name": "Bob Brown",
"email": "[email protected]",
"phone": "977557755",
"password": "123456"
}
User delete
Checklist:
UserService
UserResource
User update
Checklist:
UserService
UserResource
Test:
{
"name": "Bob Brown",
"email": "[email protected]",
"phone": "977557755"
}
Checklist:
NEW CLASS: services.exceptions.ResourceNotFoundException
NEW CLASS: resources.exceptions.StandardError
NEW CLASS: resources.exceptions.ResourceExceptionHandler
UserService
Exception handling - delete
Checklist:
NEW CLASS: services.exceptions.DatabaseException
ResourceExceptionHandler
UserService
o EmptyResultDataAccessException
o DataIntegrityViolationException
Checklist:
UserService
o EntityNotFoundException
Checklist:
Heroku Sign Up
Create app
Provision PostgreSQL
o App dashboard -> Resources
o Search "postgres" -> select "Heroku Postgres"
Checklist:
Download and install: https://www.postgresql.org/download/
o Super user: postgres
o Password: 1234567
o Port: 5432
Start/stop service: Task manager -> Services
Check instalation
o Start pgAdmin
o Databases -> Create -> Database
Encoding: UTF8
Dev profile
Checklist:
PgAdmin: create local database: create database springboot_course
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
spring.datasource.url=jdbc:postgresql://localhost:5432/springboot_course
spring.datasource.username=postgres
spring.datasource.password=1234567
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
jwt.secret=MYJWTSECRET
jwt.expiration=3600000
Run application
Checklist:
App dashboard -> Settings - > Config Vars
EXAMPLE:
postgres://wavglvupbdad:358f443aafe452eca4c58fbc15d02e50b08130c7aaea3aff6c4f59c
[email protected]:5432/d7u9ub86cdsu
user: wavglvupbdad
password: 358f443aafe452eca4c58fbc15d02e50b08130c7aaea3aff6c4f59c13f9abb
server: ec2-23-21-106-266.compute-1.amazonaws.com
port: 5432
database: d7u9ub86cdsu
Create: application-prod.properties
spring.datasource.url=${DATABASE_URL}
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=false
jwt.secret=${JWT_SECRET}
jwt.expiration=${JWT_EXPIRATION}
Update application.properties: spring.profiles.active=prod
java.runtime.version=11
Send to Heroku:
git add .
git commit -m "Deploy app to Heroku"
git push heroku master
Curso: Programação Orientada a Objetos com Java
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Objetivo geral:
Instalação do MongoDB
Checklist Windows:
https://www.mongodb.com -> Download -> Community Server
Baixar e realizar a instalação com opção "Complete"
o ATENÇÃO: optaremos no curso por NÃO instalar o Compass por enquanto
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ -> Set up the MongoDB environment
o Criar pasta \data\db
o Acrescentar em PATH: C:\Program Files\MongoDB\Server\3.6\bin (adapte para sua versão)
Testar no terminal: mongod
Checklist Mac:
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/
Instalar brew:
o https://brew.sh -> executar o comando apresentado na primeira página
Instalar o MongoDB:
o brew install mongodb
Criar pasta /data/db:
o sudo mkdir -p /data/db
Liberar acesso na pasta criada
o whoami (para ver seu nome de usuário, exemplo: nelio)
o sudo chown -Rv nelio /data/db
Testar no terminal:
o mongod
ATUALIZAÇÃO
Quando houver alguma atualização para compatibilidade com Spring Boot 2, será mostrado no início do
vídeo e também aqui no material de apoio.
Checklist:
File -> New -> Spring Starter Project
o Escolher somente o pacote Web por enquanto
Rodar o projeto e testar: http://localhost:8080
Se quiser mudar a porta padrão do projeto, incluir em application.properties: server.port=${port:8081}
Checklist:
No subpacote domain, criar a classe User
No subpacote resources, criar uma classe UserResource e implementar nela o endpoint GET padrão:
@RestController
@RequestMapping(value="/users")
public class UserResource {
@RequestMapping(method=RequestMethod.GET)
public ResponseEntity<List<User>> findAll() {
List<User> list = new ArrayList<>();
User maria = new User("1001", "Maria Brown", "[email protected]");
User alex = new User("1002", "Alex Green", "[email protected]");
list.addAll(Arrays.asList(maria, alex));
return ResponseEntity.ok().body(list);
}
}
Conectando ao MongoDB com repository e service
Referências:
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-nosql.html
https://stackoverflow.com/questions/38921414/mongodb-what-are-the-default-user-and-password
Checklist:
Em pom.xml, incluir a dependência do MongoDB:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
ATUALIZAÇÃO
Para o projeto ficar compatível com Spring Boot 2.x.x:
Checklist:
No subpacote config, criar uma classe de configuração Instantiation que implemente CommandlLineRunner
Dados para copiar:
DTO (Data Transfer Object): é um objeto que tem o papel de carregar dados das entidades de forma simples,
podendo inclusive "projetar" apenas alguns dados da entidade original. Vantagens:
- Evitar que dados de interesse exclusivo do sistema fiquem sendo expostos (por exemplo: senhas, dados de
auditoria como data de criação e data de atualização do objeto, etc.)
- Customizar os objetos trafegados conforme a necessidade de cada requisição (por exemplo: para alterar
um produto, você precisa dos dados A, B e C; já para listar os produtos, eu preciso dos dados A, B e a
categoria de cada produto, etc.).
Checklist:
No subpacote dto, criar UserDTO
Em UserResource, refatorar o método findAll
Obtendo um usuário por id
ATUALIZAÇÃO
Para o projeto ficar compatível com Spring Boot 2.x.x:
Por este:
import java.util.Optional;
(...)
Checklist:
No subpacote service.exception, criar ObjectNotFoundException
Em UserService, implementar o método findById
Em UserResource, implementar o método findById (retornar DTO)
No subpacote resources.exception, criar as classes:
o StandardError
o ResourceExceptionHandler
ATUALIZAÇÃO
Para o projeto ficar compatível com Spring Boot 2.x.x:
repo.deleteById(id);
Checklist:
Em UserService, implementar o método delete
Em UserResource, implementar o método delete
ATUALIZAÇÃO
Para o projeto ficar compatível com Spring Boot 2.x.x:
Por este:
Checklist:
Em UserService, implementar os métodos update e updateData
Em UserResource, implementar o método update
Checklist:
Criar classe Post
Criar PostRepository
Inserir alguns posts na carga inicial da base de dados
Referências:
https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/
https://docs.spring.io/spring-data/data-document/docs/current/reference/html/
Consulta:
"Buscar posts contendo um dado string no título"
Checklist:
Em PostRepository, criar o método de busca
Em PostService, criar o método de busca
No subpacote resources.util, criar classe utilitária URL com um método para decodificar parâmetro de URL
Em PostResource, implementar o endpoint
Referências:
https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/
https://docs.spring.io/spring-data/data-document/docs/current/reference/html/
https://docs.mongodb.com/manual/reference/operator/query/regex/
Consulta:
"Buscar posts contendo um dado string no título"
Checklist:
Em PostRepository, fazer a implementação alternativa da consulta
Em PostService, atualizar a chamada da consulta
Consulta:
"Buscar posts contendo um dado string em qualquer lugar (no título, corpo ou comentários) e em um dado
intervalo de datas"
Checklist:
Em PostRepository, criar o método de consulta
Em PostService, criar o método de consulta
Na classe utilitária URL, criar métodos para tratar datas recebidas
Em PostResource, implementar o endpoint
{
"id": "1001",
"name": "Maria Brown",
"email": "[email protected]",
"posts": [
{
"date": "2018-03-21",
"title": "Partiu viagem",
"body": "Vou viajar para São Paulo. Abraços!",
"comments": [
{
"text": "Boa viagem mano!",
"date": "2018-03-21",
"author": {
"id": "1013",
"name": "Alex Green"
}
},
{
"text": "Aproveite!",
"date": "2018-03-22",
"author": {
"id": "1027",
"name": "Bob Grey"
}
}
]
},
{
"date": "2018-03-23",
"title": "Bom dia",
"body": "Acordei feliz hoje!",
"comments": [
{
"text": "Tenha um ótimo dia!",
"date": "2018-03-23",
"author": {
"id": "1013",
"name": "Alex Green"
}
}
]
}
]
}
{
"id": "1001",
"name": "Maria Brown",
"email": "[email protected]",
"posts": ["5001", "5010"]
}
{
"id": "5001",
"date": "2018-03-21",
"title": "Partiu viagem",
"body": "Vou viajar para São Paulo. Abraços!",
"author": {
"id": "1001",
"name": "Maria Brown"
},
"comments": [
{
"text": "Boa viagem mano!",
"date": "2018-03-21",
"author": {
"id": "1013",
"name": "Alex Green"
}
},
{
"text": "Aproveite!",
"date": "2018-03-22",
"author": {
"id": "1027",
"name": "Bob Grey"
}
}
]
}
{
"id": "5010",
"date": "2018-03-23",
"title": "Bom dia",
"body": "Acordei feliz hoje!",
"author": {
"id": "1001",
"name": "Maria Brown"
},
"comments": [
{
"text": "Tenha um ótimo dia!",
"date": "2018-03-23",
"author": {
"id": "1013",
"name": "Alex Green"
}
}
]
}