Você está na página 1de 288

Desenvolvimento

Orientado a Objetos
em Java

Fev/2010

Prof. Rômulo Silva


Objetivos
 Apresentar as estruturas sintáticas da
linguagem Java e respectiva semântica
 Conhecer as principais bibliotecas e APIs
que Java oferece
 Entender os conceitos e terminologia de
orientação a objetos e sua aplicabilidade
em Java
 Conhecer uma ferramenta de
desenvolvimento (IDE) utilizada no
mercado

Prof. Rômulo Silva


Ementa do Curso
 Orientação a Objetos:
 Classes e Objetos
 Herança
 Polimorfismo
 Interfaces de objetos
 Classes Abstratas
 Agregação e Composição
 Linguagem Java:
 Tipos Primitivos
 Controle de fluxo em programas
 Arrays
 Escopo e Modularização
 Tratamento de exceções
 Coleções
 Interface gráfica básica

Prof. Rômulo Silva


Capítulo 1 - Introdução

Prof. Rômulo Silva


Linguagem Java
 Criada pela Sun Microsystems em 1995
 Independente de sistema operacional e
plataformas
 Orientada a objetos
 Construções sintáticas semelhantes a C++
 Portabilidade:
 write once, run anywhere

 Utiliza Máquina Virtual

Prof. Rômulo Silva


Máquina Virtual
 Especificação de uma máquina abstrata
implementada em software

 Traduz o código compilado para a


plataforma específica

Prof. Rômulo Silva


Máquina Virtual
The image cannot be display ed. Your computer may not hav e enough memory to open the image, or the image may hav e been corrupted. Restart y our computer, and then open the file again. If the red x still appears, y ou may hav e to delete the image and then insert it again.

p ro g ra m a f o n t e (. ja v a )
_ __ ___ ______ ___ __
_ __ ___ ______ ___ __
_ __ ___ ______ ___ __
_ __ ___ ______ ___ __
_ __ ___ ______ ___ __
_ __ ___ ______ ___ __
_ __ ___ ______ ___ __
_ __ ___ ______ ___ __
__

compilador
b y te c o d e ( .c l a s s )
100 10 000 111 000
101 01 011 101 011
100 00 111 100 010
101 01 010 101 010
101 01 011 110 100
110 00 101 110 101
010 10 101 010 101

M á q u in a V i r t u a l p / M á q u i n a V i r tu a l p / M á q u i n a V i r tu a l p /
S o l a r is W in d o w s X P L in u x

S o la r is W in d o w s X P L in u x

Prof. Rômulo Silva


Linguagem Java
 Versão atual: 6.0 (ano base: 2008)
 Não permite aritmética de ponteiros
 Possui Garbage Collection (Coleta de lixo)
 Suporte nativo para criação de programas
concorrentes/paralelos (threads)
 Programação de sistemas distribuídos é
relativamente simples

Prof. Rômulo Silva


Tecnologia Java
 Atualmente (ano base: 2008) existe uma
série de produtos/ferramentas para o
desenvolvimento de aplicações.
 Exs.:
 JSP (Java Server Pages)
 EJB (Enterprise Java Beans)
 JDBC (Java Database Conectivity)
 JNDI (Java Naming and Directory Interface)

Prof. Rômulo Silva


Plataforma Java
 JSE (Java Standard Edition): ferramentas e
APIs essenciais à maioria das aplicações

 JEE (Java Enterprise Editon): ferramentas


e APIs para desenvolvimento de aplicações
distribuídas

 JME (Java Micro Edition): ferramentas e


APIs para desenvolvimento de aplicações
para aparelhos portáteis.

Prof. Rômulo Silva


Plataforma Java

Prof. Rômulo Silva


JDK
 Java Development Kit:
 Ferramentas de linha de comando para
compilar, depurar e executar programas
• compilador (comando javac)
• depurador (comando jdb)

 JRE (Java Runtime Enviroment):


 Ambiente que executa os programas

Prof. Rômulo Silva


Pós-instalação
 Para execução das ferramentas via linha de
comando, após a instalação:
 criar variável de ambiente $JAVA_HOME para
conter o diretório de instalação
 Incluir $JAVA_HOME/bin no PATH do sistema

Prof. Rômulo Silva


Compilação e Execução
 via linha de comando:
 Localização: $JAVA_HOME/bin/
 Compilação:
• Comando javac
 Execução:
• Comando java

 usando IDE Eclipse:


 Opções de compilação são configuradas dentro
da própria IDE

Prof. Rômulo Silva


Processo de compilação
 Arquivos fontes:
 extensão .java
 Bytecodes: resultado do processo de
compilação dos arquivos fontes
 Código interpretado pela JVM (Java Virtual
Machine)
 Arquivos de bytecodes:
 extensão .class

Prof. Rômulo Silva


Execução de Aplicações
 Variável de ambiente CLASSPATH:
 Armazena caminhos dos arquivos de bytecodes
(.class)
 Pode ser sobreposta durante a execução:
• java –cp c:\dir1;c:\dir2 MinhaAplicacao

Prof. Rômulo Silva


Documentação da API
 Distribuída separada do JDK, disponível em
formato HTML em http://java.sun.com

 Exibe a especificação de todas as classes


das bibliotecas oferecidas pela linguagem.

 Sugestão: baixe a documentação na sua


máquina e consulte-a o tempo todo!!

Prof. Rômulo Silva


IDEs
 Eclipse:
 http://www.eclipse.org
 Netbeans:
 http://www.netbeans.org
 JDeveloper
 http://www.oracle.com
 JBuilder
 http://www.borland.com

Prof. Rômulo Silva


Capítulo 3 – Criando a
Primeira Aplicação Java

Prof. Rômulo Silva


Primeira Aplicação
 Arquivo fonte: PrimeiraAplicacao.java

public class PrimeiraAplicacao {


// este metodo eh o ponto de entrada do programa
public static void main(String args[]){
System.out.println("Minha primeira aplicação em
Java");
}
}

Prof. Rômulo Silva


Elementos do programa
Nome da classe
Comentário de linha

public class PrimeiraAplicacao {


// este metodo eh o ponto de entrada do programa
public static void main(String args[]){
System.out.println("Minha primeira aplicação em Java");
}
}

Chamada do método println


Nome do método
do objeto out da classe System

Prof. Rômulo Silva


O método main
 Define o ponto de início de execução da
aplicação (programa principal)
 Deve ter sempre a assinatura:
 public static void main(String args[])

 O parâmetro args serve para passar


argumentos via linha comando, capturados
como strings.
 Ex.:
• java MinhaAplicacao arg1 arg2

 void indica que é um método sem retorno


Prof. Rômulo Silva
Padrões de Codificação
 Importante: Java é case sensitive

 Padrões para nomeação de classes,


variáveis e métodos
 Facilitam a legibilidade do código
 Melhoram a manutenibilidade
 Idéia básica: a forma de escrever o nome
identifica a sua categoria (classe, método,
variável, constante, ...)

Prof. Rômulo Silva


Padrões de Codificação
 Nome de classe: apenas a letra inicial
maiúscula de cada palavra
 Ex:.
• PrimeiraAplicacao
• System
 Nome de método: letras minúsculas e
inicial maiúscula a partir da segunda
palavra:
 println
 main
 getValor

Prof. Rômulo Silva


Padrões de codificação
 Arquivos fontes:
 Um arquivo fonte contém a definição de uma
única classe
 Nome do arquivo é igual o nome da classe
 Extensão .java

 Após a compilação:
 É gerado um arquivo .class para cada .java
correspondente.

Prof. Rômulo Silva


Exercício

 1- Faça um outro programa, criando uma classe


chamada SegundaAplicacao, que imprima as
seguintes mensagens na tela: “Segunda
Aplicação em Java”, “Imprimindo 3
mensagens” e “Fim do Programa”.

Prof. Rômulo Silva


Capítulo 4 – Tipos
Primitivos

Prof. Rômulo Silva


Declaração de variáveis
 Sintaxe: tipo da variável seguido pelo nome
da variável.
 int quantidade;

Tipo da variável Nome da variável

 String nome;

Prof. Rômulo Silva


Hibridismo
 Java é uma linguagem híbrida:
 Nem tudo é objeto

 Classificações dos tipos:


 Primitivos ou básicos: têm tamanho fixo e NÃO
são objetos
• Ex.: valores numéricos, caracteres, booleanos
 Complexos (ou objetos): criados a partir da
definição de uma classe

Prof. Rômulo Silva


Tipos Primitivos

Tipo Tamanho Valor Mínimo Valor Máximo


boolean ------- ------- ------

char 16 bits Unicode 0 Unicode 216 - 1

byte 8 bits -128 +127

short 16 bits -215 +215 –1

int 32 bits -231 +231 –1

long 64 bits -263 +263 -1

float 32 bits IEEE 754 IEEE 754

double 64 bits IEEE 754 IEEE 754

Prof. Rômulo Silva


Tipos Primitivos
 Exemplos:
 int i = 10;
 boolean cancelado = false;
 char ch1 = 'a';
 char ch2 = '\u0041'; // caracter a em
Unicode
 float f = 5.7F;

Prof. Rômulo Silva


Variáveis Numéricas
 Operadores de
 Incremento: ++ e +=
 Decremento: -- e -=
 Exs.:
int i = 5;
i++; // incrementa i de 1, equivale a i = i + 1
System.out.println(i); // ira imprimir o valor 6
int j = 5;
j--; // decrementa i de 1, equivale a j = j - 1
System.out.println(j); // ira imprimir o valor 4
int k = 5;
k+=3; // incrementa i de 3, equivale a k = k + 3
System.out.println(k); // ira imprimir o valor 8
Prof. Rômulo Silva
Pré-incremento e Pós-
Decremento

int i = 5;
int j = i++;
System.out.println(i); // ira imprimir o valor 6
System.out.println(j); // ira imprimir o valor 5
int k = ++i;
System.out.println(i); // ira imprimir o valor 7
System.out.println(k); // ira imprimir o valor 7

Prof. Rômulo Silva


Expressões Numéricas
 O resultado de expressões numéricas é
automaticamente convertido para o tipo
com a maior quantidade de bits.
 Ex.:
 A soma de um inteiro e um ponto flutuante é
convertida para ponto flutuante
int i = 5;
float x = 3;
float y; x + i é convertido

y = x + i; para float antes da


atribuição a y

Prof. Rômulo Silva


Casting
 Conversão explícita de um tipo para outro
 Tipos primitivos
 Utilizado quando se quer converter para um tipo
que usa um número menor de bits para
representar o número
 Ex.:
double e = 2.718;
int y = (int) e; // irá truncar (y = 2)

Prof. Rômulo Silva


Ponto Flutuante
 Literais de ponto flutuante são default
considerados do tipo double.
 Colocar F no fim do número quando desejar que
sejam considerados do tipo float
 Ex.:
float numeroPI = 3.14F;

Literal interpretado
como do tipo float

Prof. Rômulo Silva


Importante

 Strings em Java são objetos e não tipos


primitivos !!!

Prof. Rômulo Silva


Exercícios
 1- Faça um programa para calcular a o perímetro
e a área de círculo de raio de 3 cm. (dados :
Perímetro = 2πR e Área = πR2).

Prof. Rômulo Silva


Exercícios
 2- Quais os valores de i, k e z em cada uma das
mensagens de impressão e porque?

Prof. Rômulo Silva


Exercícios
 3- Altere o programa do exercício 1 para imprimir
o valor inteiro do perímetro e da área do círculo,
além do resultado em ponto flutuante

Prof. Rômulo Silva


Capítulo 5 –Controle de
Fluxo

Prof. Rômulo Silva


Comando if
 Sintaxe:
 if(expressão-booleana)
bloco1
else
bloco2

