Você está na página 1de 12

1/12

Orientao a Objetos: uma abordagem com Java Parte 1


A essncia da programao orientada a objetos usando Java
Usando a linguagem de programao Java para aplicar as ideias, conceitos e abstraes do paradigma orientado a objetos CARLOS ARAJO Um parmetro que pode ser usado para medir a complexidade de um software o nmero de linhas de cdigo. Por exemplo, o Windows Vista tem cerca de 50 milhes de linhas, o kernel do Linux 3.0 tem mais de 14 milhes de linhas, a verso 2.0 do OpenOffice j apresentava mais de 10 milhes de linhas de cdigo. Por essa perspectiva no difcil concluir o quanto a complexidade do software vem aumentando a cada ano que passa. Isso acarreta alguns problemas. Um deles a dificuldade em cumprir o cronograma do projeto. Quanto maior o tamanho do programa, maior a distncia entre a estimativa de tempo prevista e o real. Segundo, os custos de desenvolvimento e manuteno aumentam consideravelmente com o tamanho do software. Estima-se, atualmente, que o custo de manuteno de um software atinge de 70 a 80% do custo total. Uma terceira dificuldade no consequncia da complexidade, mas devido dinmica dos negcios do usurio: os requisitos mudam. Neste sculo, os processos nos negcios mudam a cada seis meses ou menos. Nas dcadas de 60 e 70, essas mudanas ocorriam a cada cinco anos. Uma das peas chave para solucionar essas dificuldades chama-se reutilizao. A reutilizao fundamental para o aumento da produtividade e melhoria da qualidade. De maneira geral, reutilizao consiste na utilizao mais de uma vez de todos os tipos de informao e artefatos encontrados durante o processo de desenvolvimento, tais como requisitos, cdigo e testes. Existem diversas tcnicas que podemos lanar mo para conseguir a reutilizao. Dentre elas podemos citar os repositrios dos sistemas de controle de verso e a orientao a objetos. E sobre a orientao a objetos que pretendemos apresentar nesta matria. A Programao Orientada a Objetos (Object-Oriented Programming) foi concebida na dcada de 60 no Centro Noruegus de Computao. Nessa poca, os conceitos de classe e herana foram introduzidos atravs da linguagem Simula 67. No entanto, somente aps o lanamento da linguagem Smalltalk nos anos 70 considerada a linguagem orientada a objetos (OO) mais pura que existe que a OO comeou a se popularizar. Aps isso surgiram linguagens chamadas hbridas, tais como C++ e Java. Desta forma, neste artigo sero estudados os conceitos de orientao e de que forma podemos utilizar a linguagem Java para implement-los.

Pacotes
Em geral, quando desenvolvemos pequenas aplicaes, pode ser vivel manter o cdigo em um mesmo diretrio. Entretanto, em aplicaes maiores, colocar todos os arquivos em uma mesma pasta, sem organizao, pode prejudicar principalmente a manuteno do sistema. Por isso sugerese que o cdigo seja agrupado, de forma que as classes relacionadas fiquem em um mesmo diretrio. Esses diretrios juntamente com os arquivos dentro deles so chamados de pacotes, e tanto o cdigo fonte das classes quanto os arquivos compilados e mesmo outros pacotes so organizados dentro desses diretrios. Por curiosidade, todo o cdigo da API (Application Programming Interface) do Java tambm est organizado em pacotes. Por exemplo: o pacote java.io contm as classes referentes a I/O (Entrada/Sada) e o pacote java.net oferece o que necessrio para lidar com redes.

2/12 Supondo que uma classe chamada Pessoa pertena ao pacote br.com.nomeempresa.nomeprojeto, ento seu nome completo ser br.com.nomeempresa.nomeprojeto.Pessoa. Essa uma forma de evitar conflitos de nomes, pois classes em pacotes diferentes tm nomes completos diferentes. Considerando este mesmo exemplo, quando o compilador encontra uma referncia classe Pessoa, ele ir procurar o arquivo Pessoa.class no diretrio br/com/nomeempresa/nomeprojeto. Tenha em mente que cada um desses diretrios um pacote. Para indicar que um arquivo fonte Java pertence a um dado pacote, a primeira linha de cdigo deste arquivo deve ser a declarao:
package br.com.nomeempresa.nomeprojeto

