Você está na página 1de 64

Iniciao ao Java:

Com orientao a objetos


Mrcio Francisco Campos

Verso 11 de outubro de 2006

ndice
INTRODUO. ____________________________________________________________________ 4 PARTE ZERO INTRODUO. _____________________________________________________ 5 CAPTULO 1 CONCEITOS BSICOS._______________________________________________ 5 1.1 A LINGUAGEM E A PLATAFORMA JAVA._______________________________________________ 5 1. 2 INSTALANDO JAVA. _____________________________________________________________ 5 1.3 A SINTAXE BSICA DO JAVA._______________________________________________________ 6 1.3.1 Execuo de um programa Java. _____________________________________________ 6 1.3.1 Comentrios. _______________________________________________________________ 7 1.3.2 Tipo de dados e variveis. _____________________________________________________ 7 1.3.3 Operadores. ________________________________________________________________ 8 1.3.4 Controle de fluxo. __________________________________________________________ 11 1.3.5 Laos.____________________________________________________________________ 12 1.3.6 Caracteres(char) e Conjunto de caracteres (String). _______________________________ 13 1.3.6 Vetores___________________________________________________________________ 14 1.3.7 Exemplos._________________________________________________________________ 14 1.5 A PLATAFORMA JAVA. __________________________________________________________ 16 PARTE UM CONCEITOS INICIAIS. _______________________________________________ 18 CAPTULO 2 - CLASSES E OBJETOS _______________________________________________ 18 2.1. CONCEITOS DE CLASSES E DE OBJETOS. _____________________________________________ 18 2.2. EM JAVA. ____________________________________________________________________ 19 2.4. EXERCCIOS. __________________________________________________________________ 21 CAPTULO 3 - VARIVEIS E MTODOS DE OBJETOS E DE CLASSES. ________________ 22 3.1. CONCEITOS DE VARIVEIS E MTODOS DE UM OBJETO E DE UMA CLASSE. __________________ 22 3.2. EM JAVA. ____________________________________________________________________ 22 3.4. EXERCCIOS. __________________________________________________________________ 26 CAPTULO 4 - MENSAGENS E VISIBILIDADE. ______________________________________ 27 4.1. CONCEITOS DE MENSAGENS E VISIBILIDADE. _________________________________________ 27 4.2. EM JAVA. ____________________________________________________________________ 27 4.4 EXERCCIOS. __________________________________________________________________ 31 CAPTULO 5 - SOBRECARGA. _____________________________________________________ 32 5.1. INTRODUO._________________________________________________________________ 32 5.2. EM JAVA. ____________________________________________________________________ 32 5.4 EXERCCIOS. __________________________________________________________________ 34 CAPTULO 6 DELEGAO E COMPOSIO. ______________________________________ 35 6.1 INTRODUO. _________________________________________________________________ 35 6.2. EM JAVA. ____________________________________________________________________ 35 6.4.EXERCCIO. ___________________________________________________________________ 38 CAPTULO 7 - HERANA. _________________________________________________________ 39 7.1. INTRODUO._________________________________________________________________ 39 7.2 EM JAVA._____________________________________________________________________ 39 7.4. EXERCCIOS. __________________________________________________________________ 42 CAPTULO 8 CLASSES ABSTRATAS.______________________________________________ 43

8.1. INTRODUO._________________________________________________________________ 43 8.2. EM JAVA. ____________________________________________________________________ 43 8.3 EXERCCIOS ___________________________________________________________________ 45 CAPTULO 9 - INTERFACES. ______________________________________________________ 46 9.1. INTRODUO._________________________________________________________________ 46 9.2 EM JAVA._____________________________________________________________________ 46 9.3 EXERCCIOS ___________________________________________________________________ 49 CAPTULO 10 ESTUDO DE CASO. ________________________________________________ 50 10.1 O CASO. ____________________________________________________________________ 50 PARTE DOIS INTRODUO AOS PRINCPIOS DE PROJETO OO: PADRES. _________ 57 CAPTULO 11 PRINCPIOS E PADRES. __________________________________________ 57 11.1 O PADRO ESPECIALISTA DA INFORMAO. _______________________________________ 58 11.2 O PADRO DE CRIAO. ______________________________________________________ 58 11.3 O PADRO BAIXO ACOPLAMENTO. ______________________________________________ 59 11.4 O PADRO ALTA COESO._____________________________________________________ 60 11.4 O PADRO CONTROLADOR. ____________________________________________________ 60 11.5 EXEMPLO UM. ________________________________________________________________ 60 REFERNCIAS BIBLIOGRFICAS._________________________________________________ 63

Introduo.
Os livros de Java costumam tratar da linguagem em seus principais aspectos sintticos e semnticos. Sem dvida este um aspecto importante para a divulgao desta linguagem. Entretanto, a linguagem Java est intimamente ligada a conceitos de orientao a objetos. Se estes conceitos no estiverem bem entendidos programar Java ser um martrio. Este livro trata do aprendizado da linguagem Java, mas sob os aspectos da orientao a objetos. Desta forma, este livro no um tratado sobre a linguagem Java. Assim, no se encontrar nestas pginas um guia completo de referncia linguagem. Os conceitos apresentados de Java so aqueles suficientes para introduzir os conceitos respectivos de orientao a objetos. De maneira geral, o elo principal do documento o de ensinar Java sob o foco dos conceitos de orientao a objetos e vice-versa. atravs desta nfase que se mostrar como a linguagem Java est concebida. Somente desta forma se poder aproveitar e entender os conceitos da linguagem. Na atual verso o livro composto de duas partes. A primeira para instroduzir ao leitor os conceitos iniciais da linguagem. Na segunda parte apresenta-se os conceitos de orientao a objetos. Destaca-se que este livro no tem por objetivo ensinar a programar. Assim o leitro deve estar familiarizado com programao devemdo saber conceitos bsicos de tipos, variveis, laos etc. Para a realizao dos exemplos necessrio a instalao da maquina virtual Java que pode ser baixada de www.Java.sun.com e de um ambiente de programao, como por exemplo o SCITE, encontrado em www.scintilla.org.

Parte Zero Introduo.


Este parte tem como objetivo apresentar um pripeiro contato com a linguagem Java. A tentativa de apresentar os conceitos sem necessariamente entrar em conceitos de orientao a objetos. difcil devido a prpria natureza da linguagem. Esta parte considera que o leitor j tenha alguma noo de programao e procura ser uma ponte incial para as estruturas comuns entre as linguaguens de programao. A Parte Um tratar dos conceitos de orientao a objetos, sendo que apartir destes conceitos o leitor pode aproveitar efetivamente o poder desta linguagem.

Captulo 1 Conceitos Bsicos.


1.1 A linguagem e a plataforma Java.
Em 2005 faz dez anos da linguagem Java. Nos dias de hoje seria diminuir a tecnologia Java a meramente uma linguagem de programao como qualquer outra. O que Java se tornou foi uma verdadeira plataforma de especificao de sistemas. Originalmente pretendia-se que Java fosse empregada na programao de produtos eletrnicos. As linguagens C e C++ no atendiam as necessidades que se desejavam da nova linguagem, pois necessitavam ser compiladas para cada tipo especfico de processador. Alm do mais o ciclo de vida dos produtos eletrnicos so maiores que os de software e haveria de se manter a compatibilidade retroativa [Hoff, Shaio e Strbuck, 1996]. Assim em 1990 James Gosling iniciou o projeto de linguagem de programao apropriada a este tipo de nicho: aparelhos eletrnicos: a linguagem Java foi criada. O anncio oficial da linguagem foi feito em maio de 1995 na conferncia da Sun World em San Francisco. As caractersticas da linguagem Java so sua abordagem para orientao a objetos, compilada e independente de arquitetura de computadores. Estas caractersticas possibilitam a esta linguagem ser robusta e extensvel. Atualmente, Java deixou de ser sinnimo de uma linguagem de programao. Pode-se fazer sistemas que rodem em desktop, em rede, para a internet, para a WEB, com processamento distribudo, para rodar em celulares e palms, entre outros.

1. 2 Instalando Java.
Para programar em Java necessrio seguir alguns passos para se configurar o ambiente. O primeiro passo baixar o SDK, ou o Kit de Desenvolvimento de Software Java, e instala-lo em sua mquina. Faa a instalao correspondente ao seu ambiente computacional (Windows, Linux etc.). Na instalao voc escolher um diretrio onde os programas javas residiro, por exemplo: c:\Java.

O prximo passo a escolha de um ambiente de programao. De forma simplificada pode-se optar pelo prprio bloco de notas como o ambiente de programao. Para usa-lo digite o programa Java e salve o programa com extenso java e entre aspas, exemplo: MeuPrimeiroPrograma.java. Ao salvar o seu programa voc o encontrar no diretrio especificado por voc com a extenso Java. Ao compil-lo, e se houver erros, voc encontrar os erros listados. Se no houver erros, o compilador java ter gerado o arquivo com extenso class, por exemplo MeuPrimeiroPrograma.class. Os arquivos .class so os executveis do Java. Utilize o programa javac, no ambiente DOS, para compilar o seu programa, tal como: javac MeuPrimeiroPrograma.Java Para executar o programa com extenso class use o programa java, tal como:

MeuPrimeiroPrograma. Se os programas javac ou java no estiverem sendo encontrados voc dever criar ou atualizar a varivel de ambiente CLASSPATH que indicar o caminho de seu diretrio onde o Java foi instalado. Se preferir, existem outros ambientes mais apropriados para programao tais como o Scite e o Gel, ambos em software livre. Outros ambientes mais profissionais so o Netbeans e o Eclipse. Neles estes detalhes j esto, em sua maior parte, integrados ao ambiente.

1.3 A sintaxe bsica do Java.


A programao bsica do Java segue os mesmos princpios de qualquer outra linguagem, tipos, controle de fluxo, repetio entre outros. Em geral a sintaxe Java muito semelhante a sintaxe da linguagem C. A sintaxe de classes e objetos ser vista mais adiante, nos prximos captulos. Assim temos:

1.3.1 Execuo de um programa Java.


Esta seo ilustra como executar um programa em Java. Na realidade o que se estar fazendo a execuo de uma classe Java, mas por enquanto fica-se como est. Um exemplo de um cdigo java o que mostrado no cdigo 11. public class MeuPrimeiroPrograma //1 //2 //3