 O bloco else é opcional

Prof. Rômulo Silva


Comando if
int x = 2;
expressão booleana
int y = 5;
int z; bloco de comandos
if(x < y)
{
System.out.println("x é menor que y");
z = x;
}

else {
System.out.println("x é maior que y ");
z = y;
}

Prof. Rômulo Silva


Expressão booleana
 Operadores de comparação:
 ==, !=, >, >=, <, <=

 Conectores lógicos:
 && (AND)
 || (OR)
 ! (NOT)

Prof. Rômulo Silva


Expressão booleana
 Observação:
 Não confundir o operador de atribuição (=) com
o operador de comparação de igualdade (==)

Prof. Rômulo Silva


Comando for

 Sintaxe:
 for(inicialização;expressão-
booleana;incremento)
bloco-de-comandos
inicialização incremento

 Ex.:

for(int i = 0; i < 10; i++) {


System.out.println("O valor de i:
" + i);
}
Prof. Rômulo Silva
Comando while
 Sintaxe:
 while(expressão-booleana)
Bloco-de-comandos

 Ex.:

int i = 0;
while(i < 10) {
System.out.println("O valor de i: " + i);
}

Prof. Rômulo Silva


Comando do-while
 Sintaxe:
 do
bloco-de-comandos
while(expressão booleana)

Ex.:

int i = 0;
do {
System.out.println("O valor de i: " + i);
}
while(i < 10)

Prof. Rômulo Silva


Comando switch
 Sintaxe:
switch(expressão-inteira) {
case VALOR1:
bloco-de-comandos1
break;
case VALOR2:
bloco-de-comandos2
break;
...
case VALOR-N:
bloco-de-comandosN
break;
default:
bloco-de-comandos-default
}

Prof. Rômulo Silva


Comando switch
 Ex.:
int opcaoMenu;
...
switch(opcaoMenu) {
case 1: System.out.println("escolheu a opcao
1");
break;
case 2: System.out.println("escolheu a opcao
2");
break;
case 3: System.out.println("escolheu a opcao
3");
break;
default: System.out.println("escolheu outra
opcao "); Prof. Rômulo Silva
}
Comando switch
 É possível ter um único bloco de comandos para
vários cases.
 Ex.:
int opcaoMenu;
...
switch(opcaoMenu) {
case 1: System.out.println("escolheu a opcao 1");
break;
case 2:
case 3:
System.out.println("opcões 2 e 3 retiradas");
break;
default: System.out.println("escolheu outra opcao");
}

Prof. Rômulo Silva


Comando break
 Também pode ser usado para forçar a saída
de loops
 Ex.:

int x = 0;
for(int i = 0; i < 10; i++) {
x = x + i;
if(x > 15)
break;
}

Prof. Rômulo Silva


Comando continue
 Salta para o fim do bloco do loop e força o
teste novamente.
 Ex.:
int i = 0;
while(i < 10) {
if(i == 5) {
Salta os comandos abaixo
i++;
continue;
}
System.out.println(i);
i++;
}

Prof. Rômulo Silva


Observações
 Evite usar break e continue dentro de
loops
 Comprometem a legibilidade do código

 Para criar um loop for infinito é


semelhante a C:

for(;;){
System.out.println("Está em loop infinito");
}

Prof. Rômulo Silva


Exercícios
 1 - Faça um programa que imprima os números de 1 a
100 inclusive.

 2 - Faça um programa que imprima o fatorial de 1 a 10


inclusive.

 3 - Altere o programa do exercício 1 para imprimir uma


mensagem na tela quando o número for múltiplo de 3 ou
múltiplo de 5.

 4 - Faça um programa que calcule o resto da divisão por 9


dos números de 1 a 100, e imprima o próprio resto da
divisão quando ele for igual a 2, 3, 5 ou 7. Para os outros
valores imprima o dobro do resto
Prof. Rômulo Silva
Capítulo 6 –Classes e
Objetos

Prof. Rômulo Silva


Paradigma
 Um paradigma de programação é um
modelo de construção de programas
 Forma de abstração

 Orientação a objetos:
 É um paradigma de programação
 A solução do problema corresponde a interações
de objetos criados em tempo de execução

Prof. Rômulo Silva


OO e Java
 Compreender as estruturas sintáticas é
parte fundamental para construção de
sistemas OO, porém não suficiente

 O entendimento dos conceitos de OO é que


permitem construir bons sistemas:
 Manutenibilidade
 Reusabilidade
 Flexibilidade

Prof. Rômulo Silva


Objetos
 Conceitos que possuem:
 Identidade
 Estado
 Comportamento

 Em Java:
 Identidade: endereço do objeto na memória
 Estado: valores armazenados no objeto
 Comportamento: operações aplicáveis sobre o
objeto

Prof. Rômulo Silva


Classes
 A classe é uma especificação das
características de objetos:
 Definição das variáveis dos objetos e das
operações que as manipulam

 Classes não existem em tempo de execução


no contexto do programa, apenas seus
objetos.

 Analogia:
 Planta de um edifício (especificação da classe)
 O edifício construído (objeto)

Prof. Rômulo Silva


Terminologia OO
 Dados dos objetos:
 Variáveis de instância ou atributos

 Operações:
 Métodos ou mensagens

 Membros:
 Usado indistintamente para atributos e métodos

Prof. Rômulo Silva


Estrutura de uma classe
class NomeClasse {
atributos

construtores

metodos
}

 Os membros de uma classe podem vir em


qualquer ordem
 Seguir uma ordem facilita a legibilidade do
código

Prof. Rômulo Silva


Ex. de classe
class MensagemTela {
variável de instância (atributo)
String mensagem;

public MensagemTela(String msg) {


mensagem = msg;
} construtor

public void imprime() {


System.out.println(mensagem); método
}
public static void main(String args[]) {
MensagemTela msg = new MensagemTela(“Hello
World");
msg.imprime(); criação de objeto
} chamada de método
}
Prof. Rômulo Silva
Construtores
 Definem como construir um objeto da
classe

 Devem ter o mesmo nome da classe

 Não devem indicar retorno, pois retornam


implicitamente um objeto da própria classe

 Criação de objeto (instanciação)


 Invocação do construtor usando o operador new

Prof. Rômulo Silva


Métodos
 Definem as operações válidas para o objeto
(comportamento)
 Sintaxe:
visibilidade tipo-retorno nome-método(lista-parâmetros) {
corpo-do-método
}

 Sintaxe da chamada (invocação):


 objeto.nome-método(lista-parâmetros); p/ métodos void
 XXX x = objeto.nome-método(lista-parâmetros); p/
métodos com retorno

Prof. Rômulo Silva


Classes Pré-definidas
 Em Java existem várias classes pré-
definidas que compõem a API da
linguagem.

 Exs.:
 System
 Object
 String

Prof. Rômulo Silva


Classes x Tipo Primitivo
 Em uma linguagem OO pura (ex.:
Smalltalk), tudo é objeto.
 Java é linguagem híbrida:
 Valores de tipos primitivos (valores numéricos,
booleanos, bytes) não são objetos
 Na prática:
 A alocação de memória para objetos/tipos
privimitos é diferente
 Tipo primitivo: variáveis armazenam o próprio
valor
 Tipo objeto: variáveis armazenam o endereço
do objeto na memória (referência)
Prof. Rômulo Silva
Memória – Tipo Primitivo

M e m ó r ia

x y
int x = 2;
int y = x; 2 2

Prof. Rômulo Silva


Memória – Tipo Objeto

MensagemTela msg1 = new MensagemTela("AAA");


MensagemTela msg2 = new MensagemTela("BBB");
The image cannot be display ed. Your computer may not hav e enough memory to open the image, or the image may hav e been corrupted. Restart y our computer, and then open the file again. If the red x still appears, y ou may hav e to delete the image and then insert it again.

Memória

“AAA”
msg1

msg2
“BBB”

Prof. Rômulo Silva


Memória – Tipo Objeto
MensagemTela msg1 = new MensagemTela("AAA");
MensagemTela msg2 = new MensagemTela("BBB");

msg1 = msg2; The image cannot be display ed. Your computer may not hav e enough memory to open the image, or the image may hav e been corrupted. Restart y our computer, and then open the file again. If the red x still appears, y ou may hav e to delete the image and then insert it again.

M e m ó ria

“A A A ”
m sg1

m sg2 “B B B ”

Prof. Rômulo Silva


Comparação de objetos
 O operador == compara valores de
referências e não valores armazenados nos
objetos
MensagemTela msg1 = new MensagemTela("AAA");
MensagemTela msg2 = new MensagemTela("AAA");
M e m ó ria

objetos diferentes
“A A A ”
m sg1

m sg2 “A A A "

Prof. Rômulo Silva


null
 Variáveis de tipo objeto não inicializadas
tem valor null
 A chamada de um método sobre uma
variável que tem valor null ocasiona o
lançamento da exceção
NullPointerException
 Ex.:
variável com valor null
MensagemTela msg1;
msg1.imprime();

Prof. Rômulo Silva


Exercícios
 1 - Implementar a classe Pessoa com os seguintes
atributos: nome, idade e endereço. Crie um método
chamado imprime que imprima os dados da pessoa.

 2 - Implemente uma classe Livro com os seguintes


atributos: titulo e autor. Crie um método que imprima os
dados do livro.

 3 - Altere a classe definida no exercício para incluir o


atributo editora e um método que permita alterar a editora
de um livro

Prof. Rômulo Silva


Capítulo 7 – Arrays

Prof. Rômulo Silva


Arrays
 Estrutura semelhante a vetores e matrizes
em Matemática
 Ex.:
tipo dos elementos

int[] x = new int[5];


x[0] = 20;
número de elementos
x[1] = 30;
x[2] = 40;
x[3] = 50;
x[4] = 60;

Prof. Rômulo Silva


Arrays
 Sempre começam do índice 0

 É uma referência para elementos (tipos


primitivos ou objetos)
 Alocação da quantidade de elementos: operador
new

 A tentativa de acessar um índice inválido


ocasiona o lançamento da exceção
ArrayIndexOutOfBoundsException

Prof. Rômulo Silva


Arrays
 Podem ser inicializados com literais
diretamente:
int[] meuArray = { 10, 20, 30 };

 Não é possível alterar a quantidade de


elementos após a inicialização

Prof. Rômulo Silva


Arrays
 Arrays sem inicialização dos elementos:
 Tipos numéricos: elementos têm valor 0 (zero)

 Tipo booleano: elementos têm valor false

 Tipos objetos: elementos têm valor null

Prof. Rômulo Silva


Arrays de objetos

tipo dos elementos alocação do número de elementos

MensagemTela[] meuArray = new MensagemTela[3];


meuArray[0] = new MensagemTela("AAA");
meuArray[1] = new MensagemTela("BBB");
meuArray[2] = new MensagemTela("CCC");

inicialização do elemento da posição 2

Prof. Rômulo Silva


Número de elementos
 O número de elementos pode ser obtido
acessando-se a propriedade length
int[] meuArrayInt = new int[7];
número de elementos
...
for(int i = 0; i < meuArrayInt.length; i++){
System.out.println(meuArrayInt[i]);
}

Prof. Rômulo Silva


Arrays Multidimensionais

linhas

int[][] mat = new int[2][2];


mat[0][0] = 50;
mat[0][1] = 60; colunas
mat[1][0] = 70;
mat[1][1] = 80;

Prof. Rômulo Silva


Arrays Multidimensionais
 Em Java, matrizes são na verdade arrays
de arrays.

dimensão não inicializada

int[][] mat = new int[2][];


mat[0] = new int[3]; 3 elementos na linha 0
mat[1] = new int[4]; 4 elementos na linha 1
System.out.println(mat[1].length);

Prof. Rômulo Silva


Arrays Multimensionais
 Inicialização usando literais:

int[][] mat = { {10,20}, {30,40,50}, {60,70} };

 A classe System possui o método


arrayCopy para copiar elementos de um
array para outro. quantidade de elementos
a serem copiados
int[] origem = {20,30,40};
int[] destino = new int[10];
System.arraycopy(origem,0,destino,3,2);

posição de início
da cópia
Prof. Rômulo Silva
Arrays - varredura
 Utilizando a propriedade length:
int[] meuArray = {10,20,30};
for(int i = 0; i < meuArray.length; i++){
System.out.println(meuArray[i]);
}

Prof. Rômulo Silva


Arrays - varredura
 Utilizando enhanced-for (válido a partir da
versão 5.0):
 Não precisa testar a propriedade length

int[] meuArray = {10,20,30};


for(int x: meuArray) {
System.out.println(x);
}

Prof. Rômulo Silva


Exercícios
 1- Crie uma classe Matriz de inteiros, cujo construtor
recebe como parâmetro o número de linhas e colunas, e
inicializa um array bidimensional com as dimensões
correspondentes aos parâmetros passados. Crie métodos
para atribuir e retornar valor de um elemento e outro para
imprimir todos os elementos da matriz. Defina o método
main para testar a classe construída.

 2 - Crie um array de 5 elementos da classe Pessoa,


incialize-os e use um enhanced-for para varrer e imprimir
os elementos.

Prof. Rômulo Silva


Exercícios
 3 - Crie um classe chamada TrianguloPascal cujo
construtor receba como parâmetro o número linhas e crie
um array bidimensional que os números do Triângulo de
Pascal até atingir o número de linhas informado. Abaixo é
mostrado o Triângulo de Pascal para 5 linhas.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

Prof. Rômulo Silva


Capítulo 8 – Orientação a
Objetos

Prof. Rômulo Silva


Orientação a Objetos
 É possível escrever programas em Java
sem utilizar os recursos OO, porém são:
 difíceis de dar manutenção
 difíceis de reutilizar
• Perdem os benefícios de OO

Prof. Rômulo Silva


Tipo Abstrato de Dados
 Um tipo é caracterizado pelas operações
que você pode aplicar sobre ele:
 Ex.:
• Operações aritméticas (+,-,*,/) sobre tipos numéricos
• Operação de concatenação (+) sobre strings

 As linguagens de programação fornecem ao


programador meios de definir novos tipos a
partir dos existentes

Prof. Rômulo Silva


Linguagens OO
 Os principais mecanismos (técnicas) para
definição de novos tipos das linguagens OO,
incluindo Java, são:
 Herança
 Sobreposição (overrinding)
 Sobrecarga (overloading)
 Polimorfismo

Prof. Rômulo Silva


Herança
 Chamada de generalização/especialização

 Define uma classe como uma extensão


(especialização) de outra definida
previamente

 Efeito:
 A classe derivada (especializada) herda todos os
atributos e métodos definidos na classe genérica

Prof. Rômulo Silva


Herança - exemplo
atributos
class Pessoa {
String nome;
parâmetros
int idade;
construtor
public Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}

public void incrementaIdade() {


idade++;
}
}

referência para o objeto método


sendo criado

Prof. Rômulo Silva


Herança - exemplo

classe derivada (subclasse) classe base (superclasse)

class Aluno extends Pessoa {


construtor
String matricula;

public Aluno(String nome, int idade, String matricula){


super(nome,idade);
this.matricula = matricula;
}

public String getMatricula() {


return matricula; chamada para o
} construtor da superclasse
}

Prof. Rômulo Silva


Herança – notação UML
 Aluno é uma especialização de Pessoa
 Pessoa é uma generalização para Aluno
 Todo Aluno é uma Pessoa
Pessoa superclasse
nome
idade

incrementaIdade(): void

Aluno
matricula

getMatricula(): int subclasse

Prof. Rômulo Silva


Herança – notação UML

Pessoa
nome
idade
atributos e método
incrementaIdade(): void herdados pela classe Aluno

atributo exclusivo da classe Aluno

Aluno
matricula

getMatricula(): int método válido somente


para Aluno

Prof. Rômulo Silva


Herança - exemplo
 O método incrementaIdade() é válido
para objetos do tipo Aluno:

Aluno meuAluno = new Aluno("Joao", 20, "12345-X");


meuAluno.incrementaIdade();

método herdado da classe Pessoa

 Variáveis do tipo Pessoa podem armazenar


referências para objetos do tipo Aluno
Pessoa p = new Aluno("Joao", 20, "12345-X");
p.incrementaIdade();

Prof. Rômulo Silva


Herança – outro exemplo
 Veiculo é superclasse
de Automovel e
Veiculo
Motocicleta
 Todo Automovel é um
Veiculo
Automovel Motocicleta
 Toda Motocicleta é
um Veiculo
Palio Corsa  Todo Palio é um
Automovel
 Todo Corsa é um
Automovel

Prof. Rômulo Silva


Herança
 As classes derivadas são um subtipo da
classe base:
 Relação ”é um”

 Aplicação da herança:
 Reuso de código (implementação)

 Deve ser empregada com critério, pois é


um relacionamento estático entre classes
 Todos os objetos são afetados

Prof. Rômulo Silva


Herança - Object
 Todas as classes que não especificam uma
superclasse são derivadas da classe pré-
definida Object

 Object é a raiz da hierarquia de herança


 superclasse de todas as classes no sistema

Prof. Rômulo Silva


Herança Múltipla
 Herança múltipla:
 Capacidade de uma classe ter mais de uma
classe base

A B

C é derivada das classes A e B

Prof. Rômulo Silva


Herança - observações
 Java NÃO permite herança múltipla de
classes, como ocorrem em outras
linguagens, como em C++.
 Evitar ambigüidade

A B C objC = new C();


m (): v o id m (): v o id
objC.m();

C chamada ambígua

Prof. Rômulo Silva


Referências
 Chamada de métodos da subclasse usando
variáveis do tipo da superclasse são
inválidos, mesmo que armazenam
referência para objeto da subclasse.
 Ex.:
Pessoa p = new Aluno("Joao", 20, "12345-X");
String matricula = p.getMatricula();

chamada inválida
(erro de compilação)

Prof. Rômulo Silva


Casting
 A chamada de um método da subclasse
usando uma referência de objeto da
superclasse é possível usando casting

 Ex.:

Pessoa p = new Aluno("Joao", 20, "12345-X");


String matricula = ((Aluno)p).getMatricula();

casting

Prof. Rômulo Silva


ClassCastException
 Um casting inválido ocasiona o lançamento
da exceção ClassCastException
 Ex.:

Pessoa p = new Pessoa("Maria", 30);


String matricula = ((Aluno)p).getMatricula();

erro em tempo de execução

Prof. Rômulo Silva


instanceof
 O operador instanceof permite testar se
uma variável é uma referência para um tipo
específico
 Usado para evitar castings inválidos
Pessoa p;
...
if(p instanceof Aluno) {
String matricula = ((Aluno)p).getMatricula();
}

Prof. Rômulo Silva


Assinatura de um método
 É o que diferencia um método de outro do
ponto de vista da chamada (invocação):
 Nome do método
 Quantidade, tipo e ordem dos parâmetros
class Veiculo {
String placa;
int velocidade;

public Veiculo(String placa){ assinatura


this.placa = placa;
}

public void setVelocidade(int veloc){


velocidade = veloc;
}
}
Prof. Rômulo Silva
Sobreposição (overinding)
 É a sobrescrita de um método herdado

 Útil quando a classe derivada precisa


especializar ou alterar algum
comportamento definido na superclasse.

 A assinatura do método sobrescrito deve


ser idêntica a do método definido na
classe base

Prof. Rômulo Silva


Sobreposição
Pessoa

Aluno Funcionario

getSalario(): float

Professor Diretor

getSalario(): float getSalario(): float

métodos sobrepõem o método


definido na classe Funcionario

Prof. Rômulo Silva


Sobreposição - exemplo
class Funcionario extends Pessoa {
float salarioBase;
public Funcionario(String nome,
int idade,
float salarioBase) {
super(nome,idade);
this.salarioBase = salarioBase;
}
salário do funcionário = salário base

public float getSalario() {


return salarioBase;
}
}

Prof. Rômulo Silva


Sobreposição - exemplo
class Professor extends Funcionario {
boolean temAbono;
public Professor(String nome,
int idade,
float salarioBase,
boolean temAbono) {
super(nome,idade,salarioBase); método sobrescrito
this.temAbono = temAbono;
}
public float getSalario() {
if(temAbono)
return super.getSalario() + 200;//abono fixo.
else
return super.getSalario();// sem abono
}
}
chama o método definido
na superclasse

Prof. Rômulo Silva


Sobreposição - exemplo
Funcionario f1 = new Funcionario("Joao",20,300);
float salarioF1 = f1.getSalario(); // R$ 300,00

executa método
definido na classe Funcionario

Professor f2 = new Professor("Joao",20,300, true);


float salarioF2 = f2.getSalario(); //R$ 500,00

executa método
definido na classe Professor

Prof. Rômulo Silva


Sobreposição
 O método invocado de acordo com o tipo
real do objeto, e não de acordo com o tipo
da variável declarada.

Funcionario f = new Professor("Joao",20,300, true);


float salario = f.getSalario(); //R$ 500,00

executa método
definido na classe Professor

Prof. Rômulo Silva


Sobrecarga (overloading)
 É a definição de métodos que possuem o
mesmo nome, porém com assinaturas
diferentes
 Quantidade de parâmetros diferentes
 Ordem dos parâmetros
 Tipo dos parâmetros

 Tipo de retorno de todos os métodos devem


ser iguais.
 Tipo de retorno não faz parte da assinatura

Prof. Rômulo Silva


Sobrecarga (overloading)
 Útil quando:
 Se quer definir valores defaults para um ou mais
parâmetros
 Se deseja disponibilizar um método que faça a
mesma tarefa, porém de forma diferente

 Também pode ser aplicada aos construtores

Prof. Rômulo Silva


Sobrecarga – exemplo
class Professor extends Funcionario {
...
assinatura

public float getSalario() {


if(temAbono)
return super.getSalario() + 200;//abono fixo.
else
return super.getSalario();//sem abono
}

public float getSalario(float horas) {


return 20*horas;
}
...
} assinatura

Prof. Rômulo Silva


Sobrecarga - exemplo

Professor prof = new Professor("Jose", 20,300,true );


...

float sal1 = prof1.getSalario(); //irá retornar R$500

... executa a definição de


getSalario() sem parâmetro
float sal2 = prof1.getSalario(30);//irá retornar R$600

executa a definição de
getSalario() com
parâmetro do tipo float

Prof. Rômulo Silva


Sobrecarga de construtores
class Professor extends Funcionario {

boolean temAbono;

public Professor(String nome,


int idade, Construtor com
float salarioBase, 4 parâmetros
boolean temAbono) {
super(nome,idade,salarioBase);
this.temAbono = temAbono;
}

public Professor(String nome,


int idade,
float salarioBase) { Construtor com
super(nome,idade,salarioBase); 3 parâmetros
this.temAbono = false;
}
...
}

Prof. Rômulo Silva


Polimorfimos

 Poli = muitos, morfismo = forma

 Capacidade de um objeto de um tipo


substituir um objeto de outro tipo

Prof. Rômulo Silva


Polimorfismo
 Capacidade de cada subclasse ter
implementações diferentes para o mesmo
método
 Utilização de sobreposição

 A versão (implementação) do método a ser


chamada será determinada apenas em
tempo de execução
 late binding
 run-time binding
 dynamic binding

Prof. Rômulo Silva


Polimorfismo - exemplo
Pessoa

Versões do método
getSalario()
Aluno Funcionario

getSalario(): float

Professor Diretor

getSalario(): float getSalario(): float

Prof. Rômulo Silva


Polimorfismo - exemplo
class ImpostoRenda {
...

public void calculaImpostoRenda(Funcionario f){


...
float sal = f.getSalario();
...
} pode armazernar referência
de Funcionario,
Professor ou Diretor
...
}
versão a ser chamada
será determinada em
tempo de execução

Prof. Rômulo Silva


Exercícios
 1 - Crie uma classe Veiculo que tenha os atributos ano,
modelo, cor, placa e valor de mercado; e métodos que
retornam os valores dos atributos e um que imprime as
informações do veiculo na tela. Crie as subclasses Automovel
e Motocicleta de Veiculo. Para automóveis há um atributo
que armazena a quantidade de portas.

 2 - Altere as classes anteriores acrescentando um método


calcularIPVA que retorna o valor do IPVA de acordo com as
seguintes regras:
 IPVA = 2% do valor de mercado do veículo
 Se o automóvel tem mais de 10 anos, ele é isento do IPVA
 Se a motocicleta tem mais de 7 anos, ela é isenta do IPVA

Prof. Rômulo Silva


Exercícios
 3 - Escreva uma classe que represente um ponto de
coordenadas x e y.

 4 - Escreva uma classe que represente um pixel: um


ponto que possui uma cor.

 5 - Escreva uma classe que represente um círculo usando


um ponto e um raio. Crie um método que calcule a área
do círculo.
 6 - Crie uma classe Conta com os atributos número e
saldo; e os métodos que permitam fazer o saque,
depósito, e um para imprimir os dados da conta.

Prof. Rômulo Silva


Capítulo 9 – Pacotes,
Modificadores de Acesso e
Membros estáticos

Prof. Rômulo Silva


Modularidade e Reutilização
 Uma classe tem granularidade muito fina
para reutilização em sistemas complexos,
com milhares de linhas de código

 Sistemas complexos precisam ser


modularizados para facilitar a manutenção

 Solução em Java: uso de pacotes.

Prof. Rômulo Silva


Pacotes
 Um pacote é um agrupamento de classes
que formam um módulo de um sistema
 Sintaxe:
 package nomedopacote;

 Convenção de nomeação:
 Em letras minúsculas
 Agregar ao nome do pacote o domínio da
empresa (Internet) de trás para frente
 Exs:
• package org.eclipse.core.runtime;
• package com.sun.java.swing;

Prof. Rômulo Silva


Pacote
 Declaração de pacote deve vir antes da
declaração da classe

 Ex.:
package com.b3informatica.biblioteca;

class Livro {
...
}

Prof. Rômulo Silva


Pacotes - observações
 Toda classe deve pertencer a um único
pacote
 Java cria o pacote default para classes que
não declaram pacote
 Nome completo da classe:
nomedopacote.NomedaClasse
package com.b3informatica.biblioteca;

class Livro {
...
}
 com.b3informatica.biblioteca.Livro

Prof. Rômulo Silva


Pacotes - observações
 Classes com mesmo nome em pacotes
diferentes são consideradas classes
distintas

package com.empresa.biblioteca;

class Livro {
...
}
 com.empresa.biblioteca.Livro

package com.b3informatica.biblioteca;

class Livro {
...
}
 com.b3informatica.biblioteca;
Prof. Rômulo Silva
Reutilização de pacotes
 Para usar classes de um pacote deve-se importá-la
 Sintaxe:
 import nomedopacote.NomedaClasse;
 Declaração de import deve antes da definição da
classe cliente, após a declaração do pacote.

package com.empresa.informatica;
classe importada

import java.io.FileInputStream;

class Livro {
...
}

Prof. Rômulo Silva


Reutilização de pacotes
 Quando se deseja utilizar várias classes do
mesmo pacote, pode-se usar * (asterisco)
no lugar do nome da classe para importar
todas as classes do pacote:
package com.empresa.informatica;
import java.io.*;
class Livro {
importa todas as classes
... do pacote java.io

Prof. Rômulo Silva


Pacotes – observações
 A escolha de quais classes devem pertencer
a um determinado pacote é em função dos
critérios de modularização do sistema

 Em geral, agrupa-se classes que tratem do


mesmo assunto (domínio de aplicação)
 Ex.: package com.empresa.contabilidade;

Prof. Rômulo Silva


Modificadores de Visibilidade
 Definem o escopo de atributos, métodos e
classes
 Onde eles são visíveis (referenciáveis)

 Sintaxe:
 modificador-visibilidade atributo;
 modificador tipo-retorno nomeMetodo (lista-
parâmetros) {
Corpo-metodo
}

Prof. Rômulo Silva


Modificadores de Visibilidade
- exemplo
class Livro {
private String titulo;

private String autor; modificadores


... dos atributos
public String getTitulo() {
return titulo;
}
}

modificador de método

Prof. Rômulo Silva


Modificadores de Visiblidade
 Modificadores para atributos e métodos:
 private: visíveis apenas dentro da classe
proprietária
 protected: visíveis dentro da classe proprietária
e suas subclasses (classes derivadas)
 public: visíveis a todas as classes

 Atributos e métodos que não declaram


modificadores de visibilidade, tem escopo
package, isto é, são visíveis a todas classes
do mesmo pacote

Prof. Rômulo Silva


Modificadores de Visiblidade
 Somente o modificador public é válido para
classes
 Classes sem declaração de modificador tem escopo
package, isto é, são visíveis a apenas classes do
mesmo pacote

package com.empresa.biblioteca;
import java.io.*;

public class Livro { // classe pode ser


referenciada em outros pacotes
...
}

Prof. Rômulo Silva


Modificadores de visibilidade
- observações
 Os modificadores de visibilidade junto com
a declaração de pacotes definem o
encapsulamento dos objetos.

 Encapsulamento é um dos grandes


benefícios de OO:
 as classes expõem o mínimo de informação para
as classes clientes
 permite alterações na implementação sem
afetar as classes clientes
 minimizar dependências

Prof. Rômulo Silva


Membros estáticos
 Atributos e métodos estáticos são únicos
por classe, compartilhado por todos os
objetos da classe

 A alocação de memória para os atributos é


feita durante a carga da classe, antes
mesmo de ser criada qualquer instância

 Os membros estáticos devem ser


referenciados usando o nome da classe ao
invés de variáveis de tipo objeto.
Prof. Rômulo Silva
Membros estáticos
public class ContaInstancia {
private static int nroInstancias;

public ContaInstancia() {
nroInstancias++; chamada de
} método estático

public static void imprimeNroInstancias() {


System.out.println("Nro de Instâncias:"+
nroInstancias);
}

public static void main(String[] args) {


ContaInstancia c1 = new ContaInstancia();
ContaInstancia c2 = new ContaInstancia();
ContaInstancia c3 = new ContaInstancia();
ContaInstancia.imprimeNroInstancias();
}
}
Prof. Rômulo Silva
Membros estáticos -
observações
 Na terminologia de Orientação a Objetos,
atributos e métodos estáticos são
chamados de variáveis de classe e
métodos de classe, respectivamente.

 Porque o método main é estático:


 Para ser executado sem que haja nenhuma
instância criada

Prof. Rômulo Silva


Variáveis de classe
 Podem ser inicializadas na própria
declaração ou dentro de um bloco static:
public class ContaInstancia {
private static int nroInstancias = 0;
...
ou
public class ContaInstancia {
private static int nroInstancias;
static {
nroInstancias = 0;
}
...

Prof. Rômulo Silva


Membros final
 A palavra final indica que o membro não
pode ser alterado, após ser inicializado.
 Método: não pode ser sobreposto nas
subclasses
 Atributo: ao lado de static, será tratado
como uma constante
 Classe: não permite criação de classes
derivadas.

Prof. Rômulo Silva


Membros final - exemplo
 A classe pré-definida java.lang.Math define
as constantes matemáticas PI e E da
seguinte forma:

 public static final double PI = 3.141592653589793;

 public static final double E = 2.718281828459045;

Prof. Rômulo Silva


Exercícios
 1 - Em geral, as classes definem a visibilidade de suas
variáveis de instância como private, e os métodos que
manipulam as variáveis como public. Qual a vantagem de
assim proceder?

 2 - Crie um método estático para a classe Conta do capítulo


anterior que faça uma transferência de valor entre duas contas.

 3 - O construtor da classe padrão java.lang.Math tem


visibilidade private e todos os demais métodos são estáticos.
Qual a razão disto?

 4 - Em orientação a objetos, é comum encontrar situações


onde é preciso garantir a existência de uma única instância de
uma determinada classe. Como é possível garantir isso usando
modificadores de acesso?
Prof. Rômulo Silva
Capítulo 10 – Classes
Abstratas e Interfaces

Prof. Rômulo Silva


Problema
 Como fornecer uma implementação para o
método da classe Figura abaixo???

Figura

desenha()

Circulo Quadrado Triangulo


desenha() desenha() desenha()

Prof. Rômulo Silva


Solução: Métodos Abstratos
 Método abstrato:
 Um método que conhecemos sua interface
(assinatura), mas não se sabe como
implementá-lo.
 A implementação será fornecida por subclasses
utilizando sobreposição
 Sintaxe:
 Visibilidade abstract tipo-retorno
nomeMetodo(lista-parametros);

 Classes que possuem um método abstrato


devem ser declaradas como abstratas

Prof. Rômulo Silva


Classes e Métodos Abstratos
- exemplo
public abstract class Figura {
...
public abstract void desenha();
}

método sem implementação

Prof. Rômulo Silva


Classes Abstratas -
observações
 Uma classe abstrata não pode ser
instanciada
 Compilador não pode garantir que existe uma
implementação para cada método
...
Figura f = new Figura();
f.desenha();
...
erro de compilação

Prof. Rômulo Silva


Interfaces
 Uma interface é uma coleção de assinaturas
de métodos, que em conjunto definem um
contrato entre uma classe utilitária e suas
clientes.
 Métodos não têm implementação

 Sintaxe:
 interface NomeInterface {
assinaturasMetodos
}

Prof. Rômulo Silva


Interfaces - exemplo
interface Conjunto {
void addElemento(Object elem);
void removeElemento(Object elem);
Object getElemento(int pos);
}
 Convenção de nomeação: a mesma para
classes
 Alguns programadores gostam de incluir um I
maiúsculo no início para facilitar a identificação
em outros pontos do código
• interface IConjunto { ...}

Prof. Rômulo Silva


Interfaces
 Várias classes podem fornecer
implementações diferentes para a mesma
interface

 Útil para promover o desacoplamento entre


especificação/implementação

 Permite a troca de uma implementação


sem afetar as classes clientes.

Prof. Rômulo Silva


Interfaces - exemplo
package com.empresa.Conjuntos;
import java.util.Vector;
public class MeuConjunto implements Conjunto {
private Vector elementos;
public MeuConjunto() {
elementos = new Vector();
}
public void addElemento(Object x) { implementação
if(!elementos.contains(x)) de interface
elementos.addElement(x);
}
public void removeElemento(Object x) {
boolean achou = elementos.removeElement(x);
}
public Object getElemento(int pos) {
return elementos.elementAt(pos);
}
}

Prof. Rômulo Silva


Interfaces - observações
 Na terminologia OO, diz-se que uma classe
implementa ou assume uma interface

 Uma classe, mesmo que não declare


implementações de interfaces, possui uma
interface implícita:
 Formada pelas assinaturas do métodos públicos

Prof. Rômulo Silva


Interfaces – notação UML

<<interface>>
Conjunto
addElemento(Object x): void
removeElemento(Object x): void
getElemento(int pos): Object

MeuConjunto

Prof. Rômulo Silva


Interfaces
 Mais de uma classe pode implementar a
mesma interface
<<interface>>
Conjunto
addElemento(Object x): void
removeElemento(Object x): void
getElemento(int pos): Object

MeuConjunto ConjuntoTamFixo

Prof. Rômulo Silva


Interfaces
 O uso de interface aumenta a flexibilidade
do código:
 amplia a capacidade de polimorfismo
 objetos que têm a mesma interface podem ser
usados indistintamente em relação aos métodos
que compõem a interface

 Podem ser usadas em declarações de


atributos, variáveis locais ou parâmetros de
métodos

Prof. Rômulo Silva


Interfaces
<<interface>>
Conjunto
 Polimorfismo: addElemento(Object x): void
removeElemento(Object x): void
... getElemento(int pos): Object

Conjunto conj; ConjuntoTamFixo


MeuConjunto

...
String str = "um elemento";
conj.addElemento(str);
...
válido para objetos
da classe Conjunto e
ConjuntoTamFixo

Prof. Rômulo Silva


Interfaces - herança
 Uma interface pode estender outras
interfaces, herdando as assinaturas dos
métodos

 Ao contrário de classes, pode ocorrer


herança múltipla
 Não há ambigüidade, pois não há
implementações reais de métodos, apenas
assinaturas

Prof. Rômulo Silva


Herança de Interfaces -
exemplo
interface A { public class X implements A {
void metodoA(int x); ...
public void metodoA(int x) {
}
...
}
interface B { }
int metodoB();
} public class Y implements C {
...
public void metodoA(int x) {
interface C extends A, B { ...
void metodoC(); }
} public int metodoB() {
...
}
interface C herda
public void metodoC() {
as assinaturas ...
definidas em A e B }
}

Prof. Rômulo Silva


Interfaces - observações
 Se uma classe que assume uma interface
não provê implementação para algum
método da interface, ela deve ser
obrigatoriamente declarada como abstract

 Uma mesma classe pode assumir mais de


uma interface simultaneamente.

Prof. Rômulo Silva


Interfaces - exemplo
interface A { class Z implements A, B {
void metodoA(int x); ...
} public void metodoA(int x)
{
interface B { ...
int metodoB(); }
} public int metodoB() {
...
interface C extends A, B { }
void metodoC(); }
}

Prof. Rômulo Silva


Interfaces - observações
 Princípio de OO para
reutilização/substituição de componentes:
 “Programar mais para interfaces que para
implementações concretas”
 Acoplamentos fracos

 No momento de projetar as classes,


procurar pensar mais em termos de
interfaces (contrato dos métodos)

Prof. Rômulo Silva


Exercícios
 1 - Defina uma interface Node que represente um
elemento de uma lista e que especifique uma assinatura
de método void imprime(). Defina uma classe Lista
que implementa uma lista de nodes, com os métodos:
 boolean isVazia(): retorna true se a lista está vazia
 void addNode(Node x): adiciona um elemento na lista
 void imprime(): imprime todos os elementos da lista.
O construtor da lista deve receber o número máximo de
elementos como parâmetro.
Crie duas classes, por exemplo: Pessoa e Livro, que
implementem a interface Node e crie instâncias para
testar a classe Lista.

Prof. Rômulo Silva


Exercícios
 2 - Crie um esqueleto de programa para fazer o
tratamento de transações bancárias. Cada transação tem
um código e um número específico de campos. As
transações são enviadas para o servidor como um string,
porém cada transação sabe como gerar o string da forma
como o servidor espera. Forneça uma solução usando os
recursos de classes abstratas e interfaces.

Prof. Rômulo Silva


Capítulo 11 – Tratamento
de Exceções

Prof. Rômulo Silva


Tipos de Erros

 Erros de lógica de programação:


 Divisão por zero

 Erros relacionados ao ambiente de


execução, contudo contornáveis:
 Indisponibilidade de rede

 Erros incontornáveis:
 Falta de memória, erro interno da JVM

Prof. Rômulo Silva


Tratamento de Exceções
 Em Java, uma exceção é um tipo especial
de objeto, “lançado” quando ocorre um
erro.

 O objeto “lançado” pode ser capturado e


tratado de maneira simples e elegante.

Prof. Rômulo Silva


Tratamento de Exceções
 Sintaxe:
try {
// bloco de comandos
...
}
catch(TipoExcecao1 e) {
// bloco de tratamento da exceção 1
...
}
catch(TipoExcecao2 e) {
// bloco de tratamento da exceção 2
...
}
...
catch(TipoExcecaoN e) {
// bloco de tratamento da exceção N
...
}

Prof. Rômulo Silva


Exceções pré-definidas
 ArrayIndexOutOfBoundsException:
 Lançada quando é referenciada uma posição
inválida de um array
 NullPointerException:
 Lançada quando se tenta invocar um método
usando uma referência nula.
 FileNotFoundException:
 Lançada quando se tenta ler um arquivo
inexistente

Prof. Rômulo Silva


Tipos de Exceções
 Checked:
 Tratamento obrigatório (exigido pelo
compilador)
• Ex.: FileNotFoundException
 Unchecked:
 Tratamento opcional
• Ex.: ArrayIndexOutOfBoundsException

 Exceções definidas pelo programador


devem ser do tipo checked

Prof. Rômulo Silva


Definição de Exceções
 São classes que estendem a classe pré-
definida java.lang.Exception

public class ConfiguracaoException


extends Exception {

public ConfiguracaoException(String nome) {


super("A Config. "+ nome + “ é inválida");
}
}

Prof. Rômulo Silva


Lançamento de exceções
 Para lançar usa-se a palavra reservada
throw (sem s):
...
Configuracao c = arq.LeConfiguracao();
if(c.getNumConfiguracao() < 0) {
throw new ConfiguracaoException(arq.getNome());
}
...
lança uma exceção

Prof. Rômulo Silva


Lançamento de exceções
 O lançamento de exceção interrompe o
fluxo normal do programa, subindo de
escopo até encontrar um bloco catch
apropriado.

 A ocorrência de exceções do tipo


unchecked, quando não tratadas ocasionam
a queda da aplicação.

Prof. Rômulo Silva


Lançamento de exceções
 Métodos que não tratam exceções do tipo
checked devem declarar na sua assinatura
o lançamento das exceções

 cláusula throws (com s)

 Responsabilidade de tratamento fica para a


classe cliente

Prof. Rômulo Silva


Cláusula throws
public class Aplicacao {
...
public void setConfiguracao(Arquivo arq) throws
ConfiguracaoException {
Configuracao c = arq.LeConfiguracao();
if(c.getNumConfiguracao() < 0) {
throw new
ConfiguracaoException(arq.getNome());
}
...
delega tratamento
} para a classe cliente

Prof. Rômulo Silva


Cláusula throws
 Um método pode lançar mais de uma
exceção

 Sintaxe:
public tipo-retorno nomeMetodo(lista-
parametros) throws TipoExcecao1,
TipoExcecao2, ..., TipoExcecaoN {
// corpo do método
...
}

Prof. Rômulo Silva


finally
 Bloco opcional usado junto a um bloco try-
catch

 O conteúdo do bloco é executado


independentemente se ocorre exceção ou não

 Se ocorre exceção, é executado após o bloco


catch da exceção lançada.

Prof. Rômulo Silva


finally
try {
...
}
catch(TipoExcecao1 e) {
...
}
...
catch(TipoExcecaoN e) {
...
}
finally {
//bloco sempre executado
...
}

Prof. Rômulo Silva


Exercícios
 1 - Crie uma exceção ListaCheiaException e altere o
método void addNode(Node x) da classe Lista
proposta no exercício 1 do capítulo 10 para lançá-la
quando houver a tentativa de inserir um nó na lista que já
tenha atingindo o tamanho máximo. Faça um teste onde
ocorra o lançamento da exceção.

 2 - Crie uma exceção ExecucaoTransacaoException


e remodele a aplicação de transações bancárias, proposta
no exercício 2 do capítulo 10 , para que quando o servidor
retorne erros da execução da transação, seja lançada
uma exceção apropriada.

Prof. Rômulo Silva


Capítulo 12 – Collections

Prof. Rômulo Silva


Estruturas de Dados
 A maioria das aplicações precisam de estruturas de
dados que armazenem coleções de objetos:
 Listas, pilhas, filas, árvores binárias, tabelas hash, etc.

 O pacote java.util define uma série de classes e


interfaces para implementação e tratamento de
coleções.
 Collections Framework

 Obs.: a partir da versão 5.0, as coleções são


parametrizadas.

Prof. Rômulo Silva


Interface
java.util.Collection

 boolean add(E obj)


 void clear()
 boolean contains(E obj)
 boolean isEmpty()
 Iterator<E> iterator()
 boolean remove(E obj)
 int size()

Prof. Rômulo Silva


Interfaces do pacote
java.util
<<interface>>
java.util.Collection

<<interface>> <<interface>>
java.util.List java.util.Set

 List:
 Seqüência definida
 Elementos indexados
 Set:
 Seqüência arbitrária
 Não há elementos repetidos

Prof. Rômulo Silva


Implementações da interface
Set
 HashSet:
 Implementação de hash table

 TreeSet
 Implementação de uma árvore rubro-negra
(Red-black Tree)

 LinkedHashSet
 Implementação de lista ligada e hash table com
inserção ordenada

Prof. Rômulo Silva


Implementações da interface
List
 ArrayList
 Implementação de lista usando array
redimensionável.

 LinkedList
 Implementação de lista duplamente encadeada

 Vector
 Implementação de array redimensionável
sincronizado

Prof. Rômulo Silva


Interface Map<K,V>
 Mapeia chaves a valores.

 Não pode haver chaves repetidas.

 V put(K chave, V valor)


 V remove (Object chave)
 boolean containsKey(Object chave)
 boolean containsValue (Object valor)

Prof. Rômulo Silva


Implementações da Interface
Map<K,V>
 HashMap
 Implementação de hash table não sincronizada
que admita valores null para chaves e valores.
 TreeMap
 Implementação de uma árvore rubro-negra
(Red-black)
 LinkedHashMap
 Implementação de lista ligada e hash table com
inserção ordenada.
 Hashtable
 Implementação de hash table sincronizada que
não permite chaves e nem valores nulos
Prof. Rômulo Silva
Interface Queue
 Usada em implementações de filas

 Implementações:
 PriorityQueue: fila implementada através de
uma estrutura de dados heap
 ConcurrentLinkedQueue: fila bloqueante não
limitada baseada em nós ligados.
 ArrayBlockingQueue: fila bloqueante limitada
usando array

Prof. Rômulo Silva


classe ArrayList
 Implementa a interface java.util.List
usando um array interno.

ArrayList<String> lista = new


ArrayList<String>();
lista.add("elem1");
lista.add("elem2");
lista.add("elem3");

Prof. Rômulo Silva


classe LinkedList
 Implementa uma lista, com métodos
adicionais para inserção/remoção de
elementos no início e no fim da lista

LinkedList<String> lista = new


LinkedList<String>();
lista.addFirst("elem1");
lista.addLast("elem2");
lista.addFirst("elem3");

Prof. Rômulo Silva


Classe java.util.Collections
 Consiste exclusivamente de métodos
estáticos que operam sobre ou retornam
coleções.
 static <T> int binarySearch(List<? extends
T> list, T key, Comparator<? super T> c)
 static <T> T max(Collection<? extends
T> coll, Comparator<? super T> comp)
 static <T> T min(Collection<? extends
T> coll, Comparator<? super T> comp)
 static <T> void sort(List<T> list)
 static <T> void sort(List<T> list,
Comparator<? super T> c)

Prof. Rômulo Silva


Exercícios
 1 - Crie uma lista de objetos da classe Pessoa e ordena a
lista e imprima-a ordenada.

 2 - Crie uma tabela hash tal que o nome da pessoa seja


associado ao respectivo objeto da classe Pessoa. Em
seguida imprima todas as chaves da tabela hash.

Prof. Rômulo Silva


Genéricos (Generics)
 Semelhante a idéia de templates de C++,
porém não há expansão de código como
em C++.
 Permite escrever métodos genéricos, com
algoritmo comum operando sobre tipos
diferentes.

 Pode ser aplicado a métodos individuais ou


a classes
 Indicado pela declaração entre os sinais <
e>
Prof. Rômulo Silva
Genéricos – uso em métodos
public class MinhaClasse {
public static <E> void imprimeArray(E[]
arrayEntrada) {
for(E elemento: arrayEntrada)
System.out.printf(“%s”, elemento);
}

public static void main(String args[]) {


Integer[] x = {5,10,7,11};
imprimeArray(x);
String[] y = {“str1”, “str2”, “str3”};
imprimeArray(y);
}
Prof. Rômulo Silva
Genéricos – uso em classe
public class Pilha<E> {
private final int tam;
private int topo;
private E[] elementos;
public Pilha(int s) {
tam = s;
topo = -1;
elementos = (E[]) new Object[tam];
}
public void push(E valor) {
if(topo == tam-1)
throw new RuntimeException(“pilha cheia”);
elementos[++topo] = valor;
}
public E pop() {
if(topo == -1)
throw new RuntimeException(“pilha vazia”);
return elementos[topo--];
}
}
Prof. Rômulo Silva
Genéricos – uso em classe

Pilha<String> p = new Pilha<String> (5);
p.push(“str1”);
p.push(“str2”);
p.push(“str3”);
String s = p.pop();

Prof. Rômulo Silva


Genéricos - observação
 É possível instanciar uma classe genérica
sem indicar o tipo. Neste caso, fica
subentendido que o parâmetro da classe
será do tipo Object

 Ex.:
Pilha p = new Pilha(5);// elementos
do tipo Object
Pilha p2 = new Pilha<Integer>(7);//
elementos do tipo Integer

Prof. Rômulo Silva


Genéricos e Subtipos
 Se A é subtipo de B e G uma classe genérica
então:
G<A> NÃO é subtipo de G<B>
 Ex.: Considere classe Professor sendo subtipo de
Pessoa:
List<Professor> lista1 = new ArrayList<Professor>();
List<Pessoa> lista2 = lista1; // ERRO DE COMPILAÇÃO!!!

 Se List<Professor> fosse subtipo de List<Pessoa>


seria possível:
lista2.add(new Pessoa(“Joao”,36));// agora tem uma
Pessoa na lista de professores que não é
Professor!!!

Prof. Rômulo Silva


Genéricos – tipo Curinga
 Sintaxe: < ? >
 Indica um tipo desconhecido
 Coleções com tipo curinga podem ter seus
elementos lidos, mas não pode receber
novos elementos
 Ex.:
void printCollection(Collection<?> c) {

}
aceita uma como parâmetro uma coleção de
qualquer tipo.
Prof. Rômulo Silva
Genéricos – tipo Curinga
 Limites:
 Superior: <? extends T>
indica que aceita T e seus descendentes

 Inferior: <? super T>


indica que aceita T e seus ascendentes
 Ex.:
public void imprimeLista(List<? extends Pessoa>
lista) {//aceita Pessoa e Professor
for(Pessoa p: lista)
imprime(p);
}
Prof. Rômulo Silva
Capítulo 13 – Pacote
Padrão, Entrada e Saída

Prof. Rômulo Silva


Pacote Padrão – java.lang
 Não precisa fazer import para usar usas
classes (importado automaticamente)
 Principais classes:
 Object
 System
 String
 Thread
 Wrappers (Integer, Long, Float, Boolean, ...)
 Exceções (Exception, NullPointerException,
...)
 Interfaces (Comparable)

Prof. Rômulo Silva


java.lang.Object
 Raiz da hierarquia de classes do sistema
 Principais métodos:
 boolean equals(Object): retorna true se duas
referências de objetos são iguais (apontam para
o mesmo objeto)
 String toString(): transforma uma referência
de objeto para String.
 Class getClass(): retorna um objeto
representado a classe do objeto (metaclasse)

Prof. Rômulo Silva


java.lang.System
 Atributos estáticos que representam o
sistema
 System.in : entrada padrão do sistema
 System.out : saída padrão do sistema
 System.err : saída padrão de erro
 Principais métodos:
 String getProperty(String p): retorna
valores de propriedades do sistema (versão da
máquina virtual, separador de arquivo, sistema
operacional)
 void exit(int codigoSaida)

Prof. Rômulo Silva


java.lang.Math
 Provê constantes matemáticas (PI e E),
métodos estáticos para cálculo de funções
matemáticas
 Principais métodos:
 double pow(double a, double b)
 double sqrt(double a)
 long round(double a)
 int round(float a)
 double random()

Prof. Rômulo Silva


java.lang.String
 Implementa um objeto que armazena uma
cadeia de caracteres
 Principais métodos:
 char charAt(int pos)
 byte[] getBytes()
 int length()
 String substring(int indiceInicio, int
indiceFim)
 String valueOf(int) : converte um inteiro
para string

Prof. Rômulo Silva


java.lang.String -
comparação
 Cuidado!!: variáveis inicializadas com
literais de String iguais apontam para um
mesmo objeto

String str1 = "azul";


Irá retornar true
String str2 = "azul";
if(str1 == str2) { //compara referências str1 e str2
System.out.println(“objetos iguais");
}
else {
System.out.println(“objetos diferentes");
}

Prof. Rômulo Silva


java.lang.String -
comparação
 Variáveis inicializadas usando os
construtores da classe String nunca
apontam para um mesmo objeto
String str1 = new String("azul");
String str2 = new String("azul");
if(str1 == str2){ //compara referências str1 e str2
System.out.println("objetos iguais");
} Irá retornar false
else {
System.out.println("objetos diferentes");
}

Prof. Rômulo Silva


java.lang.String -
comparação
 Para evitar confusão nas comparações de
strings, use sempre o método equals.

 Método equals da classe String:


 Sobreposto de Object
 Retorna true se duas strings contém a mesma
seqüência de caracteres

Prof. Rômulo Silva


java.lang.String -
comparação
String str1 = new String("azul");
String str2 = new String("azul");
if(str1.equals(str2)){ //compara conteúdo de str1 e
str2
System.out.println("strings iguais");
}
Irá retornar true
else {
System.out.println("strings diferentes");
}

Prof. Rômulo Silva


Pacote java.io
 Define várias interfaces e classes para
tratamento de entrada e saída
 Classe java.io.File:
 Usada para representar o sistema de arquivos
 Métodos para testar existência de arquivos,
listar diretórios, verificar permissões, etc.
 A existência de um objeto File não implica na
existência real do arquivo

Prof. Rômulo Silva


java.io.File
 Principais métodos:
 boolean exists()
 boolean isFile()
 boolean isDirectory()
 String[] list()
 String getAbsolutePath()
 boolean createNewFile()
 boolean mkdir()

Prof. Rômulo Silva


java.io.File - exemplo

...
File f = new File("c:\\temp");
if(f.isDirectory()) {
String[] arqs = f.list();
...

Prof. Rômulo Silva


Fluxos de Entrada e Saída
 Em Java, toda operação de entrada/saída
necessita da criação de fluxos (streams)

 O pacote java.io define dois grupos de


classes de streams:
 Streams de caracteres
 Streams de bytes

Prof. Rômulo Silva


Streams de bytes

InputStream OutputStream

ByteArrayInputStream ByteArrayOutputStream

FileInputStream FileOutputStream

FilterInputStream FilterOutputStream

BufferedInputStream BufferedOutputStream

Prof. Rômulo Silva


Streams de Caracteres

Reader Writer

BufferedReader BufferedWriter

InputStreamReader OutputStreamWriter

FileReader FileWriter

Prof. Rômulo Silva


Streams de bytes
 InputStream
 Classe genérica (abstrata)
 Principais subclasses: FileInputStream e
BufferedInputStream
 Métodos principais:
• int read() : lê um byte
• int read(byte[] buffer): coloca os bytes lidos
no array do parâmetro e retorna a quantidade de bytes
lidos
• void close(): fecha o stream

Prof. Rômulo Silva


java.io.FileInputStream
File f = new File("c:\\arquivo.txt");
try {
FileInputStream in = new FileInputStream(f); //cria stream
byte[] buf = new byte[1024];
int qtdBytesLidos = in.read(buf); //le stream
while(qtdBytesLidos != -1) {
String dados = new String(buf);
System.out.println(dados);
in.read(buf);
}
in.close(); //fecha stream -1 indica fim de arquivo
}
catch(FileNotFoundException e){
System.out.println("Não encontrou arquivo");
}
catch(IOException e){
System.out.println("Erro na leitura");
}

Prof. Rômulo Silva


Stream de bytes
 OutputStream
 Classe genérica (abstrata)
 Principais subclasses: FileOutputStream e
BufferedOutputStream
 Principais métodos:
• void write(int b)
• void write(byte[] buffer)
• close()
• flush()

Prof. Rômulo Silva


Streams de Caracteres
 Reader
 Classe genérica (abstrata)
 Principais subclasses: BufferedReader e
InputStreamReader
• int read() : lê um caracter
• int read(char[] buffer) : coloca caracteres
lidos no array passado como parâmetro e retorna a
quantidade de caracteres lidos
• close() : fecha o stream

Prof. Rômulo Silva


Streams de Caracteres
 Writer
 Classe genérica (abstrata)
 Principais subclasses: BufferedWriter e
OutputStreamWriter
 Principais métodos:
• void write(int c)
• void write(char[] buffer)
• close()
• flush()

Prof. Rômulo Silva


Leitura/Escrita de arquivos
texto
 Leitura: usar FileReader dentro de um
BufferedReader
 Leitura bufferizada

 Escrita: usar FileWriter dentro de um


BufferedWriter
 Escrita bufferizada

Prof. Rômulo Silva


Leitura de Arquivos texto -
exemplo
File f = new File("c:\\arquivo.txt");
try {
BufferedReader in = new BufferedReader( new
FileReader(f)); //cria o stream
String linha = in.readLine(); //le uma linha do
arquivo texto
while(linha != null) {
System.out.println(linha);
linha = in.readLine();
}
in.close(); //fecha o stream
}
catch(FileNotFoundException e){
System.out.println("Não encontrou arquivo");
}
catch(IOException e){
System.out.println("Erro na leitura");
}

Prof. Rômulo Silva


Escrita de arquivos texto -
exemplo
File f = new File("c:\\arquivo.txt");
try {
BufferedWriter out = new BufferedWriter( new
FileWriter(f)); //cria o stream
String linha = "linha para o arquivo";
out.write(linha); //escreve a linha no stream
out.close(); //fecha o stream
}
catch(FileNotFoundException e){
System.out.println("Não encontrou arquivo");
}
catch(IOException e){
System.out.println("Erro na leitura");
}

Prof. Rômulo Silva


Leitura do teclado
 System.in : é um objeto estático do tipo
InputStream que representa a entrada
padrão (teclado)
 Para ler no formato de strings ao invés de
bytes: embrulhar o objeto System.in
dentro BufferedReader com
InputStreamReader
 Método String readLine(): retorna uma string
com a linha lida
 Para ler números: usar classes Wrappers
para converter a string lida para número

Prof. Rômulo Silva


Leitura do teclado - exemplo
try {
BufferedReader entrada = new BufferedReader(new
InputStreamReader(System.in)); //cria o stream
System.out.println("Digite um numero inteiro");
String linha = entrada.readLine();
int numero = Integer.parseInt(linha);
System.out.println(numero);
}
catch(IOException e){
System.out.println("Erro na leitura");
}

Prof. Rômulo Silva


Exercícios
 1- Crie uma classe nomeada ListaInteiros,
que implemente uma lista de inteiros, usando o
tipo primitivo int. Teste a classe criada.

 2 - Faça um programa que leia um arquivo texto e


imprima o seu conteúdo na console.

Prof. Rômulo Silva


Exercícios
 3 - Implemente uma agenda em um arquivo texto,
onde cada registro contenha as seguintes
informações separadas por 2 pontos: nome, data
de nascimento, endereço, telefone, e-mail. Crie
uma classe para representar os registros, com
um atributo para cada campo correspondente; e
faça a leitura do arquivo carregando os registros
em uma lista e imprimindo-os em seguida.
Sugestão: utilize a classe
java.util.StringTokenizer.

Prof. Rômulo Silva


Capítulo 14 – Interfaces
Gráficas de Usuário –
AWT e Swing

Prof. Rômulo Silva


Abstract Window Toolkit -
AWT
 Lançada no Java 1.0
 Oferece componentes gráficos como
botões, janelas, campos de texto, etc.
 A distribuição de componentes na tela é
determinada por gerenciadores de leiaute
 A interação entre usuário e aplicação é
baseada em eventos
 Modelo de eventos foi reformulado no Java 1.1
 Aparência e comportamento dependente de
plataforma
 Classes e interfaces dos pacotes java.awt
e java.awt.event
Prof. Rômulo Silva
Swing
 Lançado na versão 1.2
 Conhecido como JFC (Java Foundation
Classes)
 Fornece interface mais rica que AWT
 Menos dependente de plataforma
 Utiliza e expande os tipos de eventos e
gerenciadores de leiaute definidos no AWT
 Hoje, usa-se sempre que possível Swing e
não mais objetos do AWT

Prof. Rômulo Silva


Swing
 java.awt.Container são objetos
contêiners: usado para incluir outros
objetos gráficos
 javax.swing.JComponent é a superclasse
da maioria de componentes gráficos do
Swing. ja v a .la n g .O b je c t

ja v a .a w t.C o m p o n e n t

ja v a .a w t.C o n ta in e r

ja v a x .s w in g .J C o m p o n e n t

Prof. Rômulo Silva


javax.swing.JComponent
 Alugns métodos:
 void setPreferredSize(Dimension d)
 void setEnabled(boolean b)
 void setForeground(Color c)
 void setBackground(Color c)
 void setFont(Font c)

Prof. Rômulo Silva


Swing - Componentes
 Principais componentes:
 JLabel
 JTextField
 JButton
 JRadioButton
 JCheckBox
 JComboBox
 JList
 JPanel

Prof. Rômulo Silva


Swing - Componentes

Prof. Rômulo Silva


Swing - contêiners
 Todas as aplicações gráficas devem utilizar
um dos seguintes contêiners para conter os
demais objetos gráficos:
 javax.swing.JFrame: usado para conter
objetos gráficos do Swing.

 JApplet: usado para conter objetos gráficos do


Swing para rodar dentro de browsers

 JPanel: contêiner de propósito geral para


leiaute em camadas

Prof. Rômulo Silva


Swing - contêiners
 Os objetos gráficos não são adicionados
diretamente em JFrame ou JApplet
 É necessário adicionar os componentes no
contêiner opaco (independente de plataforma)
implementado no JFrame ou JApplet:
 Para obter o contêiner opaco:
JFrame fr = new JFrame();
Container c = fr.getContentPane();
Ou
JApplet applet = new JApplet();
Container c = applet.getContentPane();

Prof. Rômulo Silva


Swing - exemplo
import java.awt.*; Inclui pacotes de objetos
import javax.swing.*;
AWT e Swing
public class MinhaAplicacao extends JFrame {
public MinhaAplicacao() {
super("Título da Minha Aplicacao");
Container c = this.getContentPane(); //obtem o contêiner interno
do JFrame
c.setLayout(new FlowLayout()); //configura leiaute do JFrame
JLabel rotuloNome = new JLabel("Nome"); //cria rótulo
JTextField txtNome = new JTextField("valor inicial do campo");
c.add(rotuloNome); //adciona rótulo no contêiner interno do
JFrame
c.add(txtNome);
JLabel rotuloEndereco = new JLabel("Endereco");
JTextField txtEndereco = new JTextField("valor inicial");
c.add(rotuloEndereco);
c.add(txtEndereco);
setSize(500,300); //configura tamanho inicial para o JFrame
setVisible(true); // coloca o JFrame visível
}
public static void main(String[] args) {
MinhaAplicacao aplic = new MinhaAplicacao(); //cria um JFrame
}
}
Criação da aplicação
Prof. Rômulo Silva
Swing - exemplo

Prof. Rômulo Silva


Swing – Gerenciadores de
Leiaute
 Implementam um algoritmo de
posicionamento e redimensionamento de
objetos adicionados a um contêiner
 Principais gerenciadores de leiaute:
 FlowLayout
 BorderLayout
 GridLayout

Prof. Rômulo Silva


FlowLayout
 É o leiaute mais simples
 Posiciona os componentes em seqüência,
um ao lado do outro.
 O componentes são, por default,
posicionados justificados no centro.
 Leiaute default para JPanel

Prof. Rômulo Silva


FlowLayout
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TesteFlowLayout extends Jframe {


public TesteFlowLayout(){
super("Teste de FlowLayout");
Container c = getContentPane();
c.setLayout(new FlowLayout());
c.add(new JLabel("Nome"));
c.add(new JTextField("Joao da Silva"));
c.add(new JButton("Confirma"));
setSize(300,100);
setVisible(true);
}

public static void main(String[] args) {


TesteFlowLayout fr = new TesteFlowLayout();
}
}

Prof. Rômulo Silva


BorderLayout
 Implementa um leiaute geográfico,
dividindo o contêiner em 5 regiões: NORTH,
SOUTH, WEST, EAST e CENTER
 Default para JFrame e JApplet
 Objetos são adicionados nas regiões.
NORTH CENTER

WEST
EAST

SOUTH

Prof. Rômulo Silva


BorderLayout - exemplo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TesteBorderLayout extends JFrame {

public TesteBorderLayout(){
super("Teste de BorderLayout");
Container c = getContentPane();
c.setLayout(new BorderLayout());
JTextArea area = new JTextArea();
area.setText("linha1/nlinha2/nlinha3");
c.add(new JLabel("Nome"), BorderLayout.WEST);
c.add(new JTextField("Joao da Silva"), BorderLayout.EAST);
c.add(new JButton("Confirma"), BorderLayout.SOUTH);
c.add(new JTextArea("linha1\nlinha2\nlinha3"),
BorderLayout.CENTER);
setSize(400,120);
setVisible(true);
}
public static void main(String[] args) {
TesteBorderLayout fr = new TesteBorderLayout();
}
}

Prof. Rômulo Silva


BorderLayout - regras
 NORTH e SOUTH têm prioridade no uso da
largura e altura limitada pelo
preferredSize do componente
 WEST e EAST tem altura limitada pela
existência ou não de componentes no
NORTH e SOUTH e largura limitada pelo
preferredSize do componente
 CENTER ignora preferredSize e ocupa todo
o espaço que puder, mas limitado pela
existência de objetos em NORTH, SOUTH,
WEST e EAST
 Aceita somente um objeto por região

Prof. Rômulo Silva


GridLayout
 Posiciona os componentes em uma forma
de tabela com linhas e colunas.
 Cada célula aceita somente um objeto
 Células não preenchidas ficarão em branco
 Componente adicionado a uma célula ocupa
toda a célula
 Ignora o preferredSize dos objetos

Prof. Rômulo Silva


GridLayout - exemplo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TesteGridLayout extends


JFrame {
public TesteGridLayout(){
super("Teste de GridLayout");
Container c = getContentPane();
c.setLayout(new GridLayout(3,2));
c.add(new JLabel("Nome"));
c.add(new JTextField("Joao da Silva"));
c.add(new JCheckBox("Funcionario", true));
c.add(new JCheckBox("Estrangeiro"));
c.add(new JButton("Confirma"));
c.add(new JButton("Cancela"));
setSize(300,130);
setVisible(true);
}
public static void main(String[] args) {
TesteGridLayout fr = new TesteGridLayout();
}
}

Prof. Rômulo Silva


Swing – composição de
leiautes
 Quando é necessário acrescentar mais de
um componente na mesma célula ou
região:
 Cria-se um contêiner de propósito geral
(JPanel) com o leiaute apropriado
 Adiciona-se os objetos ao JPanel criado
 Adiciona o JPanel na célula ou região
 A construção de GUIs faz-se combinando
componentes, contêiners e leiautes
adequados.

Prof. Rômulo Silva


Combinação de Leiautes -
exemplo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestaCombinacaoLeiaute


extends JFrame {

public TestaCombinacaoLeiaute(){
super("Teste de BorderLayout");
Container c = getContentPane();
c.setLayout(new BorderLayout());
JTextArea area = new JTextArea();
area.setText("linha1/nlinha2/nlinha3");
c.add(new JLabel("Nome"), BorderLayout.WEST);
c.add(new JTextField("Joao da Silva"), BorderLayout.EAST);
JPanel painelBotoes = new JPanel();
painelBotoes.setLayout(new FlowLayout()); Composição
painelBotoes.add(new JButton("Confirma")); de leiautes
painelBotoes.add(new JButton("Cancela"));
c.add(painelBotoes , BorderLayout.SOUTH);
c.add(new JTextArea("linha1\nlinha2\nlinha3"),
BorderLayout.CENTER);
setSize(400,120);
setVisible(true);
}
...
Prof. Rômulo Silva
Swing – mais Leiautes
 BoxLayout
 GridBagLayout
 CardLayout

Prof. Rômulo Silva


Swing - Eventos
 Definidos nos pacotes java.awt.event e
javax.swing.event
java.lang.Object

java.util.EventObject

java.awt.AWTEvent

ActionEvent ItemEvent ComponentEvent AdjustmentEvent

ContainerEvent FocusEvent InputEvent PainEvent WindowEvent

KeyEvent MouseEvent

Prof. Rômulo Silva


Swing - Eventos
 Gerados automaticamente pela JVM
(máquina virtual) durante a interação do
usuário com os objetos gráficos da
aplicação

 Tratamento de eventos é feito através da


criação de classes:
 Devem implementar interfaces pré-definidas
(listeners) para o tipo de evento específico
 Utilização do padrão de projetos Observer

Prof. Rômulo Silva


Swing - Listeners
 São interfaces que devem ser
implementadas por classes que tratam os
eventos < < in te r fa c e > >
ja v a . u t il. E v e n t L is t e n e r
< < in t e r f a c e > >
A c t i o n L is t e n e r
< < in te rfa c e > >
A d ju s t m e n t L is t e n e r

< < in te rfa c e > >


C o m p o n e n t L is t e n e r

< < in te rfa c e > >


C o n t a in e r L is t e n e r
< < in te rfa c e > >
F o c u s L is t e n e r

< < in t e r f a c e > >


I t e m L is t e n e r

< < in te rfa c e > >


K e y L is t e n e r

< < in te rfa c e > >


M o u s e L is t e n e r
< < in te rfa c e > >
W in d o w L is t e n e r

Prof. Rômulo Silva


Swing – Tratamento de
Eventos
 Passos:
1. Criar objetos gráficos (botões, janelas, campos
de texto, caixas de seleção, etc.)
2. Criar classes que implementam os listeners
para o eventos desejados.
3. Criar objetos das classes listeners e registrá-los
junto ao objeto gráfico correspondente.

Prof. Rômulo Silva


Tratamento de Eventos -
exemplo
import java.awt.*;
import javax.swing.*;

public class TesteTratamentoEventos extends JFrame {


public TesteTratamentoEventos() {
super("Teste de Tratamento de Eventos");
Container c = this.getContentPane();
c.setLayout(new FlowLayout());
c.add(new JLabel("Nome"));
JTextField txtNome = new JTextField("valor inicial");
txtNome.setPreferredSize(new Dimension(100,20));
JButton btnAlteraNome = new JButton("Altera");
TratadorEventoBotao t = new
TratadorEventoBotao(txtNome);
btnAlteraNome.addActionListener(t);
c.add(txtNome);
c.add(btnAlteraNome);
setSize(new Dimension(300,150));
setVisible(true); Cria e registra listener
} do botão
...

Prof. Rômulo Silva


Tratamento de Eventos –
exemplo (listener)
import java.awt.event.*; Método chamado
import javax.swing.JTextField; automaticamente
na geração de um
public class TratadorEventoBotao evento do tipo ActionEvent
implements ActionListener {
JTextField txtCampo;

public TratadorEventoBotao(JTextField txtCampo){


this.txtCampo = txtCampo;
}

public void actionPerformed(ActionEvent e){


String dadosCampo = txtCampo.getText();
txtCampo.setText(dadosCampo.toUpperCase()); //coloca em
maiusculo
}
}

Prof. Rômulo Silva


Tratamento de Eventos -
possibilidades
 Uma mesma classe pode implementar o
tratamento de vários tipos de eventos
 Implementa os métodos definidos em cada interface
Listener
public class XXX implements ActionListener, KeyListener {

public void actionPerformed(ActionEvent e){


...
}

public void keyPressed(KeyEvent e){ método de


...
} ActionListener
public void keyTyped(KeyEvent e) {
...
}
public void keyReleased(KeyEvent e){ métodos de
... KeyListener
}
}
Prof. Rômulo Silva
Tratamento de Eventos -
possibilidades
 Um mesmo objeto pode tratar o mesmo tipo de
evento para vários objetos gráficos

public class XXX implements ActionListener {


...

public void actionPerformed(ActionEvent e){


Object obj = e.getSource();
Retorna o objeto
if(obj == btn1) { que gerou o evento
...
}
if(obj == btn2){ Faz o tratamento
...
específico para
}
...
cada objeto
}
}
Prof. Rômulo Silva
Principais eventos, Listeners
e seus métodos

Prof. Rômulo Silva


Applets
 Uma aplicação que roda dentro de um browser
 Cria-se uma classe que derive JApplet para conter
os objetos gráficos
 Adição de objetos gráficos é semelhante à utilizada
com Jframes
 Deve-se sobrepor os métodos:
 void init(): inicialização de componentes do applet
 void start(): o que fazer quando o applet iniciar
 void stop(): o que fazer antes de parar
 void destroy(): o que fazer quando o applet terminar

Prof. Rômulo Silva


Applet – ciclo de vida

Prof. Rômulo Silva


Applet - exemplo
import javax.swing.*;
import java.awt.*;

public class TesteApplet extends JApplet {


Chamado automaticamente
public TesteApplet(){
} pelo browser

public void init() {


Container c = this.getContentPane();
c.setLayout(new FlowLayout());
c.add(new JLabel("Nome"));
c.add(new JTextField("Joao da Silva"));
setSize(300,130);
}
}

Prof. Rômulo Silva


Applets - observações
 Um Applet possui várias restrições por
razões de segurança:
 Não pode ler/escrever arquivos na máquina
cliente
 Não pode iniciar a execução de um programa na
máquina cliente
 Não tem acesso a maior parte das propriedades
do sistema.
 Essas restrições só podem ser alteradas
com permissão do cliente

Prof. Rômulo Silva


Exercícios
 1- Faça um programa utilizando os componentes
Swing e gerenciadores de leiaute adequados
para obter-se uma tela como abaixo:

Prof. Rômulo Silva


Exercícios
 2- Implemente o tratamento de eventos para os
botões da seguinte forma:
 Ao pressionar Copiar, o conteúdo do JTextField é adicionado
ao JTextPane
 Ao pressionar Limpar, o conteúdo do JTextField é limpado
 Ao pressionar sair, a aplicação termina a execução

Prof. Rômulo Silva


Exercícios
 3-Altere o programa do exercício anterior para
que seja exibida uma tela como abaixo:
Na área indicada da figura devem ser exibidos os formulários 1 e 2
conforme se pressiona os botões à esquerda. O formulário 1 deve ser
exatamente a tela mostrada no exercício 1. O formulário 2 deve ser
conforme a apresentação abaixo. (Sugestão: pesquise sobre o
gerenciador de leiaute CardLayout).

Formulário 1

Área de exibição de Formulários

Formulário 2

Prof. Rômulo Silva


Interfaces Gráficas
de Usuário -
complementos

Prof. Rômulo Silva


Principais Eventos e respectivos
Listeners

Prof. Rômulo Silva


Classes Adaptadoras
 Alguns listeners especificam vários métodos
 Ex.: WindowListener
• windowActivated(WindowEvent e)
• windowClosed(WindowEvent e)
• windowClosing(WindowEvent e)
• windowDeactivated(WindowEvent e)
• windowDeiconified(WindowEvent e)
• windowIconified(WindowEvent e)
• windowOpened(WindowEvent e)
 Porém, muitas vezes a aplicação necessita
tratar apenas um ou alguns métodos
especificados na interface listener.

Prof. Rômulo Silva


Classes Adaptadoras
 Usadas quando precisa-se implementar
apenas alguns métodos especificados pelo
listener
 Java fornece classes adaptadoras prontas
para alguns listeners.

 Padrão de nome:
 WindowListener -> WindowAdapter
 MouseListener -> MouseAdapter
 KeyListener -> KeyAdapter
 ...

Prof. Rômulo Silva


Classes Adaptadoras
 Implementam a interface Listener
correspondente, tal que todos os métodos
têm implementação vazia, isto é, { }

 Maneira de usar: criar classe para


tratamento de evento fazendo herança da
classe adaptadora
 E implementar apenas os métodos pertinentes à
aplicação sendo desenvolvida.

Prof. Rômulo Silva


Classes Adaptadoras – exemplo
public class MinhaAplicacao extends JFrame {
...
this.addWindowListener(new TrataEventoJanela());
...
}

// em outro arquivo
public class TrataEventoJanela extends WindowAdapter {
public void windowClosed(WindowEvent e) {
// aqui implementa-se o tratamento desejado
...
}
}

Prof. Rômulo Silva


Classes Internas
 É uma classe definida dentro de outra
classe, ou localmente dentro de um método

 Deve ser usada com critério, para evitar


criação de códigos de difícil legibilidade

 Principal uso: tratamento de eventos de


interfaces gráficas de usuário

Prof. Rômulo Silva


Classes Internas - esquema
public class ClasseExterna {
public ClasseExterna() { // construtor
...
}
...
private ClasseInterna {
public ClasseInterna() { // construtor
...
}
...
} // fim de ClasseInterna
} // fim de ClasseExterna

Prof. Rômulo Silva


Classe Interna - exemplo
public class MinhaAplicacao extends JFrame {
public MinhaAplicacao() {// construtor
...
JButton btn = new JButton(“OK”);
btn.addActionListener( new TrataEventoBotal());
...
}

// ainda dentro da classe MinhaAplicacao…


private class TrataEventoBotao implements
ActionListener {
...
public void actionPerformed(ActionEvent e) {
...
}
}// fim da classe TrataEventoBotao
}// fim da classe MinhaAplicacao
Prof. Rômulo Silva
Classe Internas - observações

 A classe interna pode ser declarada como


private, protected, public ou sem nada
(“package”)
 private: apenas a classe externa pode instanciar
objetos da classe interna
 public: outras classes podem instanciar objetos
da classe interna
 protected: somente a classe externa e as
derivadas da classe externa podem instanciar
objetos da classe interna
 “package”: todas as classe no mesmo pacote
podem referenciar a classe interna

Prof. Rômulo Silva


Classes Internas - Observações

 Classe interna tem acesso direto aos


atributos e métodos da classe externa

 Instanciação de classe interna:


Externa e = new Externa(…);
Externa.Interna obj = e.new Interna(…);

 Se definida dentro de um método não pode


fazer uso dos modificadores public,
protected e private.

Prof. Rômulo Silva


Classes Anônimas
 É uma classe interna sem nome, declarada
dentro de um método, mais precisamente
dentro de uma instrução

 A classe só existe dentro do escopo do


método

 Usada quando o objeto será criado uma


única vez

 Uso mais comum: tratamento de eventos


de interfaces gráficas
Prof. Rômulo Silva
Classes Anônimas
 Podem ser criadas a partir de uma interface
ou classe abstrata declarada anteriormente

c.metodoClasseC( new XXX() {


//aqui vem os métodos da classe anônima
});

 onde XXX é interface ou classe abstrata

Prof. Rômulo Silva


Classes Anônimas - exemplo
public class MinhaAplicacao extends JFrame {
private JTextField txt;
private JButton btn;
public MinhaAplicacao() {
... interface
txt = new JTextField(“”);
btn = new JButton(“OK”);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
txt.setText(“Tudo ok!!”);
}
} );
...
} // fim construtor de Minhaplicacao

...

} classe anônima

Prof. Rômulo Silva


Classes Anônimas – outro
exemplo
public class MinhaAplicacao extends JFrame {
public MinhaAplicacao() {
... classe abstrata
JTextField txt = new JTextField(“”);
txt.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
...
}
} );
...
} // fim construtor de Minhaplicacao

...

Prof. Rômulo Silva


JDBC (Java Database
Connection)
 Interface para conexão com bancos de
dados baseado em SQL
 Para usá-lo é preciso ter um driver JDBC
 O driver é uma implementação de interfaces que
fazem parte da especificação JDBC feita pela
Sun.
 Em geral os fabricantes dos diversos bancos de
dados (Oracle, SQL Server, MySQL, …)
implementam drivers JDBC
 Pacotes principais:
• java.sql
• javax.sql
Prof. Rômulo Silva
Pacote java.sql
 Principais Interfaces:
 SQLInput
 SQLOutput
 Driver
 Connection
 ResultSet
 Statement
 PreparedStatement
 CallableStatement

Prof. Rômulo Silva


JDBC – gerenciador de
drivers
 DriverManager
 Provê métodos estáticos para:
• Retornar um Driver
• Estabelcer uma conexão
• Registrar um driver

Prof. Rômulo Silva


JDBC – drivers mais comuns
SGBD Nome do driver JDBC Formato de URL

MySQL com.mysql.jdbc.Driver jdbc:mysql://nomeHost/no


meBanco

ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@nomeHos


t:nroPorta:nomeBanco

DB2 COM.ibm.db2.jdbc.net.DB2Driver jdbc:db2:nomeHost:nroPorta


/nomeBanco

Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:nomeHost:


nroPorta/nomeBanco

Prof. Rômulo Silva


JDBC – exemplo de utilização
String driver = “com.mysql.jdbc.Driver”;
String db_URL = “jdbc:mysql://localhost/dbPessoa”;
Class.forName(driver); // carrega driver

Connection con = DriverManager.getConnection(db_URL,


“usuario”, “senha”);
Statement cmd = con.createStatement();

ResultSet rs = cmd.executeQuery(“SELECT nome, idade


FROM Pessoa”);

while( rs.next()) { // imprime resultado da consulta


System.out.println(rs.getString(“nome”));
System.out.println(rs.getInt(“idade”));
}

Prof. Rômulo Silva

Você também pode gostar