No caso em que esta declarao no est presente, o arquivo fonte far parte do pacote default, que o prprio diretrio corrente do projeto. Para referenciar uma classe de um pacote, possvel usar o nome completo da classe. No entanto, o que se faz normalmente usar a declarao import. Por exemplo, pode-se declarar o seguinte no incio do cdigo:
import br.com.nomeempresa.nomeprojeto.Pessoa;

A partir de ento a classe pode ser referenciada apenas pelo nome Pessoa. Podemos tambm especificar no cdigo do programa que todas as classes do pacote sero referenciadas somente pelo nome. Para obter esse efeito, declaramos:
import br.com.nomeempresa.nomeprojeto.*;

A exceo a essas regras o uso das classes do pacote java.lang. Quando uma nova classe criada na aplicao, implicitamente declarado um import a este pacote. Ele contm classes essenciais para a interpretao de qualquer programa Java, tais como String, System e Object.

Classes
Um dos mais importantes produtos das fases da anlise e projeto orientados a objetos o modelo de domnio da aplicao. Para representar esse modelo, vimos na segunda parte da srie de artigos sobre Modelagem de Software com UML, publicada na Easy Java Magazine n 5, que a Linguagem de Modelagem Unificada (UML) uma das ferramentas que podemos adotar. A UML permite expressar o modelo de domnio em um diagrama de classes. Uma classe descreve um grupo de objetos com caractersticas e comportamento similares, relacionamentos comuns com outros objetos e semntica comum. As caractersticas dos objetos so descritas pelos atributos e o comportamento definido pelos mtodos. Os mtodos so equivalentes aos procedimentos e funes usados em linguagens do paradigma estruturado como Pascal e C, mas os mtodos manipulam apenas suas variveis locais e os atributos da classe. Na definio da classe, cada atributo identificado por um nome e um tipo de dado. Em Java, o tipo de dado de um atributo pode ser um tipo primitivo (int, char ou boolean, por exemplo) ou uma classe. Alm de definir nome e tipo de dado do atributo, podemos estabelecer que ele ir receber um valor inicial chamado valor default, ou padro no momento da criao do objeto. Para especificar que um atributo receber um valor default, basta que seja atribudo a ele um valor na sua declarao, por exemplo:
double salario = 545.00;

Os atributos da definio de uma classe tambm so chamados variveis, mas para distingui-las daquelas que so declaradas dentro de mtodos, por exemplo, elas so chamadas variveis de instncia. A exceo ocorre com os atributos static estudados daqui a pouco que so chamados variveis de classe.

3/12 Vimos que, alm das caractersticas, as classes definem o comportamento dos objetos, o qual representado pelos mtodos. Para declarar um mtodo, especificado o que chamamos de assinatura, que constituda de um identificador o nome do mtodo o tipo de dado para o retorno e a lista de argumentos. Cada argumento ter um nome que o identifica e um tipo de dado correspondente. Os argumentos so valores passados pelo objeto que chama o mtodo, de forma que este possa cumprir o seu objetivo. Os argumentos so variveis locais do mtodo. A assinatura de um mtodo com argumentos pode ser definida assim, por exemplo:
public double soma(double a, double b);

Se o mtodo no tiver argumentos, devemos incluir parnteses vazios na declarao. A palavrachave void deve ser declarada no lugar do tipo de dado de retorno caso o mtodo no retorne nenhum valor. A seguir apresentamos um exemplo de declarao de um mtodo sem argumentos e sem retorno:
public void imprimir(); Modificadores de acesso a membros

