CLASSES E OBJECTOS
INTRODUÇÃO
A maioria dos problemas relacionados com o processo de desenvolvimento de aplicações advêm da forma como
estas são concebidas. Problemas tais como, atrasos na entrega do produto (software/aplicação), elevados custos
de manutenção, etc., resultam da forma como as soluções são concebidas.
Ao longo da história, vários paradigmas de concepção de aplicações foram experimentadas com vista a minimizar
estes problemas. Um dos paradigmas que se mostrou poderoso para minimizar os problemas relacionados com o
desenvolvimento de aplicações é a programação orientada a objectos. A programação orientada a objectos é uma
opção quase inevitável para o desenvolvimento de aplicações de baixo custo, flexíveis e de fácil manutenção;
A programação orientada a objectos é uma técnica de análise, desenho e escrita de código na qual os dados são
agrupados em módulos específicos considerados classes e as operações mais relevantes sobre esses dados são
definidos dentro desses módulos. Esses módulos são vistos como moldes de objectos em analogia aos objectos do
mundo real uma vez que eles possuem características (dados), comportamentos e acções (funções executadas
dentro dos módulos) e além disso, eles podem comunicar com outros (envio de mensagem e recepção de
respostas de/e para outros módulos).
CONCEITOS
CLASSE E OBJECTO
O objecto é o elemento principal na programação orientada a objectos, pois, neste paradigma, “tudo gira em
volta” deste elemento. Tal como acontece com os objectos do mundo real, o que se considera objecto em
programação orientada a objectos tem características, estado e comportamento; as características e estados,
correspondem aos dados (agrupados) e o comportamento aos métodos (procedimentos e funções) sobre os
dados. O módulo no qual são agrupados estes elementos (dados e métodos) chama-se classe e ela descreve as
características e comportamentos do (s) objecto (s) que por ela serão gerados.
Uma classe pode ser definida como representação das variáveis e métodos comuns a todos os objectos de um
determinado tipo, isto é, a classe, define as características e comportamentos de todos os objectos que pertençam
a ela.
Ficha de apoio para a cadeira de 1
Programação
Classes e Objectos
ESTRUTURA DE UMA CLASSE DE OBJECTO
Page | 2
Onde: <modificador_visibilidade> é um dos modificadores de visibilidade: private, protected, public
<definicao_de_atributos_da_classe> é o conjunto de declaração de variáveis (atributos) de
instância; os atributos correspondem as características das entidades descritas pela classe. A
definição de atributos obedece a seguinte estutura:
<definicao_de_metodos_construtores> é o conjunto de métodos construtores da classe. Os
métodos construtores fornecem uma interface para a criação de objectos da classe, sem eles se
tornaria impossível fazer uso da classe. Uma classe pode ter vários construtores com assinaturas
diferentes.
A definição de construtor obedece a seguinte estrutura:
<definicao_de_metodos_da_classe> é o conjunto de métodos (comportamentos) da classe
EXEMPLO 1
Ficha de apoio para a cadeira de 2
Programação
Classes e Objectos
Page | 3
Deste exemplo podemos identificar os elementos principais duma classe:
Nome da classe – é o identificador da classe; é através dele que se faz referência a classe. No exemplo acima o
nome da classe é Estudante; ele deve iniciar com letra maiúscula e deve coincidir com o nome do ficheiro no qual
está escrito. Não se pode criar uma classe Estudante num ficheiro [Link]; A classe Estudante deve ser
criada num ficheiro com nome [Link];
Atributos – são as características da classe (ou dos objectos que serão gerados por ela); os atributos descrevem as
propriedades da classe. No nosso exemplo temos três atributos, nomeadamente: nome, teste1 e teste2;
A definição dum atributo (na classe) possui um modificador de visibilidade o qual pode ser cada um destes tipos:
public: neste caso o atributo pode ser acedido e manipulado por qualquer outro objecto;
private: o atributo definido com este modificador, só pode ser acedido pelo objecto no qual foi definido.
Ficha de apoio para a cadeira de 3
Programação
Classes e Objectos
protected: neste caso, o atributo pode ser acedido pelos objectos “filhos” do objecto no qual o atributo foi
definido. (O conceito de “objecto filho” será tratado mais adiante);
Quando se define um atributo sem a indicação do modificador de visibilidade, por defeito considera-se que ele é
public, isto é, pode ser acedido e manipulado dentro de qualquer outra classe;
Page | 4 Vamos rescrever a nossa classe Estudante incluindo os modificadores de visibilidade;
O atributo nome foi definido como public, logo, qualquer objecto que fizer uso do Estudante pode fazer referência
a este atributo. Os atributos teste1 e teste2 foram definidos como private, logo, eles só podem ser acedidos e
manipulados dentro da classe Estudante.
Métodos – Os métodos definem o comportamento dos objectos que serão gerados pela classe; são eles que
manipulam os atributos da classe. À semelhança dos atributos, os métodos possuem modificadores de visibilidade.
No nosso exemplo temos três métodos, nomeadamente, calculaMedia, verificaSituacao e imprimirEstudante;
Ficha de apoio para a cadeira de 4
Programação
Classes e Objectos
Como se pode observar da figura, os métodos podem aceitar parâmetros assim como não. Um parâmetro é o meio
pelo qual a classe se comunica com outros objectos.
O método Construtor: prestando atenção no nosso exemplo, notamos a existência de dois métodos diferentes dos
Page | 5 já mencionados; eles possuem mesmos nomes e estes coincidem com o nome da classe. A estes métodos
chamamos de construtores; e conforme o nome sugere, eles são responsáveis pela construção de objectos da
classe. O construtor é responsável pela inicialização das variáveis de instância (atributos); esta inicialização pode
ser explícita ou implícita; a inicialização é explícita quando dentro do construtor são inicializados os atributos; por
exemplo, na nossa classe Estudante, o segundo construtor inicializa explicitamente todos os atributos do
Estudante.
Numa classe pode se criar tantos construtores quantos forem necessários; no caso em que houver vários
construtores, eles devem ser diferenciados pelos parâmetros; não podemos ter construtores com mesmas
assinaturas (mesmos parâmetros) na mesma classe.
Toda a classe tem um construtor; no caso em que não se definir um, o compilador encarrega-se de construir um
construtor default por nós; este é um construtor que não leva nenhum parâmetro;
EXEMPLO 2
Elabore uma classe que permite agrupar as características de um cidadão;
Resolução
Ficha de apoio para a cadeira de 5
Programação
Classes e Objectos
Esta classe (de nome Cidadao) possui quatro atributos, nomeadamente: nome, apelido, idade e numBI. O nome e
apelido foram definidos com o modificador de visibilidade “public”; a idade e o numBI foram definidos como
“private” o que significa que eles só podem ser acedidos na classe Cidadao.
A classe possui dois construtores, o primeiro com assinatura public Cidadao() o outro com assinatura public
Page | 6 Cidadao(String nome, String apelido, int idade, String numBI). Dentro do segundo construtor temos instruções de
inicialização das variáveis de instância; os valores recebidos pelos parâmetros são passados para as variáveis de
instância da classe. A palavra “this” indica ao compilador que a variável é um atributo do da classe;
EXEMPLO 3
Inclua, na classe criada no exemplo anterior, um método que permita imprimir os dados do Cidadao.
Resolução
Ficha de apoio para a cadeira de 6
Programação
Classes e Objectos
Page | 7 “COMO TUDO FUNCIONA”
Uma classe pode ser considerada como um molde (ou uma máquina) através do qual são gerados objectos com
características comuns; por exemplo, a classe Estudante pode ser considerada como um molde para gerar objectos
do tipo Estudante, os quais terão mesmas descrições e comportamentos;
A classe descreve o comportamento de entidades1 dentro de um sistema. Isto significa que em programação
orientada a objectos, tudo o que é entidade será definido como objecto e, os seus estados e comportamentos
serão definidos dentro da classe.
Esta abordagem traz alguns benefícios, uma vez que os métodos que manipulam os dados ficam embutidos dentro
do módulo “dono” dos dados o qual chamamos de classe; isto significa que apenas os métodos da classe (objecto)
é que podem manipular os dados o que garante maior consistência e integridade de dados. Além disso, em caso de
alteração da implementação dos métodos, os efeitos sobre os outros módulos (classes/objectos) serão mínimos,
uma vez que a comunicação entre uma classe e as outras não é feita directamente através dos dados mas sim
através de troca de mensagens.
Outro benefício considerável é que o mesmo módulo (classe) pode possuir várias instâncias num dado momento
durante a execução da aplicação; e estes objectos terão características e comportamentos similares, uma vez que
todos são gerados pela mesma classe.
INSTÂNCIA DE UMA CLASSE
Instância duma classe é um objecto concreto ou um valor concreto em analogia aos tipos de dados concretos; por
exemplo, para a classe Estudante (responsável pela geração de objectos do tipo Estudante) um Estudante
concreto, por exemplo Thomas Ludis seria uma instância da classe Estudante. Cada objecto é responsável pela
manipulação dos seus próprios dados e os objectos a fora não podem “mexer” directamente nesses dados (isso
não é aconselhável, embora seja possível).
Isto traz vantagem, uma vez que o objecto dono “sabe melhor” manipular os seus dados e em caso de mudanças
na forma de manipulação destes dados, os efeitos em relação aos objectos afora serão mínimos.
1
Uma entidade, é definida como algo, real ou abstracto, sobre o qual se pretende capturar e armazenar dados;
Ficha de apoio para a cadeira de 7
Programação
Classes e Objectos
Uma classe é algo estático expresso em forma de texto no código de uma aplicação, ao passo que objecto é algo
dinâmico que é criado em tempo de execução da aplicação; o objecto ocupa um espaço de memória do
computador no qual armazena-se o estado do objecto (ou valor) e o conjunto de operações aplicáveis aos dados
(atributos) do objecto.
Page | 8
CRIAÇÃO DE INSTÂNCIA DE CLASSES
Conforme referido antes, a classe descreve a estrutura de todos os objectos que por ela serão gerados. E como são
gerados os objectos da classe?
A criação de instâncias de classes pode ser feita em qualquer trecho de um programa; para isso bastará se definir
uma variável que seja do tipo da classe. Após a definição, a variável deverá se inicializada recorrendo-se a um dos
construtores da classe. Por exemplo: se quiséssemos criar uma instância da classe Estudante teríamos de escrever
as linhas seguintes:
//look at this, it’s a bloody data type
Na linha 1 declaramos a variável que irá guardar a nossa instância; esta declaração não se difere das declarações
de variáveis de tipos primitivos que temos feito;
Na linha 2 inicializamos (ou instanciamos, ou ainda, construímos) o nosso objecto. A inicialização é feita através da
chamada à palavra reservada “new” seguido pelo construtor da classe objecto. Nesta linha, é invocado o
construtor da classe estudante com a assinatura String, double, double; e conforme se pode ver neste construtor,
os valores recebidos são atribuídos às variáveis de instância do nosso objecto, respectivamente nome, teste1 e
teste2;
Após a linha 2, a variável “est” faz referência a um objecto com as seguintes características:
EXEMPLO 4
Elabore um programa que cria duas instâncias da classe “Cidadao” criada no exemplo 3; a primeira instância deve
ser criada recorrendo ao construtor sem parâmetros; a segunda deve ser criada recorrendo ao outro construtor e
deve criar uma instância com as seguintes características:
Ficha de apoio para a cadeira de 8
Programação
Classes e Objectos
Nome = Yolanda, apelido = Adams, idade = 32, bi = 6458547458L
Resolução
Page | 9
MANIPULAÇÃO DOS ELEMENTOS DE OBJECTOS
Uma vez criado o objecto, torna-se possível a manipulação dos seus atributos através da invocação dos seus
métodos. Para invocar um método de um objecto usa-se a sintaxe seguinte:
[Link](Parâmetros)
Onde:
1. Variável: é a variável definida como do tipo da classe;
2. nomeDoMetodo: é o nome do método que pretendemos invocar;
3. Parâmetros: são os parâmetros de entrada de valores; caso o método não tenha parâmetros não se
especifica nenhum valor como parâmetro no chamamento do método;
O exemplo abaixo mostra como são invocados os métodos do objecto Estudante
Ficha de apoio para a cadeira de 9
Programação
Classes e Objectos
Page | 10
Na linha 4, invocamos o método imprimirEstudante() para imprimir os dados do estudante de acordo com o que foi
definido neste método; o método imprimirEstudante() é void, isto é, não retorna nada, portanto, o seu
chamamento não aparece como atribuição a nenhuma variável;
Na linha 6, invocamos o método calculaMedia(), este método retorna um double, portanto ele aparece em uma
instrução de atribuição;
A invocação dos atributos do objecto é feita da mesma forma como é feita a invocação dos métodos; as linhas a
seguir mostram como podemos imprimir o nome do estudante;
Para modificar os atributos de um objecto simplesmente fazemos uma atribuição dos novos valores aos atributos
do objecto; por exemplo, se quiséssemos modificar o nome do nosso estudante faríamos o seguinte:
Nota: A modificação dos valores de objectos feita fora das suas próprias classes é uma prática desaconselhada;
exactamente por causa disso, aconselha-se a declarar os atributos das classes com o modificador de visibilidade
private (ou protected) para impedir esta prática.
EXEMPLO 5
Escreva um programa que exemplifica o chamamento dos atributos nome e apelido e do método imprimirCidadao
definidos na classe do exemplo 2.
Resolução
Ficha de apoio para a cadeira de 10
Programação
Classes e Objectos
Page | 11
EXERCÍCIOS
1. Crie uma classe (Electrodoméstico) capaz de gerar objectos com características de electrodomésticos;
inclua nela pelo menos três atributos; inclua também um método chamado visualizarElectrodomestico
capaz de imprimir na tela os valores dos atributos de um electrodoméstico.
2. Com base na classe criada no exercício anterior, crie um programa que permita criar e visualizar um
electrodoméstico com características definidas no próprio programa;
3. Altere o programa do exercício anterior de modo que as características do objecto sejam introduzidas
pelo teclado;
Ficha de apoio para a cadeira de 11
Programação