Public static void main (String[ ] args) {

System.out.println (este o meu primeiro programa; } //4 } //5

Cdigo 1.1 tipos de variveis em Java - baseado no Java tutorial

Repare na linha 1 que definido uma classe em java que a classe MeuPrimeiroPrograma. Este programa dever ser salvo com a extenso .java e quando compilado voc encontrar no mesmo diretrio o arquivo MeuPrimeiroPrograma.class.

1.3.1 Comentrios.
// comentrios at o fim da linha. /* indicadores d incio e de fim de comentrios */

1.3.2 Tipo de dados e variveis.


Uma varivel um item de dado nomeado, com um identificador simblico. Para cada varivel definida deve-se declarar um nome e um tipo. Uma declarao tpica em Java : tipo nome_da_varivel. Toda varivel, quando definida, possui um escopo de existncia. Este escopo determina onde a varivel pode ser referenciada. O escopo em Java definido pelo conjunto de chaves { e }. Assim, no exemplo do cdigo 1.1 as variveis definidas somente existem dentro do funo main. Java possui um conjunto de tipos primitivos que esto disponveis na linguagem. Seguem abaixo uma lista deles:

boolean byte short char int float double long

corresponde a um valor verdadeiro ou falso. corresponde a um valor inteiro com sinal de 8 bits. corresponde a um valor numrico com 16 bits. corresponde a um caractere Unicode de 16 bits. corresponde a um valor numrico inteiro com sinal de 32 bits. corresponde a um valor numrico em ponto flutuante de 32 bits. corresponde a um valor numrico em ponto flutuante de 64 bits. corresponde a um valor numrico inteiro com sinal de 64 bits.

O exemplo ilustra a utilizao dos tipos em Java.

public class DemoVariaveis { public static void main(String args[]) { // inteiros byte umByte = 1;//o maior valor 127 short umShort = 55; //o maior valor 32767

int umInteger = 127;//o maior valor 2147483647 long umLong = 5000L;//o maior valor 9223372036854775807

// nmeros reais float umFloat = 13.336F;//o maior valor 3.40282e+38

double umDouble = 36.725D ;//o maior valor 1.79769e+308

// outros tipos primitivos char umChar = 'S'; boolean umBoolean = true;

// mostrando-os System.out.println("O valor de umByte " + umByte); System.out.println("O valor de umShort " + umShort); System.out.println("O valor de umInteger "+ umInteger); System.out.println("O valor de umLong " + umLong); System.out.println("O valor de umFloat "+ umFloat); System.out.println("O valor de umDouble " + umDouble); System.out.println("O valor de umChar " + umChar); System.out.println("O valor de umBoolean "+ umBoolean); } } Cdigo 1.2 tipos de variveis em Java - baseado no Java tutorial

1.3.3 Operadores.
Java possui vrios tipos de operadores que podem possuir um(ex.: i++), dois (ex.: =) ou trs operandos (?:). Operadores, quando relacionados de forma apropriada, compem uma expresso. Nesta sesso trs tipos de operadores sero apresentados: os aritmticos e os relacionais e os lgicos. Os operadores aritmticos so apresentados na tabela 1.1. Operador + * / % Exemplo 5 + 4 5 - 4 5 * 4 20 / 5 20 % 5 Descrio A expresso 5 + 4 retorna o valor 9. A expresso 5 4 retorna o valor 1. A expresso 5 * 4 retorna o valor 20. A expresso 20 / 5 retorna o valor 4.

A expresso 20 % 5 calcula o valor do resto da diviso de 20 / 5 que zero. Tabela 1.1 operadores aritmticos

O cdigo 1.2 ilustra o uso de operadores aritmticos. Verifique que quando em uma expresso aritmtica pode possuir operandos de tipos numricos diferentes tais como long, short e int. Neste caso as converses so feitas de forma apropriada. public class DemoExpAritmetica { public static void main(String[] args) { //variveis int i = 20; int j = 5; double x = 13.465; double y = 8.11;

//operadores arimticos System.out.println("Operadores aritmticos"); System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" i + j = " + (i + j)); x + y = " + (x + y)); i - j = " + (i - j)); x - y = " + (x - y)); i * j = " + (i * j)); x * y = " + (x * y)); i / j = " + (i / j)); x / y = " + (x / y)); i % j = " + (i % j)); x % y = " + (x % y));

//misturando tipos System.out.println("Misturando tipos); System.out.println(" System.out.println(" } } Cdigo 1.3 operadores aritmticos baseado no Java Tutorial j + y = " + (j + y)); i * x = " + (i * x));

Os operadores relacionais compem expresses booleanas que retornam valores verdadeiros ou falsos. A tabela 1.2 lista os operadores relacionais.

Operador

Exemplo

Descrio

>

5 > 4

Cinco maior que quatro, a expresso retorna o valor verdadeiro. Cinco maior que quatro, a expresso retorna o valor verdadeiro. A expresso 4>= 4 tambm retornaria verdadeira. Cinco maior que quatro, logo a expresso retornaria falsa. Cinco maior que quatro, logo a expresso retornaria falsa. Cinco no igual a quatro, logo a expresso retornaria falso. Cinco no igual a quatro, logo a expresso retornaria verdadeira.

>=

5 >= 4

< <= == !=

5 < 4 5 <= 4 5 == 4 5 != 4

Tabela 1.2 operadores relacionais

O cdigo 1.2 ilustra o uso de operadores relacionais. public class DemoExpRelacionais { public static void main(String[] args) { //variveis int i = 37; int j = 42; int k = 42; System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" } } Cdigo 1.4 operadores relacionais baseado no Java Tutorial Os operadores lgicos quando agrupados compem uma expresso lgica. Uma expresso lgica retorna um valor verdadeiro ou falso. Os operadores lgicos so o E, o OU e o NO. Em Java estes opradores so representados pelos smbolos &&, || e ! respectivamente. A tabela 1.3 exemplifica a aplicao destes operadores. Operador && Exemplo (5 > 4) && (6 > 5) Descrio A expresso retorna verdadeiro, pois ambas as expresses, (5 > 4) e (6 > 5), so verdadeiras. De outra forma a expresso retornaria falso. i > j = " + (i > j)); i >= j = " + (i >= j)); i < j = " + (i < j)); i <= j = " + (i <= j)); i == j = " + (i == j)); i != j = " + (i != j)); //false //false //true //true //false //true

10

so verdadeiras. De outra forma a expresso retornaria falso. A expresso retorna verdadeiro, pois pelo menos uma das expresses, (5 > 4), verdadeira. De outra forma retornaria falso.

||

(5 > 4) || (3 > 6)

! (5 > 4)

A expresso retorna falso pois a expresso (5 > 4) verdadeira Tabela 1.1 operadores lgicos

O cdigo 1.4 mostra aplicao destes operadores. public class DemoExpLogicas { public static void main(String[] args) { //variveis int i = 37; int j = 42; int k = 42; //mostra os valores das expresses System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" } } Cdigo 1.5 operadores lgicos baseado no Java Tutorial i > j = " + (i > j)); //false k >= j = " + (k >= j)); j < i = " + (j < i)); j <= i = " + (j <= i)); i == j = " + (i == j)); i != j = " + (i != j)); //true //false //false //false //true

1.3.4 Controle de fluxo.


Considere o cdigo, apenas ilustrativo, 1.2 a seguir.

if

(booleano) {

/* lista de comandos */ }

else if (booleano) { /* lista de comandos */} else { /*lista de comandos *} Cdigo 1.6 exemplo de sintaxe do comando if-then-else.

11

Onde se l (booleano) entende-se como uma expresso que retorne um valor booleano, por exemplo, a expresso (5>4) retorna valor verdadeiro. Para v-lo funcionando necessrio executar o cdigo 1.3.

public class IfThen { //1 public static void main(String args[]){ //2 if (5>4) { System.out.println ("cinco maior que quatro");}//3 else {System.out.println ("cinco menor que quatro");}//4 } //5 } //6 Cdigo 1.7 usando o comando if-then-else.

1.3.5 Laos.
O comando for possui a seguinte sintaxe: for (expresso; expresso booleana; expresso) { /* lista de comandos */ }; Cdigo 1.8 exemplo de sintaxe do comando for.

Para v-lo funcionando necessrio executar o cdigo 1.5. public class UsodoFor { public static void main(String args[]){ for (int i=0; i<10; i++) { System.out.println("teste do for");} } } Cdigo 1.9 usando o comando for. //1 //2 //3 //4 //5 //6

O comando while possui dois tipos, a saber: While (booleano) { /*lista de comandos */ } ou Do { /* lista de comandos */ } while (booleano);

Cdigo 1.10 exemplo de sintaxe do comando while.

Para v-lo funcionando necessrio executar o cdigo abaixo. public class WhileUm { //1

12

public static void main(String args[]){ int i= 0; while (i<10) { System.out.println("teste do for"); i++; } } }

//2 //3 //4 //5 //6 //7 //8

Cdigo 1.11 exemplo de sintaxe do comando WhileDo. ou public class DoWhile { public static void main(String args[]){ int i= 0; do { System.out.println("teste do for"); i++; } while (i<10); } } //1 //2 //3 //4 //5 //6 //7 //8 //9 //10 Cdigo 1.12 exemplo de sintaxe do comando DoWhile.

1.3.6 Caracteres(char) e Conjunto de caracteres (String).


Java possui dois outros tipos de variveis: a que especifica um caracter e que especifica um conjunto de caracteres. O tipo char j foi apresentado na seo acima. O cdigo 1.9 ilustra o uso destes dois tipos. Verifique que o tipo String se incica com uma letra maiscula. Ser visto na outra parte deste livro que na realidade este tipo uma Classe Java, mas por enquanto estes conceitos sero deixados para serem expostos mais adiante. Certifique-se, entretanto, de sempre escrever String com letra maiscula. public class DemoCharString { public static void main(String args[]){ char umchar= a; char outrochar= b; String umaString; umaString = umchar + outrochar; // o operador + concatena dois caracteres ou //de caracteres //1 //2 //3 //4 //5 //6 um conjunto

13

System.out.println (umchar + umchar);

//7

System.out.println (outrochar + outrochar); //8 System.out.println (umaString + umaString); } } //9 //10 //11 Cdigo 1.13 exemplo de cdigo com tipo char e String.

1.3.6 Vetores
Vetores so uma das formas de se armazenar um conjunto de valores de um mesmo tipo ou de uma mesma estrutura. Em muitos livros costuma-se utilizar o nome em ingls: Array. Em Java a notao de veotres feita utilizando-se o smbolo de colchetes [ ]. O exemplo abaixo ilustra a definio de vetores: public class DemoVetores { public static void main(String args[]){ char[ ] alfabeto; String[ ] nomes; // inicializao dos vetores. alfabeto = new char[26]; alfabeto[0] = a; nomes = { marcio, Jorge, Vera} // mostra valores dos vetores System.out.println (alfabeto + alfabeto[0]);//8 System.out.println (nomes + nomes[0]); System.out.println (nomes + nomes[1]); System.out.println (nomes + nomes[2]); } } Cdigo 1.14 exemplo de declarao de vetores. //9 //10 //11 //12 //13 // 5 // 6 // 7 //1 //2 //3 //4

Verifique que na linha trs e quatro so declarados os vetores. Nas linhas cinco e sete so mostradas algumas das formas de inicalizao de um vetor: inicalizando-se a estrutura ou com os prprios valores. A linha seis mostra que a primeira posio de um vetor em Java correspodne ao valor zero.

1.3.7 Exemplos.
Para iniciar os exemplos utilizaremos duas funes bsicas: Integer.parseInt (String umaString) e Float.parseFloat(String umaString). Estas duas funes, a primeira de

14

inteiro e a segunda de nmeros decimais possuem como parmetro uma String e como resultado a tranasformao da referida String em Inteiro ou em um nmero decimal. Para executar os exemplos necesrio tambm saber o que significa o comando: public static void main (String args[ ]); . Este comando estrar associado a todos os programas

mostrados nos exemplos. Este comando significa que quando se executa o programa/classe a funo mais que levada a cabo. Esta funo aceita como parmetro uma varivel que definida com o args e que um vetor de Strings. No caso em dos exemplos os valores sero passados atravs deste parmatro. Aps compilar este programa/classe deve-se da linha de comando em DOS executar a seguinte instruo: java Maior 1 2 <enter>.

Veja os exemplos abaixo: public class Maior { public static void main(String args[ ]) { int umInteiro; int outroInteiro; umInteiro = Integer.parseInt(args[0]); //1 //2 //3 //4 //5

outroInteiro = Integer.parseInt(args[1]);//6 if (umInteiro > outroInteiro) { //7

System.out.println(" o maior " + umInteiro); //8 } //9

else System.out.println(" o maior " + outroInteiro); //10 } } Cdigo 1.15 exemplo MaiorNmero. No exemplo acima repare o a declarao da funo do programa/classe na linha 2. Na linha 3 e 4 so declarados as variveis inteiras que sero compradas. Nas linhas cinco e seis so os valores de args so convertidos para inteiro. Por fim na linha sete os valores so comprados e mostrado o maior. public class CalculadoradeInteiros { //1 //11 //12

// esta calculadora opera com numeros inteiros sendo definidas apenas // tres operaes. Para soma utilize +; para subtrao utilize -; e para multiplicao // utilize qualquer outro caracter ou o carcater "*" (com dupla // aspas). public static void main(String args[ ]) { int umInteiro; int outroInteiro; int resultado; //2 //3 //4 //5

15

char operador; umInteiro = Integer.parseInt(args[0]); operador = args[1].charAt(0); outroInteiro = Integer.parseInt(args[2]); if (operador == '+') { resultado = umInteiro + outroInteiro; } else if (operador == '-') { resultado = umInteiro - outroInteiro; } else { resultado = umInteiro * outroInteiro; }

//6 //7 //8 //9 //10 //11 //12 //13 //14 //15 //16 //17 //18

System.out.println ( " o resultado " + resultado); //19 } } Cdigo 1.16 exemplo calculadora. //20 //21

No cdigo acima verifica-se que so os parmatros passados. O primeiro o primeiro operando, o segundo o operador e o terceiro o segundo operando. O primeiro operando obtido atravs da aplicao da funo parseInt na linha sete e nove. A linha oito obtm o operador atravs da aplicao da funo charAt (0). As linhas 10, 13 e 16 testam o tipo de operao. A linha 19 mostra o resultado.

1.5 A plataforma Java.


Atualmente Java possui trs plataformas de desenvolvimento. J2ME (Java 2 Platform, Micro Edition), Java 2 Platform, Standart Edition(J2SE) e J2EE (Java 2 Plataform, Enterprise Edition). A plataforma J2ME a plataforma para dispositivos tais como telefones, palm etc. Em geral esta plataforma se presta ao desenvolvimento de aplicaes com limites de recursos e de memria de computador. A plataforma J2SE a plataforma padro de desenvolvimento, incluindo capacidade para o desenvolvimento de applets e Java beans. Esta plataforma se aplica ao desenvolvimento de sistemas centrados em rede e desktop. Esta plataforma possui dois produtos: o Java 2 SDK, Standart Edition e o Java 2 Runtime Environment, Standart Edition. O primeiro um conjunto de principal de API da linguagem de programao Java.

16

A plataforma J2EE a plataforma para o desenvolvimento de aplicaes comerciais em larga escala. Neste caso a plataforma se aplica a sistemas de misso crtica e de conectividade com a web. A plataforma base da J2EE a J2SE.

17

Parte Um Conceitos Iniciais. Captulo 2 - Classes e Objetos


2.1. Conceitos de Classes e de Objetos.
Orientao a Objetos uma forma de interpretar, modelar e entender o mundo sob a perspectiva de objetos. Assim, dois conceitos so importantes: o de Classes e o de Objetos. O entendimento destes conceitos vital para todo o aprendizado Java e de orientao a objetos, portanto fique atento! Uma boa introduo a Classes e Objetos pode ser encontrada em Deitel[2005] e Larman[2004]. Objeto um conceito bsico quando se trata deste tema, j que o ncleo de todos os outros conceitos. Em termos prticos, tudo a nosso redor pode ser considerado objeto: papel, lpis, computador, carro, estante etc. Objetos no se resumem a objetos visveis ou concretos, eles podem ser tambm objetos abstratos: amizade, saldo, felicidade, amor etc. Dois conceitos esto associados a objetos: eles possuem estados, expressos em variveis/atributos, e comportamentos, que expressam funcionalidades/mtodos/operaes. Por exemplo: um lpis possui como estado a cor, o tipo, o comprimento. Possui tambm comportamento tais como: escrever e apagar. Assim, as variveis de um objeto guardam o estado de um objeto e os mtodos se aplicam as aes que modificam os estados do objeto. Desta forma quando se faz referncia a um objeto consideram-se estes dois componentes de forma integrada. Esta perspectiva se diferencia da forma tradicional de perceber o mundo como um conjunto de funcionalidades e um conjunto de dados de forma meramente interrelacionada. Logo, uma possvel definio de objetos pode ser: Um objeto um artefato de software que composto por um conjunto de variveis e os respectivos mtodos. A ilustrao da FIGURA 1 mostra um exemplo de objetos. Varivel: nome Mtodo: Responde chamada Varivel:email Objeto aluno: Jos Figura 2.1. Um objeto

Uma das caractersticas da Figura 1 que os mtodos do objeto envolvem as variveis do mesmo. De maneira geral, os valores das variveis do objeto somente podem ser obtidos via um mtodo especfico.

18

Diz-se que as variveis, neste caso, esto encapsuladas pelos mtodos, ou seja, estas variveis no esto visveis a outros objetos para acessa-las necessrio a utilizao de um mtodo. No mundo a nossa volta presenciamos vrios objetos de um mesmo tipo. Por exemplo, sabemos qual o conceito de lpis. Sempre que algum nos fala de um lpis sabemos qual o conceito de que se est falando, suas principais variveis e seu comportamento tpico. Desta forma, quando nos referenciamos a conceitos, e no a objetos, estamos tratando de classes. Logo, uma definio para classe : uma classe uma referncia, um conceito que estabelece quais os mtodos e quais as variveis so comuns a todos os objetos desta classe. Se classes so conceitos e objetos existem na realidade ento necessrio criar objetos a partir da classe. O processo de criao de um objeto a partir da classe denominado instanciao. Assim todos os objetos que existem em um determinado momento foram, de alguma forma instanciados a partir de uma classe. No existe objeto sem uma classe referncia. Em orientao a objetos os objetos s existem se estes foram criados em um processo de instanciao de uma determinada classe.

2.2. Em Java.
Java uma linguagem totalmente Orientada a Objetos. Esta linguagem possui tratamentos especficos para a definio de classes e para a criao de objetos. Lembre-se que tanto objetos e classes so compostos de variveis e de mtodos, logo na definio de uma classe o que ser feito a declarao destas respectivas variveis e mtodos. Estas definies de variveis e de mtodos, dependendo de como so feitas, podem pertencer tanto a ao objeto instanciado quanto a classe a que se referencia. Considere o exemplo abaixo. Antes de digita-lo deve-se ter em mente que o nome do arquivo que contm a classe deve ter o mesmo nome da classe, assim o arquivo que contm o cdigo abaixo possui o nome Aluno.Java. O // uma forma de documentao de cdigo e os nmeros 1 e 2 servem apenas para referenciar a linha do cdigo Java.

public class Aluno { }

//1 //2

Cdigo 2.1 Classe Aluno inicial. Este pedao de cdigo (1.1) uma definio inicial da classe Aluno. Entretanto, esta classe no representa de forma precisa um conceito ao qual estamos acostumados, necessrio criar variveis para esta classe. public class Aluno { // variveis public String primeiroNome; //1 //2 //3

19

public String nomeFamilia; public int idade; public char sexo; }

//4 //5 //5 //6

Cdigo 2.2 Classe Aluno com variveis. Este novo cdigo (1.2) adiciona, classe aluno, variveis relativas ao aluno tais o seu primeiro nome, seu nome de famlia, sua idade e seu sexo. Falta a definio de uma funcionalidade para esta classe, o que ser definido no cdigo 1.3.

public class Aluno { // variveis public String primeiroNome; public String nomeFamilia; public int idade; public char sexo; // mtodos

//1 2 //3 //4 //5 //6 7

public Aluno(String primeiroNome, String nomeFamilia, //8 int idade, char sexo ) { this.primeiroNome = primeiroNome; this.nomeFamilia = nomeFamilia; this.idade = idade; this.sexo = sexo; } } //9 //10 //11 //12 //13 //14 //15

Cdigo 2.3 Classe Aluno com variveis e mtodos

Pronto! O cdigo 1.3 possui uma definio de uma classe e as respectivas declaraes das variveis e de seus mtodos. Uma classe pode ter conceitualmente um conjunto qualquer de variveis e de mtodos. Vale lembrar que o cdigo 1.3 uma definio de uma classe, logo este apenas um conceito daquilo que se quer representar. O que est definido vale para qualquer aluno, mas NO um aluno em particular. Para se criar um objeto necessrio instanciar a classe, quantas vezes for necessrio. Assim, se desejarmos desejar criar trs alunos ser necessrio realizar trs instanciaes. Em particular o mtodo Aluno possui o mesmo nome da classe. Este mtodo especial pois denominado o construtor da classe, ou seja, aquele responsvel pela criao correta do objeto de uma determinada classe.

20

Para criar o aluno Jos, Joo e Maria ser definida uma classe de demonstrao que criar estes objetos, conforme apresentado no cdigo 1.4. public class ExemploAluno { public static void main (String[] args){ //1 //2

Aluno alunoJose = new Aluno ("Jos", "Campos", 37, 'm'); //3 Aluno alunoJoao = new Aluno ("Joo", "Campos", 20, 'm'); //4 Aluno alunaMaria= new Aluno ("Maria", "Campos", 18, 'f');//5 } } Cdigo 2.4 Classe Aluno //6 //7

Desta forma tem-se trs objetos: alunoJose, alunoJoao e alunaMaria. Estes objetos so do tipo aluno, conforme mostrado no incio das linhas trs, quatro e cinco. O comando NEW, nestas mesmas linhas o que invoca o mtodo Aluno da classe Aluno e que faz criar os respectivos objetos com os valores passados por parmetro. Repare a definio do mtodo main acima public static void main (String[] args). Este mtodo um mtodo da classe, conforme ser explicado mais adiante.

2.4. Exerccios.
1. Especifique em Java uma classe Professor com os seguintes atributos: nome com tipo String, nomeFamilia com o tipo String, titulao com tipo String, anosdeAcademia do tipo int. Crie tambm uma classe chamada ExemploProfessor para instanciar 2 professores quaisquer.

21

Captulo 3 - Variveis e Mtodos de Objetos e de Classes.


3.1. Conceitos de Variveis e Mtodos de um objeto e de uma Classe.
O objetivo desta aula apresentar a motivao para se especificar varivel e mtodo tanto de uma classe quanto de um objeto. No exemplo dado na aula anterior, da classe Aluno, todos as variveis e mtodos definidos para ela estavam associados ao objeto quando este era instanciado. Desta forma pode-se referenciar o valor de uma varivel atravs da notao umAluno.primeiroNome, onde umAluno uma instncia de uma classe Aluno e primeiroNome uma varivel associada a este objeto. Poder-se-ia, da mesma forma, alterar o valor da varivel do objeto, por exemplo: umAluno.primeiroNome = Christopher. Entretanto existe a necessidade de guardar e manipular valores no mbito da classe. Por exemplo, o que poder ser feito caso se desejasse saber quantos objetos da classe Alunos foram criados? Se um programador adicionasse a varivel numAluno,da mesma forma como se fez com as outras variveis, cada vez que um aluno fosse instanciado esta varivel estaria associada a este objeto. O que se deseja ter o controle do nmero de alunos criados e que este valor esteja associado a prpria classe Aluno. Desta forma a varivel ao invs de pertencer ao objeto esta passa a pertencer classe. Assim para diferenciar as variveis/mtodos do objeto das variveis e mtodos da classe utiliza-se o comando static antes da declarao da varivel ou do mtodo. Pode-se acessar a varivel de classe atravs da prpria classe ou das instncias criadas por ela. Pode-se acessar o mtodo de uma classe atravs da prpria classe. Os mtodos de classe no podem acessar a instancias criadas pela classe.

3.2. Em Java.
Considere o exemplo abaixo: public class Aluno { // variveis da classe public static int numAlunos = 0; // variveis public String primeiroNome; public String nomeFamilia; public int idade; public char sexo; // mtodos //1 2 //3 4 //5 //6 //7 //8 9

public Aluno(String primeiroNome, String nomeFamilia, //10

22

int idade, char sexo ) { this.primeiroNome = primeiroNome; this.nomeFamilia = nomeFamilia; this.idade = idade; this.sexo = sexo; } } Cdigo 3.1 Classe Aluno com varivel esttica

//11 //12 //13 //14 //15 //16 //17

As linhas dois e trs apresentam uma pequena mudana em relao ao cdigo 1.4. O cdigo public static int numAlunos = 0; define uma varivel que ir pertencer classe e no ao objeto. O cdigo abaixo cria as instancias do aluno e totaliza o numero de alunos criado na varivel numAlunos.

Public class ExemploAlunoVarivelEstatica public static void main (String[] args){ Aluno umAluno = new Aluno ("Marcio", "Campos", 27, 'm'); Aluno.numAlunos = Aluno.numAlunos + 1; System.out.println("Criado Professor Marcio"); System.out.println("nome: " + umAluno.primeiroNome);

//1 //2 //3 //4 //5 //6

System.out.println("nome familia: " + umAluno.nomeFamilia);//7 System.out.println("idade: " + umAluno.idade); System.out.println("Sexo: " + umAluno.sexo); //8 //9 //10 Aluno outroAluno = new Aluno ("Jos", "Xexeo", 35, 'm'); Aluno.numAlunos = Aluno.numAlunos + 1; System.out.println("Criado Professor Xexeo"); System.out.println("nome: " + outroAluno.primeiroNome); //11 //12 //13 //14

System.out.println("nome familia:"+outroAluno.nomeFamilia);//15 System.out.println("idade: " + outroAluno.idade); System.out.println("Sexo: " + outroAluno.sexo); System.out.println("numero de alunos" + Aluno.numAlunos); } } Cdigo 3.2 classe demonstrao da varivel esttica. //16 //17 //18 //19 //20

Como se pode notar na linha quatro e na linha 12 o cdigo Aluno.numAlunos

Aluno.numAlunos + 1; realiza a adio de cada objeto criado a varivel de classe numAlunos.

23

Desta forma a classe Aluno possuir uma varivel definida como numAlunos que guardar o nmero de instancias criadas para esta classe. De forma semelhante o mtodo definido na linha dois, public static void main (String[] args){, possui a palavra reservada static o que determina que o mtodo sendo definido um mtodo da classe. Esse mtodo main, em particular, executado sempre que se executa a classe. Na linha trs e onze o construtor Aluno da classe Aluno foi utilizado para instanciar cada objeto. As linhas seis a nove e 14 a 17 foram definidas para mostrar o objeto criado. O cdigo acima poderia ser melhorado utilizado-se mais apropriadamente os conceitos de variveis e mtodos de objetos e de classes. Por exemplo, as linhas 14 a 17 mostram o objeto, logo esta funcionalidade poderia ser um mtodo do objeto j est associada ao prprio objeto. Assim poderamos adicionar o seguinte mtodo ao cdigo 2.1: public void mostraAluno() { System.out.println("nome: " + this.primeiroNome); System.out.println("nome familia: " + this.nomeFamilia); System.out.println("idade: " + this.idade); System.out.println("Sexo: " + this.sexo); } Cdigo 3.3 Mtodo MostraObjeto. O cdigo 2.3 mostra na linha um a declarao do nome do mtodo, a seguir nas linas dois a cinco, mostra o objeto sendo mostrado. Repare a referncia ao objeto corrente this seguida da varivel do objeto. Esta referncia faz com que o objeto que est sendo manipulado mostre seus prprios valores contidos em suas variveis. De forma semelhante, olhando para o cdigo 2.1 verificamos que ao se adicionar 1 a varivel numAlunos que esta funcionalidade simples est associada a uma operao da classe, logo poderamos criar um mtodo da classe para implementar esta funcionalidade, como mostra o cdigo 2.4. public static void contaAlunos() { numAlunos = numAlunos + 1; } //1 //2 //3 Cdigo 3.4 Mtodo da classe contaAlunos. //1 //2 //3 //4 //5 //6

Repare a palavra static, na linha um, que define que o mtodo da classe. De forma semelhante poderamos criar uma mtodo da classe que mostrasse o total de alunos criados, conforme o cdigo 2.5 public static void mostraTotalAlunos () { System.out.println ("o total de alunos " + numAlunos); } //1 //2 //3

24

Cdigo 3.5 Mtodo da classe mostraTotalAlunos.

Note que na linha dois no foi utilizado o a palavra this junto a numAlunos j que no existe um objeto associado pois esta uma varivel da classe. O cdigo final da classe Aluno, ao final destas alteraes ficaria como o do cdigo 2.6 public class Aluno { // variveis da classe public static int numAlunos = 0; //mtodos da classe public static void contaAlunos() { numAlunos = numAlunos + 1; } public static void mostraTotalAlunos () { //1 2 //3 4 //5 //6 //7 //8

System.out.println("o total de alunos "+numAlunos); //9 } // variveis do objeto public String primeiroNome; public String nomeFamilia; public int idade; public char sexo; // mtodos do objeto //10 11 //12 //13 //14 //15 16

public Aluno(String primeiroNome, String nomeFamilia, //17 int idade, char sexo ) { this.primeiroNome = primeiroNome; this.nomeFamilia = nomeFamilia; this.idade = idade; this.sexo = sexo; } public void mostraAluno() { //18 //19 //20 //21 //22 //23 //24

System.out.println("nome: " + this.primeiroNome);//25 System.out.println("nome familia:"+this.nomeFamilia); //26 System.out.println("idade: " + this.idade); System.out.println("Sexo: " + this.sexo); } } Cdigo 3.6 Classe Alunos final. //27 //28 //29 //30

25

A classe ExemploAlunoVariavelEstatica ficaria conforme o cdigo 2.7. public class ExemploAlunoVarivelEstatica public static void main (String[] args){ //1 //2

Aluno umAluno = new Aluno ("Marcio","Campos",27,'m'); //3 Aluno.contaAlunos(); System.out.println("Criado Professor Marcio"); umAluno.mostraAluno(); //4 //5 //6 //7 Aluno outroAluno = new Aluno ("Jos","Xexeo",35,'m'); //8 Aluno.contaAlunos(); System.out.println("Criado Professor Xexeo"); outroAluno.mostraAluno(); Aluno.mostraTotalAlunos(); } } Cdigo 3.7 Classe DemoAlunoVarivelEstatica. //9 //10 //11 //12 //13 //14

3.4. Exerccios.
1. Repita para a classe professor, criada no exerccio do captulo anterior, a mesma estrutura de cdigo desenvolvida para a classe aluno neste captulo.

26

Captulo 4 - Mensagens e Visibilidade.


4.1. Conceitos de mensagens e visibilidade.
O objetivo desta aula apresentar como os conceitos de mensagens, visibilidade e de escopo influenciam a definio e o uso dos objetos e das classes e das variveis e dos mtodos. Os objetos no vivem sozinhos no mundo. Assim que se cria um objeto este possui propriedades e mtodos, conforme visto anteriormente. Esses mtodos so invocados, chamados, ou pelo prprio objeto ou por outro objeto. Quando esta interao entre objetos ocorre diz-se que os objetos esto trocando mensagens. Entretanto nem todas as mensagens podem ser chamadas. Podem existir mtodos e atributos que no possam ser executados diretamente a partir de outros objetos devido a sua visibilidade. No caso a seguir, a classe ExemploMensagemVisibilidade faz uma chamada ao mtodo de criao de um objeto Aluno. Solicitao para a execuo de um mtodo, ex.: mostraAluno()

ExemploMensagemVisibilidade

:aluno

Figura 4.1 mensagens.

No caso da figura 3.1 o mtodo chamado pode ser vlido ou no. Isso depender da visibilidade do mtodo declarada para a classe Aluno. O mesmo conceito pode se aplicar a uma varivel, caso a classe ExemploMensagemVisibilidade, ou um de seus objetos, quisesse acessar o contedo de uma varivel de Aluno, ou de um de seus objetos, o resultado desta operao dependeria da visibilidade desta varivel na classe aluno.

4.2. Em Java.
Primeiro ser tratado o conceito de visibilidade. Abaixo so listadas as duas classes: a classe Aluno e a classe ExemploMensagemVisibilidade. Os atributos bsicos de visibilidade so: public, private. O atributo public permite acesso direto ao mtodo ou a varivel e o atributo private no permite o acesso a partir de outro objeto. Em Java, quando uma determinada classe ou objeto tenta acessar um mtodo ou varivel que tenha visibilidade private ocorre um erro de compilao. Execute-as e veja o que acontece. public class Aluno { // variveis da classe //1 2

27

public static int numAlunos = 0; // mtodos da classe public static void contaAlunos() { numAlunos = numAlunos + 1; } public static void mostraTotalAlunos () {

//3 4 //5 //6 //7 //8

System.out.println("o total de alunos "+numAlunos); //9 } // variveis do objeto private String primeiroNome; private String nomeFamilia; private int idade; private char sexo; // mtodos do objeto public Aluno(String primeiroNome, String nomeFamilia, int idade, char sexo ) { this.primeiroNome = primeiroNome; this.nomeFamilia = nomeFamilia; this.idade = idade; this.sexo = sexo; } public void mostraAluno() { System.out.println("nome: " + this.primeiroNome); //10 11 //12 //13 //14 //15 16 //17 //18 //19 //20 //21 //22 //23 //24 //25

System.out.println("nome familia:"+this.nomeFamilia); //26 System.out.println("idade: " + this.idade); System.out.println("Sexo: " + this.sexo); } } //27 //28 //29 //30 Cdigo 4.1 - Classe aluno com variveis de objetos private. public class ExemploMensagemVisibilidade public static void main (String[] args){ Aluno umAluno = new Aluno ("Marcio", "Campos", 27, 'm'); contaAlunos(); System.out.println("Criado Professor Marcio"); umAluno.idade = 22; } } //1 //2 //3 //4 //5 //6 //7 //8

28

Cdigo 4.2 - Classe DemoMensagemVisibilidade.

No exemplo acima, no cdigo 3.2, a linha seis ocorreria um erro de compilao. Por que? Porque a classe DemoMensagemVisibilidade tenta alterar a idade do aluno umAluno e esta varivel inacessvel a outras classes, apenas os prprios mtodo do objeto umAluno podem manipul-la. Desta forma caso se deseje fazer alteraes sobre os dados de aluno deve-se criar um mtodo na classe Aluno para que os objetos instanciados por esta classe possam alterar os seus dados. O cdigo 3.3 adiciona o mtodo alterarAluno() para lidar com a nova visibilidade das varveis dos objetos de aluno. public class Aluno { // variveis da classe public static int numAlunos = 0; //mtodos da classe public static void contaAlunos() { numAlunos = numAlunos + 1; } public static void mostraTotalAlunos () { //1 2 //3 4 //5 //6 //7 //8

System.out.println("o total de alunos "+numAlunos); //9 } // variveis do objeto private String primeiroNome; private String nomeFamilia; private int idade; private char sexo; // mtodos do objeto //10 11 //12 //13 //14 //15 16

public Aluno(String primeiroNome, String nomeFamilia, //17 int idade, char sexo ) { this.primeiroNome = primeiroNome; this.nomeFamilia = nomeFamilia; this.idade = idade; this.sexo = sexo; } public void mostraAluno() { //18 //19 //20 //21 //22 //23 //24

System.out.println("nome: "+this.primeiroNome); //25 System.out.println("nome familia:"+this.nomeFamilia); //26 System.out.println("idade: " + this.idade); System.out.println("Sexo: " + this.sexo); //27 //28

29

} public void alterarDados (String primeiroNome, String nomeFamilia, int idade, char sexo ) { if (primeiroNome != this.primeiroNome) this.primeiroNome = primeiroNome; if (nomeFamilia != this.nomeFamilia) this.nomeFamilia = nomeFamilia; if (idade != this.idade) this.idade = idade; } } }

//29 //30 //31 //32 //33 //34 //35 //36 //37 //38 //39 //40 Cdigo 4.3 - Classe aluno com mtodo alterarDados.

Desta forma, de acordo com o cdigo 3.3, a classe DemoMensagemVisibilidade deve ser alterada conforme o cdigo 3.4. public class ExemploMensagemVisibilidade { public static void main (String[] args){ //1 //2

Aluno umAluno = new Aluno ("Marcio","Campos",27,'m'); //3 Aluno.contaAlunos(); System.out.println("Criado Professor Marcio"); umAluno.alterarDados(Marcio, Campos, 22, 'm'); } } Cdigo 4.4 - Classe ExemploMensagemVisibilidade. //4 //5 //6 //7 //8

Se quisermos ter acesso as variveis dos objetos de forma a manipula-los devemos criar mtodos que acessem essas variveis e que retornem os valores das mesmas, por exemplo: public int valor_idade() { //1 //2 //3 Cdigo 4.5 Mtodo de retorno de valores de variveis privadas.

return this.idade }

Com este e outros mtodos semelhantes para todas as variveis podemos recuperar os valores destas variveis e oper-las como desejarmos.

30

Se adicionarmos o mtodo acima para a classe aluno poderamos reescrever a classe ExemploMensagemVisibilidade para recuperar o valor alterado e mostr-lo, conforme exemplificado no cdigo 3.6. public class ExemploMensagemVisibilidade public static void main (String[] args){ //1 //2

Aluno umAluno = new Aluno ("Marcio","Campos",27,'m'); //3 Aluno.contaAlunos(); System.out.println("Criado Professor Marcio"); umAluno.alterarDados(Marcio, Campos, 22, 'm'); int idade_alterada = umAluno.valor_idade(); //4 //5 //6 //7

System.out.println(Idade alterada :+idade_alterada); //8 } } //9 //10

Cdigo 4.6 - Classe DemoMensagemVisibilidade.

Aos mtodos tambm podem ser aplicados os conceitos de visibilidade. Quando um mtodo private indica que apenas outros mtodos definidos para o objeto podem acessa-lo, assim este ser um mtodo exclusivo dos outros mtodos da classe. A classe DemoMensagemVisibilidade nos d um exemplo de troca de mensagens entre a classe

DemoMensagemVisibilidade e o objeto umAluno instanciado da classe Aluno.

4.4 Exerccios.
1. Especifique em Java uma classe Aluno os outros mtodos de recuperao de valores de cada varivel de objeto.

31

Captulo 5 - Sobrecarga.
5.1. Introduo.
Construtores so utilizados para instanciar objetos de uma classe. J vimos como os construtores so utilizados nos exemplos anteriores. Como por exemplo, o mtodo Aluno definido na aula trs. Entretanto um mtodo pode ser utilizado de vrias formas. Estas vrias formas de invocao, de um mesmo mtodo, chama-se sobrecarga. Os construtores so teis para que possamos inicializar campos de um objeto. Desta forma garante-se que o objeto criado segue um determinado nmero de regras definidas para aquele construtor. Em realidade, para se criar objetos no necessrio de um construtor, mas sua utilizao garante maior consistncia e manutenibilidade ao cdigo. J utilizamos construtores antes e sabemos como eles se comportam. A utilizao dos construtores garante que a criao dos objetos seguir uma funcionalidade padro. Um mtodo identificado como um construtor quando o nome do mtodo igual ao da classe. J foi visto tambm a palavra-chave new utilizada em conjunto com os construtores para instanciar os objetos. Uma das caractersticas especficas na definio de mtodos a capacidade de se definir vrios mtodos com diferentes assinaturas. Uma assinatura definida pelo nome do mtodo e os correspondentes tipos dos parmetros deste. Desta forma poderamos criar/instanciar um Aluno com diferentes tipos de assinaturas. Esse mecanismo se chama sobrecarga. A sobrecarga no exclusivo de construtores esta pode ser utilizada em mtodos de maneira geral.

5.2. Em Java.
Considere o exemplo do cdigo 4.1. public class Aluno { // variveis da classe public static int numAlunos = 0; //mtodos da classe public static void contaAlunos() { numAlunos = numAlunos + 1; } public static void mostraTotalAlunos () { //9 } //10 //1 2 //3 4 //5 //6 //7 //8

System.out.println ("o total de alunos " + numAlunos);

32

// variveis do objeto private String primeiroNome; private String nomeFamilia; private int idade; private char sexo; // mtodos do objeto public Aluno() { this.primeiroNome = Teste; this.nomeFamilia = Default; this.idade = 18; this.sexo = m; }

11 //12 //13 //14 //15 16 //17 //18 //19 //20 //21 //22

public Aluno(String primeiroNome, String nomeFamilia, int idade, char sexo ) { this.primeiroNome = primeiroNome; this.nomeFamilia = nomeFamilia; this.idade = idade; this.sexo = sexo; } public void mostraAluno() { System.out.println("nome: " + this.primeiroNome);

//23 //24 //25 //26 //27 //28 //29 //30 //31

System.out.println("nomefamilia: "+this.nomeFamilia); //32 System.out.println("idade: " + this.idade); System.out.println("Sexo: " + this.sexo); } public void alterarDados (String primeiroNome, String nomeFamilia, int idade, char sexo ) { if (primeiroNome != this.primeiroNome) {this.primeiroNome = primeiroNome}; if (nomeFamilia != this.nomeFamilia) {this.nomeFamilia = nomeFamilia}; if (idade != this.idade) { this.idade = idade}; } } } //33 //34 //35 //36 //37 //38 //39 //40 //41 //42 //43 //44 //45 //46

33

Cdigo 5.1 - Classe aluno com sobrecarga do cosntrutor.

Repare que no cdigo acima temos dois construtores. No primeiro mtodo criado um aluno padro, onde no passado nenhum parmetro. No segundo criado um aluno passando todos os parmetros. Caso uma outra classe invocasse o construtor da classe aluno poderia, dependendo da necessidade instanciar um aluno teste ou meramente um aluno real. O cdigo 4.2 mostra a classe que utiliza estes dois construtores. public class ExemploSobrecarga public static void main (String[] args){ //1 //2

Aluno umAluno = new Aluno ("Marcio","Campos",27,'m'); //3 contaAlunos(); Aluno outroAluno = new Aluno (); ContaAlunos(); } } Cdigo 5.2 - Classe DemoSobrecarga. //4 //5 //6 //7 //8

5.4 Exerccios.
1. 2. Crie um outro mtodo construtor para criar alunos de intercmbio onde a faculdade de origem um parmetro importante. Crie um mtodo mostraAluno onde seja passado como parmetro o nmero de linhas que deve ser puladas para se imprimir os detalhes dos alunos.

34

Captulo 6 Delegao e Composio.


6.1 Introduo.
Um dos aspectos inerentes a orientao a objetos a capacidade de reaproveitar cdigo ou uma estrutura anteriormente definida. Esta vantagem importante quando um dos fatores que mais pesam no custo de software o de manuteno. Neste captulo ser visto conceito de delegao, uma das formas de reaproveitamento de cdigo. Na delegao, uma classe base definida e esta referenciada por outra classe. Por exemplo, um objeto da classe Computador pode possuir entre seus atributos uma referncia um objeto do tipo monitor. Assim, a criao de um objeto computador faz uso dos mtodos na classe monitor. Desta maneira, a delegao permite a reutilizao, ou composio, de classes j existentes como instncias de novas classes. Sob este aspecto as classes originais ficam contidas nas novas classes.

6.2. Em Java.
Considere os cdigo 5.1 a 5.5: teclado, monitor, mouse e gabinete. Podemos criar estes objetos individualmente, ou seja, criar uma classe para teclado, monitor, mouse e gabinete. public class Teclado { // varveis de objeto private String numero_serie; private String formato; // construtor public Teclado (String numero_serie, String formato) { this.numero_serie = numero_serie; this.formato = formato; } } Cdigo 6.1 - Classe Teclado public class Gabinete { // varveis de objeto private String patrimonio; private String formato; // construtor public Gabinete (String patrimonio, String formato) { this.patrimonio = patrimonio; this.formato = formato; //1 2 //3 //4 5 //6 //7 //8 //1 2 //3 4 5 //6 //7 //8 //9 //10

35

} } Cdigo 6.2 - Classe Gabinete public class Mouse { // varveis de objeto private String numero_serie; private String tecnologia; // construtor public Mouse (String numero_serie, String tecnologia) { this.numero_serie = numero_serie; this.tecnologia = tecnologia; } } Cdigo 6.3 - Classe Mouse

//9 //10

//1 2 //3 //4 5 //6 //7 //8 //9 //10

public class Monitor { // varveis de objeto private String numero_serie; private String fabricante; // construtor public Monitor (String numero_serie, String fabricante) { this.numero_serie = numero_serie; this.fabricante = fabricante; } } Cdigo 6.4 - Classe Monitor

//1 2 //3 //4 5 //6 //7 //8 //9 //10

public class Computador { // varveis de objeto private String sala; private String usuario; private int numero_computador; private Teclado umTeclado; private Gabinete umGabinete; private Mouse umMouse;

//1 2 //3 //4 //5 //6 //7 //8

36

private Monitor umMonitor; // construtor public Computador (String sala, String usuario, int numero_computador,Teclado umTeclado,

//9 10 //11 //12

Gabinete umGabinete, Mouse umMouse,Monitor umMonitor){//13 this.sala = sala; this.usuario = usuario; this.numero_computador = numero_computador; this.umTeclado = umTeclado; this.umGabinete = umGabinete; this.umMouse = umMouse; this.umMonitor = umMonitor; } } Cdigo 6.5 - Classe Computador No cdigo 5.1 a 5.4 forma criadas classes que em sua essncia no dependem de outras classes para sua existncia. Entretanto, a classe Computador na realidade uma composio de outras classes. Essa abordagem de criao de objetos maiores a partir de objetos menores possibilita a existncia de independente dos objetos menores com seus prprios mtodos e atributos. A classe ExemploDelegaoComposio, do cdigo 5.6 exemplifica o uso de como a partir da criao de objetos menores, delegando a cada um deles responsabilidades inerentes aos mesmos, pode-se criar objetos maiores atravs da composio. public class ExemploDelegacoComposicao { // mtodo da classe public static void main (String args[]) { Teclado umTeclado = new Teclado(12345SN, ABNT); //1 2 //3 //4 //14 //15 //16 //17 //18 //19 //20 //21 //22

Gabinete umGabinete = new Gabinete(PTR0725, ATX); //5 Mouse umMouse = new Mouse(4567SN, infravermelho); //6 Monitor umMonitor = new Monitor(1011SN, DELL); //7

Computador umComputador = new Computador(217,Jo, //8 15, umTeclado, umGabinete, umMouse, umMonitor); } } Cdigo 6.6 - Classe ExemploDelegacaoComposicao //9 //10 //11

37

Repare no cdigo 5.6 que foi necessrio a criao dos objetos teclado, gabinete, mouse e monitor para que fosse possvel criar o objeto computador.

6.4.Exerccio.
Construa classes que especifique o conceito de uma casa.

38

Captulo 7 - Herana.
7.1. Introduo.
Herana uma outra forma de reutilizar cdigo. Diferentemente da delegao, que possibilita a criao de grandes objetos a partir de outros menores, a herana permite a criao de objetos que so parecidos, em comportamento, com outros objetos ancestrais. Na delegao um multiobjeto composto de outros objetos ao passo que herana um objeto criado a partir de outro com comportamento parecido. O que herana? Na herana uma classe definida em termos de outras classes. Por exemplo, carros e motocicleta podem ser definidos em termos da classe veculos de locomoo. Neste caso carro e motocicletas so subclasses da classe veculos de locomoo. A classe veculos de locomoo definida com uma superclasse. As subclasses possuem, por definio, comportamentos e estados semelhantes aos da superclasse. De maneira geral, pode-se dizer que as subclasses herdam tanto as variveis quanto os mtodos da superclasse. Uma definio encontrada no Java Tutorial : uma subclasse uma classe que estende outra classe sendo que esta subclasse herda os estados(atributos) e comportamento (mtodos) de todos as classes ancestrais; o termo superclasse se refere a classe imediatamente ancestral assim como todas as outras classes ancestrais. Entretanto, a subclasse no est limitada as variveis e aos mtodos da superclasse. Para caracteriz-la melhor novas variveis ou mtodos podem ser adicionadas subclasse, assim como podem ser suprimidos, ou at mesmo redefinidos. De forma geral as seguintes regras se aplicam: As subclasses herdam variveis e mtodos cuja visibilidade seja pblica ou protegida.

As subclasses herdam da superclasse as variveis e os mtodos sem especificao de visibilidade desde que a classe esteja no mesmo pacote. As subclasses NO herdam membros da superclasse se a subclasse declarar uma varivel ou mtodo de mesmo nome. No caso de variveis, as variveis definidas na subclasse ocultam aquelas definidas nas superclasses; no caso dos mtodos, os mtodos definidos na subclasse redefinem aqueles definidos nas superclasses.

7.2 Em Java.
Java implementa o conceito de herana atravs da palavra Extends. No nosso exerccio do aluno vamos aproveitar a classe Aluno definida em 4.1 e estend-la atravs de herana para a classe AlunodeIntercmbio. Verificamos inicialmente que um aluno de intercmbio tambm um aluno regular, logo podemos aproveitar a definio da classe aluno para a definio da nova classe. O cdigo

39

da classe AlunodeIntercmbio mostrado no cdigo 6.1. Nesta caso a classe Aluno superclasse e a a classe AlunodeIntercambio uma subclasse.

public class AlunodeIntercambio extends Aluno{ // variveis do objeto public String faculdade_origem; // mtodos do objeto public AlunodeIntercambio (String nome, String familia, int idade, char sexo, String faculdade_origem){ super (nome, familia, idade, sexo); this.faculdade_origem = faculdade_origem; } } Cdigo 7.1 - Classe AlunodeIntercambio.

//1 2 //3 4 //5 //6 //7 //8 //9 //10

Observe que a palavra super refere-se ao construtor da classe ancestral. Desta forma aproveita-se o cdigo definido na classe ancestral. O cdigo 6.2 demonstra o uso da herana. public class ExemploHerana { //1 //2 //3

public static void main (String args[]) { Aluno umAluno = new Aluno();

Aluno umAlunodeIntercambio = new AlunodeIntercambio(Jose, Alves, 35, m, UniverSidade); } } Cdigo 7.2 - Classe ExemploHerana. //4 //5 //6

Um mtodo pode ser modificado pela classe herdeira. O cdigo 4.1 possui o mtodo mostraAluno. Poderamos criar um outro mtodo com o mesmo nome para mostrar o aluno de intercmbio. Este mtodo est descrito no cdigo 6.3. public void mostraAluno ( ) { super.mostraAluno(); //1 //2

System.out.println (Origem + this.faculdade_origem //3 } //4 Cdigo 7.3 Mtodo mostraAluno da classe AlunodeIntercambio. O cdigo completo de aluno de intercmbio ficaria, ento, como mostrado na figura 6.4.

40

public class AlunodeIntercambio extends Aluno{ // variveis do objeto public String faculdade_origem; // mtodos do objeto public AlunodeIntercambio (String nome, String familia, int idade, char sexo, String faculdade_origem){ //6

//1 2 //3 4 //5

super (nome, familia, idade, sexo, faculdade_origem); this.faculdade_origem = faculdade_origem; } public void mostraAluno ( ) { super.mostraAluno(); System.out.println (Origem+this.faculdade_origem) } } Cdigo 7.4 a classe AlunodeIntercambio completa.

//7 //8 //9 //10 //11 //12 //13 //14

Em Java uma classe pode herdar ou estender apenas uma nica classe. Vale notar com este exemplo que agora se possui dois mtodos com mesmo nome e assinatura: o da classe aluno e o da classe alunodeIntercmcio. Essa capacidade de chama-se polimorfismo, isto quer dizer o mtodo mostraAluno() pois pode possuir vrias formas, se comportar diferentemente, dependendo do objeto ao qual est associado. No caso da classe aluno este mtodo mostra apenas as suas variveis associadas ao objeto aluno e no caso da classe alunodeIntercambio o mtodo mostra no apenas as suas variveis como as de seu ancestral. Este conceito possibilita a extensibilidade das aplicaes permitindo a definio de mtodos que podem ser utilizados em toda um a hierarquia de classes em uma herana. O cdigo 6.5 mostra como o polimorfismo pode ser utilizado.

public class ExemploPolimorfismo { public static void main (String args[]) { Aluno umAluno; AlunodeIntercambio umAlunodeIntercambio = New AlunodeIntercambio (Jos, Jack, 25,m,//5 Minesota); //6

//1 //2 //3 //4

umAluno = umAlunodeIntercambio; umAluno.mostraAluno(); }

//7 //8 //9

41

} Cdigo 7.5 a classe ExemploPolimorfismo

//10

Ao executar o cdigo acima verificar-se- que apesar de umAluno ser um objeto da classe Aluno o mtodo mostrarAluno( ) mostrar corretamente o aluno de intercmbio. Um outro desdobramento, quando se lida com hierarquias, quanto a visibilidade das variveis. Vimos, anteriormente, dois tipos de visibilidade public e private. No caso da classe

AlunodeIntercambio, se este quisesse acessar as variveis de Aluno ocorreria um erro de compilao pois as variveis possuem visibilidade private. Desta forma, quando a visibilidade private, qualquer outra classe que queira acessar as variveis de Aluno devem solicitar a um de seus mtodos; inclusive as classes descendentes da classe Aluno. Quando a visibilidade pblica o acesso permitido indiscriminadamente qualquer um. Um meio do caminho entre a visibilidade public e o private a visibilidade protected. Esta visibilidade permite que apenas as classes descendentes tenham acesso a classe base, em nosso exemplo a classe Aluno. Qualquer outra classe possui seu acesso negado.

7.4. Exerccios.
1. Aproveite a classe computador mostrada no cdigo 5.5 e estenda-a para as classes ComputadorBsico com os atributos cdrom. Estenda a classe computador bsico com o nome

de ComputadorAvancado com os atributos dvd. Crie o mtodo mostra que mostre o contedo do objeto. 2. Crie a classe ExemploComputadorHeranca para manipular os objetos das classes definidas.

42

Captulo 8 Classes Abstratas.


8.1. Introduo.
Classes abstratas so uma forma de se criar subclasses a partir de outras superclasses de modo a se reutilizar os mtodos e os atributos desta ltima. Uma classe abstrata possui mtodos abstratos, ou seja, no definidos. Desta forma por possuir um comportamento no totalmente especificado no se pode criar instncias destas classes. Por sua vez, todas as outras classes que podem criar instncias so classes concretas. As classes abstratas so teis quando se deseja trabalhar com conceitos, ou seja, define-se uma classe modelo e seus herdeiros que se encarregam de implementar estes conceitos. Assim a classe abstrata serve como guia para a definio do comportamento dos herdeiros, das subclasses. Uma subclasse deve, ento, obrigatoriamente, implementar todos os mtodos abstratos, assim definidos na superclasse. Caso uma subclasse no implemente todos os mtodos abstratos esta subclasse, por definio, ser tambm abstrata.

8.2. Em Java.
Em Java define-se uma classe abstrata adicionando-se a palavra reservada abstract antes da classe ou da declarao de um mtodo. Para uma classe herdar de uma classe abstrata basta utilizar o comendo extends da mesma forma que se descrevia uma herana. Considere o cdigo 7.1 e 7.2. public abstract class Contribuinte { // variveis protected String nome; protected float total_receita; protected float total_descontos; // Mtodos public Contribuinte (String nome, float total_receita, float total_descontos) { this.nome = nome; this.total_descontos = total_descontos; this.total_receita = total_receita; } public float rec_total_receita() { return total_receita; } public float rec_total_descontos() { //8 //9 //10 //11 //12 //13 //14 //15 //16 //1 2 //3 //4 //5 //6 //7

43

return total_descontos; } // esse mtodo abstrato, pois no est definido. public abstract float imposto_a_pagar(); } Cdigo 8.1 Classe abstrata Contribuinte.

//17 //18 19 //20 //21

public class PessoaFisica extends Contribuinte { //variveis protected String CPF; // Mtodos public PessoaFisica (String nome, float total_receita, float total_descontos, String CPF) { super(nome, total_receita, total_descontos); this.CPF = CPF; } public float imposto_a_pagar(){ float total_a_pagar;

//1 2 //3 4 //5 //6 //7 //8 //9

return total_a_pagar = 0.25F * super.rec_total_receita(); } } Cdigo 8.2 Classe Pessoa

O cdigo 7.1 define uma classe contribuinte que abstrata, pois possui um de seus mtodos como abstratos. A classe PessoaFisica estende da classe Contribuinte, assim, herda os mtodos e as variveis. Etretanto a classe PessoaFisica necessitar implementar o mtodo imposto_a_pagar () caso se deseje que ela se torne uma classe concreta. O cdigo 7.2 demonstra a implementao do mtodo tornando a referida classe em uma classe concreta. O cdigo 7.3 descreve a classe ExemploClasseAbstrata. public class ExemploClasseAbstrata { public static void main (String args[]) { PessoaFisica umaPessoaFisica = //1 //2 //3

New PessoaFisica(Jose,100.000F,30.000F, 123456-78);//4 System.out.println(umaPessoaFisica.imposto_a_pagar());//5 //repare que o cdigo a seguir no funcionaria, pois // estaramos instanciando uma classe abstrata.

44

// Contribuinte umaPessoaFisica = // New Contribuinte(Jose,100.000F,30.000F); } } Cdigo 8.3 Classe ExemploClasseAbstrata //10 //11

8.3 Exerccios
1. Defina uma classe abstrata Cidado, com um atributo documentodeIdentificacao e um mtodo abstrato a ser implementado pelas classes Aluno e AlunodeIntercambio.

45

Captulo 9 - Interfaces.
9.1. Introduo.
Interfaces podem ser definidas como um conjunto de protocolos que so implementados por uma ou mais classes. A classe que implementa a interface concorda com a implementao de todos os mtodos definidos pela interface. Uma definio de interface uma coleo de definies de mtodos, sem implementao, e de variveis que so obrigatoriamente constantes. Devido ao fato de uma interface ser uma lista de mtodos no implementados, e por sua vez abstratos, necessrio estabelecer uma diferena entre as interfaces e as classes abstratas. Logo, Uma interface no pode implementar nenhum mtodo, por sua vez uma classe abstrata pode. Uma classe pode implementar vrias interfaces, mas apenas uma superclasse abstrata. A interface no compe a hierarquia da classe. Logo, classes no diretamente relacionadas podem implementar a mesma interface. Um exemplo ilustra o conceito de interface. Imagine um usurio utilizando um controle remoto universal de uma televiso. Cabe ao usurio saber como operar apenas o controle remoto. Cada nova televiso pode vir com um design diferente, mas as nicas propriedades necessrias a operar a televiso so aquelas definidas pelo controle remoto, desde que a TV implemente as operaes definidas pelo controle remoto. Este tipo de abordagem possibilita a modularizao. Caso a televiso quebre, basta comprar outra colocar no lugar da antiga que o conjunto de operaes definidas no controle remoto continua valendo. Uma das caractersticas da interface em Java que as classes devem implementar todos os mtodos definidos pela interface. Uma outra caracterstica que uma determinada classe pode implementar vrias interfaces. No exemplo abaixo, sobre TVs e Controle Remoto, apresentado como interfaces so implementadas em Java.

9.2 Em Java.
O cdigos abaixo implementam a interface ControleRemoto e as classes de Usurio, TV, TV29 e TV14. public interface ControleRemoto{ public void Iliga_desliga(); public void Imuda_canal(String botao); } //1 //2 //3

46

Cdigo 9.1 Interface ControleRemoto

Repare na linha 1, no cdigo 8.1, a palavra reservada interface indicando que o que est sendo definido uma interface.

public class Tv implements ControleRemoto{ //variveis public int canal; public String liga_desliga; //Mtodos public Tv() { this.canal = 3; this.liga_desliga = "desligado"; } public void Iliga_desliga() { if (liga_desliga == "desligado") { liga_desliga = "liga"; } else { liga_desliga = "desligado"; } ; } public void Imuda_canal(String botao) { if (botao == "+") { canal++;} else { canal--;}; } } Cdigo 9.2 Classe Tv.

//1 2 //3 //4 //5 //6 //7 //8 //9 //10

//11 //12 //13 //14 //15 //16 //17 //18

No cdigo 8.2 tem-se na linha 1 a palavra reservada implements, Isso significa que a classe TV ir implementar todos mtodos definidos pela interface ControleRemoto, e isto o que realmente ocorre, veja as linhas de 10 a 13 e de 15 a 17. public class Tv29 extends Tv{ public Tv29() { this.canal = 5; this.liga_desliga = "desligado"; } } Cdigo 9.3 Classe Tv29.

47

O cdigo 8.3 estende a classe TV. Assim a classe TV29 uma subclasse de TV. Desta forma os mtodos especificados para a classe TV tambm de aplicam a classe TV29. Isso quer dizer que o comportamento implementado pela TV a partir da interface ControleRemoto se aplica tambm s classes de TV29 e de TV14. public class Tv14 extends Tv{ public Tv14() { this.canal = 8; this.liga_desliga = "desligado"; } } Cdigo 9.4 Classe Tv14. O cdigo 8.4 faz o mesmo com a classe TV.

public class ExecutaInterface

public static void main(String[] args) { Tv uma_tv = new Tv(); uma_tv.Iliga_desliga(); uma_tv.Imuda_canal("+");

Tv uma_tv29 = new Tv29(); uma_tv29.Iliga_desliga(); uma_tv29.Imuda_canal("+");

Tv uma_tv14 = new Tv14(); uma_tv14.Iliga_desliga(); uma_tv14.Imuda_canal("+"); } } Cdigo 9.5 - Classe ExecutaInterface

A classe usurio mostra que os mtodos implementados pela classe TV a partir da interface ControleRemoto e que estes mesmo mtodos, por herana, podem ficar disponveis s demais subclasses.

48

9.3 Exerccios
1. Defina uma classe Radio e as classes RadioPortatil e RadiodeMesa de forma que operem com o mesmo ControleRemoto.

49

Captulo 10 Estudo de Caso.


10.1 O Caso.
Para exercitar os conceitos vistos nos captulos anteriores considere o caso descrito a seguir. Um coordenador das Faculdades Integradas Turing Machines resolveu automatizar o processo de orientao de projetos de seus professores com os respectivos alunos. Assim um professor(nome, sobrenome, matricula, titulao) oferece um ou mais projetos(cdigo, descrio, data de incio, data de trmino). Um projeto somente pode ter como responsvel um nico professor. Os alunos(nome, sobrenome, matricula) se inscrevem em um ou mais projetos, sendo que os projetos podem ter um ou mais alunos. A orientao um processo que envolve o professor, o projeto e aluno. Quando da orientao o professor anota a data da orientao e as atividades previstas para as prximas etapas ou as atividades realizadas pelos alunos. Um professor visitante (instituio de origem) tambm pode oferecer projetos nos mesmos moldes que um professor regular.

Analisando o caso acima se pode concluir que existem as seguintes classes: Professor com os seguintes variveis: nome, sobrenome, matricula, titulao e

mtodos: construtor, mostraProfessor. ProfessorVisitante que herda de professor com as seguintes variveis:

faculdade_de_Origem e os mtodos: construtor, mostraProfessor. Aluno com as seguintes variveis: nome, sobrenome, matricula e com os mtodos: construtor e mostraAluno. Projeto com as seguintes variveis: cdigo, descrio, dataIncio,

dataTrmino e com os seguintes mtodos: construtor e mostraProjeto. Inscrio com as seguintes variveis: um objeto de aluno e um objeto de projeto. Esta classe, em realidade, ser uma composio das duas outras. Orientao com as seguintes variveis: um objeto de professor, um objeto de aluno e um objeto de projeto, alm das variveis: dataOrientacao e DescricaoAtividades. Na realidade no se ter o objeto em si, mas apenas uma referncia aos mesmos.

50

Entretanto outras variveis devem estar presentes neste modelo: a de totalProjetosOferecidos, totalProfessoresCadastrados e totalProfessoresVisitantes, respectivamente para as classes Projetos, Professores e ProfessoresVisitantes. Estas variveis no pertencem aos objetos em si mas sim as classes ao qual estes objetos representam. Assim devemos criar mtodos de classe especficos para manipular com estas variveis. Assim temos os cdigos 9.1 a 9.7 abaixo. public class Aluno { // variveis do objeto private String nome; private String sobreNome; private int matricula; // mtodos do objeto public Aluno(String nome, String sobreNome, int matricula) { this.nome = nome; this.sobreNome = sobreNome; this.matricula = matricula; } public void mostraAluno() { System.out.println("nome: " + this.nome); System.out.println("nome familia: " + this.sobreNome); System.out.println("idade: " + this.matricula); } } Cdigo 10.1 - Classe Aluno

public class Professor { // variveis do objeto private String nome; private String nome; private String sobreNome; private String titulacao; private int matricula; // mtodos do objeto public Professor(String nome, String sobreNome,String titulacao, int matricula) { this.nome = nome;

51

this.sobreNome = sobreNome; this.titulacao = titulacao; this.matricula = matricula; } public void mostraProfessor() { System.out.println("nome: " + this.nome); System.out.println("nome familia: " + this.sobreNome); System.out.println("Titulao: " + this.titulacao); System.out.println("idade: " + this.matricula); } //mtodos necessrios devido a natureza PRIVATE das variveis da classe public String onome() { return nome; } public String osobreNome() { return sobreNome; } public String atitulacao() { return titulacao; } public int amatricula() { return matricula; } } Cdigo 10.2 - Classe Professor

public class ProfessorVisitante extends Professor { // variveis do objeto private String nome; private String faculdadeOrigem; // mtodos do objeto public ProfessorVisitante(String nome, String titulacao, int matricula, String faculdadeOrigem) { sobreNome,String

super(nome, sobreNome, titulacao, matricula); this.faculdadeOrigem = faculdadeOrigem; } public void mostraProfessor() {

52

System.out.println("nome: " + super.onome()); System.out.println("nome familia: " + super.osobreNome()); System.out.println("Titulao: " + super.atitulacao()); System.out.println("idade: " + super.amatricula()); System.out.println("Faculdade this.faculdadeOrigem); } } Cdigo 10.3 - Classe ProfessorVisitante de origem: " +

public class Projeto { // variveis do objeto private String codigo; private String descricao; private String dataInicio; private String dataTermino; private Professor professorResponsavel; // mtodos do objeto public Projeto(String codigo, String descricao, String umProfessor) { dataInicio, String dataTermino, Professor

this.codigo = codigo; this.descricao = descricao; this.dataInicio = dataInicio; this.dataTermino = dataTermino; this.professorResponsavel = umProfessor; } public void mostraProjeto() { System.out.println("nome: " + this.codigo); System.out.println("nome familia: " + this.descricao); System.out.println("idade: " + this.dataInicio); System.out.println("idade: " + this.dataTermino); } } Cdigo 10.4 - Classe Projeto

public class Inscricao {

53

// variveis do objeto private Projeto umProjeto; private Aluno umAluno; // mtodos do objeto public Inscricao(Projeto umProjeto, Aluno umAluno) { this.umProjeto = umProjeto; this.umAluno = umAluno; } public void mostraInscricao() { System.out.println("nome: " + this.umProjeto); System.out.println("nome familia: " + this.umAluno); } } Cdigo 10.5 - Classe Inscricao

public class Orientacao { // variveis do objeto private Inscricao umaInscricao; private String dataOrientacao; private String descricaoOrientacao; // mtodos do objeto public Orientacao(Inscricao umaInscricao, String dataOrietacao, String descricaoOrientacao) { this.umaInscricao = umaInscricao; this.dataOrientacao = dataOrientacao; this.descricaoOrientacao = descricaoOrientacao; } public void mostraOrientacao() { System.out.println("Inscricao: " + this.umaInscricao); System.out.println("Data this.dataOrientacao); System.out.println("Descrio this.descricaoOrientacao); } } Cdigo 10.6 - Classe Orientacao da orientao: oreintao: " " + +

54

public class ExecutaCaso { public static void main (String args[]) { // criando os professores Professor joseProfessor = new Professor ("Jose", "Santos", "MSc", 2345); joseProfessor.mostraProfessor(); Professor joaoProfessor = new Professor ("Maria", "Clara", "DSc", 4567); joaoProfessor.mostraProfessor();

ProfessorVisitante willianProfessor = new ProfessorVisitante ("Willia", "Blake", "DSc", 2346, "U of Sidney"); willianProfessor.mostraProfessor();

//criando os projetos - repare que passada a referncia do professor responsvel pelo projeto Projeto proj1 = new Projeto("abc123", requisitos", "12set2005", "12dez2005", joseProfessor); proj1.mostraProjeto(); "Gerencia de

Projeto proj2 = new Projeto("def345", "Gerencia configurao", "12ago2005", "12nov2005", joaoProfessor); proj2.mostraProjeto();

de

Projeto proj3 = new Projeto("ghi123", "Gerencia de riscos", "10jul2005", "12out2005", willianProfessor); proj3.mostraProjeto();

// criando os alunos Aluno carlosAluno = new Aluno ("Carlos", "Miguel", 5678); carlosAluno.mostraAluno();

Aluno pauloAluno = new Aluno ("Paulo", "Antunes", 3245); pauloAluno.mostraAluno();

Aluno joselioAluno = new Aluno ("Joselio", "Silva", 9876); joselioAluno.mostraAluno();

// fazendo a inscrio

dos alunos nos projetos

55

Inscricao inscricao01 = new Inscricao (proj1, carlosAluno); inscricao01.mostraInscricao();

Inscricao inscricao02 = new Inscricao (proj2, pauloAluno); inscricao02.mostraInscricao();

//fazendo a orientao Orientacao orientacao01 = "15set2005", "objetivos do projeto"); new Orientacao (inscricao01,

orientacao01.mostraOrientacao();

Orientacao orientacao02 "21set2005", "entrega do escopo");

new

Orientacao

(inscricao01,

orientacao02.mostraOrientacao();

Orientacao orientacao03 = new "03out2005", "definio dos casos de uso"); orientacao03.mostraOrientacao(); } }

Orientacao

(inscricao01,

Cdigo 10.7 - Classe ExecutaCaso

56

Parte Dois Introduo aos princpios de projeto OO: padres. Captulo 11 Princpios e Padres.
De forma resumida o desenho e a programao de sistemas orientados a objetos pode ser definido como a identificao de classes, a identificao de mtodos e a especificao de mensagens entre estas classes. Esta forma de abordar o problema encobre vrias dificuldades encontradas por aqueles que iniciam na programao orientada a objetos. Foi visto, na parte um deste trabalho, que aprender a utilizao da linguagem JAVA apenas um comeo. Saber como identificar, especificar e projetar orientado a objetos um outro problema. A identificao e a especificao no so assunto no escopo deste trabalho. Assim, ser tratada apenas a questo de projeto, em particular da questo de padres de projeto e dentre deles queles que esto diretamente associados a o projeto bsico. Desta forma, necessria a caracterizao de princpios e questes de desenho que devem ser considerados. Decidir quais os mtodos devem ser alocados a classes uma tarefa que deve ser feita de forma criteriosa, pois impacta seriamente no desenho final do sistema. Para a alocao de mtodos s classes o conceito de distribuio de responsabilidade [Larman, 2004] importante. A distribuio de responsabilidades considera as obrigaes e o comportamento que um determinado objeto deve possuir. As responsabilidades so caracterizadas de duas formas: conhecer e fazer. As responsabilidades de fazer consideram tanto o controle de outros objetos quanto saber o que o prprio objeto deve saber. As responsabilidades de conhecer consideram saber os dados armazenados e a relao com outros objetos. Uma boa modelagem de classes ilustra bem as responsabilidades de conhecer que devem ser atribudas entre as classes de objetos. Deve-se destacar que uma determinada responsabilidade pode ser representada em vrios mtodos espalhados pelas classes de objetos. A quantidade de mtodos que implementam uma responsabilidade define a granularidade da mesma. Este aspecto diferencia responsabilidade de mtodo, as responsabilidades so abstratas. Outro aspecto que merece nfase que a responsabilidade considera a questo da colaborao entre os objetos atravs de seus mtodos. Para o emprego de responsabilidades Larmam[2004] definiu alguns princpio ou padres que auxiliam nesta tarefa: os padres GRASP General Responsibility Assignment Software Patterns (Padres Gerais de Software para Alocao de Responsabilidade). Nesta parte sero considerados cinco destes princpios: especialista da informao, o especialista de criao, baixo acoplamento, alta coeso e controlador. Mas o que um padro? Um padro de projeto nomeia, abstrai e identifica os aspectos-chave de uma estrutura de projeto comum para torn-la til para a criao de um projeto orientado a objetos

57

reutilizvel [Gamma et all, 1995, pg 20]. Um padro no desceve algo novo, sua importncia est na sistematizao de conhceimento de projeto para a soluo de determionados problemas em um determinado contexto. Desta forma a descrio possui quatro elementos bsicos: o nome do padro, o problema a ser resolvido, a soluo proposta e as conseqncias das vantagens e desvantagens de se aplicar o padro. Um dos objetivos dos padres o de apronder com o sucesso dos outros ao invs dos fracassos [Eckel, 2003 apud Mark Johnson]. Costuma-se falar de padres associados implementao, entretanto, o modelo de apresentar solues padronizadas para determinados problemas atualmente est presente em vrias esferas da construo de software tais como: casos de uso, anlise, UML entre outros.

11.1 O padro Especialista da Informao.


O problema que o padro Especialista da Informao procura resolver : quem conhece os dados e informaes de um determinado objeto? Este padro um dos princpios bsicos de todos os padres, pois lida com o princpio bsico de distribuio de responsabilidade pelas classes. A soluo para este problema est em atribuir a responsabilidade a classe que detenha ou obtenha a informao necessria a sua utilizao atravs de seu acesso direto. Exemplos: Em sistema de pedidos qual classe deve ser responsvel pelo clculo do valor final do pedido?

Considerando as classes Pedido e Item de Pedido. Podemos considerar que Pedido a classe que deve possuir o mtodo valorFinaldoPedido( ) j que ela que possui acesso imediato a todos os itens de pedido. Em um sistema acadmico qual classe deveria ser responsvel pelo clculo de aprovao de uma determinada turma? Considerando as classes Turma, Notas de Alunos. Podemos considerar que Turma a classe que deve possuir o mtodo calculoAprovacaoTurma( ) j que ela possui acesso imediato s notas dos alunos na Turma. Como identificar que uma classe possui a responsabilidade de acesso para a obteno de informao de outra classe quando se possuem vrias classes? A soluo verificar o modelo conceitual de dados. este modelo que ir representar as principais relaes entre as classes e objetos. Estas relaes podem ser apenas estruturais como uma relao de associao, como tambm pode ser uma relao de posse completa, como a relao de compusio, ou de posse parcial como a relao de agregao.

11.2 O padro de Criao.


O problema que o padro de Criao procura resolver : quem deve criar um determinado objeto? A princpio, vrias abordagens podem ser consideradas j que existem vrias classes de objetos que

58

compem o seu modelo do problema. Entretanto, deve-se atribuir a uma destas classes a responsabilidade de criao de um determinado objeto, logo reina a pergunta listada acima. Para aplicar o padro de Criao deve-se: Manter o princpio do padro Especialista, mantendo as responsabilidades associadas s classes de

objetos de acesso mais imediato a este. Atribuir a responsabilidade de criao classe de objetos que possua uma associao com a outra classe de objetos, que necessita ser criada. Existem vrios tipos de associao, tais como: De uma para muitos, exemplo: uma venda possui vrios itens de venda, sendo venda e itens

de venda classes; De composio, exemplo: um pedido composto de uma ou mais formas de pagamento, sendo pedido e formas de pagamento classes; De agregao, exemplo: uma bicicleta possui dois pneus, onde bicicleta e pneus so classes.

A classe de objetos que cria outra classe de objetos j deve existir. Desta forma associaes de um para muitos so uma evidncia de qual classe deve criar a outra.

Wazlawick[2004] estabelece um conjunto de verificaes para se decidir qual classe dever criar instncias em outra classe, so estes: Verificar se a classe de objeto parte da uma relao de agregao ou composio. Se for o caso o criador ser a classe de objeto agregadora. Se a verificao i falhar certifique-se que a classe possui uma associao de um para muitos ou de um para um-zero para a classe do objeto a ser criado. Se existir e estiver em um caminho possvel de uma classe controladora, esta poder ser a classe criadora. Em caso de empate verifique qual a classe est mais fortemente associada a classe a ser criada.

11.3 O padro Baixo Acoplamento.


O padro baixo acomplamento tem como objetivo a reduo e miniminizao da conexo de um objeto com outros. Esta conexo esta relacionada a ter conhecimento sobre os outros objetos ou simplemente depender de outros objetos. De forma sujacente manter o acoplamento baixo significa redizir o impacto de mudana j que ao se alterar um objeto um mnimo de outros objetos sero afetados. Desta forma a atribuio de responsabelidade de ser tal que mantenha as visibilidades entre os objetos em seu nvel mnimo.

59

11.4 O padro Alta Coeso.


O padro de alta coeso est diretamente associado ao padro de baixo acomplamento. A problema que se procura resolver de como manter o objeto devidademente focado naquilo que ele se propem a realizar. Assim as responsabilidades de um determinado objeto devem ser aquelas reduzam a complexidade do mesmo. Uma classe, com baixa coeso, provavelmente estar representando mais de um conceito [Wazlawick, 2004].

11.4 O padro Controlador.


O padro controlador procura tratar do problema de qual objeto deve coordenar as atividades de um adeterminada operao do sistema. Em geral este objeto pode ser o prprio objeto sistema ou o objeto que representa a funcionalidade em que est sendo implementada.

11.5 Exemplo um.


O cdigo 11.1, de forma simplificada, servir de ponto de partida para ilustrar os diversos padres que podem ser utilizados. Um exemplo com interface grfica e utilizandoo padro MVC pode ser encontrado no endereo: http://csis.pace.edu/~bergin/mvc/mvcgui.html. public class ConversaoTemp { private double farenheit = 32.0; public double getFarenheit(){return farenheit;} public double getCelsius(){return (farenheit - 32.0)*5.0/9.0;} public void setFarenheit(double tempF) { farenheit = tempF; } public void setCelsius(double tempC) { farenheit = tempC*9.0/5.0 + 32.0; } public static void mostraFarenheit (double tempF) {System.out.println ("O valor de Farenheit " + tempF); } public static void mostraCelsius (double tempC) {System.out.println ("O valor de Farenheit " + tempC); } public static void mostraEscalaCelsius (ConversaoTemp temp) {for (int i=0; i<101; i++) { temp.setCelsius(i); System.out.println("Valor de Celsius" + i + "=" + temp.getFarenheit() );} } } Cdigo 11.1 - Classe ConversaoTemp O exemplo do cdigo 11.1 tem como objetivo realizar a converso de Celsius para Farenheit e vice-versa. No exemplo acima nota-se que existem duas responsabilidades bsicas associadas a classe

60

ConversoTemp: a primeura que coresponde ao modelo da prpria converso de Celsius para Farenheit e outra de mostrar seus valores. Assim, a classe no est coesa, ou seja, est com baixa coeso sendonecessrio separar essas duas responsabilidades bsicas. As classes divididas seriam ento representadas nos cdigos 11.2 e 11.3. O cdigo 11.2 fica com a responsabilidade de apenas representar o modelo e o cdigo 11.3 com a responsabilidade de mostrar os valores public class NovaConversaoTemp { private double farenheit = 32.0; public public public { } public { } } Cdigo 11.2 - Classe NovaConversaoTemp double getFarenheit(){return farenheit;} double getCelsius(){return (farenheit - 32.0)*5.0/9.0;} void setFarenheit(double tempF) farenheit = tempF; void setCelsius(double tempC) farenheit = tempC*9.0/5.0 + 32.0;

public class MostraConversaoTemp { public static void mostraFarenheit (double tempF) {System.out.println ("O valor de Farenheit " + tempF); } public static void mostraCelsius (double tempC) {System.out.println ("O valor de Farenheit " + tempC); } public static void mostraEscalaCelsius (NovaConversaoTemp temp) {for (int i=0; i<101; i++) { temp.setCelsius(i); System.out.println("Valor de Celsius" + i + "=" + temp.getFarenheit() );} } } Cdigo 11.2 - Classe MostraConversaoTemp

Agora a classe DemoConversaoTemp ir criar o objeto da Classe NovaConversaoTemp e mostrar seus valores, conforme o cdigo 11.3. public { class DemoConversaoTemp public static void main (String args[]) { NovaConversaoTemp objetoTemp = new NovaConversaoTemp(); double F = objetoTemp.getFarenheit(); MostraConversaoTemp.mostraCelsius (F); MostraConversaoTemp.mostraEscalaCelsius (objetoTemp); } } Cdigo 11.3 - Classe DemoConversaoTemp

61

Entretanto

verifica-se

que

acoplamento

entra

as

classes

MostraConversaoTemp

NovaConversaoTemp se estabelece atravs dois modos de passagem de parmetro. Pode-se reduzir este acoplamento passando apenas o objeto que se deseja mostrar e deixando para a classe MostraConversaoTemp os encargos de tratar o objeto da forma que lhe convier. Uma outra alternativa utilizar mtodos polimrficos. Assim o novo cdigo desta ltima classe mostrado em 11.4. A nova chamada das classes mostrado em 11.5.

public class NovoMostraConversaoTemp { public static void mostraFarenheit (NovaConversaoTemp temp) {System.out.println ("O valor de Farenheit " + temp.getFarenheit()); } public static void mostraCelsius (NovaConversaoTemp temp) {System.out.println ("O valor de Celsius " + temp.getCelsius()); } public static void mostraEscalaCelsius (NovaConversaoTemp temp) {for (int i=0; i<101; i++) { temp.setCelsius(i); System.out.println("Valor de Celsius" + i + "=" + temp.getFarenheit() );} } } Cdigo 11.4 - Classe NovoDemoConversaoTemp

public {

class NovoDemoConversaoTemp

public static void main (String args[]) { NovaConversaoTemp objetoTemp = new NovaConversaoTemp(); NovoMostraConversaoTemp.mostraCelsius (objetoTemp); NovoMostraConversaoTemp.mostraEscalaCelsius (objetoTemp); } } Cdigo 11.5 - Classe NovoDemoConversaoTemp

62

Referncias bibliogrficas.
Bruce Eckel Thinking in Java. 4rd edition. Este um excelente livro. Possui uma leitura fcil com exemplos ilustrativos e claros. Pode ser baixado da internet gratuitamente ou comprado como um livro regular. Est em ingls. Disponvel em http://mindview.net/Books.

Bruce Eckel .Thinking in Patterns. Revision 0.9 - May 20, 2003 Disponvel em http://mindview.net/Books/TIPatterns/

Craig Larman. Applying UML and PatternsAn Intro to OOA/D and Iterative Development. 3rd edition. 2004. um timo livro com vrios fundamentos de UML e padres. O captulo 1 de orientao a objetos est disponvel em: http://www.craiglarman.com/book_applying/intro.pdf.

Erick Gamma, Richard Helm, Ralph Johnson e John Vlissides. Padres de Projeto - Solues Reutilizveis de Sotfware Orientado a Objetos. Este um livro clssico de padres de projeto. Difcil de ler para quem est iniciando o assunto. Para iniciantes o melhor o do Larman.

H. M. Deitel e P.J. Deitel. Java How to Program, 6/e Prentice Hall 2005 ou Java como programar. Bookman. Este um clssico do Java. Acredito que este livro no deva ser o primeiro livro que um novato devesse comprar, mas uma referncia completa. Algumas downloads do Java How to Program, 6/e esto disponveis em http://www.deitel.com/books/jHTP6/. No site pode-se baixar os seguintes captulos do livro: Chapter 1: Introduction to Computers, the Internet and World Wide Web; Chapter 2: Introduction to Java Programming; Chapter 3: Introduction to Classes and Objects

Java Tutorial da Sun. Este tutorial da Sun muito bom. Cobre grande parte da tecnologia Java. Alm de poder realiza-lo pela internet este pode ser baixado e utilizado localmente. Disponvel em

http://java.sun.com/docs/books/tutorial/

63

Rafael Santos. Introduo a Orientao a Objetos usando Java. Este um dos livros da srie SBC/Campus. um timo livro, bem explicado e com muitos exemplos e que procura explicar os conceitos de OO em Java. um excelente livro introdutrio ao assunto.

Raul Sidnei Wazlawick. Anlise e Projeto de Sistemas de Informao Orientados a Objetos. 2004. Este um outro livro da srie SBC/Campus. um timo livro de anlise e projeto de sistemas de informao. Muito prtico e objetivo.

64

Você também pode gostar