Java - Prof. Fábio
Java - Prof. Fábio
Bibliografia recomendada...
1. Java Como Programar
10ª edição, 2017, Pearson
Paul Deitel, Harvey Deitel
2. OCA – Oracle Certified Associate
Java SE 8 Programmer I
Study Guide, 2015
Jeanne Boyarsky, Scott Selikoff
3. OCA – Java SE 8 Programmer I
Certification Guide
Manning, 2017
Mala Gupta
4. Lógica de Programação e Estruturas de Dados
3ª edição, 2016, Pearson
Sandra Puga, Gerson Rissetti
5. http://docs.oracle.com/javase/8
6. JDK → src.zip (Java API)
Página 2
Panorama Geral
AWT
JavaFX
Android
Tecnologia de Objetos Apps
“Fundamentos da
Linguagem”
Banco de
Dados
Página 3
1 Introdução ao Java
Java ME (Micro Edition): Direcionada a dispositivos com recursos limitados (memória, CPU,
armazenamento). Sistemas Android adotam uma versão customizada de Java ME → Smart phones,
tablets, smart TVs, smart watches, etc.
Google Android (+80% do mercado) → Ambiente de desenvolvimento...
Android Studio + Android SDK + JDK (SE)
Restante do mercado: Apple iOS, Windows Phone e outros
JDK → www.oracle.com/technetwork/java/javase/downloads/index.html
JAVA_HOME = <jdk-installation-directory>
PATH = <jdk-installation-directory>/bin
CLASSPATH = .
Habilidades…
Entender o propósito das edições Java. Preparar um ambiente de desenvolvimento Java: NetBeans + JDK SE.
Página 4
keywords...
abstract continue for new switch
assert default if package synchronized
boolean do goto private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
Habilidades…
Entender o que são palavras-chave (keywords). Reconhecer que Java é mais fácil que C++.
Página 5
App: Welcome
Windows
Fase 1 Fase 2
Welcome.java “javac”
Welcome.class “java” Interpretação ou
(bytecode) JIT Hotspot Linux
(source code) compiler JVM
“portable” compilation
Habilidades...
Compreender a estrutura básica de um código Java. Entender a importância do recuo de código. Entender o propósito das diferentes fases de compilação.
Reconhecer o ponto de partida em um programa Java. Construir e executar um código Java simples. Entender a portabilidade 32-64 bits.
Página 6
App: FichaPessoal
Nome: Joaquim José da Silva Xavier
Endereço: Rua Tiradentes, 1000
Bairro: Centro
Cep: 15100-000 Cidade: São José do Rio Preto – SP
Telefone: 9.9090-1234
1. System.out.println
2. System.out.print + System.out.println
App: ArvoreNatal
*
***
*****
_|_
Habilidades...
Imprimir saída de texto no terminal de comandos. Entender a diferença entre System.out.print e System.out.println.
Página 7
Comentários em Java
// Comentário de linha
/*
Comentário de bloco
Pode conter diversas linhas
*/
/**
Comentário javadoc
Contém código para gerar documentação
*/
“javadoc”
source code HTML
JDK
Exemplos...
salario = salario * 1.1; // 10% de aumento
/*
*
* Programa escrito por Ada Augusta
* 01/01/1850
*
*/
if (x == 2) // checa se x é igual a 2
/*
int x = 1; Péssimo!!!
int y = 2;
*/
Habilidades...
Reconhecer a importância de comentários. Saber quando, onde e como documentar/comentar trechos de código Java.
Página 8
Identificadores em Java
Identificadores são utilizados para dar nomes únicos a classes, interfaces, enumerações, arrays,
variáveis, métodos, etc.
Regras de nomeação...
1. Podem conter letras (A..Z, a..z), dígitos (0..9), underscore (_) e cifrão ($)
2. Não devem começar com um dígito
3. Não podem conter espaços
4. Letras maiúsculas e minúsculas são consideradas diferentes (case sensitive)
5. Caracteres acentuados, chineses, asiáticos, etc. são permitidos mas não recomendados
6. Não há restrições de tamanho
Identificadores válidos...
Pessoa
pessoa
x1
MAX_SIZE
salario$ → não recomendável
Identificadores inválidos...
1x
nome da pessoa
int
Habilidades...
Entender as regras de construção de identificadores. Reconhecer a importância da escolha de um nome simples e adequado.
Página 9
2 Tipos primitivos
Uma variável de um tipo primitivo contém um valor dentro do intervalo permitido para o tipo em
questão.
variável valor
Nome da variável
“identificador”
Exemplos...
idade (short) 28
Impossível
Habilidades...
Identificar os tipos de dados primitivos da linguagem Java e compreender o propósito e a capacidade de armazenamento de cada um. Entender o porquê do
padrão Unicode. Reconhecer a imprecisão numérica envolvendo cálculos com números de ponto flutuante.
Página 10
3 Tipos referência
Uma variável de um tipo referência (classe, interface, enumeração, array) contém um ponteiro
(endereço ou referência) para um objeto do tipo em questão.
32/64
variável ● bits
Nome da variável
“identificador”
Objeto
Heap
Exemplos...
univ (String) ●
Heap
Habilidades...
Entender a diferença entre alocação de dados do tipo primitivo e alocação de dados do tipo referência.
Página 11
Exemplos...
boolean estudante = true;
double salario = 9000.0;
String univ = "XYZ";
String cidade = "S. J. Rio Preto";
double salario2 = salario;
String cidade2 = cidade;
estudante true
salario 9000.0 “XYZ”
univ ●
cidade ●
salario2 9000.0 “S. J. Rio Preto”
cidade2 ●
Heap
univ = null;
cidade = null;
estudante true
salario 9000.0 “XYZ”
univ null
cidade null
salario2 9000.0 “S. J. Rio Preto”
cidade2 ●
Heap
O objeto String "XYZ", agora sem qualquer referência, ainda permanece no Heap. Contudo ele se torna
"elegível" para a coleta de lixo.
Habilidades...
Entender como declarar e inicializar variáveis. Compreender o mecanismo básico de coleta de lixo.
Página 12
5 Imutabilidade de strings
x ●
y ● “ABC”
Heap
x ●
y ● “ABC”
“DEF”
Heap
Strings em Java são imutáveis. Toda vez que uma string é criada ou modificada, um novo objeto String
é alocado no Heap.
Habilidades...
App: Dados
Imprimir...
Nome: João
Sexo: M
Idade: 28
Salário: 9000.0
}
}
Solução 1:
System.out.print(“Nome: ”);
System.out.prinln(nome);
... Solução 2:
System.out.println(“Nome: ” + nome);
...
Cuidado!
System.out.println("A soma de 1 e 2 resulta em " + 1 + 2);
Imprime: A soma de 1 e 2 resulta em 12
System.out.println("1 + 2 = " + (1 + 2));
Imprime: 1 + 2 = 3
Habilidades...
Compreender o conceito de concatenação de strings. Entender a diferença entre imprimir uma string ou o conteúdo de uma variável.
Página 14
App: Parabens
Habilidades...
Compreender o mecanismo básico de geração de objetos. Possibilitar a entrada de dados do tipo texto e numérico pelo terminal de comandos.
Página 15
App: CalculadoraInteiros
import java.util.Scanner;
Habilidades...
Saber quando utilizar os métodos print, println e printf. Reconhecer a simplicidade do uso de printf em situações onde a concatenação de strings levaria a
um código mais complexo.
Página 16
Operadores aritméticos
+ Adição
– Subtração
* Multiplicação
/ Divisão
% Resto
Operadores relacionais
== Igual
!= Diferente
> Maior
< Menor
>= Maior ou igual
<= Menor ou igual
Operadores lógicos
& AND (avaliação de curto-circuito: &&)
| OR (avaliação de curto-circuito: ||)
^ XOR
! NOT
Operadores de atribuição
= Recebe
+= Adiciona
-= Subtrai
*= Multiplica
/= Divide
%= Resto
&= AND
|= OR
^= XOR
Outros
++ Incremento
-- Decremento
?: Condicional
Habilidades...
7 Programação estruturada
_
___ _ goto
_
___
goto
_____ _
__
goto “spaghetti”
__ _ code
__
Na programação estruturada os algoritmos são implementados sem o uso de goto e com base em três
estruturas fundamentais:
- Sequência
- Decisão (if, if-else, switch)
- Repetição (for, while, do-while)
As estruturas de sequência, decisão e repetição podem ser encadeadas (uma após a outra) e também
aninhadas (nested – uma dentro da outra). A programação estruturada está incorporada na programação
orientada a objetos.
Estrutura de sequência
instrução-1;
instrução-2;
...
instrução-n;
Habilidades...
Reconhecer o problema com códigos do tipo “spaghetti”. Conhecer as três estruturas fundamentais da programação estruturada. Entender a diferença entre
código indentado (recuado), encadeado e aninhado.
Página 18
if (condição) instrução;
true
true
if (condição) {
bloco
true
if (condição)
instrução1; false
else
instrução2;
Cuidado!
if (condição1)
if (condição2)
if (condição) { true if (condição3)
instrução1;
bloco1 else
instrução2;
} else { false Indentação incorreta!
bloco2 Como escrever um else para cada uma
das condições?
}
Habilidades...
1. int x = 1;
if (x > 0) x = x + 1;
2. int x = 10;
int y = 9;
if (x + y > 20)
x = 1;
else
x++;
3. short idade = 17;
char sexo = 'M';
int x = 0;
if (sexo == 'M' && idade >= 18)
System.out.println("Homem adulto");
x = 1;
4. int x = 9;
if (x > 10) ;
x = 0;
5. int a = 1;
int b = 2;
int c = 3;
int x = 0;
if (a > 10 && b > 0)
if (c > 0)
if (x > 0)
x = 1;
else
x = 2;
6. int x = 0;
if (true) {
x = 1;
}
Habilidades...
Ficar atento a pequenos detalhes que podem mudar radicalmente o comportamento de um programa.
Página 20
A → 9.0 – 10.0
B → 8.0 – abaixo de 9.0
C → 7.0 – abaixo de 8.0
F → Abaixo de 7.0
Habilidades...
switch (expressão) { char, byte, short, int, valor de uma enumeração, String
case constante1:
...
break;
case constante2: Abandona estrutura switch
...
break;
default:
...
}
Exemplo...
int mes = 1;
switch (mes) {
case 1:
case 7:
case 12:
System.out.println("Férias");
break;
default:
System.out.println("Aulas");
}
Habilidades...
Utilizar a estrutura de decisão switch. Saber quando utilizar switch e quando utilizar if.
Página 22
continue;
...
break;
...
while (condição) {
}
true
...
Aborta estrutura “for” continue;
...
break;
do { false
...
...
}
continue;
Aborta estrutura “while”
...
break;
...
} while (condição);
false
true
Aborta estrutura “do-while”
Habilidades...
int i = 1;
while (i <= 10) {
System.out.println(i);
i++;
}
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 10);
int i = 1;
while (i <= 10) System.out.println(i++);
int i = 0;
while (++i <= 10) System.out.println(i);
int i = 0;
while (i++ < 10) System.out.println(i);
Contagem regressiva...
Habilidades...
Menu
1. Oposto Opção inválida
“Re-exibir menu”
2. Sinal ,3
,2
≠1
3. Sair
3
Escolha uma opção: “Sair da aplicação”
1
Digite um número: __
O número __ é {positivo, negativo, nulo}
“Re-exibir menu”
Digite um número: 9
O oposto de 9 é –9
“Re-exibir menu”
Página 25
App: ComparaTiposPrimitivos
import java.util.Scanner;
Execução...
int-1: 8
int-2: 8
x 8
y 8
valores iguais
x == y
(true)
Página 26
App: ComparaTiposReferencia
import java.util.Scanner;
Execução...
String-1: ABC
String-2: ABC
x ● “ABC”
y ●
“ABC”
valores diferentes
x == y Heap
(false)
Cuidado!
Nunca compare tipos referência com o operador ==
Use: if (x.equals(y)) ...
Habilidades...
Entender que o operador == compara valores de tipos primitivos e valores de tipos referência (os ponteiros).
Página 27
8 Arrays
numeros ● 0 0 0 0 0
0 1 2 3 4 → índice
meses ●
Uma vez instanciado, o tamanho de um array não pode ser alterado, ou seja, não é possível inserir
novos elementos ou excluir elementos existentes, contudo é possível alterá-los.
Arrays possuem alocação estática → Tamanho fixo pré-definido
java.util.ArrayList → Tratamento dinâmico de arrays
Exemplo...
String[] meses = new String[] {
"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho",
"Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
};
Qual o 5º mês do ano?
System.out.println(meses[4]);
Página 28
String[] meses = {
"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho",
"Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
};
Habilidades...
Entender que arrays são do tipo referência e possuem alocação estática. Compreender a indexação dos elementos em um array (zero-based). Saber quando
se pode usar a instrução for aprimorada.
Página 29
Arrays multi-dimensionais
x[0][0] = 1
x[0][1] = 2
Bônus...
import java.util.Arrays;
int[] numeros = { 30, 20, 10, 60, 40, 50 };
Arrays.sort(numeros);
int pos = Arrays.binarySearch(numeros, 60);
Habilidades...
Compreender que arrays multi-dimensionais em Java são, na verdade, arrays de arrays. Manipular arrays multi-dimensionais com loops aninhados.
Página 30
9 Pacotes em Java
Habilidades...
Motivação...
−b
∆=0⇒�=
2a
−b+ √ ∆ −b−√ ∆
∆ > 0 ⇒ �1 = ; �2 =
2a 2a
2. E quanto a equação �2 + 2� + 1 = 0 ?
Tecnologia de Objetos
2. eq.setC(1.0);
System.out.println(eq.raizes());
Mas a classe Eq2G não existe → Basta criar e implementar as funcionalidades desejadas.
Na tecnologia de objetos, as classes são componentes de software reutilizáveis que dão origem aos
objetos e ajudam a modularizar a aplicação. A reutilização se dá por herança, composição e
instanciação. Qualquer conceito, seja este concreto ou abstrato, pode ser representado por meio de um
objeto contendo atributos e comportamentos.
Pilares da Tecnologia de Objetos: Classes, Objetos, Interfaces, Encapsulamento, Herança e
Polimorfismo.
Habilidades...
Capacidade de decidir quando realizar uma tarefa da forma tradicional (métodos) e quando trabalhar com objetos. Reaproveitamento de código e ocultação
de funcionalidade. Distribuição de biblioteca (API).
Página 33
11 Classes
Opcional (default = java.lang.Object)
⁝
Construtores Componentes da classe
(Membros)
Auxiliam na inicialização dos objetos
⁝
Métodos
Executam as funcionalidades (comportamentos)
⁝
}
SuperClasse x
.. .... a
. .... .... nç
era a
... .... h av
i s te J
e x em
o l a
Nã ltip
m ú
SubClasse
...
. ......
Habilidades...
Compreender a estrutura geral de uma classe (membros). Entender que não existem destrutores em Java. Entender a hierarquia Object – Classe –
SubClasse – SubClasse... Identificar o relacionamento É-UM (IS-A).
Página 34
12 Modificadores de acesso
Encapsulamento
As classes definem (agrupam) os atributos e comportamentos dos objetos. Os modificadores de acesso
controlam a visibilidade dos componentes da classe, ocultando recursos que não devem ser expostos ou
restringindo o acesso a um subconjunto de classes.
Habilidades...
Reconhecer a importância dos modificadores de acesso para ocultação (encapsulamento) e/ou exposição de funcionalidades.
Página 35
13 Campos
Pessoa
– id: int
+ nome: String
# idade: short
~ sexo: char
+ imprimirPessoa()
Funcionario
– salario: double
+ configurar()
+ imprimirFuncionario()
Gerador de objetos
Gera uma instância da classe Funcionario
f1 ● id = 0
nome = null
idade = 0
sexo = ‘M’
salario = 0.0
Heap
O que ocorre?
f1.imprimirPessoa();
f1.configurar();
f1.imprimirFuncionario();
f1.imprimirPessoa();
f1 = null;
O que ocorre?
Pessoa f2 = new Funcionario();
f2.nome = "xyz";
f2.idade = 18;
f2.sexo = 'F';
f2.imprimirFuncionario();
f2.imprimirPessoa();
Habilidades...
Entender o mecanismo de downcasting (coerção). Reconhecer que as classes sempre herdam, implícita ou explicitamente, de Object. Entender conceitos de
herança direta/indireta, restrições e/ou controle de acesso a membros da classe e referência mais genérica (objeto referenciado por um tipo ancestral).
Página 37
14 Construtores
Atenção! Um construtor padrão sem argumentos é fornecido pelo compilador somente quando não
escrevemos nenhum construtor para a classe.
Sobrecarga de construtores…
Uma classe pode ter mais de um construtor, permitindo que um objeto seja inicializado de diversas
formas, mas sempre de modo consistente.
Página 38
this(hora, 0, 0);
}
public Horario() {
this(0, 0, 0); De fato, não é necessário fazer nada.
}
public void print() {
System.out.printf("%02d:%02d:%02d", hora, minuto, segundo);
}
}
Exemplos...
Horario h1 = new Horario(19, 20, 30);
Horario h2 = new Horario(19, 20);
Horario h3 = new Horario(19);
Horario h4 = new Horario();
h1.print();
h2.print();
h3.print();
h4.print();
Página 39
Pessoa
– id: int
– nome: String
– idade: short
– sexo: char
+ Pessoa(id, nome, idade, sexo)
+ Pessoa(id, nome)
+ imprimir()
Funcionario
– salario: double
+ Funcionario(id, nome, idade, sexo, salario)
+ Funcionario(id, nome)
+ imprimir()
Exemplos...
Funcionario f1 = new Funcionario(1, "X", (short)33, 'F', 9000.0);
Funcionario f2 = new Funcionario(2, "ABC");
Funcionario f3 = new Funcionario(); // Compila?
f1.imprimir();
f2.imprimir();
f3.imprimir();
Pessoa p = new Pessoa(3, "DEF");
p.imprimir();
Habilidades...
Entender o uso de construtores (sub-rotinas de inicialização) e conceitos relacionados: construtor padrão, sobrecarga, operador "new", "shadowing" e o
emprego das palavras super e this.
Página 41
15 Métodos
Métodos são sub-rotinas (procedimentos ou funções) que pertencem a uma classe e realizam uma
determinada tarefa. Variáveis declaradas em um método possuem escopo local e existem a partir do
ponto onde foram declaradas e somente dentro do bloco onde foram declaradas. Ao contrário das
variáveis de classe, nos métodos as variáveis devem ser explicitamente inicializadas antes do seu uso.
Declaração...
{ } tipo
void
nomeMetodo(tipo parâmetro1, tipo parâmetro2, ...) {
__
___ _____
return [valor];
} Somente quando não for “void”
A instrução “return” também pode ser utilizada para sair prematuramente de um método.
Página 42
Pessoa
– id: int
– nome: String
– idade: short
– sexo: char
+ Pessoa(id, nome, idade, sexo)
+ Pessoa(id, nome)
+ imprimir()
+ getId(): int
+ getNome(): String
+ getIdade(): short
+ getSexo(): char
+ setIdade(value)
Métodos Acessores
(getters/setters)
Funcionario
– salario: double
+ Funcionario(id, nome, idade, sexo, salario)
+ Funcionario(id, nome)
+ imprimir()
+ getSalario(): double
+ setSalario(value)
+ reajustarSalario(percentual)
Página 43
Habilidades...
Entender o conceito de sub-rotinas e, principalmente, saber quando definir um método. Compreender o que são métodos acessores.
Página 45
App: OOP
Apps
└─ OOP
└─ src
├─ oop
│ └─ OOP.java
└─ rh
├─ Pessoa.java
└─ Funcionario.java
Em OOP.java, testar:
1. Geração de instâncias de Pessoa e Funcionario.
2. Invocação de métodos.
3. Acessibilidade de membros (Intellisense do NetBeans).
16 Argumentos x Parâmetros
void m1() {
int a = 1;
double b = 2.0;
Univ u = new Univ("Universidade X", "RP");
m2(a, b, u);
⋮
Argumentos em Java são copiados
u = null; sempre por valor
⋮
} Endereço do objeto
1 2.0
⋮
u = 80F9 x Universidade X
z = A2F1 RP
m2
y = 2.0
x=12 x
u = A2F1
m1 b = 2.0 Universidade X
a=1 RP
⋮ Heap
Stack
(pilha)
Habilidades...
Reconhecer que alterações em tipos primitivos locais não afetam o valor original dos argumentos. Compreender o mecanismo de alteração de um
argumento do tipo referência por meio de acesso a um de seus membros.
Página 47
A finalidade de ambos os métodos é retornar o maior número inteiro. Métodos com a mesma finalidade
podem compartilhar de um mesmo nome, desde que apresentem assinaturas diferentes.
int max(int x, int y) {
return x > y ? x : y; Método max sobrecarregado
(overload)
}
int max(int x, int y, int z) {
return max(x, max(y, z));
}
Exemplos:
System.out.println(max(1, 2));
System.out.println(max(3, 4, 2));
O compilador sabe qual método invocar com base no número e tipo dos argumentos e parâmetros
envolvidos na chamada.
Habilidades...
Saber quando e como sobrecarregar um método. Entender as regras para que uma sobrecarga seja permitida.
Página 48
A sobrescrita (override) ocorre quando o mesmo nome e assinatura (parâmetros) são utilizados por
classes diferentes que se relacionam por herança.
Métodos sobrescritos apresentam comportamento polimórfico. A versão a ser invocada não depende do
tipo da variável, mas sim do tipo do objeto referenciado (instância).
Exemplo:
Pessoa p = new Aluno("Eurípides", "Matemática");
p.imprimir();
Habilidades...
Compreender a diferença entre overload e override. Entender a importância da anotação @Override em Java.
Página 49
19 Membros estáticos
Membros não-estáticos estão associados aos objetos de uma classe (instâncias). Por sua vez, membros
estáticos estão associados as classes.
Considere a classe Lib a seguir:
public class Lib {
public int min(int a, int b) {
return a < b ? a : b;
}
public int max(int a, int b) {
return a > b ? a : b;
}
}
Membros cujo comportamento/finalidade não dependem ou não exigem um objeto com um estado em
particular para agir podem ser declarados como estáticos.
Página 50
Forma de uso:
System.out.println(Lib.min(1, 2));
System.out.println(Lib.max(2, 3));
Pergunta!
public static void main(String[] args) {
}
Por que o método “main” é declarado como estático?
Página 51
Campos estáticos
public class X {
public static int alfa = 100;
private int a, b, c;
public X(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
}
x1 ●
alfa=100 Heap
Referência mantida
pela JVM
Habilidades...
Universidade
“versão simplificada”
Entidade
id: int
nome: String
Pessoa Empresa
cpf: String cnpj: String Receita
«abstract» getDoc(): String entrada: double
Despesa
saida: double
Aluno Professor
ra: int funcional: int Despesa
Receita
curso: String disciplina: String
mensalidade: double salario: double
Receita Despesa
getReceita(): double getDespesa(): double
Uma interface possibilita que classes não relacionadas por uma hierarquia compartilhem de constantes
e métodos comuns.
Página 53
Exemplos...
Polimorfismo → Permite que objetos e comportamentos específicos sejam manipulados por meio de
uma referência mais genérica, neste caso, interfaces.
Habilidades...
Compreender que a aplicação pode ser facilmente extendida sem a necessidade de alterações onde o processamento dos dados é feito de forma polimórfica.
Página 55
21 Exceptions
Liberação de recursos
}
Desafio!
Reconstruir App CalculadoraInteiros. A aplicação não deve abortar abruptamente caso o usuário não
digite um número válido.
Página 56
Object
Throwable
Exception Error
Condições anormais
CHECKED “Não devem ser tratadas”
RuntimeException exceptions
...
} catch (...) { }
Criando exceções...
Exceção lançada e
não capturada
Resultado...
Janeiro
Mês 13 inválido
Exception in thread ...
Habilidades...
Entender o mecanismo de tratamento de exceções e a diferença entre exceções comuns e do tipo "checked".
Página 59
A programação concorrente é feita por meio de threads. O número de CPUs disponíveis influencia
fortemente na possibilidade ou não de execução paralela de segmentos de código independentes.
new
thread starts
runnable I/O
it co
wa ll I/O m
f yA re pl
All
otify ”
t i qu ete
notif e expired
o
it
n es s
y/
wa
t
o tif
p/
waiting n blocked
y/n
don
e
sle
“tim
ice
m esl es
Quando no estado runnable… ti pir Ready
ex
Running U
CP utes
ec
ex
“Java é projetado para ser simples, mas a programação concorrente não é fácil.”
Página 60
import java.security.SecureRandom;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
Solução
Tornar a operação atômica por meio de exclusão mútua
Habilidades...
23 Enumerações
Enumerações em Java são um tipo especial de classe com um conjunto de constantes representadas por
identificadores únicos (os enumeradores). As constantes são, de fato, instâncias da própria classe.
class
enum CONSTANTES...
campos
construtores
métodos
Exemplo...
for (Pais pais : Pais.values()) {
System.out.println(pais + ", " + pais.getDDI());
}
Habilidades...
24 A palavra-chave “final”
Utilizada para indicar o estado difinitivo (final) de um conceito e impedir alterações acidentais.
Habilidades...
25 Revisão e trabalho
keywords...
abstract continue for new switch
assert default if package synchronized
boolean do goto private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
26 Tópicos adicionais
void m1() {
➀
m2();
➄
}
void m2() {
➁
m3();
➃
}
void m3() {
➂
}
Recursividade: Um método recursivo é um método que chama a si próprio direta ou indiretamente por
meio de outro método.
void m() {
➀➁➂...
if (...) m();
➆➇➈...
}
BigInteger
import java.math.BigInteger;
Boxing / Unboxing
Array dinâmico
java.util.ArrayList<T>
Tipo referência
Exemplos...
ArrayList<Integer> n = new ArrayList<>();
n.add(new Integer(10));
n.add(new Integer(20));
n.add(new Integer(30));
int x = n.get(0).intValue();
ou...
ArrayList<Integer> n = new ArrayList<>();
n.add(10); // boxing: 10 é transformado em um objeto Integer(10)
n.add(20); // boxing: 20 é transformado em um objeto Integer(20)
n.add(30); // boxing: 30 é transformado em um objeto Integer(30)
int x = n.get(0); // unboxing: n.get(0).intValue()
Exemplos...
void m(Object o) {
System.out.println(o);
}
Chamadas... m("abc");
m(99); // boxing: new Integer(99)
void n(int x) {
System.out.println(x);
}
Chamadas... n(9)
Integer i = new Integer(99);
n(i); // unboxing: i.intValue()
Sistemas numéricos
Nr. inteiro 267
int x = 267; // Sistema numérico decimal
(267)10 = (1.0000.1011)2 = (413)8 = (10B)16
decimal binário octal hexadecimal
int x = 267;
int x = 0b100001011; // ou 0b1_0000_1011
int x = 0413; // octal (Cuidado: 10 + 0413 = 277)
int x = 0x10B;
Regras de agrupamento
Certo Errado
Decimal 1_000_000 1_000_000_
Binário 0b1111_1111 0b_1111_1111
Octal 0_413 0_413_
Hexadecimal 0xFF_FF 0x_FF_FF