Parece muito mais simples escrever programas que permitam o acesso s variveis de instncia de um objeto. Porm, isso poderia resultar em um cdigo pouco seguro. Por exemplo, suponha que qualquer objeto pudesse ter acesso ao atributo saldo de uma instncia de ContaCorrente. Dessa forma, seria possvel modificar o saldo de uma conta sem necessidade de fazer um depsito, por exemplo. Por essa razo, recomendado restringir, tanto quanto possvel, o acesso aos membros de um objeto. Essa uma prtica da orientao a objetos conhecida como encapsulamento, que estudaremos em seguida. De maneira a ajudar na tarefa de estabelecer esses limites, tanto os atributos quanto os mtodos denominados membros de uma classe podem ter modificadores de acesso, que podem ser: public os membros da classe atributos e mtodos que recebem esse modificador podem ser acessados por qualquer outro objeto; private neste caso os membros da classe no so acessveis por qualquer outro objeto; protected membros que recebem esse modificador podem ser acessados fora do pacote apenas por objetos de classes que derivem desta atravs de herana; default no exatamente um modificador, mas sim um nvel de acesso. Permite visibilidade apenas dentro do pacote. No exige um modificador explcito. Considere ento a classe Empregado, que tem os seguintes atributos com seus correspondentes tipos de dados: matricula int, nome String, cpf int, cargo String, salario double e gratificacao double. Suponha tambm que a classe tem o mtodo calculaSalario() que retorna a soma de salario e gratificacao. Esta definio pode ser implementada preliminarmente conforme a Listagem 1.
Listagem 1. Cdigo da classe Empregado.
public class Empregado { int matricula; String nome; long cpf; String cargo; double salario; double gratificacao; public double calculaSalario() { return this.salario + this.gratificacao; } }

Encapsulamento

Os atributos da classe Empregado, exibidos na Listagem 1, no possuem um modificador de acesso, portanto tm nvel de acesso default. Entretanto, essa no uma boa prtica da orientao a

4/12 objetos, como falamos antes. A recomendao que os atributos de um objeto e a implementao de seus mtodos devem ser o mais privados possvel. Em geral, os atributos no devem ser visveis fora da classe e no se deve conhecer detalhes da implementao dos seus mtodos. Essa prtica recebe o nome de encapsulamento. Ou seja, devemos construir uma classe de forma que o usurio tenha acesso apenas ao seu conjunto de mtodos chamado de interface. Este conceito no deve ser confundido com o tipo abstrato interface, o qual define mtodos que uma classe deve implementar, que ser explicado na prxima parte da matria. Por ora, podemos antecipar que o tipo interface definido como se fosse uma classe sem atributos e cujos mtodos possuem apenas a assinatura. Deste modo, vamos modificar o cdigo da Listagem 1 para se adequar a esse conceito. Se voc estiver usando o NetBeans, selecione no menu Refatorar > Encapsular campos. Na janela que ser aberta, pressione o boto Selecionar tudo. Na opo Javadoc voc pode escolher se deseja comentrios ou no. Deixe as demais opes com os valores padro e pressione o boto Refatorar. Feito isso, ser criado um cdigo semelhante ao da Listagem 2.
Listagem 2. Cdigo da classe Empregado com encapsulamento.
public class Empregado { private int matricula; private String nome; private long cpf; private String cargo; private double salario; private double gratificacao; public double calculaSalario() { return this.getSalario() + this.getGratificacao(); } public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public long getCpf() { return cpf; } public void setCpf(long cpf) { this.cpf = cpf; } public String getCargo() { return cargo; } public void setCargo(String cargo) { this.cargo = cargo; } public double getSalario() { return salario; } public void setSalario(double salario) { this.salario = salario; } public double getGratificacao() { return gratificacao; }

5/12
public void setGratificacao(double gratificacao) { this.gratificacao = gratificacao; } }

Note que os modificadores de acesso dos atributos foram alterados para private. Alm disso, foram criados os mtodos getters e setters pblicos para cada campo da classe. Os getters so mtodos de leitura dos campos e os setters so os mtodos de escrita. Esses mtodos tambm so chamados de accessors e mutators, respectivamente. A palavra-chave this usada para referenciar membros da instncia corrente. Ou seja, this refere-se ao objeto que est executando o cdigo onde esta palavrachave pode ser vista. Esta referncia no obrigatria, porque se um mtodo ou varivel for acessado sem o operador ponto (.), isto significa que tal membro pertence classe corrente. No entanto, a sua utilizao torna o cdigo mais fcil de ler.
Modificadores de classes

