O documento apresenta uma introdução à programação orientada a objetos na linguagem Java, abordando tópicos como: a história e evolução do Java desde sua criação em 1991; as principais distribuições da linguagem (JSE, JEE, JME); a máquina virtual Java e o compilador; e um exemplo simples de um programa "Hello World" em Java.
4. www.labes.ufpa.br
4
• 1991 - Criado projeto ‘Oak’, linguagem precedente do
Java criada para o mercado de sistemas embarcados
• 1994 - Depois de frustradas tentativas de embutir ‘Oak’
em Set-top box de TV, a linguagem é revisada e têm
seu compilador mudado de C para ‘Oak’
• 1995 - ‘Oak’ é rebatizada para Java e tem o
lançamento oficial
• 1998 - Lançado o Java 2: versão 1.2 batizada de Java
2
• 1999 - Lançada versão beta de J2EE
• 2000 - Lançado o J2SE 1.3
Cronologia
5. www.labes.ufpa.br
5
• 2001 - Lançamento do projeto Eclipse e do J2EE 1.3
• 2002 - Lançado Hibernate 1.0
• 2004 - Lançamento do Java 1.5 (Tiger)
• 2006 – Lançado o Java 6
• 2007 – Lançado JDK completo como Open Source
• 2008 – Java 7
• 2014 – Java 8
Cronologia
6. www.labes.ufpa.br
6
• A motivação inicial para Java
– “A necessidade de uma plataforma independente de
linguagem que possa ser embutida em vários produtos
eletrônicos de consumo como torradeiras e
refrigeradores”
– Um dos primeiros projetos utilizando Java foi um controle
remoto pessoal para hand-held chamado Star 7.
– Nesta mesma época a World Wide Web e a Internet vinham
ganhando popularidade.
– James Gosling e companhia “sacaram” que Java poderia
ser também utilizada para programação na Internet.
– Lançaram aí a tecnologia dos Applets Java.
Motivação
7. www.labes.ufpa.br
7
• JavaScript é uma versão simplificada de Java? Não!!
– JavaScript é uma linguagem de script que pode
ser inserida dentro de páginas web
– Foi inventada pela Netscape e originalmente
chamada de LiveScript, que tem uma sintaxe
parecida (mas que no fundo não tem relação
direta com Java)
– Em particular, um programa JavaScript pode
modificar um documento no qual está exibido (a
página web).
Java VS JavaScript
8. www.labes.ufpa.br
8
• Com a API Java Advanced Imaging são capturadas as
imagens panorâmicas para fotografar a superfície marciana
• Em várias partes do sistema de controle existem
aplicações Java que ajudam a comunicação e controle do
robô da NASA em Marte
• Em várias partes existem dispositivos embarcados
utilizando Java
• Em http://mars.telascience.org pode-se baixar o software
Maestro (versão free de parte do código Java em Marte)
Java em Marte
10. www.labes.ufpa.br
10
• A tecnologia Java pode ser
vista como :
– Uma linguagem de programação
– Um ambiente de desenvolvimento
– Um ambiente para aplicações
– Um ambiente de implantação
O que é Java?
11. www.labes.ufpa.br
11
• Java é uma linguagem de programação
Orientada a Objetos com uma sintaxe
semelhante a C/C++ e que gera programas
multiplataformas.
• Java pode criar qualquer tipo de aplicação
que se pode criar com uma linguagem de
programação convencional.
O que é Java?
12. www.labes.ufpa.br
12
• Java permite o desenvolvimento de aplicações para
uma série de plataformas.
• É possível ter software Java desde de dispositivos
como telefones celulares, até computadores de
grande porte, como os mainframes.
• Devido a essa característica, a linguagem Java conta
com três conhecidas distribuições para ambientes de
desenvolvimento:
– JSE (antigamente J2SE)
– JEE (antigamente J2EE)
– JME (antigamente J2ME)
Distribuições
13. www.labes.ufpa.br
13
JSE (Java Standard Edition)
• É o ambiente de desenvolvimento com uso voltado a
micros e servidores
• Essa é a plataforma principal, já que, de uma forma
ou de outra, o JEE e o JME têm no JSE sua base.
• Assim, os outros ambientes de desenvolvimento são
versões aprimoradas do JSE para as aplicações a
que se propõem.
• Por ser a plataforma mais abrangente do Java, o
JSE é a mais indicada para quem quer aprender a
linguagem.
Distribuições
14. www.labes.ufpa.br
14
JEE (Java Enterprise Edition)
• Contém bibliotecas especialmente desenvolvidas para o
acesso a servidores, a sistemas de e-mail, a banco de
dados, etc.
• Contém uma série de especificações, cada uma com
funcionalidades distintas. Entre elas, tem-se:
– JDBC (Java Database Connectivity), utilizado no acesso a banco
de dados;
– Servlets, uma API para o desenvolvimento de aplicações Web.
Este recurso "estende" o funcionamento dos servidores Web,
permitindo a geração de conteúdo dinâmico nos sites.
– JSP (Java Server Pages), permite script para criação de páginas
dinâmicas como uma abstração sobre a tecnologia de Servlets
Distribuições
15. www.labes.ufpa.br
15
JME (Java Micro Edition)
• É o ambiente de desenvolvimento para dispositivos
móveis ou portáteis, como telefones celulares e palmtops.
• Como a linguagem Java já era conhecida e a adaptação
ao JME não é complicada, logo surgiram diversos tipos de
aplicativos para tais dispositivos, como jogos e agendas
eletrônicas.
• As empresas saíram ganhando com isso porque, desde
que seus dispositivos tenham uma JVM (Máquina Virtual
Java), é possível, com poucas modificações,
implementar os aplicativos em qualquer aparelho, sendo
o único limite a capacidade do hardware.
Distribuições
16. www.labes.ufpa.br
16
• Em seu ambiente de desenvolvimento, Java provê
algumas ferramentas:
– Um compilador (javac)
– Um interpretador (java)
– Um gerador de documentação (javadoc)
– Um aplicativo para empacotamento de classes
(jar)
– Um registro e compilador para aplicações
distribuídas (rmiregistry e rmic)
– Entre outras funcionalidades
Ambiente de Desenvolvimento
17. www.labes.ufpa.br
17
• Tecnologias de aplicação Java são tipicamente
programas de propósito geral que executam em
qualquer máquina onde haja uma ambiente de
execução Java (JRE- Java Runtime Environment)
• Existem dois ambientes principais de instalação:
1. A JRE contém todos os arquivos de classes
para os pacotes Java, incluindo classes básicas
da linguagem, componentes de GUI, entre outras.
2. O Web Browser, onde muitos provêem um
interpretador Java e um ambiente de execução.
Ambiente de Desenvolvimento
19. www.labes.ufpa.br
19
• Máquina Virtual ou Java Virtual Machine (JVM)
– É uma máquina abstrata que é implementada pela
emulação de software em tempo real
– Provê a especificação da plataforma de hardware para
compilação do código Java
• A JVM interpreta Bytecode
– Bytecode é uma linguagem de máquina especial que
pode ser entendida pela JVM
– Esta linguagem é independente de qualquer hardware
particular de computador, de tal forma que qualquer
computador com um interpretador Java possa
executar o programa não importando a máquina em que
o código foi compilado.
Funcionalidades Java
20. www.labes.ufpa.br
20
• Coletor de Lixo ou Garbage Collector (GC):
– A linha de execução do GC é responsável pela liberação
de qualquer memória não mais utilizada por programas
Java.
– Isto acontece automaticamente durante o tempo de
execução do programa Java
» VANTAGEM: O programador fica livre da
tarefa de alocar e desalocar memória
manualmente
Funcionalidades Java
21. www.labes.ufpa.br
21
• Segurança de Código:
• Segurança de código é provida na implementação da
JRE.
• Desta forma, para executar o código, a JRE utiliza o
ClassLoader para carregar o código e verifica o
código(através do verificador de bytecode)
• O ClassLoader carrega todas as classes, onde determina
o layout de memória em tempo de execução, para
protegê-la de acesso desautorizado.
• O Verificador de Bytecode procura no formato dos
fragmentos do código acessos ilegais que possam violar
direitos de acesso aos objetos
Funcionalidades Java
22. www.labes.ufpa.br
22
Editor
disco
Programa é criado em um
editor e armazenado no
disco
Compilador
disco
Compilador gera os
bytecodes e os armazena
no disco
Carregador de
classes
disco
O carregador de classes
– Class Loader – coloca
os bytecodes na
memória
_______
_______
_______
_______
__
memória
Verificador de
bytecodes
O verificador de bytecodes
– Bytecodes Verifier –
confirma se todos os
bytecodes estão corretos e
não violam as restrições
de segurança da
linguagem Java
________
________
________
______
memória
Interpretador
O interpretador lê os
bytecodes e executa o
programa
________
________
________
______
memória
FasesdeumprogramaJava
Tempo
+
24. www.labes.ufpa.br
24
O procedimento de instalação do Java consiste em
3 passos principais:
Instalação
Instalação
do
JDK
Configuração
do
PATH
Teste
usando
linha
de
comando
27. www.labes.ufpa.br
27
• Configuração do PATH
• Após a instalação do JDK, é preciso realizar as
seguintes etapas adicionais:
– Adicionar o diretório bin do jdk no PATH de
execução do SO (Sistema Operacional)
– Tais etapas variam de acordo com o SO
• A seguir serão apresentados os passos nos
sistemas Windows® e Linux
Instalação
28. www.labes.ufpa.br
28
• Configuração do PATH (LINUX)
• Em Linux, o procedimento para edição do PATH de
execução depende do shell que está usando.
• Se está utilizando o Bourne Again shell (que é o default do
Linux), adicione a seguinte linha ao final do arquivo
~/.bashrc ou ~/.bash_profile:
– export PATH=/usr/local/jdk/bin:$PATH
– onde ”/usr/local/jdk” pode variar de acordo com a
opção de instalação
– DICA: Se está no MacOSX, edite o arquivo
~/.profile com o mesmo comando Linux
Instalação
29. www.labes.ufpa.br
29
• Configuração do PATH (Windows)
• No Windows, é preciso fazer login como administrador.
• Basta: 1 - iniciar o “Painel de Controle”; 2 - selecionar o
ícone “Sistema”; 3 – selecionar a aba “Avançado”
Instalação
30. www.labes.ufpa.br
30
• Configuração do PATH (Windows)(cont.)
4 - clique no botão “Variáveis de Ambiente”; 5 - navegue até
encontrar a propriedade PATH, onde deve-se editar e
adicionar o caminho completo do diretório; 6- salvar as
configurações.
Instalação
Editar
Para editar o path, basta colocar
um “;” ao final do conteúdo e
adicionar o caminho do diretório
bin do jdk
Exemplo: “; C:Arquivos de
programasJava
jdk1.6.0_03bin”
Obs: Sem as aspas
31. www.labes.ufpa.br
31
• Teste usando linha de comando
• Independente do SO, em um shell aberto digite:
– java -version
• Pressione ENTER. Você deve visualizar algo
parecido com:
Instalação
33. www.labes.ufpa.br
33
Programa “Hello World”
public class Hello
{
/**
* Meu primeiro programa Java
*/
public static void main(String[]args){
//escreve a string “Hello World” na tela
System.out.println(“Hello
world”);
}
}
34. www.labes.ufpa.br
34
● Indica o nome da classe que é Hello
● Em Java, todo código deve ser colocado dentro de
uma declaração de classe
● A classe utiliza o identificador de acesso public, que
indica que esta classe é acessível a outras classes de
outros pacotes.
Definição de Classe
public class Hello
{
/**
* Meu primeiro programa Java
*/
35. www.labes.ufpa.br
35
● As linhas destacadas indicam comentários Java
● Um comentário:
- U)lizado
para
documentar
uma
parte
de
código
- É
uma
boa
prá)ca
de
programação
adicionar
comentários
ao
código.
Comentários
public class Hello
{
/**
* Meu primeiro programa Java
*/
…
//escreve a string “Hello world” na tela
36. www.labes.ufpa.br
36
● Indica o nome do método Hello que é o principal de um
programa Java.
● O método main é o ponto de partida de um programa Java
● Todos os programas, exceto pelos Applets, iniciam a partir
de um método main.
● É necessário que a assinatura esteja correta (com um
array de string passado como parâmetro).
Método main
public class Hello
{
/**
* Meu primeiro programa Java
*/
public static void main( String[] args ){
37. www.labes.ufpa.br
37
● O comando System.out.println() escreve o texto
passado como parâmetro entre aspas.
Comando de escrita
public class Hello
{
/**
* My first Java program
*/
public static void main( String[] args ){
//prints the string “Hello world” on screen
System.out.println(“Hello world”);
39. www.labes.ufpa.br
39
Definição de IDE
IDE vem do inglês Integrated Development
Environment ou Ambiente Integrado de
Desenvolvimento
É um programa de computador que reúne
características e ferramentas de apoio ao
desenvolvimento de software com o objetivo de
agilizar este processo.
Geralmente facilitam a técnica RAD (de Rapid
Application Development, ou "Desenvolvimento Rápido
de Aplicativos"), que visa a maior produtividade dos
desenvolvedores.
40. www.labes.ufpa.br
40
• As características e ferramentas mais comuns
encontradas nos IDEs são:
– Editor
– Compilador
– Linker
– Depurador (debugger)
– Modelagem (modelling)
– Geração de código
– Distribuição (deploy)
– Testes Automatizados (automated tests)
– Refatoração (refactoring)
Definição de IDE
41. www.labes.ufpa.br
41
• Dentre as várias IDES existentes,
pode-se destacar as seguintes IDEs que dão apoio ao
desenvolvimento em Java:
• IntelliJ IDEA - paga
• Eclipse - livre
• NetBeans - livre
• JBuilder - paga
• Sun Java Studio Enterprise
• Jedit
• BlueJ
• OptimalJ
IDEs Java Existentes
42. www.labes.ufpa.br
42
• De forma resumida:
• Em geral comparar IDEs é algo polêmico, pois
depende muito da necessidade atual de cada
desenvolvedor
• Dentre as IDEs pagas, IntelliJ e JBuilder se
destacam por oferecer diversos componentes
“pré-fabricados” para apoio ao desenvolvimento
RAD.
• Dentre as IDEs livres, Eclipse e NetBeans são
líderes de mercado
IDEs Java Existentes
43. www.labes.ufpa.br
43
• A seguir neste curso serão apresentados de
forma resumida o processo de instalação do
NetBeans e do Eclipse.
• Neste curso, a utilização de uma IDE é
necessária para simplificar o processo de
c o m p i l a ç ã o e t e s t e d o s c ó d i g o s
desenvolvidos
IDEs Java Existentes
49. www.labes.ufpa.br
49
Partes básicas de um programa
Java • Sentenças
e
Blocos
1
• IdenHficadores
2
• Palavras
Reservadas
3
• Variáveis
4
• Literais
5
• Tipos
PrimiHvos
6
50. www.labes.ufpa.br
50
• Sentença
– Uma ou mais linhas de código terminado por
um ponto e vírgula
– Exemplo:
System.out.println(“Hello world”);
Sentenças e Blocos
51. www.labes.ufpa.br
51
• Bloco
– É uma ou mais sentenças circundada por uma abertura e
fechamento de chaves que agrupam as sentenças como
uma unidade.
– Blocos de sentenças podem ser encadeados
infinitamente.
– É permitida qualquer quantidade de espaços em branco.
– Exemplo:
public static void main( String[] args ){
System.out.println("Hello");
System.out.println("world”);
}
Sentenças e Blocos
52. www.labes.ufpa.br
52
1. Na criação de blocos, é permitido colocar a
chave junto com a sentença. Por exemplo:
public static void main( String[]
args ){
ou é permitida a chave na próxima linha,
como,
public static void main( String[]
args )
{
2. É recomendada a identacão das sentenças
após o início de um bloco. Por exemplo:
public static void main( String[]
Sentenças e Blocos
53. www.labes.ufpa.br
53
• Identificadores
– São tokens que representam nomes de variáveis,
métodos, classes, etc.
– Exemplos de identificadores são: Hello, main, System,
out.
• Da mesma forma que C e C++, identificadores Java são
sensíveis ao caso.
– Isto significa que o identificador Hello não é o mesmo
que hello.
Identificadores
54. www.labes.ufpa.br
54
• Identificadores podem iniciar com uma letra,
underscore “_”, ou um sinal de “$”.
• Letras podem ser minúsculas ou MAIUSCULAS
• Caracteres subseqüentes podem ser números de 0 a 9.
• Identificadores não podem utilizar palavras chave do
Java, como class, public, void, etc.
Identificadores
55. www.labes.ufpa.br
55
1. Para nomes de classes, recomenda-se por a primeira
letra da palavra como maiúsculo:
ExemploDeNomeParaClasse
2. Para nomes de métodos e variáveis, a primeira letra
deve ser minúscula:
esteNomeDeMetodoExemplo
Identificadores
56. www.labes.ufpa.br
56
3. No caso de identificadores com várias
palavras, use maiúsculo para iniciar cada
palavra exceto a primeira:
charArray, fileNumber, ClassName.
4. Evite o uso de underscores no início de
identificador como em _read ou _write.
Identificadores
57. www.labes.ufpa.br
57
• Palavras reservadas são identificadores pré-
definidos reservados pelo Java para um propósito
específico.
• Não é permitido utilizar palavras chave como
nomes de variáveis, classes, métodos, etc.
• A seguir é mostrada uma tabelas com as palavras
reservadas do Java
Palavras Reservadas
59. www.labes.ufpa.br
59
• Uma variável representa um item de dado que é
utilizado para armazenar estado de objetos.
• Uma variável contém:
– Tipo de dado
• O tipo de dado indica o tipo de valores que a
variável pode possuir.
– Nome
• O nome da variável segue as regras para
identificadores.
Variáveis
60. www.labes.ufpa.br
60
• A declaração de variáveis segue a seguinte
estrutura:
<tipo de dado> <nome> [=valor inicial];
• Nota: Valores entre <> são obrigatórios,
enquanto valores entre [] são opcionais.
Variáveis
61. www.labes.ufpa.br
61
Variáveis
package br.eln.java;
public class ExemploDeVariaveis {
public static void main( String[] args ){
//declara um tipo de dado com o nome da variável
// result é do tipo de dado boolean
boolean result;
//declara um tipo de dado com o nome da variável
// option é do tipo de dado char
char option;
option = 'C'; //atribui 'C' em option
//declara um tipo de dado com o nome da variável
/*grade é do tipo de dado double que é inicializado para 0.0
*/
double grade = 0.0;
}
}
62. www.labes.ufpa.br
62
1. É sempre bom inicializar variáveis na sua declaração.
2. Declare uma variável por linha de código. Por
exemplos, a declaração de variáveis a seguir
double exam=0;
double quiz=10;
double grade = 0;
é preferível ao invés da seguinte,
double exam=0, quiz=10, grade=0;
Variáveis
63. www.labes.ufpa.br
63
Variáveis
Tipo de dado Valor Default
byte/short/int 0
long 0L
float 0.0F
double 0.0
boolean false
char ‘u0000’
Object null
Tabela que mostra os valores default de tipos de variáveis Java:
64. www.labes.ufpa.br
64
• Literais são tokens que não são modificados, ou
seja, são constantes.
• Diferentes tipos de literais em Java são:
– Literais Inteiros
– Literais de Ponto Flutuante
– Literais Booleanos
– Literais Caracteres
– Literais String
Literais
65. www.labes.ufpa.br
65
Literais Inteiros
• Podem ser definidos em diferentes formatos:
– Decimal (base 10)
• Sem notação especial
• exemplo: 12
– Hexadecimal (base 16)
• Precedido por 0x ou 0X (zero)
• Exemplo:
– Octal (base 8)
• Precedido por 0 (zero)
• Exemplo:
Literais
int octal = 014;
int octal2= 08;
int hexadecimal =
0XC;
int hexadecimal2 =
0xD;
valor excede escala octal que vai até “07”
66. www.labes.ufpa.br
66
Literais de Ponto Flutuante
• Representam decimais com partes fracionárias:
– Exemplo: 3.1416
• Podem ser expressados segundo duas notações:
– Padrão
– Científica
Literais
double pFlutuante1 = 583.45;
double pFlutuante2 =
58345e-2; // 583.45
double pFlutuante3 =
58345E-2; // 583.45
long pFlutuante4 = 583.45;
Java não permite literal de ponto flutuante para long, que não
possui ponto flutuantes
O uso de “e” e “E” na notação não muda o resultad
double ou
float
67. www.labes.ufpa.br
67
Literais Booleanos
• Podem possuir somente dois valores:
– true ou false.
Literais
boolean bool1 =
true;
boolean bool2 =
false;
boolean bool3 = 1;
Diferente de outras linguagens, como C/C++, variáveis
booleanas podem receber apenas valores booleanos(true/
false), não sendo permitida a utilização de atribuição e testes
utilizando números inteiros
68. www.labes.ufpa.br
68
Literais Caracteres
• No Java, literais caracteres representam um único código
Unico de caracteres
Caracter Unicode:
– Um caracter com conjunto de 16-bits que substitui o antigo
conjunto ASCII de 8-bits
– O Unicode permite a inclusão de símbolos e caracteres
especiais de outras linguagens além do inglês.
Literais
69. www.labes.ufpa.br
69
Literais Caracteres
• Por exemplo:
– A letra a é representada como ‘a’.
• Caracteres Especiais
Literais
Função Caracter
Line break ‘n’
Carriage return ‘r’
Backspace ‘b’
70. www.labes.ufpa.br
70
Literais String
• Literais String representam múltipos caracteres e
são cercados por aspas duplas (“ ”)
• Um exemplo de literal string podem ser “Hello
World”.
Literais
71. www.labes.ufpa.br
71
• A linguagem Java define 8 tipos de dados primitivos:
– boolean
– char
– byte
– short
– int
– long
– double
– float
Tipos Primitivos
72. www.labes.ufpa.br
72
Booleano
• Um tipo de dado booleano representa dois estados:
verdadeiro e falso (true e false).
• Um exemplo é :
boolean result = true;
• O exemplo acima declara uma variável chamada
result como boolean e atribui o valor true.
Tipos Primitivos
73. www.labes.ufpa.br
73
Caracter
• Um tipo de dado caracter (char) representa um único
código de caracter Unicode.
• Seus literais devem estar entre aspas simples (’ ’).
• Por exemplo,
‘a’ //Uma letra a
‘t’ //Tab
• Para representar caracteres especial como ' (aspas
simples) ou " (aspas duplas), utilize o caracter (barra
invertida). Por exemplo:
''' //Para aspas simples
'"' //Para aspas duplas
Tipos Primitivos
74. www.labes.ufpa.br
74
Caracter – Caso String
• Apesar da String não ser um tipo de dado primitivo (é uma
Classe), alguns comentários podem ser feitos:
– Uma String representa um tipo de dado que contém
múltiplos caracteres. No Java, String é representado por
uma classe, não é um tipo de dado primitivo.
– Possui seus literais dentro de aspas duplas (“ ”).
– Por exemplo,
String message=“Hello world!”;
Tipos Primitivos
75. www.labes.ufpa.br
75
• Inteiros – byte, short, int e long
• Tipos de dados inteiros em Java são de 3 formas:
2 //Valor Decimal 2
077 // 0 (zero) indica um valor octal
0xBACC //O 0x (zero e x) indica um valor hexadecimal
Tipos inteiros possuem int como tipo de dado
default.
• É possível atribuir um valor long adicionando a
letra l ou L.
• Por exemplo:
10L
Tipos Primitivos
Na definição de um valor long, é preferível utilizar
L (maiúsculo) ao invés de l (minúsculo), para não
confundir com o dígito 1
76. www.labes.ufpa.br
76
• Tipos inteiros tem as seguintes
escalas de valores:
Tipos Primitivos
Tipo Tamanho Range
byte 8 bits - até -1
short 16 bits - até -1
int 32 bits - até -1
long 64 bits - até -1
7
2 7
2
15
2
15
2
31
2
31
2
63
2
63
2
77. www.labes.ufpa.br
77
Ponto Flutuante: float e double
• Tipos de ponto flutuante possuem double como tipo
de dado default.
• Literais de ponto flutuante incluem decimais:
E ou e //(adiciona valor exponencial)
F ou f //(atribui valor para float)
D ou d //(atribuir valor para double)
• Exemplos são,
3.14 //A simples valor de ponto flutuante (double)
6.02E23 //um grande valor de ponto flutuante
2.718F //um valor float simples
123.4E+306D//um grande valor double com o D
redundante
Tipos Primitivos
78. www.labes.ufpa.br
78
Ponto Flutuante: float e double
• Valores de ponto flutuante possuem as
seguintes escalas de valores:
Tipos Primitivos
Tipo Tamanho Range
float 32 bits - até -1
double 64 bits - até -1
31
2
63
2
31
2
63
2
80. www.labes.ufpa.br
80
• Para definir uma classe, escreve-se:
<modificador> class <nome> {
<declaracaoDeAtributo>*
<declaracaoConstrutor>*
<declaracaoMetodo>*
}
– Onde:
• <modificador> é um modificador de acesso,
onde pode ser combinado com outros tipos
de modificadores.
Definição de Classes
81. www.labes.ufpa.br
81
public class RegistroCompra {
//mais códigos serão adicionados depois
}
– Onde:
• public – significa que a classe é acessível
por outras classes fora do mesmo pacote
• class - usado para definir uma classe em
Java
• RegistroCompra – um identificador único que
descreve a classe
Definição de Classes
82. www.labes.ufpa.br
82
• Pense em um nome apropriado para a
classe. Nunca defina nomes como XYZ ou
outro nome aleatório.
• Recomenda-se que nomes de classes
iniciem com uma letra maiúscula
• O nome do arquivo da classe deve ter o
mesmo nome da classe Java.
• Defina um arquivo para cada classe Java
definida
Definição de Classes
83. www.labes.ufpa.br
83
• Atributos em classes Java podem ser de
representados por variáveis de 2 tipos:
– Tipos de dados primitivos (long, char, int,...)
– Referencias para Objetos (String, Pessoa,
Carro, etc.)
• Os atributos de uma classe podem ser
especificados como:
– Variáveis de instância
– Variáveis de classe
Atributos
84. www.labes.ufpa.br
84
• Variáveis de Instância
– Pertencem a uma instância de objeto
– Valor de um atributo para um objeto é
diferente das instâncias para outros objetos
• Variáveis de classes (também chamadas de
variáveis membros estáticas)
– Variáveis que pertencem a toda a classe.
– Isto significa que eles possuem o mesmo
valor para todas as instâncias da mesma
classe
Atributos
85. www.labes.ufpa.br
85
Variáveis de Instância
public class RegistroCompra {
// variáveis de instância
private String nomeProduto;
private long codigo;
private Date validade;
private double precoCusto;
private double precoVenda;
}
– Onde:
• private agora significa que as variáveis são
acessadas somente dentro da classe. Outros
objetos não podem acessar as variáveis
diretamente.
Atributos
86. www.labes.ufpa.br
86
Variáveis de classes (estáticas)
public class RegistroCompra {
// variáveis de instância
private String nomeProduto;
private long codigo;
private Date validade;
private double precoCusto;
private double precoVenda;
private static int quantidaComprasFechadas;
}
– É utilizado o modificador static para indicar
que a variável é estática.
Atributos
87. www.labes.ufpa.br
87
• Declare todas as variáveis de instância logo no
início da definição da classe
• Declare uma variável em cada linha
• Use tipos de dados adequados para cada variável
• Declare variáveis de instância como privadas e
defina métodos de acesso para cada.
• Conceito de encapsulamento
Atributos
88. www.labes.ufpa.br
88
• Para declarar métodos em Java:
<modificador> <tipoDeRetorno> <nome>(<parametros>*) {
<sentencas>*
}
– onde,
• <modificador> pode assumir diferentes modificadores
• <tipoDeRetorno> pode ser de qualquer tipo (incluindo
void)
• <nome> pode ser qualquer identificador válido
• <parametro> ::= <tipo_parametro> <nome_parametro>[,]
Métodos
89. www.labes.ufpa.br
89
public static int getQuantidaComprasFechadas() {
return quantidaComprasFechadas;
}
public static void setQuantidaComprasFechadas(int
quantidaComprasFechadas) {
RegistroCompra.quantidaComprasFechadas =
quantidaComprasFechadas;
}
public long getCodigo() {
return codigo;
}
public void setCodigo(long codigo) {
Métodos
91. www.labes.ufpa.br
91
• Sobrescrevendo métodos
– Permite um método com mesmo nome mas com parâmetros
diferentes, para ter implementação e retorno diferentes
– Pode ser utilizado quando diferentes operações possuem
diferentes implementações.
• Sempre lembre que sobrescrever métodos tem as
seguintes propriedades:
– O mesmo nome de método
– Diferentes para ou diferente número de parâmetros
– Tipo de retorno pode ser diferente ou o mesmo
Métodos
92. www.labes.ufpa.br
92
• Construtores são chamados na instanciação de
um objeto.
• Os construtores possuem as seguintes
propriedades:
– Possuem o mesmo nome da classe
– Aceita modificador de acesso
– Não possuem tipo de retorno
– Não se pode acessar o construtor diretamente,
somente através do operador new.
Construtores
94. www.labes.ufpa.br
94
• A referência this
– refere-se à instância do objeto corrente
– utilizado para acessar variáveis de instância.
– Só é permitido acesso para variáveis de
instância e NÃO para variáveis de classe
(estáticas)
Referência “this”
96. www.labes.ufpa.br
96
• Existem quatro diferentes tipos de
modificadores de acesso em Java:
– public (Menos restritivo)
– protected
– private (Mais restritivo)
– default
• Os três primeiros modificadores de acesso são
explicitamente escritos em código para indicar o
tipo de acesso, o quarto que é default não
necessita ser utilizado obrigatoriamente.
Modificadores de Acesso
97. www.labes.ufpa.br
97
Modificadores de Acesso
private default/package protected public
Mesma Classe Sim Sim Sim Sim
Mesmo Pacote Não Sim Sim Sim
Pacote diferente
(sub-classe)
Não Não Sim Sim
Pacote diferente (não
é sub-classe)
Não Não Não Sim
98. www.labes.ufpa.br
98
• Um pacote é um agrupamento de tipos
relacionados provendo gerência de proteção
de acesso e espaço de nomes
– Note que tipos refere-se a classes,
interfaces, enumerações e tipos de
anotações (os dois últimos são novos
recursos a partir de Java 5).
Pacotes
99. www.labes.ufpa.br
99
Benefícios:
• Facilita a identificação de classes e interfaces
relacionados.
• Os nomes de pacotes devem ser diferentes de
existentes, para evitar conflito de espaços de
nomes.
• É possível permitir dentro do pacote acesso
irrestrito de fora assim como restringir acesso
de outros pacotes externos.
Pacotes
100. www.labes.ufpa.br
100
• Para definir uma classe em um pacote, basta
escrever o seguinte na primeira linha do código:
package br.java.meupacote;
public class MinhaClasse{
…….
}
Pacotes
101. www.labes.ufpa.br
101
Importando Pacotes:
• Para estar habilitado a utilizar classes fora do mesmo
pacote que a classe atual pertence é necessário
importar explicitamente o pacote das classes.
• Por default, todos os programas Java importam o
pacote java.lang.*, o que permite a utilização de
String e Integer dentro do programa sem ter importado
qualquer pacote.
• A sintaxe de import é:
import br.java.meuPacote.*;
import br.java.novoPacote.UmaClasse;
Pacotes
102. www.labes.ufpa.br
102
• O pacote java.lang.* é composto por aquelas
classes que encapsulam os tipos primitivos
da linguagem (Wrapper Classes)
Pacotes
Boolean - encapsula um primitivo boolean
Character - encapsula um primitivo char
Double - encapsula um primitivo double
Float - encapsula um primitivo float
Integer - encapsula um primitivo int
Long - encapsula um primitivo long
String - encapsula uma cadeia de caracteres
104. www.labes.ufpa.br
104
• Herança é o conceito aplicado quando um filho para
uma classe (também chamado de sub classe)
automaticamente herda variáveis e métodos da classe
pai (super classe).
• É uma das funcionalidades principais da
programação orientada a objetos
• Como benefício, permite o reuso de métodos e
atributos, que são automaticamente compartilhados
entre classes e subclasses
• Cada subclasse fica responsável por estender e
modificar o comportamento herdado
Herança
105. www.labes.ufpa.br
105
• A palavra chave extends permite a herança em Java
• A sub classe herda todos os membros “public” e
“protected” (atributos e métodos) do pai, não
importando a qual pacote a sub classe pertence
• Se a sub classe está no mesmo pacote que o pai, ela
também herda os membros ”private” (atributos e
métodos) do pai
Herança
public class Funcionario extends Pessoa {
private String nomeEmpresa;
protected int cargaHoraria;
. . . .
}
106. www.labes.ufpa.br
106
• Os atributos herdados podem ser utilizados
diretamente, assim como qualquer atributo.
• É permitido declarar novos atributos na sub classe
que não existam na super classe
• É permitido declarar um atributo com o mesmo
nome do que existe na super classe, dessa forma
escondendo o atributo original (não recomendado).
• A sub classe não tem acesso aos membros privados
da classe pai. Mesmo assim, se a super classe tem
método público ou protegido para acessar o atributo
privados a sub classe poderá ter acesso aos dados.
Herança
107. www.labes.ufpa.br
107
• Em Java , a classe Object é a “mãe” de todas as
classes
– Todas as classes estendem da super classe Object
– A classe Object é a única classe que não tem super classe
• Object define e implementa comportamento comum
para todas as classes:
– getClass()
– equals()
– toString()
– …
Herança
Object
ClasseA
ClasseB
ClasseC
108. www.labes.ufpa.br
108
Classes Final
– Classes que não podem ser estendidas
– Para declarar uma classe final:
public final NomeClasse {
. . .
}
Métodos Final
– Métodos que não podem ser sobrescritos
– Basta colocar o termo final na definição do método
• Métodos static são automaticamente final
Herança
109. www.labes.ufpa.br
109
• Uma classe abstrata é uma classe que contém
um ou mais métodos abtsratos
• Uma classe abstrata não pode ser instanciada
// O seguinte código vai dar erro de compilação
MinhaClasseAbstrata a1 = new MinhaClasseAbstrata();
• Qualquer outra classe (classe concreta) deve
prover a implementação dos métodos abstratos
Classes Abstratas
110. www.labes.ufpa.br
110
Classes Abstratas
public abstract class SerVivo {
public void respira() {
System.out.println("Ser vivo respirando...");
}
public void come() {
System.out.println("Ser vivo comendo...");
}
/**
* Método abstrato anda()
* Este método deve ser implementado por uma classe concreta
*/
public abstract void anda();
}
111. www.labes.ufpa.br
111
• Quando uma classe concreta estende a classe
abstrata SerVivo, deve implementar o método
abstrato anda(), ou então a subclasse também deve
ser uma classe abstrata (e não poderá ser
instanciada)
Classes Abstratas
public class Homem extends SerVivo {
@Override
public void anda() {
System.out.println("Homem andando ... ");
}
}
112. www.labes.ufpa.br
112
• Define um modo padrão e público de
especificar o comportamento de classes (como
um contrato)
• Todos os métodos de uma interface são
abstratos
• Uma classe concreta deve implementar a
interface
• Isto permite que diferentes classes
implementam um comportamento em comum
Interfaces
113. www.labes.ufpa.br
CapacitaçãoEletronorte–2007-2008
113
l Como exemplo, a interface Relacao é definida para
representar os métodos que representam a relação
natural entre objetos
Interfaces
public interface Relacao {
public boolean maior(Object a, Object b);
public boolean menor(Object a, Object b);
public boolean igual(Object a, Object b);
}
114. www.labes.ufpa.br
CapacitaçãoEletronorte–2007-2008
114
Interfaces
public boolean igual(Object a, Object b) {
double aLen = ((Linha) a).getTamanho();
double bLen = ((Linha) b).getTamanho();
return (aLen == bLen);
}
public boolean maior(Object a, Object b) {
double aLen = ((Linha) a).getTamanho();
double bLen = ((Linha) b).getTamanho();
return (aLen > bLen);
}
public boolean menor(Object a, Object b) {
double aLen = ((Linha) a).getTamanho();
double bLen = ((Linha) b).getTamanho();
return (aLen < bLen);
}
}
public class Linha implements
Relacao {
private double x1;
private double x2;
private double y1;
private double y2;
public Linha(double x1, double
x2,
double y1, double y2) {
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
public double getTamanho() {
double length = Math.sqrt((x2
- x1) *
(x2 - x1) + (y2 - y1) * (y2
- y1));
return length;
}
115. www.labes.ufpa.br
CapacitaçãoEletronorte–2007-2008
115
Relacionamento com Classes
l Uma classe concreta pode ter somente uma super
classe, mas por outro lado pode implementar várias
interfaces
- Java não permite herança múltipla, mas
interfaces fornecem uma alternativa.
l Todos os métodos abstratos de todas as interfaces
devem ser implementados por uma classe concreta
Interfaces
116. www.labes.ufpa.br
116
Herança entre Interfaces
• Interfaces não fazem parte da hierarquia de classes
• Porém, interface podem ter relacionamentos de
herança entre si
Interfaces
public interface RelacaoAmpliada extends Relacao{
public boolean diferenca(Object a, Object b);
}
117. www.labes.ufpa.br
117
• Quando uma instância de objeto é criada de
uma classe, pode-se afirmar que o objeto é do
“tipo”da classe e das super classes
• Uma instância de objeto de um tipo em
particular pode ser utilizada em qualquer lugar
onde seu tipo e os super tipos são invocados
(incluindo interfaces implementadas)
Casting de Tipos
118. www.labes.ufpa.br
118
• Exemplo:
– contaCorrente1 é um objeto do tipo de ContaBancaria
– O objeto contaCorrente1 pode ser chamado em qualquer
lugar onde uma instância de ContaBancaria é chamada
• Isto permite o chamado polimorfismo
Casting de Tipos
119. www.labes.ufpa.br
119
Casting Implícito
• Uma instância de uma sub classe pode ser atribuída
a uma variável de uma super classe através do
casting implícito
• Exemple
ContaCorrente contCorrente = new ContaCorrente();
Poupanca poupanca = new Poupanca();
ContaBancaria conta = contCorrente; // Casting implícito
ContaBancaria conta2 = poupanca; // Casting implícito
Object objeto = poupanca; // Casting implícito
Casting de Tipos
120. www.labes.ufpa.br
120
Casting Explícito
• Uma instância de objeto de uma super classe deve ser
atribuída a uma variável de uma classe filha através do
casting explícito (se não fizer isso é lançado erro de
compilação)
• Exemplo:
Casting de Tipos
ContaBancaria conta = new ContaCorrente();
ContaCorrente contaCorrente = (ContaCorrente) conta;
ContaBancaria conta = new Poupanca();
ContaCorrente contaCorrente = (ContaCorrente) conta;
Não lança erro de compilação, mas lança erro em tempo de execução
121. www.labes.ufpa.br
121
Operador instanceof
• É possível checar o tipo de uma instância de objeto
utilizando instanceof antes do casting de tipos
• Exemplo
ContaBancaria conta1 = new ContaCorrente();
ContaBancaria conta2 = new Poupanca();
if( conta2 instanceof ContaCorrente ) {
ContaCorrente contaCorrente = (ContaCorrente) conta2;
}
Casting de Tipos
123. www.labes.ufpa.br
123
– Dado o modelo UML anterior:
– Crie classes Java e Atributos
• Quando necessário, considere classes
abstratas e herança
• Diferencie varáveis de instância e de
classe
• Organize as classes em pacotes Java
Exercício
125. www.labes.ufpa.br
125
• Em Java existem 3 tipos de estruturas de
controle
– Estruturas de controle de decisão
• Permitem selecionar seções específicas do código para serem
executadas (if-then-else, swicth)
– Estruturas de controle de repetição
• Permitem executar seções específicas um número repetido de
vezes (while, for, do-while)
– Estruturas de controle de redirecionamento
• Permitem redirecionar o fluxo de execução de comandos (break,
continue, return );
Estruturas de Controle
126. www.labes.ufpa.br
126
• Estruturas de Decisão podem ser dos
seguintes tipos:
– Sentenças if
– Sentenças if-else
– Sentenças If-else-if
– Sentenças switch
Estruturas de Decisão
127. www.labes.ufpa.br
127
● Sentenças if
– Especificam que a sentença (ou bloco de código) será
executada somente se uma certa expressão booleana
for verdadeira.
if( expre_booleana )
sentença;
ou
if( expre_booleana ){
sentença;
sentença;
}
– Onde,
• expre_booleana representa uma expressão
Estruturas de Decisão
129. www.labes.ufpa.br
129
Sentenças if-else
– Utilizadas quando se deseja executar algo quando
a sentença é verdadeira, e algo diferentes quando
é falsa.
if( expre_booleana ){
sentença;
} else{
sentença;
}
Estruturas de Decisão
131. www.labes.ufpa.br
131
● Sentenças If-else-If
• A sentença em uma cláusula else pode ser outra estrutura if-
else.
• Este encadeamento de estruturas permite a
criação de seleções mais complexas.
if( expre_booleana ){
sentença;
} else if( expre_booleana ) {
sentença;
} else if( expre_booleana ) {
sentença;
} else {
sentença;
Estruturas de Decisão
133. www.labes.ufpa.br
133
Erros Comuns
1. Não utilizar uma expressão booelana no if. Por exemplo
//ERRADO
int number = 0;
if( number ){
//alguma sentença
}
A variável number não possui um valor booleano (Este caso
difere Java de C/C++, onde este exemplo acima estaria
correto).
2. Escrever elseif (junto) ao invés de else if (separado).
Estruturas de Decisão
135. www.labes.ufpa.br
135
Sentenças switch
– Permitem múltiplos testes simultâneos.
• Setenças switch possuem a seguite forma:
switch( expres_switch){
case seletor1:
sentença;
break;
case seletor2:
sentença;
break;
.....
default:
sentença;
}
Estruturas de Decisão
Onde:
express_switch: pode ser um valor inteiro ou
caracter
seletor1..n: um valor inteiro único ou uma
constante caracter
138. www.labes.ufpa.br
138
Loop while
– É uma sentença ou bloco que é repetido enquanto
alguma condição é satisfeita.
while( expre_booleana ){
sentença1;
sentença2;
. . .
}
– Enquanto expre_booleana é verdadeira as sentenças
do loop são executadas.
Estruturas de Repetição
139. www.labes.ufpa.br
139
Loop do-while
– similar ao loop while
– A principal diferença é:
• Os comandos dentro do loop do-while são executados no mínimo
uma vez.
do{
sentença1;
sentença2;
. . .
}while( boolean_expression );
Estruturas de Repetição
140. www.labes.ufpa.br
140
Loop for
– Permite a execução do mesmo código um número
específico de vezes.
for(expressaoDeInicializacao;condLoop;expressaoEmCadaPasso)
{
sentença1;
sentença2;
. . .
}
Onde:
• expressaoDeInicializacao –inicializa variável de loop.
• condLoop – compara a variável de loop com algum valor limite.
• expressaoEmCadaPasso - atualiza a variável de loop.
Estruturas de Repetição
141. www.labes.ufpa.br
141
• O código acima é equivalente ao seguinte loop while
Estruturas de Repetição
int i;
for( i = 0; i < 10; i++ ){
System.out.println(i);
}
int i = 0;
while( i < 10 ){
System.out.print(i);
i++;
}
Loop for: Exemplo
143. www.labes.ufpa.br
143
Break sem marcador
– Finaliza o comando switch atual, e segue o fluxo
de controle para a sentença imediatamente
posterior ao switch.
– Isto pode também ser aplicado para finalizar um
loop for, while ou do-while
Estruturas de Redirecionamento
for (int i = 0; i < nomes.length; i++) {
if (nomeBusca.equals(nomes[i]) {
achou=true
break;
}
}
144. www.labes.ufpa.br
144
• Break com marcador
– Finalizar um comando externo ao contexto atual,
que é identificado por um marcador no comando
break.
– O fluxo de controle é transferido para a sentença
imediatamente após a sentença marcada.
– O trecho de programa a seguir representa uma
busca em um array de duas dimensões. Dois loops
encadeados varrem o array. Quando o valor é
encontrado o break com marcador finaliza o
comando “marcacaoBusca”, que é um loop
externo
Estruturas de Redirecionamento
145. www.labes.ufpa.br
145
int[][] numeros = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int numeroBusca = 5;
boolean encontrouNumero = false;
marcacaoBusca:
for (int i = 0; i < numeros.length; i++) {
for (int j = 0; j <
numeros[i].length; j++) {
if (numeroBusca == numeros[i][j]) {
encontrouNumero = true;
break marcacaoBusca;
}
}
}
if (encontrouNumero)
Estruturas de Redirecionamento
Break com marcador: Exemplo
Finaliza o for externo marcado
146. www.labes.ufpa.br
146
• Continue sem marcador
– Simplesmente pula a iteração atual de um loop
Estruturas de Redirecionamento
String
nomes[]
=
{
"Java",
"C",
"C++",
"Java"
};
int
quan)dade
=
0;
for
(int
i
=
0;
i
<
nomes.length;
i++)
{
if
(nomes[i].equals("Java"))
{
conHnue;
//
pula
o
proximo
comando
}
quan)dade++;
}
System.out.println("Existem
"
+
quan)dade
+
"
nomes
Java
na
lista");
147. www.labes.ufpa.br
147
• Continue com marcador
– Pula a iteração corrente e continua o fluxo para um
loop externo devidamente marcado
Estruturas de Redirecionamento
loopExterno:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.println("Dentro do for j"); // mensagem1
if (j == 2)
continue loopExterno;
}
System.out.println("Dentro do for i"); // mensagem2
} Nunca chega exibir a mensagem2
Quantas vezes a mensagem1 é exibida?
148. www.labes.ufpa.br
148
Return
– Utilizado para sair do método corrente
– Fluxo de controle retorna ao comando que invocou
o método originalmente.
Estruturas de Redirecionamento
public String ComandoReturn(){
return "TextoQualquer";
}
Em método void, basta colocar return;
150. www.labes.ufpa.br
150
• Evento não esperado
• Erro que ocorre em tempo de execução
• Causa ruptura do fluxo normal do programa
• Exemplos
– Erros de divisão por zero
– Acessar elementos de um array além do tamanho
– Entrada inválida
– Pane no disco rígido
– Abertura de arquivo não existente
– Estouro do Heap de memória
O que é uma Exceção?
151. www.labes.ufpa.br
151
O que é uma Exceção?
class DivisaoPorZero {
public static void main(String args[]) {
System.out.println(3/0);
System.out.println("me escreva");
}
}
O código abaixo
Gera a seguinte saída:
152. www.labes.ufpa.br
152
• Tratador default de exceções:
– Provido pelo runtime Java
– Imprime uma descrição da exceção
– Imprime a pilha de exceções
• Hierarquia de métodos onde a exceção ocorreu
– Faz o programa finalizar
• Quando uma exceção ocorre em um método, o
método cria um objeto exceção e lança ao sistema de
execução
– Criar um objeto exceção e lançar no sistema de execução é
chamado “throwing an exception”
– Objetos de exceção contém informações sobre o erro,
incluindo o tipo e o estado do programa quando o erro
ocorreu
O que é uma Exceção?
153. www.labes.ufpa.br
153
• O sistema de execução busca pela pila
de chamadas um método que trate a
exceção
O que é uma Exceção?
Método
onde
ocorreu
erro
Método
sem
um
tratador
de
exceção
Método
com
um
tratador
de
exceção
main
Chamada de
método
Chamada de
método
Chamada de
método
154. www.labes.ufpa.br
154
• Buscando um tratador de exceção
O que é uma Exceção?
Método
onde
ocorreu
erro
Método
sem
um
tratador
de
exceção
Método
com
um
tratador
de
exceção
main
Procura tratador
apropriado
Procura tratador
apropriado
Lança exceção
Encaminha exceção
Captura exceção
155. www.labes.ufpa.br
155
Tratamento de exceções com try/catch
• U m m é t o d o p o d e
organizar suas exceções
lançando-as para que
um método posterior
possa tratá-las.
• Assim, somente métodos
que “se importam” com
os erros precisam tratá-
los
• Q u a l q u e r e x c e ç ã o
lançada deve estar
explicitamente estar na
assinatura do método
(utilizando o throws).
metodo1 (){
try {
metodo2();
} catch (exception e) {
processaErro();
}
}
metodo2 () throws exception
{
metodo3();
}
metodo3 () throws exception
{
leituraArquivo();
}
156. www.labes.ufpa.br
156
Tratamento de exceções com try/catch
class
DivisaoPorZeroComTry
{
public
staHc
void
main(String
args[])
{
try
{
System.out.println(3
/
0);
System.out.println("me
escreva");
}
catch
(Arithme)cExcep)on
exc)
{
//
Divissao
por
zero
é
uma
Arithme)cExcep)on
System.out.println(exc);
}
finally{
//
Codigo
a
ser
excutado
antes
do
bloco
try
terminar
System.out.println(“passou
pelo
finally
");
}
System.out.println("Apos
excecao.");
}
}
● Exemplo
157. www.labes.ufpa.br
157
• Java permite ao programador lançar
exceções
throw <ObjetoExcecao>;
• Um exceção é um objeto
– É necessário criar uma objeto exceção da mesma
forma como se cria qualquer objeto Java
• Exemplo:
throw new ArithmeticException(“teste...”);
Criando e Lançando Exceções
158. www.labes.ufpa.br
158
Criando Exceções Próprias
• Criar exceções próprias para um programa cria um
mecanismo específico para tratar as exceções no
escopo do próprio sistema
• Passos para seguir
– Criar uma classe que estenda a RuntimeException ou a
classe Exception
– Customize a classe
• Membros e construtores podem ser adicionados à classe
• Exemplo:
class ExcecaoExemplo extends RuntimeException {
/* algum codigo */
}
Criando e Lançando Exceções
159. www.labes.ufpa.br
159
Criando e Lançando Exceções
class TesteNegaString {
public static void main(String args[]) {
String input = "entrada invalida";
try {
if (input.equals("entrada invalida")) {
throw new ExcecaoExemplo();
}
System.out.println("Aceitou string.");
} catch (ExcecaoExemplo e) {
System.out.println("Negou string!");
}
}
}
Lança exceção
Captura exceção
160. www.labes.ufpa.br
160
• Permitem que o programador verifique se uma
condição foi alcançada na execução do programa
• Estende os comentários de tal forma que uma
asserção indica ao leitor do código que uma
condição particular deve sempre acontecer
– O programa informa se as asserções são verdadeiras ou
falsas
– Se uma asserção não é verdadeira, uma AssertionError é
lançada
• O usuário tem a opção de desligar a execução da
checagem de asserções
Asserções
161. www.labes.ufpa.br
161
Habilitando e Desabilitando Asserções
• Programa com asserções não funciona corretamente
em clientes que não habilitam tal propriedade
• Compilação
– Código deve ser compilado com java 1.4 ou superior
• Habilitando asserções:
– Ao invocar o interpretador, utilize a tag ”–enableassertions”
ou “–ea”.
java –enableassertions MeuPrograma
Asserções
165. www.labes.ufpa.br
165
– Dado o modelo UML anterior, considere
uma operação que lê dados de entrada
do usuário e cadastra em banco os
dados:
– Defina e codifique no mínimo 3 exceções
Java que tenha significado ao contexto
citado
Exercício
167. www.labes.ufpa.br
167
• Provê constantes e métodos pré-definidos para
realizar diferentes operações matemáticas
• Métodos e Constantes são variáveis de classe
(estáticas), permitindo o acesso sem
necessidade de instanciar a classe
• Constantes:
• Math.E à 2.718281828459045
• Math.PI à 3.141592653589793
java.lang.Math
168. www.labes.ufpa.br
168
• Métodos:
• Absoluto de -5 = Math.abs(-5)
• Número randômico (máximo é 10) = Math.random() * 10
• Número máximo e mínimo entre 3.5 e 1.2 = Math.max(3.5,1.2),Math.min(3.5,1.2)
• Funções teto e piso = Math.ceil(3.5), Math.floor(3.5)
• Número de Euler elevado a 1 = Math.exp(1)
• log 10 = Math.log(10)
• 10 elevado a 3 = Math.pow(10, 3)
• Arrondamento do PI = Math.round(Math.PI)
• Raiz quadrada de 5 = Math.sqrt(5)
• 10 radianos transformados em graus = Math.toDegrees(10) + " graus")
• Seno de 90 = Math.sin(Math.toRadians(90))
java.lang.Math
169. www.labes.ufpa.br
169
Operadores Aritméticos
Operador Uso Descrição
+ op1+op2 Soma op1 e op2
* op1*op2 Multiplica op1 por op2
/ op1/op2 Divide op1 por op2
% op1%op2 Computa o resto da divisão de op1 por op2
- op1-op2 Subtrai op1 por op2
170. www.labes.ufpa.br
170
Operadores Aritméticos
Operador Uso Descrição
++ op++ Incrementa op em 1; avalia o valor de op
antes de ser incrementado
++ ++op Incrementa op em 1; avalia o valor de op
depois de ser incrementado
-- op-- Subtrai op em 1; avalia o valor de op antes
de ser incrementado
-- --op1 Subtrai op em 1; avalia o valor de op
depois de ser incrementado
Operadores de incremento e decremento
171. www.labes.ufpa.br
171
Operadores Aritméticos
int i = 10;
int j = 3;
int k = 0;
k = ++j + i; //resulta em k = 4+10 = 14
Operadores de incremento e decremento
int i = 10;
int j = 3;
int k = 0;
k = j++ + i; //resulta em k = 3+10 = 13
172. www.labes.ufpa.br
172
• Comparam dois valores e determinam o
relacionamento entre estes valores
• A saída da avaliação é true ou false.
Operadores Relacionais
Operador Uso Descrição
> op1>op2 op1 é maior que op2
>= op1>=op2 op1 é maior ou igual a op2
< op1<op2 op1 é menor que op2
<= pp1<=op2 op1 é menor ou igual a op2
== op1==op2 op1 é igual a op2
!= op1!=op2 op1 é diferente de op2
173. www.labes.ufpa.br
173
• Possuem um ou dois operandos booleanos que
produzem um resultado booleano.
• Estes são os 6 operadores lógicos:
– && (AND lógico)
– & (AND lógico booleano)
– || (OR lógico)
– | (OR lógico booleano inclusivo)
– ^ (OR lógico booleano exclusivo)
– ! (NOT lógico)
Operadores Lógicos
174. www.labes.ufpa.br
174
● Operadores Lógicos && e &
● Diferença básica:
- &&
permite
avaliações
de
curto-‐circuito
(ou
avaliações
parciais),
enquanto
&
não.
● Dada a expressão:
exp1 && exp2
- &&
irá
avaliar
a
expressão
exp1,
e
imediatamente
retornar
false
se
o
valor
de
exp1
for
falso.
- Em
contraste,
o
operador
&
sempre
avaliar
ambos
exp1
e
exp2
antes
de
retornar
a
resposta.
Operadores Lógicos
175. www.labes.ufpa.br
175
public class TestAND {
public static void
main( String[] args ){
int i = 0;
int j = 10;
boolean test= false;
//demonstra &&
test = (i > 10) && (j++ > 9);
System.out.println(i);
System.out.println(j);
System.out.println(test);
//demonstra &
test = (i > 10) & (j++ > 9);
System.out.println(i);
System.out.println(j);
System.out.println(test);
}
}
Operadores Lógicos
● Operadores Lógicos && e &
Qual saída este programa gera no console?
176. www.labes.ufpa.br
176
● Operadores Lógicos || e |
● Seguem a mesma lógica dos operadores && e &, ou seja:
- ||
permite
avaliações
de
curto-‐circuito
(ou
avaliações
parciais),
enquanto
|
não.
● Dada a expressão:
exp1 || exp2
- ||
irá
avaliar
a
expressão
exp1,
e
imediatamente
retornar
true
se
exp1
é
verdadeiro
- Em
contrastes,
o
operador
|
sempre
avaliar
as
duas
expressões
antes
de
retornar
a
resposta.
Operadores Lógicos
177. www.labes.ufpa.br
177
• O resultado de uma operação de OU
exclusivo é verdadeiro, se e um dos
operandos é verdadeiro e o outro é falso
• Sempre os dois operandos serão
avaliadospara calcular o resultado.
Operadores Lógicos
● Operador Lógico ^ (OU exclusivo)
● Operador Lógico ! (NÃO lógico)
● O resultado de uma operação de NÃO lógico é a negação
do valor avaliada
● Se é verdadeiro o resultado é falso, se é falso o resultado é
verdadeiro
178. www.labes.ufpa.br
178
• Operador Lógico condicional ? :
– É uma operador ternário.
• Isto significa que recebe três argumentos de expressão condicional.
– A estrutura de uma expressão utilizando o operador
condicional é:
exp1?exp2:exp3
onde,
exp1 – é um expressão booleana que pode resultar em true ou false
– Resultado:
Se exp1 é true, exp2 é o valor retornado.
Se for false, então exp3 é retornada.
Operadores Lógicos
179. www.labes.ufpa.br
179
Operadores Lógicos
● Operador Lógico condicional ? :
public class OperadorCondicional {
public static void main( String[] args ){
String status = "";
int grade = 80;
//pega status do estudante
status = (grade >= 60)?"Passou":"Falhou";
//escreve status
System.out.println( status );
}
}
181. www.labes.ufpa.br
181
• Dada a seguinte expressão,
6%2*5+4/2+88-10
Pode-se re-escrever com alguns parentes
baseado na precedência de operadores,
((6%2)*5)+(4/2)+88-10
Precedência de Operadores
184. www.labes.ufpa.br
184
O que é uma Coleção?
• Um objeto coleção — algumas vezes chamados de
“container” — é simplesmente um objeto que agrupa
múltiplos elementos em uma unidade
• Coleções são utilizadas para armazenar, recuperar,
manipular e comunicar dados agregados
– Tipicamente, representam itens de dados que
formam um grupo natural, como uma pasta de
email (uma coleção de cartas), ou um diretório de
telefones (um mapeamento entre nomes e números
de telefones).
Framework de Coleções
185. www.labes.ufpa.br
185
• O framework de coleções é uma arquitetura
unificada para representar e manipular coleções
• O framework de coleções possui:
– Interfaces
– Implementações
– Algoritmos
Framework de Coleções
186. www.labes.ufpa.br
186
Benefícios:
• Reduz esforço de programação
• Incrementa velocidade e qualidade dos programas
• Permite interoperabilidade entre APIS não
relacionadas
– As interfaces de coleções são padrão na troca de dados
entre APIS
• Reduz tempo de aprendizagem de novas APIS
• Reduz esforço para projetar novas APIS
• Promove o reuso de software
– Novas estruturas de dados que esteja de acordo com as
interfaces padrão de coleção são naturalmente
reutilizáveis
Framework de Coleções
187. www.labes.ufpa.br
187
• Interfaces Collection são tipos de dados
abstratos que estão definidas na forma de
interfaces Java
• Interfaces definem como coleções são
manipuladas independentemente dos seus
detalhes de implementação internos
– Comportamento polimórfico
• Em Java (e em outras linguagens orientadas a
objetos), interfaces genericamente formam
uma hierarquia
Interfaces e Implementações
189. www.labes.ufpa.br
189
• Implementações são objetos utilizados para
armazenar coleções, implementando as
interfaces do framework
• Cada implementação de propósito geral provê
os operadores das interfaces que
implementam
• O framework de coleções Java também provê
várias implementações para situações
específicas
Interfaces e Implementações
191. www.labes.ufpa.br
191
• Nas últimas versões do Java, algumas classes
que tratam de coleções foram consideradas
“legadas”:
– Vector
– Stack
– Hashtable
– Properties
Interfaces e Implementações
192. www.labes.ufpa.br
192
• É a raiz para a hierarquia de coleções
• É o último denominador comum que as coleções
implementam
– Todo objeto coleção é um tipo da interface Collection
• É utilizado para passar objetos de coleção e
manipular quando generalização máxima é desejada
– Utilize a interface Collection como um tipo
• JDK não provê implementação direta desta
interface, mas prove implementações mais específicos
como Set e List
Interface Collection
194. www.labes.ufpa.br
194
Métodos de adição e remoção
• O método add() é definido genericamente o suficiente
para admitir a adição de itens duplicados ou não, o que
depende das implementações da interface Collection
• Isto garante que a coleção irá conter o elemento
passado como parâmetro após a invocação do método.
add(Object obj) e remove(Object obj)
Operações em Coleções
…
conjuntoA.add(new Integer(1));
conjuntoA.remove(new Integer(1));
…
Adiciona objeto
Remove objeto
195. www.labes.ufpa.br
195
Navegação
Para navegar entre os elementos de uma coleção
existem o for each e Iterator:
• for each (a partir do Java 5)
– O construtor for each permite que se navegue por um array
ou collection de forma concisa
Operações em Coleções
…
Collection<String> nomes = new ArrayList<String>();
nomes.add("a");
nomes.add("b");
nomes.add("c");
for (String umNome: nomes)
System.out.println(umNome.charAt(0));
…
196. www.labes.ufpa.br
196
Navegação
• Iterator
– Um Iterator é um objeto que permite a navegação em uma
coleção e remover elementos da coleção de forma seletiva,
caso desejado
Operações em Coleções
…
Collection<String> nomes = new ArrayList<String>();
nomes.add("a");
nomes.add("b");
nomes.add("c");
for (Iterator it=nomes.iterator();it.hasNext();)
System.out.println(String(it.next())s);
…
Obtém iterator
Testa se ainda
existem elementos
Obtém a referência
do próximo objeto
198. www.labes.ufpa.br
198
Outras operações
• containsAll(Collection entrada) — retorna true se a coleção alvo
contém todos os elementos da coleção passada como
parâmetro.
• addAll(Collection entrada) — adiciona todos os elementos da
coleção passada como parâmetro na coleção alvo.
• removeAll(Collection entrada) — remove todos os elementos
da coleção passada como parâmetro que também pertençam à
coleção alvo.
• retainAll(Collection entrada) — contrário do anterior, pois
remove todos os elementos que não estejam em comum na
coleção passada como parâmetro
• clear() — remove todos os elementos da coleção
Operações em Coleções
199. www.labes.ufpa.br
199
• Representa uma coleção que não pode ter
elementos duplicados
• Modela a abstração matemática de conjunto:
– Matérias de um curso de graduação
– Conjunto de pessoas em uma sala
• Esta interface possui apenas os mesmos métodos
herdados da interface Collection.
• Apenas nas implementações desta interface são
adicionadas operações para garantir que não
conterá elementos repetidos
• Não existe restrição nenhuma em relação a ordem
em que os elementos são agrupados
Interface Set
200. www.labes.ufpa.br
200
Implementações da Interface Set
• HashSet – conjunto genérico e não ordenado que armazena
por valor hash
• TreeSet – árvore não balanceada cujos elementos estão
ordenados (garante tempo log(n) para operações básicas - add,
remove and contains)
• LinkedHashSet – um conjunto HashSet que amazena também
a ordem de inserção
Interface Set
HashSet
1
3
2
LinkedHashSet
201. www.labes.ufpa.br
201
HashSet, TreeSet e LinkedHashSet
• HashSet é mais rápido que TreeSet em várias
operações (tempo constante versus tempo log para
as operações), mas não oferece nenhuma garantia de
ordenamento
• HashSet é a implementação mais comumente
utilizada
• LinkedHashSet provê quase o mesmo tempo de
acesso de HashSet e não possui o custo de log
como TreeSet.
Interface Set
202. www.labes.ufpa.br
202
• Representa uma coleção ordenada (algumas vezes
chamada de seqüência )
• Lista pode conter elementos duplicados em sua
definição
• O usuário da lista geralmente tem controle preciso
sobre a posição onde está cada elemento da lista
• Pode acessar os elementos pelo valor inteiro de sua
posição
• Provê operações adicionais à interface Collection,
que possuem as seguintes funções: acesso pela
posição, busca, iteração e listagens por range
Interface List
203. www.labes.ufpa.br
203
public interface List<E> extends
Collection<E> {
E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
boolean addAll(int index, Collection c);
int indexOf(Object o);
int lastIndexOf(Object o);
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
List<E> subList(int from, int to);
}
Interface List
204. www.labes.ufpa.br
204
Implementações
• ArrayList
– Oferece tempo constante de acesso, utiliza um array como
representação interna e é a implementação de lista mais
utilizada
• LinkedList
– Utilizado para freqüentemente adicionar elementos ao topo
da lista, navegar e apagar elementos no interior da lista
Interface List
ArrayList
remove
LinkedList
205. www.labes.ufpa.br
205
• Em relacionamentos entre objetos onde pode haver mais de
um objeto envolvido, podem ser utilizados arrays ou coleções
• Pela flexibilidade e facilidade de uso, naturalmente utilizam-se
coleções Java para representar relacionamentos do lado “n”.
Coleção como Atributo
Relacionamentos n-ários
206. www.labes.ufpa.br
206
• Codificação
Coleção como Atributo
public class Funcionario {
private String nome;
private String cpf;
private Date dataAdmissao;
private String tipo;
private Date dataNascimento;
private Funcionario chefe;
private Collection subordinados;
private Divisao lotacao;
}
208. www.labes.ufpa.br
208
– Dado o modelo de súmulas de futebol:
– Codifique os relacionamentos entre as
classes
– Considere a cardinalidade e a direção
– Quando determinado, defina o tipo de
ordenação (List ou Set)
Exercício
210. www.labes.ufpa.br
210
• Representa as operações de entrada e saída de dados
para um destino
• Pode ser representado por diferentes tipos de fontes e
destinos
– Arquivos em disco, aparelhos, outros programas, um socket
de rede, arrays em memória, entre outros.
• Pode operar com diferentes tipos de dados
– Bytes simples, tipos de dados primitivos, caracteres
específicos e objetos
• Um programa Java utiliza a abstração de Stream para
criar um canal de comunicação entre fonte e destino
O que é Java I/O
213. www.labes.ufpa.br
213
• Representa uma abstração sobre os
arquivos e diretórios verdadeiros
armazenados no SO
• Não é uma stream Java
• É muito importante I/O Java, pois streams
Java manipulam objetos da classe File
• P o s s u i o p e r a ç õ e s p a r a a c e s s a r
propriedades do arquivo ou diretório, tais
como permissões de leitura, escrita,
tamanho, etc.
Classe File
214. www.labes.ufpa.br
214
Classe File
public class FileInfoClass {
public static void main(String args[]) {
String nomeArquivo = "arquivo.txt";//mude aqui o nome para o diretorio
que queira testar
File arquivoRef = new File(nomeArquivo);
System.out.println("Nome: " + arquivoRef.getName());
if (!arquivoRef.exists()) {
System.out.println(nomeArquivo + " nao existe");
/* Cria um diretorio temporario */
System.out.println("Criando diretorio temporario...");
nomeArquivo = "temp";
arquivoRef = new File(nomeArquivo);
arquivoRef.mkdir();
System.out.println(nomeArquivo + (arquivoRef.exists() ? "existe" :
"nao existe"));
System.out.println("Deleting temp directory...");
arquivoRef.delete();
System.out.println(nomeArquivo + " e um " + (arquivoRef.isFile() ?
"arquivo ." : "diretorio ."));
}
…
Cria objeto arquivo
Verifica se arquivo já existe
Cria um diretório temp
Apaga arquivo
215. www.labes.ufpa.br
215
…
if (arquivoRef.isDirectory()) {
String content[] = arquivoRef.list();
System.out.println("O conteudo do diretorio");
for (int i = 0; i < content.length; i++) {
System.out.println(content[i]);
}
}
System.out.println(nomeArquivo + " tem tamanho = " +
arquivoRef.lastModified() );
if (!arquivoRef.canRead()) {
System.out.println(nomeArquivo + " nao pode ser lido");
return;
}
System.out.println(nomeArquivo + " tem tamanho " +
arquivoRef.lastModified());
if (!arquivoRef.canWrite()) {
System.out.println(nomeArquivo + " nao pode ser escrito");
}
}
}
Verifica se é diretório
Imprime nome do arquivo
Classe File
218. www.labes.ufpa.br
218
• Streams de Byte
– Streams de dados binários
– Classes raiz para streams de bytes:
• Classe InputStream
• Classe OutputStream
• Ambas são classes abstratas
• Streams de Character
– Para caracteres Unicode
– Classes raiz para streams de caracteres:
• Classe Reader
• Classe Writer
• Ambas são abstratas
Leitura e Escrita de Arquivos
219. www.labes.ufpa.br
219
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("eln.txt");
out = new FileOutputStream("saidaeln.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}
// mais codigo
finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Leitura e Escrita de Arquivos
FileInputStream e FileOutputStream
Cria referências
Lê da entrada e escreve na saída
Fecha referências aos arquivos
220. www.labes.ufpa.br
220
• Leitura de Linhas
• Entrada e Saída baseada em caracteres é uma
operação muito “baixo nível”
• Entrada e Saída usualmente utiliza unidades
maiores que um simples caracter
– Uma unidade comum é uma linha: uma string
com um caracter terminador no final
– Um terminador de linha pode ser um retorno de
carro seguido de nova linha ("rn"), um único
retorno de carro ("r"), ou uma única nova linha
("n").
Leitura e Escrita de Arquivos
221. www.labes.ufpa.br
221
public static void main(String[] args) {
File inputFile = new File("eln.txt");
File outputFile = new File("saidaeln.txt");
FileReader in;
FileWriter out;
try {
in = new FileReader(inputFile);
out = new FileWriter(outputFile);
BufferedReader inputStream = new
BufferedReader(in);
PrintWriter outputStream = new
PrintWriter(out);
String l;
while ((l = inputStream.readLine()
System.out.println(l);
outputStream.println(l);
}
in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Leitura e Escrita de Arquivos
● Leitura de Linhas
222. www.labes.ufpa.br
222
• Uma operação de I/O sem buffer significa que cada chamada de
leitura ou escrita é capturada diretamente pelo SO
– Isto pode fazer os programas ficarem ineficientes, a partir de
que cada requisição geralmente representa um acesso a
disco, atividade de rede, ou alguma operação geralmente
custosa.
• Para reduzir este tipo de overhead, a plataforma Java
implementa streams com buffer de I/O
– Streams com buffer de entrada lêem dados de área de
memória conhecida como buffer; a API nativa é chamada
quando o buffer está vazio
– Similarmente, Streams com buffer de saída escrevem dados
para o buffer, e a API nativa é chamada quando o buffer
estiver cheio.
Buffer de I/O
223. www.labes.ufpa.br
223
• Um programa pode converter uma stream
sem buffer em uma stream com buffer
utilizando o “empacotamento”:
– Uma stream sem buffer é passada como
parâmetro no construtor de classe stream com
buffer
• Exemplo
inputStream = new BufferedReader(new
FileReader(”entra.txt"));
outputStream =new BufferedWriter(new
FileWriter(”sai.txt"));
Buffer de I/O
224. www.labes.ufpa.br
224
• Geralmente não faz sentido enviar dados do buffer
em pontos críticos, sem esperar pelo preenchimento
do mesmo. Isto é conhecido como “flush” do buffer.
• Alguns buffers permitem flush automático, que é
especificado por um parâmetro opcional no construtor.
– Quando flush automático está habilitado, certos eventos
chave fazem com o buffer seja descarregado
– Por exemplo, um objeto PrintWriter com flush automático
descarrega os dados em toda invocação de println().
• Para realizar o “flush” de arquivos manualmente, é
necessário invocar o método flush().
Buffer de I/O
225. www.labes.ufpa.br
225
• Em Java existem três tipos de stream padrão:
– Entrada Padrão, acessada por System.in
– Saída Padrão, acessada por System.out
– Erro Padrão, acessada por System.err
• Estes objetos são definidos automaticamente e
não precisam ser instanciados
• System.out e System.err são definidas como
objetos PrintStream (streams de escrita)
Entrada e Saída Padrão
226. www.labes.ufpa.br
CapacitaçãoEletronorte–2007-2008
226
Entrada e Saída Padrão
public class LeituraEntradaPadrao {
public static void main(String[] args) throws IOException {
DataOutputStream output = new DataOutputStream(System.out
DataInputStream in = new DataInputStream(System.in);
int c;
while ((c = in.read()) != -1)
output.write(c);
in.close(); //sempre fechar antes de terminar
output.close();//sempre fechar antes de terminar
}
}
MacLima:bin adailton$ java br.eln.java.io.LeituraEntradaPadrao < ../eln.txt
***************
inicio do arquivo
linha 1
linha 2
linha3
fim do arquivo
**************
MacLima:bin adailton$
227. www.labes.ufpa.br
227
• Geralmente ler o conteúdo de entrada a partir da linha
comando e com sigilo exige a definição de alguma
classe utilitária para tal tarefa.
• O Java SE 6 introduziu a classe Console
especificamente para facilitar esta tarefa.
• Para ler uma senha, utilize o seguinte código:
– Console cons = System.console();
– String username = cons.readLine(“Nome Usuario: ");
– char[] passwd = cons.readPassword(“Senha: ");
Java 6: Classe Console
228. www.labes.ufpa.br
228
– Considere um arquivo de texto com o
conteúdo no seguinte formato:
Exercício
Fulano 89 n
Fulano 23 n
Fulano 45 n
Beltrano 33 n
EOF
Nome Jogador
Minuto do jogo em
que marcou golLinha
229. www.labes.ufpa.br
229
– Codifique um método que receba como
entrada o nome do arquivo, e processa
o texto escrevendo na tela quantos gol
cada jogador fez e o minuto do primeiro
gol
Exercício
232. www.labes.ufpa.br
232
Recentes Evoluções do Java
SplashScreen
SystemTray
JDBC 4.0
Scripting (JavaScript, JavaFX e JRuby)
JAX-WS (Web Services)
Melhorias de I/O (Console, Permissões)
Java 6
233. www.labes.ufpa.br
233
• De maneira geral, a versão 5 do Java incluiu
novas estruturas para a linguagem em si
• A versão 6 adicionou várias melhorias de
performance e funcionalidades relacionadas à
plataforma, como acesso a banco, apoio a
scripts, etc.
• A versão 7 está no forno ainda, mas pretende
adicionar novas estruturas para linguagem, como
por exemplo tipagem dinâmica
Recentes Evoluções do Java
234. www.labes.ufpa.br
234
• Permite que uma classe tenha acesso a membros
estáticos (atributos e métodos) sem necessitar digitar
explicitamente a classe originária, como em:
double r = Math.cos(Math.PI * valor);
• O import estático permite acesso a membros
estáticos sem necessariamente utilizar herança.
Assim, o programa importa somente os membros
individualmente:
import static java.lang.Math.PI;
• ou
import static java.lang.Math.*;
Import Estático
235. www.labes.ufpa.br
235
• Uma vez importados, os membros estáticos podem ser
utilizados diretamente:
double r = cos(PI * theta);
• A declaração de import estático é análogo ao import
normal, pois permite acesso sem necessitar explicitar o
path completo
Import Estático
import static java.lang.Math.PI;
import static java.lang.Math.round;
public class ImportMathEstatico {
public static void main(String args[]){
System.out.println(" Valor de PI = "+PI);
System.out.println(" Valor de -5 arredondado =
"+round(-5));
}
}
236. www.labes.ufpa.br
236
• Utilize quando precisar ter acesso freqüente a
membros estáticos de uma ou duas classes.
• Se utilizar mal a funcionalidade de import estático,
pode fazer o programa perder legibilidade e
manutenibilidade, poluindo o código com todos os
membros estáticos importados.
• Se utilizado apropriadamente, o import estático
pode fazer o programa mais legível (pois remove
toda a repetição de nomes de classes)
Import Estático
237. www.labes.ufpa.br
237
• Esse processo de empacotamento entre primitivos e
objetos é algo intediante.
• A partir do Java 5, o recurso de autoboxing faz esse
empacotamento sozinho:
• No Java 1.4 o código acima é inválido. No Java 5 ele
compila perfeitamente.
Autoboxing
Integer inteiro1= new Integer(1);
int valInteiro1 = inteiro1.intValue();
Integer inteiro2= 1;
int valInteiro2 = inteiro1;
238. www.labes.ufpa.br
238
• Este caso se aplica a todos os tipos primitivos e seus
correspondentes wrappers (float e Float, double e
Double, etc.)
• Isso não quer dizer que tipos primitivos e referências
agora são a mesma coisa, isso é simplesmente um
“adocicamento sintático” para facilitar a codificação.
• Pode-se fazer o autoboxing diretamente para Object
também, possibilitando passar um tipo primitivo para
um método que recebe Object como argumento:
Autoboxing
Object val1 = 5;
Object val2 = 5.0F;
Internamente val1 e val2 são empacotados no mesmo tipo de objeto?
239. www.labes.ufpa.br
239
Como são utilizadas?
• Annotations, ou simplesmente ”anotações”, são
utilizadas para afetar o modo como os programas
são tratados por ferramentas e bibliotecas
• Annotations são utilizados por ferramentas para
produzir arquivos derivados
– Ferramentas: Compilador, IDE
– Arquivos derivados: Novo código Java, descritor
de implantação, arquivos .class
Annotations
240. www.labes.ufpa.br
240
Porquê Annotations?
• Habilitam o estilo de “programação declarativa”
– Menor codificação, já que uma ferramenta pode
gerar arquivos derivados automaticamente
– Fácil modificar configurações
• Elimina a necessidade de manter “arquivos
dependentes” que precisam ser alterados sempre para
estar sincronizado com o código fonte
– Informação é mantida no arquivo fonte
Annotations
241. www.labes.ufpa.br
241
• A definição do tipo Annotation é similar ao modo
de definir Interfaces Java
– Um “arroba” (@) precede a palavra reservada interface
– Cada,método define um elemento da Annotation
– Declaração de métodos não pode ter parâmetros e nem
lançar exceções
– Tipos de retorno são restritos a primitivos, String, Class,
enums, annotations, e arrays dos tipos anteriores
– Métodos podem ter valores default
Annotations
Definindo uma Annotation
242. www.labes.ufpa.br
242
public @interface RequerMelhoria {
int id();
String resumo();
String analista() default "[naoDefinid
String data() default "[naoImplementad
}
Definindo uma Annotation
Annotations
Item definido como método
Define valor default
243. www.labes.ufpa.br
243
• Depois de definida, é possível utilizar uma Annotation
na declaração de:
– classes, métodos, atributos
• Uma é um tipo especial de modificador, e pode ser
utilizado em qualquer lugar que outros modificadores
(como public, static, ou final) podem ser utilizados
– Por convenção, Annotations precedem outros
modificadores
– Annotations consistem em um arroba (@) seguido
de parêntesis com os elementos listados
Annotations
Como utilizar uma Annotation
244. www.labes.ufpa.br
244
public interface InterfaceTeste {
@RequerMelhoria(
id = 123,
resumo = "Permitir Jogo Adiado",
analista = "Fulano de Tal",
data = "4/1/2010"
)
public void definirDataJogo(Date data);
}
Como utilizar uma Annotation
Annotations
245. www.labes.ufpa.br
245
Restrições de Escopo em Annotations
• De maneira geral as anotações podem ser
restringidas de duas maneiras:
– Escopo de uso: restringem a qual contexto a
Annotation estará disponível para ser acessada
por ferramentas (código fonte, código .class, JRE,
etc.)
– Escopo de definição: restringem a quais
elementos Java a Annotation pode ser aplicada
(classe, atributo, método, etc.)
Annotations
246. www.labes.ufpa.br
246
• Utiliza-se a meta-annotation @Retention, que possui 3
níveis:
– SOURCE: indica que a informação da Annotation será
colocada apenas no código fonte, mas não estará
disponível no arquivo .class
– CLASS (Default): indica que a informação da
Annotation será colocada no arquivo .class, mas não
estará disponível em tempo de execução (não será
carregado pela JRE)
– RUNTIME – indica que a informação será armazenada
no arquivo .class e carregada pela JRE
Annotations
Escopo de Uso
248. www.labes.ufpa.br
248
• Definição similar ao escopo de uso
• Utiliza-se a meta-annotation @Target, que possui vários
níveis, tais como:
• TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,
LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE
Annotations
Escopo de Definição
@Target(ElementType.FIELD)
public @interface RequerMelhoria {
int id();
String resumo();
String analista() default "[naoDefinido]";
String data() default "[naoImplementado]";
}
249. www.labes.ufpa.br
249
@Target(ElementType.FIELD)
public @interface RequerMelhoria {
int id();
String resumo();
String analista() default "[naoDefinido]";
String data() default "[naoImplementado]";
}
public interface InterfaceTeste {
@RequerMelhoria(
id = 123,
resumo = "Permitir Jogo Adiado",
analista = "Fulano de Tal",
data = "4/1/2010"
)
public void definirDataJogo(Date data);
}
§ The annotation @RequerMelhoria is disallowed for this location
Annotations
250. www.labes.ufpa.br
250
• Provêem abstração aos tipos
– Classes, Interfaces e Métodos podem ser parametrizados por
tipos ( este recurso é conhecido por programadores C++)
• Generics permite código seguro para uso de tipos
– Se o código compila sem erros ou advertências, não irá
acontecer nenhuma ClassCastException inesperado em
tempo de execução
Generics
…
Collection<String> nomes = new
ArrayList<String>();
nomes.add("a");
for (String umNome: nomes)
System.out.println(umNome.charAt(0));
Esta definição já apresentada é
permitida pelo uso de Generics
§ Não precisa fazer
Casting para String
251. www.labes.ufpa.br
251
Definição de uma classe genérica:
• Definição: LinkedList<E> tem um parâmetro tipo E que
representa o tipo do elemento armazenado no interior
da lista
Generics
public interface LinkedList<E> extends
AbstractSequentialList<E>
implements List<E>,Queue<E>, Clonable,
java.io.Serializable {
…
…
}
§ O uso de “E” como parâmetro é
apenas uma convenção
§ Este parâmetro segue a mesma
r e g r a p a r a d e f i n i ç ã o d e
identificadores para a linguagem
J a v a ( p . e x : T, T I P O , t i P o ,
TIPO1,etc...)
252. www.labes.ufpa.br
252
• Substituir o parâmetro tipo <E> pelo tipo concreto no
argumento, como <Integer> ou <String> ou <MeuTipo>
– LinkedList<Integer> pode armazenar somente
Integer ou sub tipos deste
Generics
Uso de uma classe genérica:
…
LinkedList<Integer> valores = new LinkedList<Integer>();
valores.add(new Integer(1));
valores.add(23);
valores.add(“142”);
String valor = valores.get(1);
…
Não é permitido adicionar um valor String
Permitido pelo
Autoboxing
Acesso a valor é verificado
253. www.labes.ufpa.br
253
• Problema: Tipos de elementos em Collection
– Compilador não consegue verificar tipos de elementos (pois tudo é
Object)
– Atribuição com casting de tipos
– Podem ocorrer ClassCastException em tempo de execução do
programa
• Solução: Generics
– Diz ao compilador o tipo da coleção
– Deixa o compilador fazer o casting
– Permite a detecção em tempo de compilação
Generics
Porquê usar Generics?
254. www.labes.ufpa.br
254
• Você pode codificar isto:
– Object o = new Integer(5);
• Você pode codificar também:
– Object[] or = new Integer[5];
• Então é esperado que permitido o seguinte código: (Que na
verdade NÃO pode!)
– ArrayList<Object> ao = new ArrayList<Integer>();
• Isto poderia causar ClassCastException em tempo de
execução
Generics
Generics e Sub Tipos
255. www.labes.ufpa.br
255
Generics
Generics e Sub Tipos
ArrayList<Integer> ai = new ArrayList<Integer>();
ArrayList<Object> ao = ai; // permitido em compilação
ao.add(new Object());
Integer i = ai.get(0);
ArrayList<Number> an = new ArrayList<Number>();
an.add(new Integer(5));
an.add(new Long(1000L));
No seguinte caso, Long e Integer são subclasses de Number: