Documente Academic
Documente Profesional
Documente Cultură
Equipe de Produo Tcnica Anlise didtico-pedaggica Prof. MSc. Jos Eduardo Pires Campos Jnior Profa. Dra Leda Gonalves de Freitas Prof. MSc. Juarez Moreira Profa. Especialista Ana Brigatti Edio Prof. Especialista Cynthia Rosa Mrcia Regina de Oliveira Yara Dias Fortuna Montagem Marcelo Rodrigues Gonzaga Anderson Macedo Silva Bruno Marques Bea da Silva Conteudista Maristela Terto de Holanda
Sumrio
Ementa ..................................................................................................6 Objetivos ...............................................................................................6 Contextualizao .....................................................................................6 Aula 01 - Introduo Linguagem Java ..........................................................7
1.1 Introduo................................................................................................. 7 1.2 Histria da Linguagem Java ............................................................................ 7 1.3 Caractersticas da Linguagem Java ................................................................... 8 1.4 Arquitetura da Mquina Virtual Java e do Byte Code ........................................... 9 1.5 Meu Primeiro Programa ................................................................................10 1.6 Diviso do Java ..........................................................................................11 1.7 Ambientes de Desenvolvimento ......................................................................14 2.1 Introduo................................................................................................15 2.2 Classes ....................................................................................................15
2.2.1 Criando uma Classe...........................................................................................16 2.2.2 Definindo um Atributo de uma Classe .....................................................................17 2.2.3 Criando Mtodos de uma Classe............................................................................18
3.4 Operadores...............................................................................................29
3.3.1 Identificadores e Palavras Reservadas ....................................................................26 3.3.2 Declarando e Inicializando uma Varivel (Tipo Primitivo) .............................................28 3.3.3 Declarando e Inicializando uma Varivel (array) ........................................................28 3.4.1 Operadores Aritmticos .....................................................................................29 3.4.2 Operadores Relacionais......................................................................................30 3.4.3 Operadores Lgicos...........................................................................................30
4.5 Polimorfismo.............................................................................................44
6.3 Genricos.................................................................................................53
Glossrio .............................................................................................. 69
Ementa
Conceitos de orientao a objetos. Classes e objetos, mtodos e atributos. Sintaxe bsica de uma linguagem Orientada a Objetos (OO). Abstrao, encapsulamento, herana, polimorfismo. Colees. Tratamento de erros e excees.
Objetivos
Geral Compreender os principais conceitos da orientao a objetos (classe, objeto, abstrao, encapsulamento, herana e polimorfismo), a sintaxe bsica da linguagem de programao Java e as principais bibliotecas do Java SE (Standart Edition). Especficos Escrever pequenos programas em Java. Conhecer e utilizar as principais ferramentas para programao Java. Aplicar os principais conceitos de OO na prtica.
Contextualizao
Atualmente, h vrias formas de escrever programas de computadores. Umas das linguagens mais utilizadas no mercado a linguagem Java. Esta linguagem no s por ser uma linguagem orientada a objetos, mas por ser uma linguagem de programao livre, vem ganhando espao no desenvolvimento de aplicaes atuais. Nesta disciplina, Linguagem de Programao I, sero apresentadas as principais caractersticas da linguagem Java; os conceitos importantes sobre orientao a objetos; e as semelhanas e diferenas com outras linguagens de programao. Voc, aluno, ter a oportunidade de explorar os principais recursos dessa linguagem, ampliando o seu conhecimento, por meio de atividades prticas, e conhecendo melhor a arquitetura e o funcionamento da linguagem de programao Java.
WebRunner, um navegador para Internet com possibilidade de fazer download e a execuo de aplicativos escritos em Java atravs da Internet. O WebRunner foi rebatizado para HotJava e lanado oficialmente, em 1995, pela Sun no evento SunWorld9. O interesse pela soluo foi muito grande, poucos messes depois, numa iniciativa indita para poca, a Sun decide disponibilizar para download gratuito na Internet um kit de desenvolvimento Java (JDK1.0 Java Development Kit). Assim, inicia-se a histria de sucesso da tecnologia Java.
Uma das marcas registradas de Java o seu mascote Duke, criado ainda no projeto Green por Joe Palrang. O Duke pode ser visto, transformado e admirado em um conjunto de fotos que explica que sua utilizao transformao livre. Consulte mais informaes em uma de suas pginas de projeto na Web.
Segura Java possui segurana em diversos nveis, possui segurana atravs da verificao do cdigo originalmente compilado, possui ainda um a API (Aplication Program Interface) prpria para criptografia e segurana.
Vir Java
tual
10
void: um tipo primitivo do Java; o valor de retorno do mtodo main(). Quando o mtodo no retorna nenhum valor, ele retorna void, uma espcie de valor vazio que deve ser especificado. main: Este um nome particular de mtodo que indica para o compilador o incio do programa.
(String args[]): atravs desse parmetro que o mtodo main (por conseqncia, o programa todo) recebe argumentos da linha de comando. Esse parmetro um array de Strings que inicializado quando os argumnetos so passados por meio da invocao do nome do programa na linha de comando do sistema operacional, por exemplo: java OiMundo arg1 arg2. Nesse caso, o array args ser inicializado com args[0] com valor arg1 e args[1] com valor arg2. Em Java, os arrays comeam na posio 0. Na terceira linha deste programa System.out.println(Oi Mundo);, temos uma instruo para escrever na sada padro a String passada como parmetro para o mtodo println, ou seja, a frase Oi Mundo. Todo programa fonte em Java um arquivo texto simples, mas existem diversos editores que podem facilitar as tarefas de edio e compilao de programas Java.
11
Java EE (Enterprise Edition) um conjunto de classes especficas para aplicaes corporativas. utilizado sempre em conjunto com as demais classes definidas na SE para construo de aplicaes mais complexas que envolvem transao, persistncia, normalmente desenvolvidas para Internet. Na Figura 1.3 abaixo, pode-se ter uma idia da sopa de letrinhas que envolve a tecnologia JEE, que so bibliotecas de componentes para aplicaes corporativas em Java.
12
Java ME (Micro Edition) a especificao de componentes para dispositivos pequenos e dispositivos mveis. Escrever para aplicaes celulares, por exemplo, deve-se utilizar as APIs (bibliotecas) definidas para o ME. A Figura 1.4 abaixo apresenta um emulador que pode ser baixado gratuitamente no site da Sun para escrever aplicaes para celulares. Figura 1.4 Emulador J ME
13
Finalizamos nossa pimeira aula. Nela tivemos o primeiro contato com a linguagem de programao Java, conhecemos um pouco da sua histria e suas principais caractersticas, vimos tambm o primeiro programa e alguns ambientes de desenvolvimento. Nas prximas aulas veremos como aplicar os conceitos da orientao a objetos em nossos programas.
14
2.2 Classes
Como j vimos em aulas anteriores, a linguagem Java orientada a objetos, isto , todos os elementos do mundo real so modelados como objetos. Os objetos so criados a partir das classes. Uma classe define a estrutura de um objeto. Uma classe especifica todos os atributos (propriedades) e mtodos (comportamento) que um objeto daquela classe pode ter. Na Figura 2.1, a seguir, tem-se uma classe automvel e trs objetos que foram gerados a partir dessa classe automvel. Figura 2.1 Classe Automvel
A classe automvel tem como atributos: cor, ano, modelo. Os mtodos so: desligar, acelerar, e ligar. A Figura 2.2 apresenta o objeto gerado por essa classe, que tem a cor laranja, ano: 2007, modelo: Punto.
15
Uma classe um prottipo que define os atributos e os mtodos comuns a todos os objetos de um determinado tipo e da prpria classe, com a finalidade de servir como molde para a criao de objetos. Dessa forma, uma classe um template, um modelo para gerar objetos. Em uma classe, os atributos representam o estado do objeto, os mtodos e a sua interao com o mundo externo. Um objeto gerado (instanciado) por meio de uma classe.
class MinhaClasse { // todo o cdigo que envolve a classe, seus atributos e mtodos }
Qualificador de Acesso Determina o acesso a essa classe por outras classes. Iremos falar sobre os possveis modificadores mais tarde. Por enquanto, deixaremos sem qualificador de acesso a nossa classe.
Class A palavra class informa que essa declarao refere-se a uma classe. Nome da Classe Em Java, por padronizao, todas as classes comeam com letra maiscula.
16
17
Agora vamos escrever os atributos da classe Automvel. Como pode ser observado a seguir, a classe Automvel tem um atributo do tipo primitivo int (ano), dois atributos do tipo da classe String, (cor, modelo), alm do atributo do tipo da classe Pneu (pneu).
class Automovel { String cor; int ano; String modelo; Pneu pneu; }
nomeMetodo(lista de parmetros) {
Modificador de acesso Define quem pode ter acesso ao mtodo. At esse momento, conhecemos os modificadores public e private. TipoDeRetorno o tipo do dado que o mtodo ir retornar. Se o mtodo no retorna nenhum valor, deve-se utilizar a palavra void. Um retorno de um mtodo pode ser do tipo primitivo ou do tipo de uma classe.
Lista de parmetros Um mtodo pode no receber parmetros, ou receber um ou mais parmetros. Para receber mais de um parmetro necessrio separ-los por vrgula. Para cada parmetro necessrio definir o seu tipo.
Return uma palavra reservada no Java que define o retorno de um mtodo. Quando o mtodo no retorna nada (tipo de retorno void), o return no deve ser utilizado no mtodo.
Agora que sabemos o que so os mtodos, vamos escrever alguns mtodos da classe Automvel. Os mtodos implementados so: o ligaMotor que tem como objetivo colocar o motor no estado ligado; o getModelo que retorna o modelo do automvel, e o setAno que atribui um ano para o automvel.
18
class Automovel { String cor; int ano; String modelo; Pneu pneu; public void ligamotor(){ //Mtodo pblico que no retorna nenhum valor e no recebe parmetros estadoMotor= true; } public String getModelo(){ //Mtodo pblico que retorna uma String e no recebe parmetros return modelo; } public void setAno (int novoAno){ //Mtodo pblico que no retorna nenhum valor e recebe um parmetro do tipo int ano = novoAno; } }
Mtodo Construtor
O mtodo construtor utilizado para definir o estado inicial de um objeto. Por meio do mtodo construtor o objeto de uma classe instanciado (criado). Como sabemos, a classe utilizada para criar objetos, e o como deve ser criado esse objeto definido no mtodo construtor. O mtodo construtor tem algumas caractersticas especiais: Tem o mesmo nome da classe. Sempre um mtodo pblico. No retorna nenhum valor. No necessria na definio do mtodo construtor a palavra void.
Uma classe pode ter vrios mtodos construtores. Quando no definido um mtodo construtor, o compilador Java cria um automaticamente sem receber nenhum parmetro. A seguir, apresentada a classe Automvel com dois mtodos construtores, um sem receber nenhum parmetro, o outro recebendo os valores iniciais dos atributos da classe Automvel.
19
String modelo; Pneu pneu; public Automovel(){ } public Automovel(String cor, int ano, String modelo){ this.cor = cor; this.ano = ano; this.modelo = modelo; } public void ligaMotor(){ estadoMotor= true; } } Quando um mtodo construtor for vazio, os objetos criados a partir desse mtodo tero seus valores iniciais correspondentes aos valores padres do tipo da varivel. Por exemplo, na classe Automvel, o ano que do tipo int ter o valor inicial 0, estadoMotor que boolean ter o valor false, e as variveis cor e Pneu que so do tipo de classes tero seus valores iniciais null.
A palavra this
No exemplo anterior, foi apresentada a palavra this no mtodo construtor do Automvel. A palavra this utilizada para fazer referncia ao atributo do objeto. utilizada para tirar ambigidade entre os nomes das variveis recebida como parmetro e o atributo da classe. Exemplo: this.ano refere-se ao atributo ano da classe Automvel, a varivel ano (sem a palavra this) refere-se ao parmetro passado para o mtodo.
20
Mtodos Sobrecarregados
Em uma classe Java podemos ter mais de um mtodo com o mesmo nome, com argumentos diferentes e talvez tipo de retorno diferente, isso se chama sobrecarga de mtodo. Sobrecarga utilizada quando necessrio que o mesmo mtodo tenha comportamento diferente de acordo com os seus parmetros de entrada. Suponha uma classe chamada Tringulo que tenha um mtodo especfico para clculo de rea. Existem diferentes formas de se calcular a rea de um tringulo: tem-se, por exemplo, o clculo do tamanho dos seus lados ou o clculo de sua base e altura. No exemplo apresentado a seguir, a classe Tringulo tem dois mtodos para o clculo da rea do tringulo. Esse um exemplo de sobrecarga, em que um mesmo mtodo (mesmo nome, calculaSalario) recebe diferentes parmetros de entrada, retornando rea do tringulo.
public class Triangulo { // ... public float calculaArea(float base, float altura){ return (base*altura)/2; } public float calculaArea(float lado1, float lado2, float lado3){ float semiPerimetro = (lado1 + lado2 + lado3)/2; return(semiPerimetro*(semiPerimetro-lado1)*(semiPerimetrolado2)*(semiPerimetro*lado3)); } }
21
Resumo de sobrecarga: Dois ou mais mtodos na mesma classe (incluindo mtodos herdados de uma superclasse) com o mesmo nome, porm com lista de argumentos diferentes, so ditos sobrecarregados. Mtodos com o nome sobrecarregados so mtodos independentes. Mtodos sobrecarregados so chamados da mesma maneira, e a definio do mtodo a ser executado ser de acordo com a lista de parmetros utilizados na chamada do mtodo.
2.3 Objetos
Um objeto uma representao abstrata de uma entidade do mundo real que tem um identificador nico, propriedades embutidas e a habilidade de interagir com outros objetos e consigo mesmo. As classes so utilizadas para criar objetos. As classes definem os atributos e o comportamento dos objetos. Depois de aprendermos a criar as nossas classes, vamos aprender a escrever os nossos objetos. Objetos so criados por meio da palavra reservada new seguida do mtodo construtor da classe referente ao objeto. Dessa forma, sempre que encontrarmos a palavra new, isso significar que um objeto est sendo criado e que o mtodo construtor da classe relacionada a esse objeto ser executado.
// A varivel gol do tipo Automvel Automovel gol; // A varivel gol vai faz referencia a um objeto do tipo Automovel gol = new Automvel(); Todo objeto do tipo Automvel ter os atributos cor, ano, estadoMotor e Pneu. Para acessar algum desses atributos, a sintaxe ser a varivel de referncia ao objeto . (ponto) e nome do atributo.
<varivel de referncia>.<atributo> A seguir, apresentado um exemplo, em que a varivel gol referencia um objeto do tipo Automvel. O atributo ano do objeto referenciado pela varivel gol 2005 e a cor Branca.
// A varivel gol do tipo Automvel declarada e o objeto criado Automovel gol = new Automvel(); // Acessando os atributos do objeto gol gol.ano = 2005; gol.cor = Branca; Para acessar os mtodos, necessrio utilizar a varivel de referncia ao objeto . (ponto) e o nome do mtodo.
22
<varivel de referncia>.<mtodo> Lembre-se de que os mtodos de um objeto podem retornar ou no algum valor. Dessa forma, os valores de retorno podem ser recibos em uma varivel. No exemplo apresentado a seguir, a varivel modelo recebe o valor do modelo que est no objeto gol.
// A varivel gol do tipo Automvel declarada e o objeto criado Automovel gol = new Automvel(); // Acessando os mtodos do objeto gol String modelo = gol.getModelo(); gol.ligaMotor(); Para finalizar esses conceitos, vamos criar um programa de uma Agncia de Automvel que vai gerar alguns objetos do tipo de automvel e vai utilizar esses objetos para apresentar os seus valores.
1. public class AgenciaAutomovel { 2. 3. public static void main(String args[]){ 4. 5. // Criando os objetos gol e punto 6. Automovel gol = new Automovel(); 7. Automovel punto = new Automovel(); 8. 9. //Acessando os mtodos do objeto referenciado por gol 10. gol.ligaMotor(); 11. gol.setModelo("Gol"); 12. gol.setAno (1999); 13. gol.setCor("Preta"); 14. 15. //Acessando os mtodos do objeto referenciado por punto 16. punto.setModelo("Punto"); 17. punto.setCor("Branca"); 18. punto.setAno(2007); 19. 20. System.out.println("Objeto Criado \n Modelo: "+gol.getModelo() + 21. "\n Cor : " + gol.getCor() + 22. "\n Ano : " + gol.getAno() ); 23. 24. System.out.println("\nObjeto Criado\nModelo: "+punto.getModelo()+ 25. "\n Cor : " + punto.getCor() + 26. "\n Ano : " + punto.getAno() ); 27. }
Sada do programa:
Objeto Criado Modelo: Gol Cor : Preta Ano : 1999 Objeto Criado Modelo: Punto Cor : Branca Ano : 2007
23
Objeto e1 tem ano igual a 23 Objeto e2 tem ano igual a 23 Todos os objetos Estaticos tm o valor 23 Como se observa, quando um atributo esttico ele pode ser acessado diretamente a partir de sua classe, sem precisar criar um objeto para acessar o atributo. Quando se chama o atributo ano da classe Esttico, chama-se um atributo da classe e no o de um objeto especfico. Um mtodo tambm pode ser esttico. Quando um mtodo esttico ele pode ser acessado diretamente pela classe, mesmo sem ter um objeto relacionado com a classe.
24
1. public class Estatico { 2. 3. public static int ano; 4. public String nome; 5. 6. public static int getAno(){ 7. return ano; 8. } 9. 10. public static void main(String args[]){ 11. Estatico e1 = new Estatico(); 12. e1.nome = "Maria"; 13. e1.ano = 23; 14. 15. Estatico e2 = new Estatico(); 16. e2.nome = "Joo"; 17. 18. System.out.println("Objeto e1 tem ano igual a " + e1.ano + " \n" + "Objeto e2 tem ano igual a " + e2.ano); 19. 20. System.out.println("Todos os objetos Estaticos tem o valor " + Estatico.getAno()); 21. } 22. }
06. public static int getAno(){ 07. return ano; 08. } 20. System.out. Sada do programa:
Objeto e1 tem ano igual a 23 Objeto e2 tem ano igual a 23 Todos os objetos Estaticos tm o valor 23
Nessa aula estudamos o que so classes e objetos, como so estruturados e como cri-los e utiliz-los. A partir da prxima aula estaremos nos aprofundando nas caractersticas especficas que essas classes e objetos podem ter.
25
3.2 Comentrios
Existem trs formas de fazer comentrios em Java, descritas a seguir:
utilizado para comentar uma linha do ponto inicial at o final da linha. Comenta um bloco. Comenta um bloco e indica o uso de documentao em Java (javadoc).
O Documentador (javadoc)
Uma ferramenta importante para documentao de programas Java o javadoc. Para aprender a utilizar o javadoc e aprofundar os conhecimentos, veja os descritores no site da Sun.
26
A Tabela 3.1, abaixo, apresenta os tipos primitivos, o respectivo tamanho em bits, os nmeros mnimos e mximos, alm da classe Wrapper correspondente. Tabela 3.1 Tipos Primitivos Tipo boolean byte char short int float * long Bits 1 8 16 16 32 32 64 -264 264 -1 -231 231 -1 Mnimo -27 Mximo 27 -1 Wrapper Boolean Byte Character Short Integer Float Long
27
double * void
64 -
Double Void
* Representaes em ponto flutuante. Uma classe Wrapper a representao de um tipo primitivo na forma de objeto.
int x, y; // Declara de x e y do tipo int x = 10; // Atribui um valor 10 a x int x = 10; // Declara de x do tipo int com valor inicial 10 char c; // Declara c do tipo char char c = A; // Declara c do tipo char com valor inicial A boolean x = true // Declara x do tipo boolean com valor inicial true (verdadeiro)
int [] x; // Declara um array unidimensional x do tipo int int x [] = new int[10]; // Declara um array com 10 elementos do tipo int int x[] = {0;1,2,3}; // Declara um array com 4 elementos 0,1,2,3
Existem algumas regras bsicas para utilizao de arrays: Arrays so sempre de um mesmo tipo. Array tem tamanho fixo e definido. S podemos acessar um ndice do array depois de inicializ-lo. No faz diferena colocar o smbolo [] antes ou depois do nome da varivel. Podemos ter arrays de mais de uma dimenso.
28
3.4 Operadores
Dividimos os operadores em aritmticos, relacionais e lgicos.
Algumas questes merecem destaque nas operaes aritmticas: Existe como na matemtica a precedncia de operadores ( * / % + - ). Em uma expresso com tipos diferentes, por exemplo, um inteiro e um double, no resultado, prevalece o nmero com maior preciso, por exemplo, na diviso do nmero 3.2/2, o resultado ser um nmero double 1,6. Quando ocorrem operaes com dois nmeros do mesmo tipo, o resultado sempre ser do mesmo tipo. Por exemplo, na diviso de um inteiro (int) por outro inteiro (int) o resultado inteiro: x = 14/3 o resultado final um inteiro com o valor 4. Existe ainda uma forma reduzida de uma expresso, por exemplo:
X += 4; equivale a x = x + 4;
29
30
31
Sintaxe:
if (expresso booleana) comando ou bloco else (opcional) comando ou bloco Exemplo: 1. public class TesteIf { 2. public static void main(String args[]){ 3. int x=10; 4. int y=15; 5. if (x>y) 6. x-=y; 7. else 8. x+=y; 9. } Qual o valor de x na linha 9? Acertou quem respondeu x igual a 25, pois, avaliando a expresso x > y na linha 5, o resultado false, portanto, no executa a linha 6; e, como existe o else na linha 7, o prximo comando ou bloco a execuo da linha 8, ou seja: atribui-se ao valor de x (10) + o valor de y (15) armazenando o resultado no prprio x. Observao importante: diferente de outras linguagens com C e C++, Java no permite a substituio da expresso booleana (true ou false) por um inteiro (0 ou 1). Outra estrutura de controle o switch que tem a sintaxe e o exemplo descrito abaixo:
switch (expresso) { case expresso1: comando ou bloco break; case expresson: comando ou bloco break; default: comando ou bloco }
32
Exemplo: 1. public class UsoSwitch { 2. public static void main(String[] args) { 3. for(int i=1; i < 5; i++){ 4. switch(i) 5. { 6. case 1 : System.out.println("Numero UM"); 7. break; 8. case 2 : System.out.println("Numero DOIS"); 9. break; 10. case 3 : System.out.println("Numero TRES"); 11. break; 12. default : System.out.println("Numero INVLIDO"); 13. } 14. } 15. } 16. } A sada desse programa :
33
Exemplo while: Figura 3.2 Programa UsoWhile.java 1. public class UsoWhile { 2. public static void main(String[] args) { 3. int x=10, y=15; 4. while(x < y){ 5. x++; 6. y--; 7. System.out.println("O valos da soma de y e x = " + (x+y) ); 8. } 9. } 10. } Quantas vezes apareceu na tela a frase O valor da soma de y e x = com o resultado de x + y =25? Acertou quem respondeu trs vezes. No primeiro teste while (x < y), o valor de x=10 e y=15, no segundo x=11 e y=14 e no terceiro e ltimo o x=12 e y=13, a partir da o x passa a ser maior que y e no entra mais na estrutura de repetio. A estrutura do tipo for tambm conhecida como lao (repetio); uma estrutura bem genrica que suporta iteraes. Sua sintaxe apresentada a seguir.
for (parmetros; condio; expresso) bloco de repetio Onde: O parmetro executado antes de o loop comear. Sempre sendo utilizado para condies iniciais. Pode conter declaraes. A condio verificada no incio do loop. O bloco ser repetido at que a condio torne-se falsa. A expresso executada depois do bloco do loop.
Veja o exemplo abaixo que imprime na tela os nmeros de 1 a 10: 1. public class UsoFor { 2. public static void main(String[] args) { 3. for (int i = 1; i < 10; i++) 4. System.out.println(i); 5. } 6. } Na primeira parte da instruo for, int i = 1 feita a definio de i e o seu valor inicial ( possvel definir o tipo de i fora do for e somente utiliz-lo com um valor inicial), a segunda parte a condio de teste (i
34
< 10), e a terceira e ltima parte (i++) representa a alterao do contador. Abaixo, temos um exemplo de uso do for junto com o exemplo do switch. 1. public class UsoSwitch { 2. public static void main(String[] args) { 3. for(int i=1; i<5; i++){ 4. switch(i) 5. { 6. case 1 : System.out.println("Numero UM"); 7. break; 8. case 2 : System.out.println("Numero DOIS"); 9. break; 10. case 3 : System.out.println("Numero TRES"); 11. break; 12. default : System.out.println("Numero INVLIDO"); 13. } 14. } 15. } 16. }
Nessa aula, conhecemos, com um pouco mais de detalhe, a sintaxe da linguagem Java. Vimos os tipos primitivos e arrays e o como utilizar os operadores, suas estruturas de controle e repetio.
35
4.2 Abstrao
O conceito de abstrao, quando aplicado ao contexto de desenvolvimento de software baseado em objetos, parte do princpio de que devemos considerar a essncia de cada objeto e no pensar em todos os detalhes de sua implementao. Abstrao: Extrair tudo o que for essencial e nada mais. Todos os conceitos de uma linguagem de programao orientada a objetos esto relacionados com fatos do mundo real. Com o conceito de abstrao isso no seria diferente. Ns estamos sempre extraindo dos objetos o que te fato nos interessa. Na Figura 4.1, abaixo, temos um exemplo de uma moto. Para o guarda, as informaes que so importantes, isto , a sua abstrao em relao ao objeto moto, : placa, cor, nmero do chassi e aplicao de multa. Para o dono da moto, as informaes importantes (sua abstrao) so: cilindrada, cor, velocidade mxima e acelerao. Figura 4.1 Exemplo de Abstrao
Da mesma forma que o guarda e o dono da moto no exemplo anterior, temos que definir, nos objetos da nossa aplicao, os dados que realmente so necessrios para a soluo do problema que devemos resolver.
36
4.3 Encapsulamento
A propriedade de encapsulamento de objetos est relacionada com a observao do mundo real, em que os atributos (caractersticas, estado) de um objeto s devem ser visto pelo prprio objeto. Apenas o prprio objeto deve decidir como apresentar os seus atributos para os outros objetos do mundo real. Na Figura 4.2, por exemplo, o Joo tem seu atributo salrio, e a forma como esse atributo ser apresentado para a sua namorada e o seu cunhado s o prprio Joo deve decidir. Para o seu cunhado, que adora pedir dinheiro emprestado, o Joo pode querer diminuir o valor do salrio por 5, por exemplo. Figura 4.2 Exemplo de Encapsulamento
Dessa forma, a propriedade de encapsulamento visa segurana e autonomia dos objetos. S o prprio objeto deve ter acesso aos seus atributos e ter autonomia sobre quais outros objetos iro acessar esses atributos e como esses outros objetos iro v-los. Com a linguagem Java, essa propriedade implementada por meio dos modificadores de acessos. Os atributos devem ter acessos privados, e mtodos pblicos devem ser criados para acessar e modificar os seus valores. Dessa forma, a propriedade de encapsulamento deve seguir os seguintes passos: Todos os atributos do objeto devem ser privados private. Os mtodos acessores para esses atributos, chamados de mtodos gets, devem ser criados e pblicos (public). Os mtodos modificadores (sets), que so utilizados para modificar os valores de um atributo de um objeto, devem ser pblicos (public). Agora, vamos encapsular a nossa classe Automvel. Os atributos devem ser privados, e os mtodos gets e sets para cada atributo devem ser pblicos. Como se pode observar no exemplo a seguir, todo mtodo get deve ter um retorno de acordo com o tipo de atributo que esse mtodo dar acesso e os mtodos set devem receber como parmetro o valor do atributo que deve ser modificado.
37
1. public class Automovel { 2. 3. private String modelo; 4. private int ano; 5. private Pneu pneu; 6. private boolean estadoMotor; 7. 8. public int getAno() { 9. return ano; 10. } 11. public void setAno(int ano) { 12. this.ano = ano; 13. } 14. public boolean isEstadoMotor() { 15. return estadoMotor; 16. } 17. public void setEstadoMotor(boolean estadoMotor) { 18. this.estadoMotor = estadoMotor; 19. } 20. public String getModelo() { 21. return modelo; 22. } 23. public void setModelo(String modelo) { 24. this.modelo = modelo; 25. } 26. public Pneu getPneu() { 27. return pneu; 28. } 29. public void setPneu(Pneu pneu) { 30. this.pneu = pneu; 31. } 32. } A sintaxe do mtodo get sempre:
4.4 Herana
Uma das caractersticas bsicas de uma linguagem orientada a objeto a propriedade de reuso. Uma das formas de implementar o reuso em Java por meio da herana. Com herana, uma classe pode herdar todas as caractersticas de uma outra classe. Assim, a propriedade de herana permite a uma classe incorporar os dados e mtodos de uma classe previamente definida.
38
Como pode ser observado na Figura 4.3 a seguir, as classes Gerente, Secretria e Programador herdam as caractersticas de um Empregado. Um Gerente um Empregado. Um Gerente pode at ter alguns atributos especializados e mtodos prprios, mas herda todas as caractersticas de um Empregado. Figura 4.3 Exemplo de Herana
Quando utilizamos herana, as classes podem ser classificadas de duas formas: Subclasses Classes que herdam caractersticas de outras classes. No exemplo anterior, as classes, Gerente, Secretria e Programador so subclasses da classe Empregado. Superclasse a classe mais geral, que tem as caractersticas que sero herdadas pelas subclasses. No exemplo da Figura 4.3, a classe Empregado a superclasse de Gerente, Secretria e Programador. A classe Gerente a superclasse da classe Executivo. Com herana possvel criar uma hierarquia de classes. Nessa hierarquia de classes a mesma classe pode ser uma subclasse e uma superclasse. No exemplo apresentado, a classe Gerente subclasse da classe Empregado, ao mesmo tempo que superclasse em relao classe Executivo. Ao implementar uma subclasse, alm de herdar as caractersticas de uma superclasse, voc pode especializar mtodos da classe ancestral e especificar novas operaes e atributos, para refinar, substituir ou estender as funcionalidades da superclasse. Quando falamos da hierarquia de classes em Java, h uma superclasse chamada Object, em que qualquer classe implementada em Java implicitamente herda as caractersticas dessa classe, pois a classe Object a superclasse de todas as classes implementadas em Java. Todas as classes implementadas em Java so, ento, subclasses da Object. Na Figura 4.4, temos uma classe Sobremesa que herda as caractersticas da classe Object. A classe Floresta Negra herda as caractersticas da classe Bolo, que herda de Sobremesa.
39
Por isso, toda classe em Java j tem alguns mtodos implcitos, como por exemplo, os mtodos toString() que gera uma String a partir do objeto, e o mtodo equals(), que analisa se um objeto igual a um outro, dentre outros. Em Java, uma classe s pode herdar caractersticas de uma nica classe. Java no d suporte herana mltipla. Como apresentado na Figura 4.5, no possvel em Java ter uma classe Anfbio que herde caractersticas de uma classe Veiculo Aqutico e uma classe Veiculo Terrestre ao mesmo tempo. Figura 4.5 Herana Mltipla
Para implementarmos herana em Java s adicionar na declarao de uma classe a palavra extends. Como apresentado a seguir, a classe Gerente herda as caracterstica da classe Empregado. Isto , Gerente uma subclasse da classe Empregado.
40
1. public class Empregado{ 2. private String nome; 3. 4. public void setNome (String novoNome){ 5. nome = novoNome; 6. } 7. public String getNome ( ){ 8. return nome; 9. } 10. }
1. public class Gerente extends Empregado { 2. 3. private float salario; 4. 5. public void setSalario (float perc){ 6. salario = salario*perc; 7. } 8. } Ao se tratar de herana em Java, voc pode fazer sempre com que um objeto mais geral (isto , um objeto do tipo da superclasse) armazene um objeto mais especializado (subclasse), mas o contrrio no verdadeiro sem uma converso explcita de tipos. A seguir, so apresentados dois exemplos, no primeiro, a varivel mamo do tipo Fruta (mais geral, superclasse) recebe um objeto do tipo Ctrica (subclasse). No segundo exemplo, teremos um erro de compilao, uma vez que a varivel laranja do tipo Ctrica no pode receber diretamente um objeto do tipo Fruta. Isso significa que todas as Ctricas so Frutas, mas nem todas as Frutas so Ctricas. 1. public class Fruta { 2. private int gramas; 3. private int caloriasPorGrama; 4. 5. public int getCaloriasPorGrama() { 6. return caloriasPorGrama; 7. } 8. public void setCaloriasPorGrama(int caloriasPorGrama) { 9. this.caloriasPorGrama = caloriasPorGrama; 10. } 11. public int getGramas() { 12. return gramas; 13. } 14. public void setGramas(int gramas) { 15. this.gramas = gramas; 16. } 17. }
41
1. public class Citro extends Fruta { 2. 3. private int acidoCitrico; 4. 5. public int getAcidoCitrico() { 6. return acidoCitrico; 7. } 8. 9. public void setAcidoCitrico(int acidoCitrico) { 10. this.acidoCitrico = acidoCitrico; 11. } 12. }
42
Todo mtodo construtor de uma subclasse deve ter como a sua primeira instruo a chamada ao construtor da superclasse, e isso realizado por meio do comando super(). A idia aqui : como toda subclasse uma superclasse com atributos e/ou mtodos especializados, ento primeiro preciso criar (instanciar) um objeto da superclasse e depois especializ-lo. Por exemplo, todo Citro Fruta, ento primeiro crio uma Fruta, e depois, o Citro, que uma Fruta especializada.
Destaque: Se o construtor da subclasse no chamar um construtor da superclasse, explicitamente, ento o mtodo construtor padro (sem parmetros) da superclasse ser utilizado. Se o construtor da subclasse no chamar um construtor da superclasse, explicitamente, ento a superclasse usa seu construtor padro. Se a superclasse no tiver construtor padro e o construtor da subclasse no chamar nenhum outro construtor da superclasse, explicitamente, ocorrer um erro de compilao. Isso o que acontece no exemplo apresentado a seguir. 1. public class Fruta { 2. private int gramas; 3. private int caloriasPorGrama; 4. 5. public Fruta(int gramas, int caloriasPorGrama) { 6. this.gramas = gramas; 7. this.caloriasPorGrama = caloriasPorGrama; 8. } 9. 10. public int getCaloriasPorGrama() { 11. return caloriasPorGrama; 12. } 13. public void setCaloriasPorGrama(int caloriasPorGrama) { 14. this.caloriasPorGrama = caloriasPorGrama; 15. } 16. public int getGramas() {
43
4.5 Polimorfismo
s vezes necessrio que mtodos dentro de uma hierarquia de classes, tenham comportamentos diferentes, apesar de ter o mesmo nome. Por exemplo, suponha que na classe de Empregado tenha o mtodo para calcular salrio. Para a Secretria, o calculo de salrio sempre retornar um valor fixo de acordo com a sua carteira de trabalho. Para o empregado do tipo Gerente, o clculo de salrio estar relacionado com a sua produo, nessa empresa, isto significa que ele ganhar uma comisso sobre cada contrato fechado. Desta forma, o mesmo mtodo (calcularSalario) pode comportar-se de maneira diferente de acordo com o objeto que est sendo manipulado. Essa caracterstica de um mesmo mtodo comportar-se de maneira diferente de acordo com o objeto instanciado chamado de polimorfismo. s vezes, o mtodo que existe na superclasse no define exatamente o comportamento que um mtodo de uma subclasse deve ter. Por exemplo, na classe Empregado, vamos supor que tivesse um mtodo de calculaSalario que retorna o salrio base (assinado na carteira de trabalho) do empregado. Quase todos os empregados tm o salrio igual ao da carteira. Esse o mais comum dentro dessa empresa. Apenas o empregado gerente tem salrio diferenciado. Alm do salrio base, ele ganha uma comisso (5% do salrio base) em cada contrato assinado. Desta forma, para os objetos da classe Gerente (subclasse de Empregado) necessrio implementar (isto , sobre-escrever) o mtodo calculaSalario.
44
1. public class Empregado{ 2. private String nome; 3. private float salarioBase; 4. 5. public void setNome (String novoNome){ 6. nome = novoNome; 7. } 8. public String getNome ( ){ 9. return nome; 10. } 11. 12. public float getSalarioBase() { 13. return salarioBase; 14. } 15. 16. public void setSalarioBase(float salarioBase) { 17. this.salarioBase = salarioBase; 18. } 19. 20. public float calculaSalario(){ 21. return getSalarioBase(); 22. } 23. } 20 public float calculaSalario(){ 21 22 } return getSalarioBase();
1. public class Gerente extends Empregado { 2. 3. private int numContratos; 4. 5. public int getNumContratos() { 6. return numContratos; 7. } 8. 9. public void setNumContratos(int numContratos) { 10. this.numContratos = numContratos; 11. } 12. 13. public float calculaSalario(){ 14. return (super.getSalarioBase() + 15. (float)(0.05*super.getSalarioBase())*getNumContratos()); 16. } 17. } 13 public float calculaSalario(){ 14 15 16 } return (super.getSalarioBase() + (float)(0.05*super.getSalarioBase())*getNumContratos());
45
Resumo de sobreescrever: Sobreescrita est diretamente relacionada com subclasses. Quando voc extends uma classe para produzir uma nova, voc herda e tem acesso a todos os mtodos no privados da classe original. Algumas vezes necessrio modificar o comportamento de um mtodo da subclasse; essa a proposta da sobrescrita do mtodo. Ao ocorrer uma sobreescrita de mtodos, a mquina virtual ir executar o mtodo da classe mais especializada (a subclasse) e no o mtodo da superclasse (sobreposio). Note que esta deciso ocorre em tempo de execuo. Diferenas entre sobrecarga e sobrescrita: Classe pai pode ser sobrescrito por mtodos da subclasse. Mtodos sobrecarregados devem ter lista de argumentos diferentes; mtodos sobrescrito devem ter lista idntica de argumentos. O tipo de retorno de um mtodo sobrecarregado pode ser escolhido livremente; o retorno de um mtodo sobrescrito deve ser idntico ao mtodo original.
Nessa aula foram apresentados conceitos fundamentais da linguagem de programao orientada a objetos e suas caractersticas importantes. Com essas caractersticas, as linguagens orientadas a objetos esto dominando o mundo de desenvolvimento de software.
46
5.2 Nmeros
Alm dos tipos primitivos, vistos na aula 3, e da definio de Classes e Objetos, vistos na aula 4, veremos agora como representar nmeros por meio da biblioteca de classes do Java.
Tabela 5.1 Mtodos Transformadores de Number Retorno Byte Int Float Long Short Mtodo .byteValue() .intValue() .floatValue() .longValue() .shortValue() Descrio Retorna o valor do objeto como um byte Retorna o valor do objeto como um int Retorna o valor do objeto como um float Retorna o valor do objeto como um long Retorna o valor do objeto como um short
47
Tabela 5.2 Mtodos de Integer Retorno Int byte Boolean Integer Mtodo .parseInt(String s) .byteValue() .equals(Object o) .valueOf(String x) Descrio Retorna um int com o valor da String Retorna o int com um byte Compara o objeto com o objeto Integer Retorna um objeto Integer dado uma String
Alm dos mtodos descritos acima, podemos consultar a relao completa dos mtodos e das constantes da classe Integer na pgina da documentao do Java.
Tabela 5.3 Mtodos de Float Retorno float byte Boolean int Mtodo .parseFloat(String s) .byteValue() .equals(Object o) .intValue() Descrio Retorna um float com o valor da String Retorna o int com um byte Compara o objeto com o objeto Float Retorna um objeto Float como um int
48
5.3 Strings
A classe String representa uma seqncia imutvel de caracteres. A linguagem Java no possui nenhum tipo primitivo do tipo String. Na aula 3, vimos como representamos um tipo primitivo char. Perceba, agora, as diferenas entre o tipo primitivo char e os objetos String. Para criar um objeto do tipo String, podemos utilizar a seguinte notao:
String nome = Fernando; String nome = new String(Fernando); char[] letras = { F, e, r, n, a, n, d, o}; String nome = new String (letras);
Enfim, opes no faltam para criarmos nossos objetos String, mas ser que todas as formas citadas acima criam os objetos da mesma maneira? Para responder esta pergunta, vamos aprender a testar a igualdade entre Strings: A primeira idia utilizar o operador = =, que nos indica se os dois objetos String apontam para o mesmo endereo em memria, ou seja, se so os mesmos objetos. Contudo, normalmente no isso
49
que queremos. Na maioria das vezes, queremos saber se o contedo das nossas Strings so iguais, ou seja, se Fernando igual a Fernando. Para essa tarefa utilize o mtodo .equals(String x) no lugar do operador de igualdade = = . Alm da classe String, a linguagem Java possui outras classes irms de String que possuem caractersticas semelhantes, mas implementaes diferentes, so elas: StringBuffer, StringBuilder e StringTokenizer. Para aprofundar o conhecimento dessas classes, acesse a documentao do Java.
As principais classes apresentadas at agora tratam de nmeros (Number, Integer e Float) e de Strings, que uma seqncia de caracteres. Essas classes tambm so conhecidas como classes bases, ou seja, elas sero muito utilizadas por outras classes em Java. Na aula 7, conheceremos outras classes interessantes que utilizam essas classes bases.
50
6.2 Pacotes
Para organizar e facilitar o uso das classes, podemos agrupar as classes relacionadas em pacotes. Alm disso, a utilizao de pacote evita problemas de conflito de nome e ajuda no controle de acesso a classes de determinado pacotes.
package aula6; public class Empregado{ // Cdigo da classe } Para a definio do nome de um determinado pacote, a Sun especificou alguns padres que devem ser obedecidos. So eles: Os nomes dos pacotes devem sempre ser escritos com todas as letras minsculas. Quando desenvolvendo um sistema em uma empresa que tem um domnio na Internet, esse domnio deve ser parte do nome do pacote. Exemplo: ao desenvolver um sistema para Catlica Virtual, que tem o domnio catolicavirutal.br, o nome do pacote deveria ter como incio br.catolicavirtual. Dessa forma, o exemplo da classe Empregado deveria estar no pacote br.catolicavirtual.aula6. Como apresentado a seguir:
51
Na Figura 6.2, o arquivo Empregado, que est no pacote br.catolicavirtual.aula6, fica armazenado fisicamente no diretrio br/catolicavirtual/aula6. Figura 6.2 Classe Empregado no pacote br.catolicavirtual.aula6
52
6.3 Genricos
Algumas vezes, dentro de uma determinada classe, podemos ter mtodos diferentes, com o mesmo comportamento, que apenas manipulam objetos de tipos diferentes. No exemplo apresentado a seguir, tem-se a classe Matemtica com trs mtodos: somaInteger, somaFloat e somaDouble. Como para usar tipos genricos precisamos trabalhar com objetos, utilizamos as classes que representam os tipos primitivos, sendo elas: Integer, Doubl e Float. 1. package aula6; 2. public class Matematica { 3. public static void exibirNumeros(Integer[] numeros){ 4. String saida = "Dados do array : "; 5. for (int i = 0; i < numeros.length; i++) { 6. saida+=numeros[i].toString() + " "; 7. } 8. System.out.println(saida); 9. } 10. public static void exibirNumeros(Double[] numeros){ 11. String saida = "Dados do array : "; 12. for (int i = 0; i < numeros.length; i++) { 13. saida+=numeros[i].toString() + " "; 14. } 15. System.out.println(saida); 16. } 17. public static void exibirNumeros(Float[] numeros){ 18. String saida = "Dados do array : "; 19. for (int i = 0; i < numeros.length; i++) { 20. saida+=numeros[i].toString()+ " "; 21. } 22. System.out.println(saida); 23. }
53
public static void main(String args[]){ //Criar array Integer[] numerosInteger = {new Integer(1),new Integer(2),new Integer(3) , new Inte ger(4),new Integer(5)}; 28. Float[] numerosFloat = {new Float(1.1),new Float(2.2), 29. new Float(3.3) , new Float(4.4),new Float(5.5)}; 30. exibirNumeros(numerosInteger); 31. exibirNumeros(numerosFloat); 32. } 33. } Esses trs mtodos que tem a mesma funcionalidade pode ser substitudo por um nico mtodo genrico. Como apresentado na classe MatematicaGenerico, a seguir: o N entre os sinais de maior e menor <N> , significa que o tipo de dado recebido pelo mtodo Genrico (pode ser de qualquer tipo). 1. package aula6; 2. public class MatematicaGenerico { 3. public static <N> void exibirNumeros(N[] numeros){ 4. String saida = "Dados do array : "; 5. for (int i = 0; i < numeros.length; i++) { 6. saida+=numeros[i].toString() + " "; 7. } 8. System.out.println(saida); 9. } 10. public static void main(String args[]){ 11. //Criar array 12. Integer[] numerosInteger = {new Integer(1),new Integer(2), 13. new Integer(3) , new Integer(4),new Integer(5)}; 14. Float[] numerosFloat = {new Float(1.1),new Float(2.2), 15. new Float(3.3) , new Float(4.4),new Float(5.5)}; 16. exibirNumeros(numerosInteger); 17. exibirNumeros(numerosFloat); 18. } 19. }
54
55
matematica.setNumeros(numerosInteger); MatematicaClasseGenerica matematica1 = new MatematicaClasseGenerica (); Float[] numerosFloat = {new Float(1.1),new Float(2.2), new Float(3.3),new Float(4.4), new Float(5.5)}; matematica1.setNumeros(numerosFloat); }
6.4 Anotaes
Anotaes fornecem dados sobre um programa que no parte do prprio programa. Elas no tm efeito direto na operao do cdigo do programa que elas anotam. Anotaes podem ser utilizadas para: Informaes ao compilador Anotaes podem ser usadas pelo compilador para detectar erro ou suprimir os alertas (warnings). Processamento em tempo de compilao ou de instalao (deployment) Algumas ferramentas utilizam informaes de anotaes para gerar cdigos, arquivos XML etc. Processamento em tempo de execuo Algumas anotaes so disponveis para ser examinadas no momento de execuo. As anotaes podem ser aplicadas na declarao de classes, campos, mtodos e outros elementos do programa.
6.4.1 Documentao
Utilizada para fornecer informaes importantes sobre o programa. Por exemplo, suponha que em cada classe o desenvolver deseja colocar o seu nome, a data que foi disponibilizado o programa e sua verso. Antes de fazer as anotaes na classe necessrio primeiro criar a anotao. A sintaxe de criao de uma anotao :
package br.catolicavirtual.aula6; public @interface Informacaoes { String desenvolvedor(); String data(); String versao() default "1.0"; } Em seguida essa anotao pode ser utilizada.
56
package br.catolicavirtual.aula6; @Informacaoes( desenvolvedor= "Maria", data= "10/05/2007", versao= "1.0" ) public class ExemploAnotacao { // Cdigo da classe } Para que esses dados sejam exibidos no javadoc, devemos utilizar a anotao chamada @Documented no incio da implementao da anotao. Como apresentado a seguir:
package br.catolicavirtual.aula6; import java.lang.annotation.Documented; @Documented public @interface Informacaoes { String desenvolvedor(); String data(); String versao() default "1.0"; } Para utilizar a anotao @Documented, deve-se importar esta anotao do pacote java.lang.annotation, pacote em que esta anotao est definida.
57
@SuppressWarnings Especifica para o compilado que ele deve suprimir os alertas que seriam gerados. No exemplo a seguir, informado ao compilador que ele deve suprimir o alerta que seria gerado pelo fato de o mtodo utilizado estar desatualizado.
public class ExemploAnotacao { @SuppressWarnings("deprecation") public void metodoDeprecated(){ } } Todo os alertas do compilador pertencem a uma categoria. Na especificao Java existem duas categorias: deprecation e unchecked. O unchecked deve ser utilizado para cdigos legados escritos antes do advento dos genricos. Quando deseja-se suprimir mais de uma categoria de alerta, utilizado a seguinte sintaxe.
58
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface Informacaoes { String desenvolvedor(); String data(); String versao() default "1.0"; }
Nessa aula apresentamos algumas caractersticas importantes da linguagem Java: os pacotes, que j uma caracterstica presente na primeira verso da especificao do Java, e os genricos e as anotaes, que so novas caractersticas da verso Java 5.0.
59
public abstract class VeiculoAquatico { abstract void definirRumo(int n); abstract void definirVelocidade(int n); }
public class Canoa extends VeiculoAquatico { void definirRumo(int n) { // cdigo } void definirVelocidade(int n) { // cdigo } } Podemos observar que a classe que abstrata VeiculoAquatico possui a assinatura de dois mtodos, ambos abstratos, e a classe que herda de VeiculoAquatico implementa obrigatoriamente todos os mtodos definidos anteriormente. As classes abstratas possuem mtodos abstratos que so mtodos que nos preocupamos com a sua assinatura e no com o seu corpo, ou seja, os mtodos abstratos no possuem implementao o objetivo utiliz-los como modelo (respeitando a sua assinatura). Quando uma classe herda de uma
60
classe abstrata ela obrigada a escrever o corpo dos mtodos abstratos ou defini-los novamente como abstratos.
7.3 Interfaces
Voc j aprendeu que os objetos interagem entre si, mas como os objetos se apresentam para o mundo exterior (para outros objetos) percebido pelos mtodos pblicos. A esses mtodos pblicos damos o nome de Interface do objeto. Muitas vezes precisamos interagir com outros objetos e no estamos preocupados com detalhes de implementao, ento basta saber o qu o objeto faz, que est definido na interface e no como esse objeto trabalha internamente, ou seja, como feita a implementao dessa interface. Um exemplo clssico para apresentar os conceitos de Interface demonstrado na figura 7.2 abaixo: Figura 7.2 Exemplo de Interface
O controle remoto um bom exemplo de interface, no controle voc as operaes bsicas (ligar, desligar, mudar de canal) todas essas aes podem ser associadas aos mtodos do objeto que implementa a interface controle remoto, note que a televiso o objeto que implementa as aes e diferentemente das classes abstratas vista na seo anterior, televiso no do tipo controle remoto.
public interface nomeDaInterface A seguir apresentada a interface AparelhoEletronico que implementa as operaes do controle remoto, que teoricamente podem servir para qualquer aparelho eletrnico:
61
public interface AparelhoEletronico { public void ligar(); public void desligar(); public void aumentarVolume(); public void diminuirVolume(); public void adiantarCanal(); public void retrocederCanal(); } Para finalizar, precisamos saber como usar as interfaces em conjunto com as demais classes java, para isso utilizamos a palavra reservada implements, permitido que uma classe implemente mais de uma interface, o que encarado por alguns autores como uma forma de implementar herana mltipla.
7.4 Colees
Colees uma parte da Linguagem Java utilizada para manipulao de um conjunto de dados relacionados. Nas primeiras verses da linguagem Java, a classe Vector (seo 7.3.1) era utilizada para manipular esses grupos de objetos. Nas verses mais novas do Java, foi implementada uma hierarquia de classes relacionadas com a classe Collection, assim como, uma maneira de manipular grupos de objetos semelhantes (colees) foi especificada (seo 7.3.2). Utilizando essas classes que manipulam as colees conseguimos desenvolver programas de maneira mais elegante e mais fcil.
62
import java.util.Vector; import javax.swing.JOptionPane; import aula4.Empregado; public class EmpregadosVector { public static void main (String args[]) { String resposta = "S"; Vector<Empregado> listaEmpregados = new Ve ctor<Empregado>(); Empregado emp; System.out.println("Quando desejar sair do cadastro "+ "Digite a letra N"); while (!(resposta.equals("N"))){ emp = new Empregado(JOptionPane.showInputDialog("D igite seu nome"), JOptionPane.showInputDialog("Digite seu cpf")); listaEmpregados.addElement(emp); resposta = (JOptionPane.showInputDialog("Deseja Co ntinuar")); } System.exit(0); } }
63
Todas as interfaces do core Java a partir da verso 1.5 so genricas. Por exemplo a interface Collection definida assim: public inteface Collection<E>... Com genricos possvel definir o tipo de dados que uma coleo pode receber, com isso, o compilador pode verificar tipos errados no momento da compilao. A seguir descrevemos cada uma das interfaces: Collection: a raiz da hierarquia das colees. Uma coleo representa um grupo de objetos conhecidos como seus elementos. Algumas colees podem ter elementos duplos. Alguns so ordenados outros no. Set: uma coleo que no pode conter elementos duplicados. List: uma coleo ordenada. Lists podem conter elementos duplicados. Queue: uma coleo utilizada para processar elementos com prioridade de processamento. Map: um objeto que mapeia chave para valor. Um Map no contm chaves duplicadas.
Existem duas colees que so as verses ordenadas de um Set e um Map, so elas: SortedSet e SortedMap.
7.4.2.2 Implementaes
Implementao so objetos de dados usados para armazenar colees, no qual implementa as interfaces descritas anteriormente. Existem vrias classes de implementao, aqui estaremos vendo as que so classificadas como de proposta geral, que so as mais utilizadas hoje em dia (Tabela 7.1). E esto resumidas na tabela abaixo.
64
Tabela 7.1 Implementaes de Colees Interface Implementao Tabela Hash + Lista LinkedHashed LinkedList
Tabela de Hash
Array dinmicos
rvores
Listas
HashSet ArrayList
TreeSet
HashMap
TreeMap
LinkedMap
Cada uma dessas implementaes fornecem todas as operaes opcionais contidas em sua interface. Todos permitem elementos null, chave e valores. Nenhuma sincronizada (thread-safe). Todos tm iteradores com deteco de falha rpido, os quais identificam rapidamente uma modificao ilegal durante a iterao. Essas novas colees, diferentemente do Vector no garantem sincronismos entre as threads pois, de uma maneira geral, as coleo so utilizadas onde a sincronizao no importante. Se for necessrio a utilizao de sincronizao com as novas colees posvel utilizar as implementaes wrapper.
7.4.2.3 Algoritmos
Os algoritmos descritos aqui so funcionalidades reutilizadas fornecidas pelas colees do Java. Todos eles vem da classe Collections, e todos tem a forma de mtodos estticos no qual o primeiro argumento a coleo na qual a operao vai ser realizada. A maioria dos algoritmos fornecidos operam com List, mas tem os que operam com qualquer instncia de Collection. Existem vrios algoritmos, aqui mostraremos o de ordenao (sort). Esse algoritmo ordena uma lista de elementos na ordem crescente de acordo com o apresentado a seguir.
65
1. 2. 3. 4. 5. 6. 7. 8. 9.
import java.util.Arrays; import java.util.Collections; import java.util.List; public class OrdemAlfabetica { public static void main(String[] args) { String[] listaNomes = {"Maria","Silvia", "Alexan dre"}; List<String> list = Arrays.asList(listaN Collections.sort(list); System.out.println(list); }
A segunda forma de utilizar a sort com um Comparator. Usando o Comparator, um conjunto com a lista dos elementos e a forma como os elementos so comparados, devem ser especificados.
1. import 2. import 3. import 4. 5. public 6. 7. 8. 9. 10. 11. 12. 13. 14. ); 15. 16. 17. 18. 19. 20. 21.
java.util.ArrayList; java.util.Collections; java.util.List; class OrdenandoData { public void ordenarData(){ List<Data> listaDeDatas = new ArrayList<Data>(); listaDeDatas.add(new Data(1976,10,30)); listaDeDatas.add(new Data(1986,4,29)); listaDeDatas.add(new Data(1981,10,20)); Collections.sort(listaDeDatas,new ComparandoData()); System.out.println("Datas Ordenandas" + listaDeDatas } public static void main(String args[]){ OrdenandoData datasOrdenandas = new OrdenandoData(); datasOrdenandas.ordenarData(); }
66
2. 3. private int ano; 4. private int mes; 5. private int dia; 6. 7. public Data(int ano, int mes, int dia) { 8. this.ano = ano; 9. this.mes = mes; 10. this.dia = dia; 11. } 12. 13. public int getAno() { 14. return ano; 15. } 16. public void setAno(int ano) { 17. this.ano = ano; 18. } 19. public int getDia() { 20. return dia; 21. } 22. public void setDia(int dia) { 23. this.dia = dia; 24. } 25. public int getMes() { 26. return mes; 27. } 28. public void setMes(int mes) { 29. this.mes = mes; 30. } 31. 32. public String toString(){ 33. return this.getDia() + "/" + this.getMes() + "/" + t his.getAno(); 34. } 35. 36. }
1. import java.util.Comparator; 2. 3. public class ComparandoData implements Comparator{ 4. 5. public int compare(Data data1, Data data2) { 6. 7. int comparaAno = data1.getAno() - data2.getAno(); 8. if (comparaAno != 0) 9. return comparaAno; 10. 11. int comparaMes = data1.getMes() - data2.getMes(); 12. if (comparaMes != 0) 13. return comparaMes; 14. 15. int comparaDia = data1.getDia() - data2.getDia(); 16. if (comparaDia != 0) 17. return comparaDia;
67
return 0; } }
Finalizamos essa aula. Nela, apresentamos conceitos importantes para a implementao de programas em Java: como classes abstratas, interfaces e colees.
68
Glossrio
API (Application Program Interface) um conjunto de bibliotecas de classes reutilizveis. Arquivo fonte o arquivo texto, de alto nvel, onde se escrevem os comandos da linguagem Java. Arrays Estrutura simples de Java que representa uma coleo de objetos.
B
Byte Code o cdigo Java compilado e que pode ser executado em qualquer ambiente que tenha uma mquina virtual Java.
C
Classe ancestral a classe que deu origem herana, tambm conhecida como classe me ou progenitora. Compilador Ferramenta utilizada para transformar cdigo fonte em cdigo compilado, no caso de Java, para transformar em byte code. CORBA (Common Object Request Broker Archtecture) uma arquitetura para objetos distribuda e suportada pela linguagem Java. Core o ncleo da linguagem; a parte central, fundamental, o corao da linguagem, as principais classes e ferramentas.
D
Download Processo de baixar programas, normalmente da Web. Duke o mascote de java.
F
Framework Conjunto de aplicativos e ferramentas para uma atividade especfica, por exemplo Framework Java Web (conjunto de ferramentas Java para desenvolvimento Web).
69
H
Herana mltipla quando herdamos de mais de uma classe. Em java, no permitido herana mltipla.
J
Javax.swing API para interfaces grficas em Java. JDK Kit de desenvolvimento Java - do ingls java development kit.
L
Linguagem C Linguagem de programao estruturada muito conhecida e utilizada pela comunidade.
M
Mquina Virtual Java uma mquina imaginria implementada por software que simula uma mquina real, tornando possvel a portabilidade de programas Java. responsvel pelo tratamento de heterogeneidade entre plataformas. Mtodo Construtor um mtodo especial em Java que serve para inicializar os valores de um objeto. Tem o mesmo nome da classe e no possui tipo de retorno. Toda classe possui um construtor, se no escrevermos um, o compilador gera um automaticamente.
O
Oak (carvalho) Em funo de uma rvore que existia em frente ao escritrio de James Gosling. Primeiro nome da linguagem Java.
P
Package Pacote, organizao de diretrios em Java.
R
RMI (Remote Method Invocation) uma API de Java que d suporte programao distribuda, ou seja, a invocao de mtodos remotos como se fossem locais.
T
Threads API de Java que permite rodar os programas em mais de uma linha de execuo.
70
Thread-safe Thread segura, ou processo seguro. Tipada Uma linguagem de programao tipada quanto existe a verificao dos tipos de dados das variveis. Tipo primitivo um tipo de varivel nativa da linguagem Java. Por exemplo: int, float, double, void, char e boolean.
W
Wrapper uma classe mapeadora, ou seja, representa um tipo primitivo como se fosse uma classe.
71