Podemos observar que na declarao da classe utilizamos o modificador de acesso public, que significa que a classe pode ser acessada por qualquer outra, independente do pacote onde cada uma esteja. Mas se no for especificado um modificador de acesso na declarao da classe, ento ela ter acesso em nvel de pacote, tambm chamado default, ou seja, a classe s poder ser acessada por outra classe do mesmo pacote. Uma classe somente pode ter um desses dois nveis de acesso. Alm do modificador public ou a ausncia dele outros modificadores que no se referem a nveis de acesso podem ser usados na declarao de uma classe, tais como final e abstract. O modificador final usado para definir que a classe no pode ser estendida (herdada). Apesar de parecer estranho, em alguns casos isso pode ser necessrio. Por exemplo, String uma classe de Java definida como final. Imagine a confuso que seria se os programadores pudessem estender String e redefinir seu comportamento. Outro modificador que podemos usar para classes abstract. Uma classe que tem esse modificador chamada abstrata e no pode ser instanciada, ou seja, voc no pode criar um objeto a partir dela. Mais adiante estudaremos herana e classes abstratas.
Construtores

Em Java, os objetos so construdos utilizando a palavra-chave new. Quando usamos este termo, executado um cdigo que chamamos de construtor. Portanto, para que os objetos sejam instanciados, toda classe deve possuir, no mnimo, um construtor. Se o desenvolvedor no o criar explicitamente, o compilador cria um sem argumentos, que denominado construtor padro. Por exemplo, observe o cdigo da Listagem 3.
Listagem 3. Cdigo da classe Empregado com construtor explcito.
public class Empregado { private int matricula; private String nome; private long cpf; private String cargo; private double salario; private double gratificacao; // construtor public Empregado() { } public double calculaSalario() { return this.getSalario() + this.getGratificacao(); } //... restante do cdigo aqui }

Note que o construtor se assemelha a um mtodo, com a diferena fundamental que um construtor no tem tipo de retorno. Eles devem ter exatamente o mesmo nome da classe onde so declarados e eventualmente podem ter os mesmos modificadores de acesso a membros. Na classe da Listagem 3 foi criado um construtor sem argumentos, que no deve ser chamado construtor padro, mesmo se assemelhando ao que criado pelo compilador. Pois, chamamos construtor padro apenas aquele

6/12 que o compilador cria implicitamente para ns, quando a classe no possui um construtor explicitamente declarado. Quando um construtor sem argumentos usado para instanciar um objeto, e nenhum valor definido para inicializao dos atributos no corpo da classe, ento o compilador define valores padro para as variveis de instncia de acordo com o tipo de dado, conforme a Tabela 1. Isso obriga que tenhamos que inicializar os campos usando os mtodos setters. Por isso, em geral, os construtores so usados para inicializar o estado das variveis de instncia. Na Listagem 4 mostramos o cdigo da classe Empregado, implementando um construtor para inicializar os atributos. Tipo de dado byte, short, int, long char boolean float double String (ou qualquer outra classe)
Listagem 4. Construtor para inicializar os atributos da classe.
public class Empregado { private int matricula; private String nome; private long cpf; private String cargo; private double salario; private double gratificacao; // construtor public Empregado(int matricula, String nome, long cpf, String cargo, double salario, double gratificacao) { this.matricula = matricula; this.nome = nome; this.cpf = cpf; this.cargo = cargo; this.salario = salario; this.gratificacao = gratificacao; } //... restante do cdigo aqui }

Valor da inicializao 0 '' false 0.0f 0.0 null

Tabela 1. Valores de inicializao padro dos atributos de um objeto.

Os exemplos de classes que foram apresentados at o momento implmentam apenas um construtor. No entanto, se estudarmos a documentao da classe String, por exemplo, veremos que possvel criar cadeias de caracteres chamando o construtor String() sem argumentos, passando uma string literal ou at um array de bytes como argumento. Portanto, conclumos que uma classe pode ter mais de um construtor. Isso bastante comum e chamado sobrecarga conceito que ser estudado mais frente. E mesmo que voc tenha vrios construtores sobrecarregados, tambm aconselhvel que a classe tenha um construtor sem argumentos. Isso importante, principalmente quando necessrio estender a classe. Pois como veremos mais adiante, os construtores da subclasse, implicitamente, fazem uma chamada ao construtor sem argumentos da classe me. E se no houver um construtor desses na superclasse, o compilar ir reclamar. Na Listagem 5 mostrada a classe Empregado com trs construtores, incluindo aquele sem argumentos.
Listagem 5. Classe com mais de um construtor.
public class Empregado {

7/12
private private private private private private int matricula; String nome; long cpf; String cargo; double salario; double gratificacao;

// construtores da classe public Empregado() { } public Empregado(int matricula, String nome) { this.matricula = matricula; this.nome = nome; } public Empregado(int matricula, String nome, long cpf, String cargo, double salario, double gratificacao) { this.matricula = matricula; this.nome = nome; this.cpf = cpf; this.cargo = cargo; this.salario = salario; this.gratificacao = gratificacao; } //... restante do cdigo aqui }

A partir dessa definio de classe podemos criar objetos usando cada um desses construtores, da forma que estamos mostrando na Listagem 6. No entanto, o objeto e3 teve todos os seus atributos inicializados, o objeto e2 inicializou apenas dois atributos, e e1 ainda precisa definir valores para todos os seus atributos. Ou seja, dependendo do construtor chamado, pode ser necessrio invocar mtodos setters para inicializar variveis de instncia.
Listagem 6. Instanciao de objetos.
public class Programa { public static void main(String[] args) { Empregado e1 = new Empregado(); Empregado e2 = new Empregado(123, "Joo da Silva"); Empregado e3 = new Empregado(124, "Antnio Jos", 12345678901L, "Vendedor", 700.0, 120.0); } }

Voltaremos a falar sobre construtores na seo seguinte, quando estudarmos herana.


Modificadores de membros no referentes a acesso

Existem vrios modificadores que podem ser aplicados a membros de uma classe. No entanto, por ora, vamos falar apenas de final e static. O modificador final tem funes diferentes quando aplicados a atributos e a mtodos. Quando aplicado a um atributo, indica que este uma constante. Por exemplo, a classe Math do pacote java.lang que contm mtodos para fazer operaes matemticas bsicas define o campo PI declarado como static. Esse campo define um valor para pi aproximadamente 3.14 usado em clculos matemticos, tais como a rea do crculo. Por padro, os nomes de campos declarados como final devem ser escritos em maisculas. Por sua vez, mtodos declarados como final no podem ser sobrescritos nas subclasses. Estudaremos sobrescrita em uma seo mais adiante. Java utiliza esse modificador quando deseja que o programador utilize forosamente determinados recursos da API, tais como alguns mtodos da classe java.lang.Thread. Essa restrio garante que um mtodo no ser substitudo, oferecendo certa segurana sua implementao. Este recurso, entretanto, deve ser usado com cautela, pois invalida muitos dos benefcios da orientao a objetos, tais como a extensibilidade atravs do polimorfismo, que estudaremos mais frente. Membros de uma classe podem ser declarados como static quando seu comportamento ou valor no dependem do estado de um objeto. Suponha que uma classe tem um mtodo que sempre

8/12 executado da mesma maneira, sem depender dos dados da instncia, que retorna um nmero aleatrio por exemplo. Ou seja, no necessrio instanciar um objeto para que o mtodo realize a sua funo. Em outra situao, imagine que desejamos contar as instncias de uma classe. Definir esse contador como uma varivel de instncia no funcionaria, pois ela seria reinicializada com um valor padro a cada vez que um novo objeto criado. Nos dois cenrios anteriores, a resposta usar o modificador static. Membros declarados como static pertencem classe, em vez de a uma instncia. Um exemplo clssico de static o mtodo main(), que deve estar presente em toda aplicao. O mtodo main() o ponto de entrada para um programa Java, e a JVM o executa implicitamente sem que seja necessrio instanciar um objeto. Na Listagem 6 mostramos a classe Programa, e como se sabe, esta classe no instanciada para que main() seja executado. Na Listagem 7 mostramos um exemplo de classe utilizando membros static.
Listagem 7. Cdigo da classe que declara membros estticos.
public class Matematica { public static final double PI = 3.14; public static double perimetroCirculo(double raio) { return 2 * PI * raio; } }

E como acessamos os membros estticos? Observe como isso feito na Listagem 8. Note que usamos o operador ponto no nome da classe Matematica, e no na referncia a uma instncia.
Listagem 8. Acesso aos membros static.
public class Programa { public static void main(String[] args) { double raio = 5.0; System.out.println("Valor de pi: " + Matematica.PI); System.out.println("Perimetro do crculo: " + Matematica.perimetroCirculo(raio)); } }

Uma varivel ou mtodo esttico pertencem classe e no a uma instncia dela, pois eles existem antes mesmo que seja criado qualquer objeto. Por isso, ao criar mtodos static, duas restries importantes devem ser observadas: Um mtodo static no pode acessar um membro mtodo ou atributo no esttico de sua prpria classe; Mtodos static no podem ser sobrescritos. Eles apenas podem ser redefinidos. Na seo onde estudaremos sobrescrita voltaremos a este assunto.

Relacionamentos entre Classes


Ao analisar o domnio de um problema percebemos que os objetos normalmente se relacionam. Por exemplo: um cliente compra produtos em uma loja e atendido por um vendedor, um aluno cursa uma disciplina que ministrada por um professor. Quando estudamos os relacionamentos aprendemos que duas classes podem se relacionar atravs de composio, agregao, associao e generalizao/especializao. Composio e agregao so os relacionamentos todo-parte, onde um objeto parte de outro, como no caso em que Monitor parte de Computador. Quando um objeto utiliza outro, dizemos que isso uma associao, tal como Professor ministra Disciplina. A generalizao/especializao ocorre quando um objeto herda caractersticas e comportamento de outro (herana), como no caso de Cachorro um Animal. No entanto, esses relacionamentos se resumem aos chamados TEM-UM nos casos de composio, agregao e composio e -UM para o caso de generalizao/especializao. Portanto, o que nos interessa dentro do escopo do nosso artigo so o relacionamento TEM-UM e o relacionamento -UM.

9/12
Relacionamento TEM-UM

Este relacionamento baseado na utilizao de uma classe por outra, inclusive nos casos de composio e agregao. Ou seja, se uma classe A TEM-UM B, ento o cdigo de A tem uma referncia a uma instncia de B. Para exemplificar este relacionamento, considere o caso do relacionamento Pessoa TEM-UM Endereco. Neste exemplo, a classe Pessoa deve ter um campo do tipo Endereco, conforme mostra a Listagem 9. Na Listagem 10 apresentamos o cdigo da classe Endereco.
Listagem 9. Implementao do relacionamento TEM-UM.
public class Pessoa { private String nome; // varivel de instncia que define o relacionamento TEM-UM private Endereco endereco; public Pessoa() { } public Pessoa(String nome, Endereco endereco) { this.nome = nome; this.endereco = endereco; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public Endereco getEndereco() { return endereco; } public void setEndereco(Endereco endereco) { this.endereco = endereco; } }

Listagem 10. Classe Endereco usada por Pessoa.


public class Endereco { private String logradouro; private int numero; private String complemento; private int cep; private String cidade; private String estado; public Endereco() { } public Endereco(String logradouro, int numero) { this.logradouro = logradouro; this.numero = numero; } public Endereco(String logradouro, int numero, String complemento, int cep, String cidade, String estado) { this.logradouro = logradouro; this.numero = numero; this.complemento = complemento; this.cep = cep; this.cidade = cidade; this.estado = estado; } //... mtodos getters e setters aqui }

10/1 A ideia aqui que a classe Pessoa usa a referncia a Endereco, que tem seus mtodos chamados por Pessoa sem a necessidade que o cdigo desses mtodos seja duplicado. Esta uma prtica totalmente de acordo com as metas de se obter alta coeso (objeto com finalidade muito bem definida) e baixo acoplamento (grau de interdependncia entre as classes). Genericamente falando, se uma classe A TEM-UM B, ento A aparenta ter tambm o comportamento B, pois mtodos de B podem ser invocados atravs de A. No entanto, quando os mtodos de B precisam ser chamados, A simplesmente delega a B a execuo de tais tarefas. Um exemplo de instanciao de um objeto Pessoa mostrado na Listagem 11. Note que necessrio instanciar um Endereco para podermos criar um objeto Pessoa. Observe tambm que no necessrio usar uma referncia explcita a Endereco, podemos simplesmente instanciar o objeto na prpria chamada ao construtor de Pessoa. E esse procedimento sempre pode ser usado quando um construtor ou mtodo espera receber um objeto como argumento.
Listagem 11. Exemplo de instanciao de um relacionamento TEM-UM.
public class Main { public static void main(String[] args) { Pessoa p = new Pessoa("Joo da Silva", new Endereco("Rua Maravilha", 55)); } }

Note que ao utilizarmos a classe Pessoa, desejamos que ela faa realmente as tarefas definidas em seu comportamento, de acordo com o princpio da coeso, mesmo que para isso ela precise solicitar o servio a outras classes, tais como Endereco. Pois uma classe pode ter a colaborao de outras para cumprir o seu objetivo. Entretanto, Pessoa jamais deve implementar tarefas que so de Endereco, pois uma das preocupaes do projeto de software orientado a objetos com a reutilizao. Se, por exemplo, precisarmos definir uma nova classe chamada Empresa, constatamos que esta tambm TEM-UM Endereco, e se no modelarmos endereo como uma classe, sua implementao tambm teria que ser parte de Empresa, contrariando o princpio do reuso. Portanto, as classes devem ser projetadas de forma a podermos reutiliz-las em outros contextos.
Relacionamento -UM

O relacionamento generalizao/especializao ocorre quando uma classe B um subtipo de outra, A. A esse relacionamento chamamos comumente de herana, e neste, alm da implementao de interfaces, que se baseia o conceito -UM. Mas, por enquanto, falaremos apenas de herana de classes, pois ainda no estudamos interfaces. Generalizao/especializao o relacionamento onde uma classe (subclasse) estende outra (superclasse), aproveitando suas caractersticas e comportamento. Por exemplo, sabe-se que professor uma pessoa. Desta forma, podemos dizer que a classe Professor -UM(a) Pessoa. Em Java, o relacionamento -UM entre classes definido atravs da palavra-chave extends ou implements no caso de interfaces. A seguir, mostramos na Listagem 12 o cdigo da classe Professor, a qual estende a classe Pessoa, apresentada na Listagem 9.
Listagem 12. Implementao do relacionamento -UM.
public class Professor extends Pessoa { private double horaAula; public Professor() { } public Professor(String nome, Endereco endereco, double horaAula) { super(nome, endereco); this.horaAula = horaAula; } public double getHoraAula() { return horaAula; } public void setHoraAula(double horaAula) { this.horaAula = horaAula;

11/1
} }

Observe que Professor incluiu uma caracterstica denominada horaAula, tendo herdado de Pessoa os demais atributos. Na Listagem 13 podemos ver um exemplo de criao de um objeto Professor.
Listagem 13. Criao de um objeto de uma subclasse
public class Main { public static void main(String[] args) { Professor p = new Professor("Joo da Silva", new Endereco("Rua Maravilha", 55), 20.00); } }

Um detalhe aqui merece uma ateno especial. Um dos construtores de Professor recebe como parmetros o nome e o endereo, que so atributos herdados de Pessoa. E estes parmetros so usados na chamada super(nome, endereco) no cdigo de implementao do construtor. A palavrachave super usada para referenciar membros da superclasse. Vamos ento falar um pouco mais sobre construtores para entender isso. Antes de retornamos ao assunto construtores, no entanto, importante sabermos que toda classe em Java -UM Object. Object uma classe da API que superclasse de todas as classes existentes em Java ou daquelas que so criadas pelo desenvolvedor. Quando, na definio da classe, no for especificada uma superclasse atravs do uso de extends o compilador assume que a superclasse Object. Do nosso exemplo anterior, conclumos, portanto que Professor estende Pessoa, que por sua vez estende Object. Voltando a falar de construtores, podemos afirmar que todo construtor invoca o construtor de sua superclasse com uma chamada implcita a super(). A exceo ocorre quando o construtor chama um construtor sobrecarregado da mesma classe, usando this(). Falaremos sobre isso daqui a pouco. Desta forma, quando new Professor() executado, o construtor de Pessoa ser chamado. E quando o construtor de Pessoa chamado, o de Object tambm . Ento, vamos relacionar mais algumas regras de construtores, alm daquelas que j foram citadas: Se voc criar um construtor com argumentos e precisar de um sem argumentos, ento voc ter que cri-lo; A primeira instruo de um construtor deve ser uma chamada a super() ou a um construtor sobrecarregado por meio de uma chamada a this(); Se voc definir um construtor e no inserir uma chamada a this() ou a super(), o compilador ir inserir automaticamente uma chamada a super(), sem argumentos; Uma chamada a super() pode incluir argumentos, que so passados ao construtor da superclasse; Um construtor no pode ser chamado a partir de um mtodo. uma boa prtica incluir sempre um construtor sem argumentos em suas classes, mesmo que existam construtores com argumentos. Como j falamos antes, em cada construtor de uma subclasse o compilador insere chamadas ao construtor sem argumentos da superclasse se uma chamada explcita a super() ou a this() for encontrada. Portanto, ao adotar esta prtica, evitamos que o compilador reclame quando ele tentar inserir chamadas a super() nos construtores das subclasses. Na classe Professor, apresentada na Listagem 12, h um construtor com argumentos que faz uma chamada a super(nome, endereco). Essa chamada ir inicializar os atributos da superclasse Pessoa conforme uma das regras acima, e assim este construtor no ter uma chamada a super() sem argumentos.

Concluses
Escrever aplicaes que sejam fceis de estender e manter uma misso crucial de todo desenvolvedor. O paradigma de orientao a objetos oferece uma maneira de criar programas que

12/1 facilitam o alcance desse objetivo. Pensando nisso, neste primeiro artigo da srie introduzimos alguns conceitos e prticas que podem ajudar muito aos programadores em seus primeiros passos na programao orientada a objetos. O entendimento desses conceitos e de algumas regras aqui estudadas iro facilitar muito a compreenso e aplicao de novos tpicos relacionados, tais como sobrescrita, sobrecarga, classes abstratas, interfaces e polimorfismo, que deixamos para a parte seguinte da matria.

Links
ccuec.unicamp.br/revista/infotec/artigos/leite_rahal.html Programao Orientada ao Objeto: uma abordagem didtica

Livros
Sun Certified Programmer for Java 6 Study Guide, Kate Sierra e Bert Bates, McGrawHill, 2008 Excelente livro para aqueles que desejam se preparar para o SCJP De que se trata o artigo:

Apresenta os conceitos iniciais de orientao a objetos, de forma leve, tentando mostrar exemplos prticos em Java que tornem mais fcil o entendimento do paradigma. Tambm antecipa brevemente alguns temas que sero abordados no futuro.
Para que serve:

Serve como um guia bsico aos desenvolvedores que esto dando os primeiros passos na programao orientada a objetos e tambm queles que esto se preparando para o SCJP Certificao para Programador Java.
Em que situao o tema til:

A programao em Java baseia-se em classes, e compreender os conceitos de orientao a objetos fundamental para escrever programas cujos mdulos podem ser reutilizveis e escalveis. Os sistemas esto cada vez mais complexos, e criar programas que sejam fceis de manter depende do entendimento dos recursos do paradigma OO e da linguagem de programao utilizada.
Resumo DevMan:

Neste artigo, sero apresentados os conceitos iniciais da orientao a objetos e como eles podem ser implementados em Java. Para isso, mostramos como organizar classes em pacotes e como criar classes preocupando-se principalmente com o encapsulamento e a coeso. O texto fala sobre os relacionamentos entre as classes, e apresentamos exemplos de como implementar esses relacionamentos, principalmente TEM-UM (que reune composio, agregao e associao) e UM (que corresponde generalizao/especializao). Os contrutores e seu encadeamento so estudados com detalhes, principalmente as regras que devem ser observadas na sua criao.
Carlos Arajo (stonefull.stm@gmail.com) professor do curso de Sistemas de Informao no Centro Universitrio Luterano de Santarm Par. Leciona Estruturas de Dados e Linguagem de Programao Orientada a Objetos usando Java, desenvolve sistemas h 20 anos e certificado SCJP. Mantm o blog http://professorcarlos.blogspot.com.