Você está na página 1de 84

Curso Tcnico em Informtica

Programao Orientada a Objetos I

Robson Braga de Andrade


Presidente da Confederao Nacional da Indstria

Rafael Lucchesi
Diretor do Departamento Nacional do SENAI

Regina Maria de Ftima Torres


Diretora de Operaes do Departamento Nacional do SENAI

Alcantaro Corra
Presidente da Federao da Indstria do Estado de Santa Catarina

Srgio Roberto Arruda


Diretor Regional do SENAI/SC

Antnio Jos Carradore


Diretor de Educao e Tecnologia do SENAI/SC

Marco Antnio Dociatti


Diretor de Desenvolvimento Organizacional do SENAI/SC

Confederao Nacional da Indstria


Servio Nacional de Aprendizagem Industrial

Curso Tcnico em Informtica

Programao Orientada a Objetos I


Dieison Grumovski

Florianpolis/SC
2011

proibida a reproduo total ou parcial deste material por qualquer meio ou sistema sem o prvio consentimento
do editor.

Autor
Dieison Grumovski

Fotografias
Banco de Imagens SENAI/SC
http://www.sxc.hu/
http://office.microsoft.com/en-us/ images/
http://www.morguefile.com/
http://www.bancodemidia.cni.org.br/

SENAI/SC Servio Nacional de Aprendizagem Industrial


Rodovia Admar Gonzaga, 2.765 Itacorubi Florianpolis/SC
CEP: 88034-001
Fone: (48) 0800 48 12 12
www.sc.senai.br

Prefcio
Voc faz parte da maior instituio de educao profissional do estado.
Uma rede de Educao e Tecnologia, formada por 35 unidades conectadas e estrategicamente instaladas em todas as regies de Santa Catarina.
No SENAI, o conhecimento a mais realidade. A proximidade com as
necessidades da indstria, a infraestrutura de primeira linha e as aulas
tericas, e realmente prticas, so a essncia de um modelo de Educao
por Competncias que possibilita ao aluno adquirir conhecimentos, desenvolver habilidade e garantir seu espao no mercado de trabalho.
Com acesso livre a uma eficiente estrutura laboratorial, com o que existe
de mais moderno no mundo da tecnologia, voc est construindo o seu
futuro profissional em uma instituio que, desde 1954, se preocupa em
oferecer um modelo de educao atual e de qualidade.
Estruturado com o objetivo de atualizar constantemente os mtodos de
ensino-aprendizagem da instituio, o Programa Educao em Movimento promove a discusso, a reviso e o aprimoramento dos processos
de educao do SENAI. Buscando manter o alinhamento com as necessidades do mercado, ampliar as possibilidades do processo educacional,
oferecer recursos didticos de excelncia e consolidar o modelo de Educao por Competncias, em todos os seus cursos.
nesse contexto que este livro foi produzido e chega s suas mos.
Todos os materiais didticos do SENAI Santa Catarina so produes
colaborativas dos professores mais qualificados e experientes, e contam
com ambiente virtual, mini-aulas e apresentaes, muitas com animaes, tornando a aula mais interativa e atraente.
Mais de 1,6 milhes de alunos j escolheram o SENAI. Voc faz parte
deste universo. Seja bem-vindo e aproveite por completo a Indstria
do Conhecimento.

Sumrio
Contedo Formativo
Apresentao

46 Unidade de estudo 5

68 Unidade de estudo 10

Pacotes, como
Organizar suas
Classes

11

Interface

69

12 Unidade de estudo 1
Introduo a
Programao
Orientada a Objeto

47

Seo 1 - Pacotes, como


organizar suas classes

72 Unidade de estudo 11
Programao
Concorrente
e Threads

50 Unidade de estudo 6
Herana

13

Seo 1 - Relao com o


mundo real

14

Seo 2 - Relao com o


mundo da programao

51

Seo 1 - Reaproveitamento
de cdigo

15

Seo 3 - Classes e objetos

54

20

Seo 4 - Mtodos e
atributos

Seo 2 - Reescrita de
mtodos

73

56 Unidade de estudo 7
26 Unidade de estudo 2

Polimorfismo

Acessibilidade
57
27

Seo 1 - Controle de acesso

31

Seo 2 - Encapsulamento

Seo 1 - Polimorfismo

60 Unidade de estudo 8
Agregao e
Composio

36 Unidade de estudo 3
Construtores
61
37

Seo 1 - Construtores

42 Unidade de estudo 4

64 Unidade de estudo 9
Classes Abstratas

Sobrecarga de
Mtodos
65
43

Seo 1 - Agregao e
composio

Seo 1 - Sobrecarga de
mtodos

Seo 1 - Classes Abstratas

Seo 1 - Interface

Seo 1 - Programao
concorrente e threads

Finalizando

79

Referncias

81

CURSOS TCNICOS SENAI

Contedo Formativo
Carga horria da dedicao
Carga horria: 90 horas

Competncias
Analisar e implementar os princpios da programao orientada a objetos para
soluo de problemas computacionais.

Conhecimentos
Orientao a objetos: abstrao, classes, objetos e instncias.
Comentrios.
Construtores.
Encapsulamento.
Herana.
Interface de desenvolvimento (IDE).
Mtodos e atributos.

Habilidades
Diferenciar programao orientada a objetos de programao estruturada.
Aplicar os conceitos de orientao a objetos.
Utilizar interface de desenvolvimento (IDE) de sistemas orientados a objetos.

Atitudes
Organizao e zelo na utilizao de equipamentos.
Foco no contedo trabalhado.
Acesso a stios relacionados ao tema trabalhado.
Organizao e limpeza dos ambientes coletivos.
Dedicao e empenho nas atividades curriculares e extracurriculares.
Capacidade de abstrao.
Trabalho em equipe.
Apresentao de novas solues para situaes problemas.
Cumprimento de prazos.
Anlise crtica de suas produes.

PROGRAMAO ORIENTADA A OBJETOS I

Apresentao
Bem-vindo disciplina de Programao Orientada a Objetos I!
Voc tem em mos, um material que foi preparado para assessorar o
aperfeioamento de seus conhecimentos como futuro profissional da
indstria de Tecnologia da Informao (TI).
A disciplina de Programao Orientada a Objetos tem como principal
objetivo prepar-lo para desenvolver sistemas com um novo paradigma
de programao, mais fcil de entender, de manutenir e de desenvolver
novas funcionalidades.
Para isso, a disciplina apresentar conceitos referentes programao
orientada a objeto, desde declaraes simples de variveis at a utilizao
de recursos mais complexos, como herana entre classes. Certamente,
esse material ir ajud-lo no desenvolvimento profissional, abordando
um tema que base para a maioria dos grandes sistemas desenvolvidos.
Bons estudos!

Dieison Grumovski
Dieison Grumovski graduado em Cincia da Computao
pela Universidade do Estado de
Santa Catarina (UDESC) e ps-graduado em Engenharia da
Produo pela Faculdade de
Tecnologia Internacional (FATEC). Atua no SENAI em Joinville como instrutor de cursos
tcnicos em informtica, tendo
atuado tambm como instrutor
nos cursos de aprendizagem
industrial. Ainda no SENAI trabalhou como pesquisador desenvolvendo um projeto com a
tecnologia de identificao por
radio frequncia (RFID). Atualmente, alm das atividades de
docncia, atua como Analista de
Sistemas, trabalhando com tecnologia e inovao na rea de
Gerenciamento Eletrnico de
Documentos (GED) e Gerenciamento de Processos de Negcio
(BPM) na empresa TOTVS S.A.
em Joinville.

PROGRAMAO ORIENTADA A OBJETOS I

11

Unidade de
estudo 1
Sees de estudo
Seo 1 - Relao com o mundo real
Seo 2 - Relao com o mundo da
programao
Seo 3 - Classes e objetos
Seo 4 - Mtodos e atributos

Introduo a Programao
Orientada a Objeto
SEO 1

Relao com o mundo


real
Muita coisa mudou desde o incio
do desenvolvimento de software
para computadores, entre essas
mudanas, esto as prprias linguagens utilizadas para o desenvolvimento desses sistemas.
Nesse momento, vale lembrar da
programao estruturada, desenvolvida nos anos 60 e que impulsionou a criao de softwares mais
complexos, porm, no eram somente os sistemas desenvolvidos
que podiam ser mais complexos,
os projetos tornavam-se muito
grandes e difceis de serem entendidos e manutenidos, e, claro, que isso gerava, e ainda gera,
altos custo para muitas empresas.
Com o objetivo de solucionar
esses problemas, a programao
orientada a objeto foi criada e tida
como resposta aos problemas encontrados na programao estruturada.
A programao orientada o objeto, conhecida pelo termo POO,
tem como uma de suas caractersticas levar para o mundo virtual um pouco do mundo real, e
representar os objetos que aqui
existem. Essa representao realizada por meio de classes e atributos, onde a classe representa o
objeto em si, e os atributos as suas
caractersticas.

Para entender melhor o conceito da orientao a objeto, observe como


exemplo, um objeto do nosso dia a dia.

Figura 1: Ilustrao de objetos


Fonte: Locadora (2011)

Nenhum copo da imagem acima igual ao outro, porm, todos so


copos, logo, podemos dizer que todos fazem parte da mesma classe e
possuem os mesmos atributos. Nesse caso, temos a classe copo e os seus
atributos podem ser, altura, dimetro da base, dimetro do bocal, peso
e volume.
No mundo real, os objetos interagem entre si, o copo precisa de uma
mesa para se apoiar, o ser humano utiliza uma cadeira para sentar-se
mesa, e um copo para beber gua. Na programao no diferente, os
objetos tambm interagem entre si, cada um tem um papel e oferece
servios, que so utilizados por outros objetos, e assim o sistema toma
forma e se torna funcional.
Na prxima seo, voc estudar sobre classes e objetos dentro do mundo da programao.

PROGRAMAO ORIENTADA A OBJETOS I

13

SEO 2

Relao com o mundo


da programao
J fizemos um estudo para entendermos o que so classes e objetos no mundo real, agora, a vez
de entender o que esses termos
significam no mundo da informtica. Para facilitar, utilizaremos
como exemplo para nosso estudo
uma videolocadora, identificando
algumas classes existentes e seus
atributos, que se transformaram
em objetos para realizar a troca de
mensagens.
Quando voc vai at a videolocadora com o simples objetivo de
locar um filme, voc imagina com
quantas classes tem contato desde
o momento que chega at o momento em que sai com o filme em
mos? No? Pois essa uma boa
prtica para aprender a identificar
classes de um sistema. Sabendo
disso, vamos praticar!
O primeiro ponto identificar
tudo que se precisa para locar uma
mdia em uma locadora. Observe:

Primeiro, define-se em qual

videolocadora ser realizada a


locao

Definido isso, voc se des-

loca at o local e convidado a


fazer um cadastro para que a loja
saiba onde voc mora, e para que
possa entrar em contato, caso
seja necessrio. Como voc um
novo cliente, o atendente solicitar algumas informaes para
fazer o cadastro, como alguns
dados pessoais e endereo.

Aps a realizao do cadastro,


voc poder se dirigir at a categoria de filmes do seu interesse e
escolher um filme, que pode ser
de qualquer tipo de mdia (DRD,
blue-ray ou outro).

14

CURSOS TCNICOS SENAI

Com base nessa anlise, j possvel definir alguns itens como classes obrigatrias do nosso sistema.
Veja:

Locadora
Cliente
Endereo
Categoria
Filme
Mdia
Funcionrio

DICA
Para facilitar o estudo e entendimento do material,
ser utilizado o exemplo da
videolocadora. Nos exerccios, ser empregado o de
uma fbrica de carros e motos. Esse processo vai facilitar o seu desenvolvimento,
pois voc poder utilizar os
exemplos do material para
desenvolver as atividades.
E, agora que voc entendeu
como definir as classes do
seu sistema, coloque em
prtica o conhecimento, realizando o exerccio 1 do caderno de atividades prticas.

Aps a identificao das classes,


necessrio identificar tambm os
seus atributos. Para isso, responda
a pergunta: quais so as caractersticas dessas classe? Ao mesmo
tempo em que se responde a essa
pergunta, possvel definir as caractersticas necessrias para que
o sistema seja desenvolvido. Fazendo isso, tm-se novas classes
definidas e prontas.
Para entender melhor como responder a essa pergunta, vamos
analisar com calma a classe Filme, da nossa lista de classes.
Pensando em um filme, podemos
imaginar vrias caractersticas, tais

como, nome, tempo de durao,


ano de lanamento, categoria,
diretor, nmero de atores, lugar
onde foi filmado, tempo de durao para ser criado, valor gasto
para o desenvolvimento do filme
e tudo mais que possa representar
uma informao referente a ele.
Mas ser que todos esses itens so
mesmo necessrios para o desenvolvimento do sistema? Claro que
no. Para que o dono da locadora
ou o prprio cliente precisariam
saber quanto custou para criar o
filme, no momento em que ele estiver sendo alugado? Essa uma
informao desnecessria, e, pensando dessa forma, a nossa classe Filme ficaria com os seguintes
atributos:

nome;
tempo de durao;
ano de lanamento;
categoria.

Essas quatro caractersticas facilitam a busca do filme dentro da


locadora e ainda permitem fornecer aos clientes informaes, que
normalmente lhes interessam,
como, o ano de lanamento e a
durao do filme.

DICA
Aproveite e defina os atributos para cada classe que
voc identificou para o seu
sistema de fbrica de carros
e motos, resolvendo o exerccio 2 do caderno de atividades prticas.

Para fazermos uma descrio mais


tcnica das classes, podemos utilizar a UML para represent-las.
importante lembrar que a UML
(Unified Modeling Language) uma
linguagem utilizada para descre-

ver, de forma grfica e padronizada, sistemas desenvolvidos utilizando o conceito de orientao


a objetos. (BOOCH; RUMBAUGH; JACOBSON, 2006)
Para fazer uma descrio mais tcnica das classes utiliza-se a UML,
por meio do diagrama de classes,
que representado por um retngulo dividido em trs partes,
onde a primeira indica a classe, a
segunda os atributos e a terceira
os mtodos.
Observe como
fica a representao da classe Filme no diagrama de classe UML.

SEO 3

Classes e objetos
At agora, voc aprendeu a definir as classes e seus atributos, tornando possvel o desenvolvimento de um sistema para uma videolocadora.
Agora, veja como criar essas classes, aplicando a linguagem de programao Java, utilizada no desenvolvimento de sistemas orientados a objetos. Sero usadas as classes j definidas.
Voc j sabe que uma classe uma representao de um objeto. Agora,
vamos repassar isso para o computador, para que por meio dessa classe,
possamos entender e utilizar os objetos criados a partir dela. Para criarmos uma classe, devemos seguir um padro, que o seguinte:

[modificadores de acesso] class NomedaClasse{}

Os modificadores de acesso (sero estudados na unidade de estudo seguinte) no so obrigatrios. A palavra reservada class, identifica a classe, seguida por seu nome. Para identificar onde a classe comea e onde
termina, utilizam-se as chaves. Elas definem o bloco da classe, que
onde os atributos sero colocados.
Sabendo isso, em Java, a classe filme definida anteriormente fica assim:

Figura 2: Diagrama de classe UML para


a classe Filme

class Filme {

String nome;

String categoria;

int duracao;

int anoLancamento;
}

DICA
Teste o diagrama de classe,
realizando o exerccio 3 do
caderno de atividades prticas.

Aps voc ter definido as classes


e seus atributos, a hora de pass-las para o computador em uma
linguagem que a mquina entenda. Para isso, utilizaremos a linguagem de programao Java, que
uma linguagem robusta, segura
e multiplataforma, capaz de rodar
em qualquer mquina, independente do sistema operacional.

Seguindo um padro mundialmente utilizado, sempre escrevemos


nomes de classes com a letra inicial maiscula e nomes de atributos
com a letra inicial minscula. Quando o nome de um atributo for composto por mais de uma palavra, com exceo da primeira, as demais
palavras devem possuir a primeira letra maiscula, como, o atributo
anoLancamento, onde a letra L ficou maiscula. Seguindo o padro,
tambm no permitido o uso de acentos ou da .

O tipo String, utilizado para definir o nome e a categoria da classe Filme,


uma classe do Java. A String pode ser entendida como um vetor de caracteres, ou seja, vrios caracteres juntos, agrupados.

Como j temos a classe Filme definida no Java, a partir de agora, tudo


ser baseado em classes, e por meio destas que os objetos sero criados.

PROGRAMAO ORIENTADA A OBJETOS I

15

DICA
Aproveite que voc acabou de definir a classe Filmes, e realize o exerccio 4 do caderno de atividades prticas.

Veja a seguir, a classe Locadora, que servir apenas para utilizarmos os


objetos criados a partir das classes que definimos anteriormente.

class Locadora {

public static void main(String[] args) {

Filme filme01;

filme01 = new Filme();

}
}

Perceba que, nesse exemplo, existe o mtodo main. Os mtodos sero


estudados mais adiante, por enquanto, basta que voc entenda que ele
o responsvel por iniciar a execuo de um programa Java.
Note que, no exemplo anterior, as classes e mtodos so delimitados
por chaves. Aps o nome da classe e aps o final do mtodo, abre-se
uma chave, e no final do exemplo fecham-se duas chaves, que indicam
o fim do mtodo main e da classe Locadora, respectivamente.

Como existem os tipos int, float, char, entre outros, todas as classes que
criamos, se tornam tipos, e os atributos destes, podem receber objeto
dessa classe.
No exemplo, criamos uma varivel chamada filme01, que do tipo Filme, e corresponde classe Filme, que criamos no incio dessa seo.
O responsvel por criar o objeto o new, para isso, basta utilizar essa
palavra reservada na frente do nome da classe que deseja criar o objeto,
seguido de um abre e fecha parnteses (o significado dos parnteses
estudaremos posteriormente). Dessa forma:

new Filme();

Pronto, j sabemos como criar um objeto do tipo Filme. Agora precisamos utiliz-lo, para isso, precisamos armazen-lo em uma varivel. Foi
por esse motivo que criamos a varivel filme01 do tipo Filme. Dessa
forma voc armazena o objeto no atributo filme01. Veja

16

CURSOS TCNICOS SENAI

filme01 = new Filme();

De posse do objeto filme01, voc pode acessar os atributos da classe


Filme. Entenda como isso feito.

class Locadora {

public static void main(String[] args) {

Filme filme01;

filme01 = new Filme();

filme01.nome = Avatar;

filme01.categoria = Fico Cientfica;

filme01.anoLancamento = 2009;

filme01.duracao = 166;

}
}

Para acessar um atributo de um objeto, basta utilizar o ponto como operador de acesso.

Observando o exemplo, possvel perceber que, por meio do ponto, so


acessados todos os atributos da classe Filme e atribudos valores a eles.
Nesse momento, o nosso filme o Avatar que pertence categoria de
fico cientfica, lanado no ano de 2009, com durao de 166 minutos.

DICA
Antes de prosseguir, realize os exerccios 5 e 6 do caderno de atividades prticas.


Em um sistema, pode-se criar quantos objetos forem necessrios. No
nosso exemplo, precisaremos criar vrios, um para cada filme cadastrado no sistema, por isso, basta utiliza a palavra reservada new vrias
vezes. Observe:

class Locadora {

public static void main(String[] args) {

Filme filme01;

filme01 = new Filme();

filme01.nome = Avatar;

filme01.categoria = Fico Cientfica;

filme01.anoLancamento = 2009;

filme01.duracao = 166;


Filme filme02;

filme02 = new Filme();

//acessar e setar valores aos atributos

}
}

PROGRAMAO ORIENTADA A OBJETOS I

17

Nesse exemplo foram criados dois objetos filme01 e filme02. Note


que antes do texto acessar e setar valores aos atributos, foram inseridas duas barras, isso para a linguagem de programao significa comentrio, logo, o texto colocado foi apenas um comentrio, que ainda faltam
acessar e setar os valores dos atributos do objeto filme02.
At o momento, estamos tratando os atributos do tipo Filme como
sendo objetos,para facilitar o entendimento, mas saiba que os atributos de tipos de classes no so objetos, eles so uma referncia para
que o objeto possa ser acessado.

No exemplo a seguir, correto dizer que o atributo filme01 do tipo Filme, possui uma referncia para acessar o objeto. E isso ocorre em todo
o Java, sempre teremos atributos referncia, nunca objetos.

class Locadora {

public static void main(String[] args) {

Filme filme01;

filme01 = new Filme();

}
}

Para facilitar o entendimento, continuaremos chamando de objetos os atributos de referncia.

Agora sabendo que os atributos guardam as referncias para os objetos,


vamos ver o que acontece na memria do computador para armazenar
e acessar tais objetos. Observe a figura a seguir:

Figura 3: Referncia dos objetos em memria

18

CURSOS TCNICOS SENAI

Nesse exemplo, os atributos do tipo Filme chamados filme01 e filme02,


fazem referncia a locais diferentes na memria, nesses locais esto armazenados os objetos. Por isso, basta termos armazenado o endereo
(referncia) dos objetos nos atributos para poder encontr-los, quando
necessrio.
Imagine agora se, por algum motivo, voc precisasse atribuir um objeto
ao outro, o que aconteceria? Analise o exemplo a seguir.

class Locadora {

public static void main(String[] args) {

Filme filme01;

filme01 = new Filme();

filme01.nome = Avatar;

filme01.categoria = Fico Cientfica;

filme01.anoLancamento = 2009;

filme01.duracao = 166;


Filme filme02;

filme02 = new Filme();

filme02.nome = Quem quer ser um milionrio;

filme02.categoria = Drama;

filme02.anoLancamento = 2009;

filme02.duracao = 121;


filme01 = filme02;


System.out.println(filme01.nome);

}
}

Lembrando que o comando System.out.println serve para imprimir um


valor ou frase para o usurio, qual valor voc imagina que ser impresso?
Avatar ou Quem quer ser um milionrio?
Nesse caso a resposta simples, o valor exibido ser Quem quer ser
um milionrio.
Vamos ver na memria o que aconteceu aps a execuo desse programa. Observando a figura a seguir, note que os dois atributos filme01 e
filme02 esto fazendo referncia para o mesmo lugar da memria, logo,
um dos objetos foi perdido, no temos mais como recuper-lo.

PROGRAMAO ORIENTADA A OBJETOS I

19

sempre iro acessar o mesmo objeto quando solicitados, portanto,


tanto faz se alterarmos o objeto,
utilizando o filme01 ou o filme02.
O valor acessado por qualquer
um deles sempre ser igual, nesse
caso o valor impresso ser ao.

DICA
Faa o teste, realizando o
exerccio 7 do caderno de
atividades prticas.

Figura 4: Referncia dos objetos em memria aps atribuio

Agora imagine, se fizermos alguma alterao em qualquer um dos objetos, o que ir acontecer? Observe o exemplo:

class Locadora {

public static void main(String[] args) {

Filme filme01;

filme01 = new Filme();

filme01.nome = Avatar;

filme01.categoria = Fico Cientfica;

filme01.anoLancamento = 2009;

filme01.duracao = 166;


Filme filme02;

filme02 = new Filme();

filme02.nome = Quem quer ser um milionrio;

filme02.categoria = Drama;

filme02.anoLancamento = 2009;

filme02.duracao = 121;


filme01 = filme02;


filme02.categoria = Ao;


System.out.println(filme01.categoria);

}
}

Nesse caso, alteramos a categoria do objeto filme02, e logo abaixo estamos imprimindo o valor da categoria do objeto filme01. O que ser
impresso para o usurio? Fico cientfica, drama ou ao?
Na figura anterior, vimos que ao atribuir um atributo referncia ao outro, eles faro referncia ao mesmo endereo de memria, ou seja, eles

20

CURSOS TCNICOS SENAI


Na prxima seo, voc aprender a criar e invocar mtodos
criados dentro de suas respectivas
classes.

SEO 4

Mtodos e atributos
At o momento voc aprendeu
a definir uma classe e seus atributos, mas e agora? O que fazer
com eles?
Dentro de cada classe preciso definir o que ela faz, ou seja,
o seu comportamento. Definindo as funes dentro da prpria
classe, fica fcil encontrar no programa onde os procedimentos
so realizados. Essas funes so
chamadas de mtodos, que so os
responsveis por realizar as operaes com os objetos.
Todo mtodo possui uma assinatura, que vai identific-lo em todo
o sistema. Essa assinatura composta por quatro itens, modificadores de acesso, retorno, nome
do mtodo e seus parmetros. Os
modificadores de acesso sero estudados na unidade de estudo seguinte. A estrutura dos mtodos
fica da seguinte forma:

[modificadores de acesso] retorno nomeDoMetodo(parametros);

Os modificadores de acesso no so obrigatrios. O nmero de parmetros no limitado, podem ser utilizados quantos forem necessrios, e
caso no o sejam, o mtodo pode no receber parmetros.
Dentro da classe Locadora, que estamos utilizando como exemplo, podemos criar um mtodo para cadastrar um novo filme. Exemplo:

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora();

loca.cadastrarFilme();

}


void cadastrarFilme(){

Filme filme01;

filme01 = new Filme();

filme01.nome = Avatar;

filme01.categoria = Fico Cientfica;

filme01.anoLancamento = 2009;

filme01.duracao = 166;

}
}

A palavra reservada void, utilizada antes do nome do mtodo, significa que


quando esse mtodo for chamado, no retornar nada como resposta a
quem o chamou.

Se lembrarmos da assinatura do mtodo, fica fcil identificar que no


mtodo cadastrarFilme no temos controle de acesso, o retorno void,
pois, o nome do mtodo cadastrarFilme e no possui parmetros.
No exemplo anterior, alm do mtodo main, temos tambm o cadastrarFilme, note que para acessar um mtodo tambm utilizado o operador
ponto. Para que isso fosse possvel, foi criado um objeto do tipo Locadora que foi utilizado para acessar o mtodo cadastrarFilme. Com isso,
podemos acessar o mtodo quantas vezes desejar e criar vrios filmes,
sem precisar repetir o cdigo responsvel por setar o valor nos atributos
do objeto.
Nesse momento entendemos uma das principais caractersticas da
programao orientada a objetos, o reaproveitamento de cdigo.

Os mtodos ainda podem receber valores como parmetros para realizar


operaes, da forma como fizemos no exemplo anterior, o mtodo cadastrarFilme s poderia criar objetos do filme Avatar, mas com a passagem de parmetro, podemos criar qualquer tipo de filme utilizando esse
mtodo. O exemplo a seguir mostra isso.
PROGRAMAO ORIENTADA A OBJETOS I

21

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora();

String nome = Avatar;

String categoria = Fico Cientfica;
int anoLancamento = 2009;
int duracao = 166;

loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);

}


void cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao)
{

Filme filme01;

filme01 = new Filme();

filme01.nome = nome;

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;

}
}

Note que dentro dos parnteses do mtodo, estamos criando alguns


atributos para receber valores de quem chama o mtodo. Tais atributos
chamamos de parmetros. Com isso, quem define os valores para os atributos do objeto filme01, que est sendo criado, quem chama o mtodo
e no o prprio mtodo.
Alm de receber parmetros, os mtodos podem retornar respostas a
quem o chamou, isso ocorre sempre no final da execuo do mtodo.
Para que voc entenda melhor, vamos alterar o exemplo anterior para
que o mtodo cadastrarFilme, receba valores como parmetros e retorne
uma resposta.

22

CURSOS TCNICOS SENAI

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora();

String nome = Avatar;

String categoria = Fico Cientfica;
int anoLancamento = 2009;
int duracao = 166;
boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);

if(cadastrado == true){

System.out.print(Filme cadastrado com sucesso.);

}

}


boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme();

filme01.nome = nome;

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;

return true;

}
}

Nesse exemplo, inclumos antes do nome do mtodo o tipo boolean,


isso significa que o mtodo cadastrarFilme agora retorna um valor do
tipo boolean. Para que isso acontea, no final do mtodo foi includa
a expresso return true; que a instruo responsvel por enviar a
quem chamou o mtodo a resposta true, que do tipo boolean definida antes do nome do mtodo.
Dentro do mtodo main, onde chamamos o mtodo cadastrarFilme,
criamos um atributo do tipo boolean chamado, cadastrado para receber
essa resposta. Para receber a resposta, basta atribuir ao atributo, a chamada do mtodo, dessa forma:

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);

Depois podemos utilizar essa resposta para imprimir uma mensagem


para o usurio do sistema. Observando o exemplo anterior, podemos
verificar a existncia de uma condio como uso do if , e logo aps
o comando System.out.println, que o responsvel por imprimir uma
mensagem para o usurio. Observe.

PROGRAMAO ORIENTADA A OBJETOS I

23

if(cadastrado == true){

System.out.print(Filme cadastrado com sucesso.);
}

Tendo estudado o conceito de mtodos, voc vai entender agora que


os locais onde so criados e, se atribuir valor ou no a um atributo faz
diferena. Veja os exemplos e fique atento onde criar e setar valores aos
seus atributos.
Atributo de instncia:significa que o atributo tem seu valor especificado no objeto e no dentro da prpria classe. Nesse caso, em geral,
o atributo possui um valor diferente em cada objeto representante da
classe.
Atributo de classe: significa que o atributo tem seu valor especificado
na prpria classe e comum a todos os objetos que ela representar.
Atributos globais: so os atributos criados dentro do escopo da classe
e so acessveis em toda a classe, inclusive dentro de qualquer mtodo dela. Tanto os atributos de instncia, quanto os de classe, so
tambm atributos globais.
Atributos locais: so atributos criados dentro de um mtodo ou blocos menores, como estruturas de repetio ou de condio, como for
e if respectivamente. Elas s existem dentro daquele bloco, quando o
ele acaba, os atributos locais deixam de existir.

Veja um exemplo com os tipos de atributos:


class Locadora {

//Atributo de instncia e global

String nome;


//Atributo de classe e global

String endereo = Av. 7 de setembro.;

boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

//Todos os atributos passados como parmetros do mtodo so locais (nome,
categoria, anoLancamento, durao).

//A atributo filme01 local

Filme filme01;

filme01 = new Filme();

filme01.nome = nome;

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;
return true;

}
}

24

CURSOS TCNICOS SENAI

DICA
Agora, treine, realizando o exerccio 8 do caderno de atividades prticas.

Nessa unidade de estudos, voc aprendeu a definir as classes e seus atributos, tambm aprendeu a criar e invocar mtodos criados dentro de
suas respectivas classes, e a definir o comportamento do cada classe.
Na prxima unidade, voc aprender a controlar o acesso e encapsular.
Continue atento! At l.

PROGRAMAO ORIENTADA A OBJETOS I

25

Unidade de
estudo 2
Sees de estudo
Seo 1 - Controle de Acesso
Seo 2 - Encapsulamento

Acessibilidade
SEO 1

Controle de acesso
Voc j parou para pensar nos
recursos que so utilizados para
proteger voc e a sua casa? Normalmente so colocadas cercas,
muros altos, ces de guarda, alarmes, grades nas janelas e portas,
entre outros, e todos com o mesmo objetivo: controlar o acesso e
proteger. Na programao no
diferente, precisamos controlar o
acesso s classes, atributos e seus
mtodos, e, para que isso seja possvel, utilizam-se os modificadores de acesso.
Como voc j viu na unidade de
estudo anterior, os controladores
de acesso fazem parte das assinaturas dos mtodos, mas eles no
so utilizados apenas em mtodos, podem ser aplicados tambm
a atributos e classes. Eles servem
para proteger e restringir o acesso
a determinadas partes do nosso
sistema.
Imagine que voc trabalha em
uma empresa com muitos funcionrios, e que a empresa trabalha
com pesquisas cientficas, e as
descobertas s podem ser conhecidas por algumas pessoas. Uma
das medidas tomadas para proteger essas informaes, bloqueando o acesso a algumas salas, e
autorizando o acesso de apenas
algumas pessoas. Uma forma de
fazer isso com uso de senhas
para abrir portas, essas senhas daro mais ou menos poder de acesso aos funcionrios.

Os modificadores de acesso tambm tm esse papel: bloquear o


acesso a determinadas classes,
mtodos e/ou atributos do sistema, de forma que outras classes
no tenham acesso a um contedo proibido. Para entender
melhor, vejamos quais so esses
modificadores de acesso e como
utiliz-los.
Os modificadores de acesso que
voc estudar so os seguintes:
public, protected, private, friendly,
abstract, static e final. A seguir
realizada uma explicao baseada
no conceito apresentado por Deitel (2005) sobre cada um desses
modificadores. Acompanhe.

Public: o mais simples. Ele


d acesso irrestrito, permite que
tudo seja acessado de qualquer
parte do seu sistema. Qualquer
classe, mtodo e atributo, podem
ser acessados de qualquer lugar
do programa se fizer uso do modificador de acesso public.
Protected: permite acesso

prpria classe, s subclasses (classes filhas) e s classes do mesmo


pacote.

Private: o modificador mais

restritivo de todos, permite o


acesso somente prpria classe,
ou seja, os mtodos e atributos
s podem ser acessados de dentro da classe, nenhuma outra tem
acesso.

Friendly: conhecido como


default ou package. o modificador adotado quando no informamos modificadores de acesso.
Muitos pensam que quando no
informamos, o padro do Java
o public, mas no verdade, o
modificador de acesso default do
Java o friendly e permite o acesso de todas as classes do mesmo
pacote.
Abstract: definir, por exem-

plo, um mtodo como abstrato,


significa dizer que esse mtodo
ser desenvolvido nas subclasses, ou seja, na classe onde ele
definido como sendo abstract, vai
apenas a assinatura do mtodo.
A sua implementao deve ser
feita nas classes filhas. Para criar a
assinatura de um mtodo usando
o abstract, a classe que contm
essa assinatura tambm deve ser
abstrata. Classes definidas como
sendo abstratas, no podem ser
instanciadas.

Static: esse modificador define


um atributo como sendo da
classe e no da instncia da classe.
Dessa forma, a cada novo objeto
criado (nova instncia), no ser
feita uma cpia desse atributo, ele
ser compartilhado por todas as
instncias da classe. Com isso, se
uma instncia realizar alguma alterao no valor do atributo, essa
mudana ser aplicada a todas as
demais.

PROGRAMAO ORIENTADA A OBJETOS I

27

Final: quando esse modificador aplicado a um atributo, ele no


pode ter seu valor alterado, tornando-se uma constante. Quando aplicado a uma classe, esta no pode ser herdada, e quando aplicado a um
mtodo, o mtodo no pode ser redefinido.
Agora que voc j conhece os principais modificadores de acesso, como
podemos utiliz-los para proteger nosso sistema de locadora? Veja alguns exemplos.
Na nossa classe Locadora, exemplificada a seguir, no estamos utilizando nenhum tipo de modificador de acesso, exceto no mtodo main, que
o mtodo com a assinatura padro utilizado pelo Java para dar incio
execuo do programa. Se quisssemos que a classe Locadora e seus
mtodos fossem accessveis de qualquer lugar do sistema, qual modificador de acesso deveramos utilizar? Acertou, se voc respondeu public.

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora();

String nome = Avatar;

String categoria = Fico Cientfica;
int anoLancamento = 2009;
int duracao = 166; boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);
if(cadastrado == true){

System.out.print(Filme cadastrado com sucesso.);

}

}


boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme();

filme01.nome = nome;

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;

return true;

}
}

Para torn-la toda pblica, necessrio acrescentar a palavra public em


dois locais: no incio da classe e antes do retorno do mtodo. Fazendo
essas mudanas, nosso exemplo ficaria da seguinte forma.

28

CURSOS TCNICOS SENAI

public class Locadora {



public static void main(String[] args) {

Locadora loca = new Locadora();

String nome = Avatar;

String categoria = Fico Cientfica;
int anoLancamento = 2009;
int duracao = 166;
boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);
if(cadastrado == true){

System.out.print(Filme cadastrado com sucesso.);

}

}


public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme();

filme01.nome = nome;

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;


return true;

}
}

Sabendo onde aplicar os modificadores, fica fcil utilizar os demais. Nos locais onde colocamos
a palavra public, basta substituir
pelo modificador necessrio, podendo ser protected, private ou
abstract. Os modificadores static
e final so utilizados em conjunto com os demais. Para entender
melhor essa utilizao conjunta,
vamos utilizar a nossa classe Filme para exemplificar.

class Filme {

String nome;

String categoria;

int duracao;

int anoLancamento;
}

Na classe Filme apresentada, no temos uso de nenhum modificador de


acesso. Imagine que queremos tornar essa classe pblica, porm, seus
atributos devem ser protegidos de qualquer outra classe do sistema, e
outro diferencial, o ano do filme deve ser compartilhado por todas as
instncias dessa classe.
Para fazer isso tudo, precisamos em primeiro lugar tornar a classe pblica, e, para isso, basta incluir a palavra public no incio da classe, depois,
precisamos tornar os atributos protegidos de todas as outras classes do
sistema, para isso basta incluir a palavra private antes da declarao de
todos os atributos e por ltimo, tornar o ano de lanamento do filme
compartilhado por todas as instncias, incluindo o modificador de acesso static antes do private.
Fazendo todas essas mudanas corretamente, teremos como resultado a
classe Filme da seguinte forma:

public class Filme{



private String nome;

private String categoria;

private int duracao;

private static int anoLancamento;
}

PROGRAMAO ORIENTADA A OBJETOS I

29

Com o uso do modificador static no atributo anoLanamento, todas as


instncias da classe filme tero o mesmo valor sempre para esse atributo.
Exemplo:
public class Filme{

private String nome;

private String categoria;

private int duracao;

private static int anoLancamento;


public void testeFilme(){

Filme filme01 = new Filme();

Filme filme02 = new Filme();


filme01.anoLancamento = 2011;

filme02.anoLancamento = 2010;


System.out.println(Ano de lanamento = + filme01.anoLancamento);

System.out.println(Ano de lanamento = + filme02.anoLancamento);

}

No exemplo anterior, temos na classe Filme um mtodo de teste chamado testeFilme(), que est sendo utilizado apenas para demonstrar o uso
do modificador de acesso. Esse mtodo cria dois objetos, ou seja, duas
instncias da classe Filme. Aps criar os objetos sero atribudos valores
ao atributo anoLancamento de ambos os objetos. Logo aps impresso
o valor de ambos os atributos dos objetos.
Voc sabe quais valores sero impressos? Lembrando que o atributo em
questo utiliza o modificador static, voc est certo se responder que em
ambas as frases impressas aparecer o ano de 2010.
E voc sabe por que isso ocorreu? Porque o conceito de static de que
o atributo compartilhado por todas as instncias da classe, isto , se
uma instncia tem o valor 2010, todas as outras tambm o tero, com
isso sempre o ltimo valor atribudo ao atributo ser utilizado por todas
as instncias.
Foi preciso criar um mtodo de teste dentro da prpria classe Filme,
para que pudssemos acessar os atributos dela, isso foi necessrio devido ao fato de que todos foram declarados como private, e por isso s
podem ser acessados de dentro da prpria classe.
Da mesma forma que o modificador static utilizado em conjunto com
outros modificadores, o modificador final tambm deve ser utilizado em
conjunto. Confira um exemplo de uso do modificador final.
public class Filme{

private String nome;

private String categoria;

private int duracao;

private final int anoLancamento = 2011;
}

30

CURSOS TCNICOS SENAI

O uso do modificador final obriga que um valor seja atribudo ao atributo no momento da criao, por isso precisamos cri-lo e conferir-lhe
o valor 2011. Feito isso, esse atributo no poder mais ser alterado,
sempre vai valer 2011.
E o que acontece se tentarmos atribuir valor a um atributo do tipo final
como mostrado a seguir?

filme01.anoLancamento = 2011;
filme02.anoLancamento = 2010;

Se voc respondeu que ir gerar um erro no momento de compilar o


programa, voc acertou. O compilador Java vai identificar que uma operao incorreta est tentando ser executada e ir gerar um erro, no sendo possvel executar o programa.
Aps termos estudado os modificadores de acesso, veremos outra forma de tornar nosso sistema mais acessvel e seguro, sem esquecer os
modificadores de acesso.

DICA
Antes de estudar o encapsulamento, realize os exerccios 9, 10 e 11
do caderno de atividades prticas.

SEO 2

Encapsulamento
O objetivo de se utilizar o encapsulamento, no desenvolvimento de sistemas, agrupar as funcionalidades referentes a um objeto em um nico
lugar, garantindo a segurana no acesso s informaes, facilitando a
busca dos programadores por mtodos dentro do sistema, seja para consultar ou para realizar manutenes.
Imagine que voc precisa alterar o mtodo onde realizado o cadastro
de filmes, em qual classe voc procuraria? Se no existisse o encapsulamento voc poderia ficar perdido, e poderiam existir vrios locais no
seu sistema que realizam essa operao, mas com o encapsulamento o
cadastro de filmes feito por uma nica classe, a Locadora, onde o funcionrio da locadora que realiza o cadastro de todos os filmes. por
isso que esse mtodo foi colocado na classe Filme.

A ideia do encapsulamento tambm fechar o nosso sistema, de forma


que quem for utilizar os mtodos e atributos saiba para que eles servem, e no o que eles fazem ou o que feito com eles internamente.

PROGRAMAO ORIENTADA A OBJETOS I

31

Imagine que voc ir fazer um cadastro de um novo filme, voc precisa


saber o que o mtodo de cadastro faz internamente? No. Voc s precisa
saber que ele vai fazer o cadastro e no como ele faz.
Dessa forma nosso sistema fica mais organizado e com isso mais fcil de
entender. Se algum dia outro programador que no participou desde o
incio do desenvolvimento do sistema precisar realizar uma modificao
em algum mtodo, ele no ter tanta dificuldade para encontrar e manutenir as funcionalidades do sistema.
Para auxiliar na questo do acesso aos atributos, comum na orientao
a objeto a criao de mtodos get e set. Esses mtodos so utilizados
para dar acesso a atributos declarados como private.
Voc deve pensar sempre em dar acesso e no retirar acesso aos atributos. O que isso quer dizer? Como padro crie sempre os atributos
das classes como private, assim ningum vai conseguir acess-los de
fora da classe. Caso voc queira permitir o acesso a algum desses atributos, utilize os mtodos set e get.

Mas o que so mtodos set e get?


Os mtodos set e get so responsveis por colocar valor em um atributo ou
recuperar o valor de um atributo respectivamente.

Defini-se, que por padro, sempre se criar os atributos de classes como


sendo privados. Portanto, a nossa classe Filme fica assim:

public class Filme{



private String nome;

private String categoria;

private int duracao;

private int anoLancamento;
}

Dessa forma ningum ter acesso aos atributos dessa classe a no ser ela
mesma. Agora voc concorda que assim, a classe Filme, no ter utilidade alguma, pois a classe Locadora que fazia uso desses atributos, e com
eles declarados como private, ela no ter mais acesso.
em situaes como esta que entra o uso dos mtodos get e set. Devemos criar os mtodos de acordo com a necessidade do sistema, para
liberar o acesso necessrio aos atributos.
No obrigatria a criao dos dois mtodos, set e get, eles devem
ser criados de acordo com a necessidade do sistema.

32

CURSOS TCNICOS SENAI

No nosso exemplo, necessitamos liberar o acesso a todos os atributos,


logo, precisamos criar os mtodos get e set para todos os atributos. Fazendo isso, a classe Filme ficar assim:

public class Filme{



private String nome;

private String categoria;

private int duracao;

private int anoLancamento;


public String getNome() {
return nome;

}

public void setNome(String nome) {
this.nome = nome;

}

public String getCategoria() {

return categoria;

}

public void setCategoria(String categoria) {
this.categoria = categoria;

}

public int getDuracao() {
return duracao;

}

public void setDuracao(int duracao) {
this.duracao = duracao;

}

public int getAnoLancamento() {
return anoLancamento;

}

public void setAnoLancamento(int anoLancamento) {
this.anoLancamento = anoLancamento;

}
}

Observando os mtodos set e get, identificamos um padro para o nome


dos mtodos, utilizando sempre o set ou get seguido do nome do atributo com letra maiscula. Para o atributo nome os mtodos ficam assim:

public String getNome() {


return nome;
}
public void setNome(String nome) {

this.nome = nome;
}

Observe que o mtodo getNome responsvel por retornar o valor do


atributo nome, enquanto que o setNome recebe como parmetro um
valor para ser salvo no atributo nome, e essas so as suas funes, retornar e salvar um valor em um determinado atributo.

PROGRAMAO ORIENTADA A OBJETOS I

33

No mtodo setNome voc pode observar o uso de um novo operador,


o this, que utilizado para indicar que estamos acessando o atributo
da classe e no o atributo que est sendo passado como parmetro no
mtodo, pois ambos tm o mesmo nome.
A palavra chave this utilizada para indicar que estamos acessando o atributo ou mtodo da classe em que estamos trabalhando.

O uso do this no obrigatrio, porm altamente recomendado, pois


facilita a leitura do cdigo fonte pelos programadores. Para retir-lo do
mtodo set.nome preciso trocar o nome do atributo que est sendo
passado como parmetro. Confira o exemplo:

public void setNome(String param) {



nome = param;
}

Com o uso dos mtodos set e get, voc pode controlar se outras classes
tero acesso aos atributos ou no. Se voc pretender dar acesso apenas a
gravao de dados nos atributos, basta criar apenas o mtodo set na sua
classe. Porm, se voc quer permitir que outras classes apenas recuperem o valor dos atributos, basta criar na sua classe o mtodo get.
Agora, com os mtodos set e get criados e entendidos, temos que alterar
tambm a forma de acessar os atributos. No mais possvel acess-los
diretamente como estvamos fazendo at agora, daqui em diante teremos que chamar os mtodos set e get, como mostra o exemplo a seguir:

public class Locadora{



public static void main(String[] args) {


Filme filme01;

filme01 = new Filme();

//salvando informaes

filme01.setNome(Avatar);

filme01.setCategoria(Fico Cientfica);

filme01.setAnoLancamento(2009);

filme01.setDuracao(166);


//pegando informaes

System.out.println(Nome: + filme01.getNome());

System.out.println(Categoria: + filme01.getCategoria());

System.out.println(Ano de lanamento: + filme01.getAnoLancamento());

System.out.println(Durao: + filme01.getDuracao());

}
}

34

CURSOS TCNICOS SENAI

DICA
Realize os exerccios do 12 ao 15 do caderno de atividades prticas
e perceba que com o uso dos modificadores de acesso, em conjunto
com a criao dos mtodos set e get, tm-se classes muito mais seguras e organizadas.


Agora que voc j sabe criar os controles de acesso e encapsular, est
pronto para aprender o porqu de criar dessa maneira. Ento, prepare-se
e bom estudo!

PROGRAMAO ORIENTADA A OBJETOS I

35

Unidade de
estudo 3
Sees de estudo
Seo 1 - Construtores

Construtores
SEO 1

Construtores
Se voc observar a criao de um objeto, perceber algo parecido com a
chamada de um mtodo, veja no exemplo a classe Locadora:
public class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora();

String nome = Avatar;

String categoria = Fico Cientfica;
int anoLancamento = 2009;
int duracao = 166;boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);
if(cadastrado == true){

System.out.print(Filme cadastrado com sucesso.);

}

}


public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme();

filme01.nome = nome;

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;

return true;

}
}

Note que no mtodo main criamos um objeto do tipo Locadora e no


mtodo cadastrarFilme criamos um objeto do tipo Filme. A criao
realizada com o uso do new, a expresso que representa o objeto a
seguinte:

new Filme();

Sempre se utiliza o nome da classe seguido de abre e fecha parnteses.


Voc sabe por que feito isso? como se fosse chamado um mtodo
Filme, pois toda chamada de mtodo, tambm abre e fecha parnteses.

PROGRAMAO ORIENTADA A OBJETOS I

37

Realmente, sempre que se utiliza o new criado um novo objeto, e


para criar esse objeto necessrio chamar o mtodo construtor da
classe que se deseja criar.

Um mtodo construtor nada mais do que um mtodo com o mesmo


nome da classe, exatamente o mesmo nome, obedecendo inclusive as
letras maisculas e minsculas (DEITEL, 2005, p. 68). Veja o exemplo
de como ficaria a classe Filme com o mtodo construtor:

public class Filme{



private String nome;

private String categoria;

private int duracao;

private int anoLancamento;


public Filme(){

System.out.println(Filme Criado!);

}


// mtodos set e get
}

Observando o exemplo voc pode pensar que, como no tnhamos os


mtodos construtores estvamos fazendo errado, mas no estvamos.
Mesmo sem serem criadas, todas as classes possuem, por definio, um
mtodo construtor vazio. Assim:

Filme(){
}

Por isso, mesmo que voc no crie o mtodo construtor dentro da classe, acredite, ele esta l!
Agora voc pode ter ficado com outra dvida: se o Java cria como padro um mtodo construtor para todas as classes, por que voc precisa
cri-los?
Sempre que se cria um mtodo construtor para uma classe, o mtodo
construtor default deixa de ser utilizado, logo o seu mtodo construtor
se torna o principal da classe. Imagine que antes de tudo, o seu mtodo
ser chamado e voc poder fazer qualquer operao nesse momento,
voc pode iniciar atributos, fazer chamadas a outros mtodos, enfim,
definir como seu objeto ser criado.
No exemplo a seguir, foi criado um mtodo construtor que, antes de
criar o objeto do tipo Filme, inicializa o atributo nome com um valor
qualquer. Veja:

38

CURSOS TCNICOS SENAI

public class Filme{



private String nome;

private String categoria;

private int duracao;

private int anoLancamento;


public Filme(){
this.nome = Avatar;

}

}

// mtodos set e get

Fazendo isso, sempre que um objeto do tipo filme for criado, ele j ser
criado com o nome Avatar. Fazendo dessa forma, no fica muito usual,
uma vez que no existe apenas o filme Avatar, mas sim vrios filmes
que sero cadastrados. Ento que outra forma de setar valor para esse
atributo pode ser usada?
O mtodo construtor aceita a passagem de parmetros. Observe o
exemplo:

public class Filme{



private String nome;

private String categoria;

private int duracao;

private int anoLancamento;


public Filme(String nome){
this.nome = nome;

}

}

// mtodos set e get

Nesse caso, podemos garantir que sempre que um objeto do tipo filme
for criado, ele possuir um nome, pois isso feito no seu construtor, e
se um nome no for passado a ele, o objeto no ser criado.
A forma de criar esse objeto agora mudou um pouco, devido a passagem
do parmetro, na nossa classe Locadora a criao do objeto Filme fica
conforme o exemplo a seguir:

PROGRAMAO ORIENTADA A OBJETOS I

39

public class Locadora {



public static void main(String[] args) {

Locadora loca = new Locadora();

String nome = Avatar;

String categoria = Fico Cientfica;
int anoLancamento = 2009;
int duracao = 166;
boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);
if(cadastrado == true){

System.out.print(Filme cadastrado com sucesso.);

}

}


public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme(nome);

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;

return true;

}
}

Observe que nosso mtodo main no foi alterado, apenas o mtodo cadastrarFilme sofreu alteraes. A criao do objeto Filme agora recebeu
um parmetro, correspondente ao nome do Filme e no mais necessrio setar valor para o atributo nome da classe Filme, uma vez que agora
isso feito dentro do mtodo construtor.
Apesar de ser chamado de mtodo construtor, ele no um simples
mtodo. Pode-se dizer que um mtodo especial, pois no pode possuir retorno e s pode ser chamado no momento de criao de um
objeto.

Uma classe pode ter quantos mtodos forem necessrios para sua utilizao, e no diferente para mtodos construtores, que permitem mais
de um mtodo construtor em uma mesma classe. Veja o exemplo:

40

CURSOS TCNICOS SENAI

public class Filme{



private String nome;

private String categoria;

private int duracao;

private int anoLancamento;


public Filme(String nome){
this.nome = nome;

}

public Filme(String nome, String categoria){
this.nome = nome;
this.categoria = categoria;

}

}

// mtodos set e get

Nesse caso criamos dois mtodos construtores, onde um recebe apenas o nome do filme como parmetro, e o segundo recebe o nome e
a categoria. Dependendo da necessidade, pode-se utilizar um ou outro
para criar nossos objetos do tipo Filme e, para utiliz-los basta fazer da
seguinte forma:
Filme filme01 = new Filme(nome);
ou
Filme filme01 = new Filme(nome, categoria);

Os mtodos construtores so
muito importantes, pois com
eles possvel controlar e definir
como um objeto ser criado, e se
ser realizada alguma operao no
momento de sua criao.

DICA
Os exerccios 16, 17 e 18 do
caderno de atividades prticas so sobre os mtodos
construtores. Que tal resolv-los e testar o que acabou
de aprender?

Voc viu que possvel criar mtodos com o mesmo nome em


uma mesma classe, utilizando os
mtodos construtores, que possuem o mesmo nome e podem
ser criados mais de um na mesma
classe. Na prxima unidade de estudos voc estudar as sobrecargas de mtodos. At l!

possvel tambm chamar um construtor de dentro de outro, lembrando do conceito do mtodo construtor que diz que ele s pode ser chamado durante a criao do objeto, e, como est sendo criado dentro
de outro mtodo construtor ento pode ser chamado de dentro deste.
Observe o exemplo.

public class Filme{



private String nome;

private String categoria;

private int duracao;

private int anoLancamento;


public Filme(String nome){
this.nome = nome;

}

public Filme(String nome, String categoria){

// Chamada do primeiro mtodo construtor

this(nome);

this.categoria = categoria;

}

}

// mtodos set e get

PROGRAMAO ORIENTADA A OBJETOS I

41

Unidade de
estudo 4
Sees de estudo
Seo 1 - Sobrecarga de mtodos

Sobrecarga de Mtodos
SEO 1

Sobrecarga de mtodos
O fato de criarmos mtodos com o mesmo nome em uma mesma classe
chamado de sobrecarga de mtodos, ou ainda de overloading.
O que no pode existir em uma mesma classe, so mtodos com assinaturas iguais. O que isso quer dizer? Quer dizer que no se pode ter dois
mtodos com o mesmo nome, e com os mesmos tipos e nmeros de
parmetros. Observe o diagrama a seguir para entender melhor o conceito de sobrecarga.

Figura 5: Diagrama de classe UML com sobrecarga de mtodos

Nesse diagrama apresentado pode-se entender melhor esse conceito


de sobrecarga. H trs mtodos, todos com o mesmo nome, porm,
com algumas sobrecargas: os tipos dos parmetros entre o primeiro e
o segundo mtodo e a quantidade de parmetros passados no quarto
mtodo.
A sobrecarga de mtodos cadastrarFilme ficaria da seguinte forma se
desenvolvido na linguagem Java:

PROGRAMAO ORIENTADA A OBJETOS I

43

public class Locadora {



public static void main(String[] args) {

Locadora loca = new Locadora();

String nome = Avatar;

String categoria = Fico Cientfica;

int anoLancamento = 2009;
int duracao = 166; boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);

if(cadastrado == true){

System.out.print(Filme cadastrado com sucesso.);

}

}


public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme(nome);

filme01.categoria = categoria;

filme01.anoLancamento = anoLancamento;

filme01.duracao = duracao;

return true;

}

public boolean cadastrarFilme(String nome, String categoria, String anoLancamento, String duracao){

//implementao do mtodo

}

public boolean cadastrarFilme(String nome){

//implementao do mtodo

}
}

DICA
Como os mtodos tero o mesmo nome e, provavelmente, sero
utilizados para realizao de tarefas semelhantes, importante escolher um nome mais apropriado que identifique todas as tarefas de
modo a no gerar confuso no momento de sua utilizao.

E como saber qual mtodo est sendo chamando no momento da execuo quando h nomes repetidos?
Voc no precisa se preocupar com isso pois, quem define, o compilador, levando em considerao as diferenas dos mtodos para utiliz-los
de acordo com suas caractersticas, por exemplo:

boolean retorno = cadastrarFilme(Avatar, Fico Cientfica, 2009, 166);

44

CURSOS TCNICOS SENAI

Nesse caso, temos os quatro parmetros como sendo do tipo String. O


compilador identificou e utilizou o segundo mtodo criado na classe
Locadora, que o que recebe como parmetro os quatro parmetros do
tipo String.
Voc sabe que mtodo da classe locadora seria chamado se, ao invs do
exemplo anterior, fosse feito da seguinte maneira?

boolean retorno = cadastrarFilme(Avatar);

Neste caso seria chamado o ltimo mtodo, pois, ele o nico que recebe apenas um parmetro.
Tenha bastante cuidado ao fazer sobrecarga com o mesmo nmero de parmetros, pois o compilador diferencia o tipo dos parmetros, e no o nome
deles.

O exemplo a seguir no caracteriza uma sobrecarga.


public boolean cadastrarFilme(String nome, String categoria, String anoLancamento, String duracao){

//implementao do mtodo

}
public boolean cadastrarFilme(String nome, String categoria, String ano, String tempo){

//implementao do mtodo

}


Nesse exemplo apresentado, foram alterados os nomes de dois parmetros, de anoLancamento para ano, e de durao para tempo. Essa
mudana no caracteriza uma sobrecarga, e o seu programa no ir funcionar, pois existem dois mtodos exatamente iguais, e isso no permitido.

DICA
Utilizando o caso da fbrica de carros e motos, teste a sobrecarga,
realizando os exerccios 19 e 20 do caderno de atividade prticas.

Na prxima unidade de estudos voc aprender como organizar as suas


classes por meio de pacotes. Prepare-se!

PROGRAMAO ORIENTADA A OBJETOS I

45

Unidade de
estudo 5
Sees de estudo
Seo 1 - Pacotes, como organizar
suas classes

Pacotes, como Organizar


suas Classes
SEO 1

Pacotes, como organizar


suas classes
Para falar dos pacotes em Java,
vamos fazer uma analogia com
as pastas que voc cria costumeiramente no sistema operacional.
Imagine que voc possua apenas
uma pasta em todo seu computador, como voc faria para organizar suas coisas? Certamente
colocaria suas msicas em uma
pasta, seus trabalho da disciplina
de POO em outra pasta, e assim
por diante.
Agora, imagine se essa separao de pastas no fosse possvel
e tudo tivesse que ficar em um
mesmo lugar, tudo misturado. Seria horrvel, no mesmo? Ainda
bem que podemos organizar tudo
em diretrios, fica muito mais
fcil encontrar os documentos.
Agora pense na seguinte situao:
voc e alguns amigos foram fazer
um passeio e tiraram vrias fotos
com a sua cmera digital, e agora
todos os seus amigos esto pedindo uma cpia dessas fotos. Voc
pode simplesmente copiar a pasta de uma s vez e repass-la aos
seus amigos o que muito fcil
ou voc pode ficar procurando
as fotos em meio a outros documentos e copiar, foto por foto,
com o risco de esquecer alguma
pelo caminho.

Na programao isso no diferente. No vamos criar todas as nossas


classes dentro de um nico diretrio, mas sim, dividi-las de acordo com
suas funcionalidades e necessidades do projeto.
Os diretrios dentro da programao so chamados de pacotes, ou
package. Imagine que temos uma classe salva dentro do seguinte diretrio no sistema operacional:

\br\com\poo\locadora

Isso significa que nossa classe est dentro do seguinte package:

br.com.poo.locadora

Observe que na estrutura de diretrios do sistema operacional, os nomes das pastas so separados por barras \, e os packages so divididos
por pontos .. Da mesma formaque existem padres, no momento de
criar nomes de classes, mtodos e variveis, existe um padro para criao de pacotes, nesse caso, todos os pacotes devem ser escritos apenas
com letras minsculas, independente se os nomes so compostos por
mais de uma palavra.
Deve-se referenciar o pacote, onde a classe est gravada e no incio desta, informando sempre a palavra package seguida do caminho completo
do pacote. Para entender melhor, veja esse exemplo: imagine que a classe
Pessoa encontrasse dentro do pacote br.com.poo.entidade. Tal classe
ficaria assim:

PROGRAMAO ORIENTADA A OBJETOS I

47

package br.com.poo.entidade.Pessoa;
public class Pessoa {

private String nome;

private String telefone;

private String rg;

private String cpf;

private String estadoCivil;

private String sexo;


//implementao dos mtodos
}

Dentro de um mesmo pacote, podem estar quantas classes forem necessrias, e todas tm acesso direto umas as outras - o que estava sendo
feito at o momento - pois todas estavam em um mesmo pacote.
Se quisssemos acessar a classe Pessoa, de dentro da classe Locadora,
imaginando que nesse momento elas esto no mesmo pacote, poderamos fazer um acesso direto por meio de Pessoa pessoa = new Pessoa();.
Confira:

package br.com.poo.entidade.Locadora;
public class Locadora{

public static void main(String[] args) {

Pessoa pessoa = new Pessoa();

pessoa.getEndereco().setBairro(Bom Retiro);

pessoa.getEndereco().setCep(89222-365);

//...

}
}

Imagine que colocamos a classe Locadora dentro do pacote br.com.poo.


locadora. Como fazer para acessar a classe Pessoa de dentro da classe
Locadora? Como elas esto em pacotes diferentes, no h mais o acesso
direto entre as classes, como fazer para acessar as classes que no esto
no mesmo pacote?
Para que funcione corretamente, pode-se informar o caminho completo
do pacote da classe que se quer acessar, fazendo da seguinte forma:

br.com.poo.entidade.Pessoa pessoa = new br.com.poo.entidade.Pessoa();

Fazendo dessa forma, no fica nem um pouco elegante o cdigo fonte,


e toda vez que se quiser fazer referncia classe Pessoa, seria necessrio
escrever o caminho completo. Nada prtico, no acha?

48

CURSOS TCNICOS SENAI

Para resolver isso, o Java possui uma palavra reservada chamada import,
que serve para importar um pacote para dentro da classe onde o import
foi utilizado. Com isso no existe a necessidade de digitar todo o caminho do pacote de uma classe toda vez que desejarmos fazer referncia
a ela.
Com a classe Locadora em outro diretrio e utilizando o import para
fazer acesso classe Pessoa, e com a classe Locadora em outro diretrio,
esta ficaria da seguinte forma:

package br.com.poo.locadora.Locadora;
import br.com.poo.entidade.Pessoa;
public class Locadora{

public static void main(String[] args) {

Pessoa pessoa = new Pessoa();

pessoa.getEndereco().setBairro(Bom Retiro);

pessoa.getEndereco().setCep(89222-365);

//...

}
}

Note que agora, o package da classe mostra que o pacote da classe Locadora no mais o entidade, e sim o pacote locadora.

package br.com.poo.locadora.Locadora;

J o uso do import, indica que pode-se utilizar a classe Pessoa, que est
dentro do pacote br.com.poo.entidade diretamente, como se a classe
estivesse dentro do mesmo pacote. A instruo que permite isso :

import br.com.poo.entidade.Pessoa;

Fazendo uso desse recurso, continua-se tendo acesso a todas as classes,


independentemente delas estarem ou no no mesmo pacote.
possvel, tambm, importar todas as classes de um pacote de uma s
vez. Para isso, basta utilizar o *, que indica que qualquer classe, em
um pacote, pode ser acessada. Por exemplo:

import br.com.poo.entidade.*;

Nesse caso, se permite o acesso a todas as classes que esto dentro do


pacote entidade.

O import vale tambm para classes externas ao projeto, por exemplo, se quisermos utilizar uma
classe do Java, dentro de alguma
das classes, como a ArrayList do
Java, que implementa uma lista,
para que se tenha acesso a essa
classe, ser necessrio, obrigatoriamente, fazer um import dela
para a classe em que se quer utiliz-la. Portanto, o import ficaria
da seguinte forma:

import java.util.ArrayList;

Fazendo isso, poderamos utilizar


uma classe que no est no projeto, mas est implementada diretamente pelo prprio Java.
Note que, nesse caso, importamos
apenas a classe ArrayList, que est
dentro do pacote util do Java.
No obrigatrio importar um
pacote inteiro, se voc utilizar somente uma classe.
Nessa unidade, voc viu que podemos importar todo um pacote,
o que d acesso a todas as classes
do pacote, ou utilizar o * para
importar todas as classes de uma
s vez.
Lembre-se que importante deixar o sistema o mais limpo possvel, ou seja, importe somente as
classes que sero utilizadas para
no existir dvidas sobre as classes corretas.
No sistema, na classe Locadora, seria importada apenas a classe Pessoa, que a que nos interessa ter
acesso. Isso o correto a ser feito.

Na prxima unidade, voc aprender como reaproveitar cdigos e


reescrever mtodos, mas antes de
continuar, realize o exerccio 21
do caderno de atividades prticas.

PROGRAMAO ORIENTADA A OBJETOS I

49

Unidade de
estudo 6
Sees de estudo
Seo 1 - Reaproveitamento de cdigo
Seo 2 - Reescrita de mtodos

Herana
SEO 1

Reaproveitamento de
cdigo
Os sistemas, de um modo geral,
evoluram muito nos ltimos anos
e para que essa evoluo acontecesse, foi necessrio escrever muitas linhas de cdigo fonte. Agora,
imagine classes imensas e projetos
com centenas de classes; ser que
tudo isso era mesmo necessrio?
Ser que no h uma forma de
reutilizar partes do cdigo fonte
e tornar o sistema mais simples?
Essa uma das vantagens de se
utilizar a herana.
Antes de entender o que a herana na programao, pense na
sua vida, o que herana? Pense
em caractersticas genticas, j lhe
disseram como voc parecido
com seu pai ou com sua me?
Pois bem, isso herana, seus pais
herdaram caractersticas do seus
avs, e voc herdou caractersticas
dos seus pais.
A figura a seguir representa a herana gentica, que o filho herda
caractersticas do pai.

Tendo claro o conceito de herana, j podemos falar de forma tcnica.


Com a herana no preciso repetir atributos ou mtodos, ou seja, no
preciso reescrev-los, podendo simplesmente utilizar os atributos de
outras classes que j o desenvolveram.
Porm, para utilizar a herana, no simplesmente sair herdando toda
e qualquer classe. Estas precisam ter alguma relao. Vamos buscar novamente o exemplo da locadora, para entender melhor esse conceito.
Definimos na primeira unidade de estudo que precisaramos de uma
classe para definir um cliente, e uma classe para definir um funcionrio.
Mas o que essas duas classes tm em comum? Tanto um cliente como
um funcionrio so pessoas, logo, tero atributos em comum.
Os atributos que a classe Cliente e a classe Funcionrio tiverem em
comum, voc pode isolar em uma terceira. Assim no ser necessrio
duplicar as informaes, o cdigo fica mais centralizado, com isso o
sistema fica mais fcil de entender e de manutenir.
Observe a figura a seguir, para entender melhor como ficaria o nosso
exemplo, utilizando o conceito de herana.

Figura 6: Diagrama exemplificando a


herana gentica

Figura 7: Herdando da classe Pessoa

PROGRAMAO ORIENTADA A OBJETOS I

51

Como funcionrios e clientes so pessoas, criamos uma classe chamada


Pessoa, para centralizar nela todos os atributos comuns dessas classes.
Observando a figura 7, se pode identificar os atributos nome, telefone,
rg, cpf, estadoCivil e sexo, como sendo os atributos comuns. J na classe Funcionario permaneceram apenas os atributos salrio e carteira de
trabalho, que so os necessrios para contratar e pagar o funcionrio da
locadora, e na classe Cliente, foram colocados apenas o atributo dependentes, para indicar se mais algum pode locar um filme no nome desse
cliente.
Se no tivssemos criado a classe Pessoa, todos os atributos desta teriam
que ser duplicados na classe Funcionario, e na Cliente, desnecessariamente.
A classe que herda os atributos e mtodos chamada de filha ou subclasse, nesse caso, as classes Funcionario e Cliente so subclasses da
Pessoa. J a classe que herdada, chamada de me ou superclasse.
Portanto, a classe Pessoa uma superclasse.

Relembrando um pouco sobre modificadores de acesso, quando temos


um atributo ou mtodo declarado como private, somente a prpria classe tem acesso a ele. Isso vale tambm para herana, as subclasses no
herdam os atributos e mtodos criados como private. Para que seja possvel herdar, necessrio utilizar outros modificadores de acordo com a
necessidade, podendo ser, por exemplo, um protected ou public.
J entendemos o porqu de utilizar a herana, mas como fazer isso no
Java? Como dizer ao compilador que voc est utilizando parte do cdigo fonte de outra classe? Para isso existe uma palavra-chave chamada
extends, que possibilita fazer uso da herana no Java. Veja no exemplo
a seguir, como ficariam as trs classes desenvolvidas no Java.
public class Pessoa {

private String nome;

private String telefone;

private String rg;

private String cpf;

private String estadoCivil;

private String sexo;


//implementao dos mtodos
}
public class Cliente extends Pessoa{

private String dependentes;


//implementao dos mtodos
}
public class Funcionario extends Pessoa {

private float salario;

private String carteiraTrabalho;

}
52

CURSOS TCNICOS SENAI

//implementao dos mtodos

Observe que logo aps o nome da classe, utilizamos a palavra reservada


extends, seguida do nome da classe que queremos herdar.
Fazendo isso, como se copissemos tudo que est dentro da classe
Pessoa e colssemos dentro da classe Funcionario e Cliente, exceto os
atributos e mtodos declarados como private.
Quando criamos um objeto do tipo Funcionario, por exemplo, no precisamos fazer nenhum tipo de referncia classe Pessoa para utilizar
seus atributos e mtodos. Veja no exemplo:
public class Locadora{

public static void main(String[] args) {

Funcionario funcionario = new Funcionario();

funcionario.setNome(Joo);

funcionario.setRg(89898789);

funcionario.setCpf(021.234.543-90);

funcionario.setTelefone((47)30001122);

funcionario.setSexo(Masculino);

funcionario.setEstadoCivil(Casado);

funcionario.setCarteiraTrabalho(9876234653);

funcionario.setSalario(2000);

}

//implementao dos mtodos

Observando o exemplo, nota-se que no h diferena nenhuma ao acessar os atributos que a classe Funcionario est herdando da Pessoa,
como se os atributos fossem exclusivamente da classe Funcionario.
Pode acontecer de se herdar mtodos com determinadas caractersticas,
que no queremos utilizar em outras classes, e para refazer esse mtodo,
existe um mecanismo chamado de reescrita de mtodos. Esse o assunto da prxima seo de estudo.

PROGRAMAO ORIENTADA A OBJETOS I

53

SEO 2

Reescrita de Mtodos
Nem sempre os mtodos herdados possuem o comportamento que queramos. Nesses casos, necessrio reescrev-los. Imagine que na classe
Pessoa exista um mtodo para cadastrar o cpf de uma pessoa, porm,
esse mtodo no faz nenhum tipo de validao para saber se o nmero
informado vlido. Para fazer essa validao, necessrio reescrever o
mtodo de cadastro do cpf. Observe:

public class Pessoa {



private String nome;

private String telefone;

private String rg;

private String cpf;

private String estadoCivil;

private String sexo;


public void cadastroCpf(String cpf){
this.cpf = cpf;

}

//implementao dos mtodos
}
public class Funcionario extends Pessoa {

private float salario;

private String carteiraTrabalho;

public void cadastroCpf(String cpf){
if(cpf.length() >= 11){
super.setCpf(cpf);

}
else{

System.out.println(CPF invlido.);

}

}

}

//implementao dos mtodos

Nesse exemplo, temos um mtodo chamado cadastroCpf na classe Pessoa, onde ele apenas seta o valor do cpf informado no atributo da classe,
sem fazer qualquer tipo de validao.
Na classe Funcionario, reescrevemos o mtodo de cadastro do cpf fazendo uma validao simples com relao ao tamanho do nmero informado. Tal documento, para ser vlido, deve possuir pelo menos onze
dgitos, logo, se informar menos, o cpf invlido.

54

CURSOS TCNICOS SENAI

Agora, sempre que utilizarmos um objeto do tipo Funcionario para


acessar o mtodo cadastroCpf, ele invocar o mtodo reescrito e no
mais o da superclasse. O mesmo pode ser feito para a classe Cliente.
Saiba que possvel que exista a necessidade de, em algum momento,
chamar o mtodo herdado ao invs do reescrito, basta, para isso, utilizar
a palavra reservada super, que faz referncia superclasse, e acessar o
mtodo herdado. No exemplo anterior, foi utilizada a palavra super para
acessar o mtodo setCpf da superClasse.
Ateno: A palavra super s pode ser utilizada dentro da subclasse.

Observe outro exemplo de uso do super.

public class Funcionario extends Pessoa {



private float salario;

private String carteiraTrabalho;

public void cadastroCpf(String cpf){
if(cpf.length() >= 11){
super.cadastroCpf(cpf);

}
else{

System.out.println(CPF invlido.);

}

}

}

//implementao dos mtodos

Nesse exemplo, ao invs de chamar o mtodo setCpf, foi chamado o


mtodo cadastroCpf, herdado da superclasse. feita a validao no mtodo reescrito, se estiver tudo certo, chamado o mtodo herdado para
fazer o cadastro efetivo.
A reescrita de mtodos muito importante para mudar o comportamento de um mtodo, para se adequar as necessidades da classe que o est
herdando.

DICA
Agora, realize os exerccios 22 ao 26 do caderno de atividades prticas e teste o que acabou de aprender. Ah! Preste ateno na informao do exerccio 25, h um comentrio sobre duas expresses novas.
Continue atento!

PROGRAMAO ORIENTADA A OBJETOS I

55

Unidade de
estudo 7
Sees de estudo
Seo 1 - Polimorfismo

Polimorfismo
SEO 1

Polimorfismo
Se entrar algum na locadora e pedir para falar com alguma pessoa, esta
pode ser tanto um cliente como um funcionrio, certo? Afinal, cliente e
funcionrio so pessoas. Com base nessa ideia, se pode fazer a seguinte
operao no nosso sistema:
public class Locadora{

public static void main(String[] args) {

Funcionario funcionario = new Funcionario();

funcionario.setNome(Joo);

funcionario.setRg(89898789);

funcionario.setCpf(021.234.543-90);

funcionario.setTelefone((47)30001122);

funcionario.setSexo(Masculino);

funcionario.setEstadoCivil(Casado);

funcionario.setCarteiraTrabalho(9876234653);

funcionario.setSalario(2000);

Pessoa pessoa = new Pessoa();


pessoa = funcionario;

//implementao dos mtodos

A operao realizada s possvel graas ao polimorfismo, que a capacidade de fazer referncia a um objeto de formas diferentes.

No exemplo, estamos nos referenciando a um funcionrio como sendo uma pessoa. Mas tome cuidado, um objeto pode fazer referncia a
outros objetos, porm, ele nunca muda de tipo. Se ele foi criado como
sendo um objeto do tipo Funcionario, ele sempre vai ser assim, at
que seja destrudo.

Veja outro exemplo para entender melhor. Imagine que na classe Pessoa tenha um mtodo chamado queTipoSou, que imprime uma frase
mostrando de que tipo um determinado objeto. Esse mesmo mtodo
criado na classe Funcionario. Fazendo isso, temos as seguintes classes:

PROGRAMAO ORIENTADA A OBJETOS I

57

public class Pessoa {



private String nome;

private String telefone;

private String rg;

private String cpf;

private String estadoCivil;

private String sexo;

public void queTipoSou(){

System.out.println(Pessoa!);

}

//implementao dos mtodos
}
public class Funcionario extends Pessoa {

private float salario;

private String carteiraTrabalho;
public void queTipoSou(){

System.out.println(Funcionrio!);

}

}

//implementao dos mtodos

Se criarmos um objeto do tipo Funcionario e um objeto do tipo Pessoa


e atribuirmos o objeto Funcionario ao objeto Pessoa, e, aps isso, chamarmos o mtodo quetipoSou, que frase ser impressa? Funcionrio!
ou Pessoa!? Antes de responder a essa pergunta, veja o exemplo:

public class Locadora{



public static void main(String[] args) {

Funcionario funcionario = new Funcionario();

funcionario.setNome(Joo);

funcionario.setRg(89898789);

funcionario.setCpf(021.234.543-90);

funcionario.setTelefone((47)30001122);

funcionario.setSexo(Masculino);

funcionario.setEstadoCivil(Casado);

funcionario.setCarteiraTrabalho(9876234653);

funcionario.setSalario(2000);

Pessoa pessoa = new Pessoa();


pessoa = funcionario;

pessoa.queTipoSou();

//implementao dos mtodos

58

CURSOS TCNICOS SENAI

Agora temos um objeto do tipo Pessoa, que faz referncia a um objeto


do tipo Funcionario. Lembre-se que um objeto sempre ser do tipo que
foi criado, nunca muda, at ser destrudo. Logo, se utilizar o objeto do
tipo Pessoa para chamar o mtodo queTipoSou, a frase impressa ser
Funcionrio, apesar de estar utilizando o objeto pessoa para chamar o
mtodo. Quem possibilita isso o polimorfismo.
O assunto da prxima unidade de estudos agregao e composio.
Continue atento e v fazendo os exerccios do caderno de atividades!

PROGRAMAO ORIENTADA A OBJETOS I

59

Unidade de
estudo 8
Sees de estudo
Seo 1 - Agregao e composio

Agregao e Composio
SEO 1

Agregao e Composio
Assim como na herana, que uma classe estende de outra para utilizar
seus atributos e mtodos, a agregao e a composio tambm tm esse
mesmo objetivo. Veja agora o que agregao e composio, e qual a
diferena entre esses conceitos com relao herana.
Os conceitos de agregao e composio, inicialmente, podem gerar alguma dvida, mas, a forma de utilizar exatamente a mesmo, o que
muda o momento em que cada um ser utilizado.
A agregao ou a composio devem ser utilizadas sempre que existir
a necessidade de caractersticas de outro objeto, dentro de uma classe.
Veja um exemplo, para entender melhor.

public class Pessoa {



private String nome;

private String telefone;

private String rg;

private String cpf;

private String estadoCivil;

private String sexo;

private String endereco;

private String bairro;

private String cep;

private String cidade;

private String complemento;


//implementao dos mtodos
}

Nesse exemplo, temos uma classe chamada Pessoa, alguns de seus atributos so correspondentes a um endereo, como endereo, bairro, cidade e cep. Ns poderamos criar outra classe, chamada Endereco, e nesta
colocar todos os atributos que esto na classe Pessoa e que se referem
a um endereo. Com isso, criaremos uma nova classe, que representa
um endereo, e que pode ser utilizada dentro da classe Pessoa, para isso,
basta criar um atributo do tipo Endereco dentro da classe Pessoa. Veja.

PROGRAMAO ORIENTADA A OBJETOS I

61

public class Endereco {



private String rua;

private String bairro;

private String cidade;

private String cep;

private String complemento;


}

// implementao dos mtodos

Agora, com a classe Endereco j criada, possvel retirar todos os atributos que representam um endereo e que esto dentro da classe Pessoa.
Mas, uma pessoa precisa de um endereo, ento, como fazer? Vamos
utilizar a classe que acabamos de criar, chamada Endereco, e fazer uma
agregao. A implementao fica desta forma:

public class Pessoa {



private String nome;

private String telefone;

private String rg;

private String cpf;

private String estadoCivil;

private String sexo;

private Endereco endereco;

public Endereco getEndereco() { return endereco;

}

public void setEndereco(Endereco endereco) {
this.endereco = endereco;

}

}

//implementao dos demais mtodos

Note que agora temos acesso aos atributos do endereo por meio do
atributo declarado, dentro da classe Pessoa do tipo Endereco. Para ter
acesso aos atributos, basta fazer o seguinte:

public class Locadora{



public static void main(String[] args) {

Pessoa pessoa = new Pessoa();

pessoa.getEndereco().setBairro(Bom Retiro);

pessoa.getEndereco().setCep(89222-365);

//...

}
}

62

CURSOS TCNICOS SENAI

Observe que, anteriormente, o


exemplo foi utilizado como uma
agregao, mas ser que esse
exemplo no poderia ser considerado uma composio? Entenda
melhor o conceito de cada um
deles.
Considera-se uma agregao quando todas as classes utilizadas na
operao podem existir, sem depender umas das outras.

No exemplo, temos uma classe


Pessoa e uma classe Endereco,
nesse caso, uma pessoa existe sem
um endereo e um endereo pode
existir sem uma pessoa, logo, a
utilizao de um objeto Endereco
dentro da classe Pessoa denominado como agregao.
Para representar uma agregao,
podemos utilizar um diagrama
que representa a relao entre as
classes, onde um losango vazado
(no preenchido) utilizado no
lado da classe que ir possuir a
outra. Veja o exemplo:

Se o contm encaixar melhor na


frase, voc deve utilizar ou a agregao ou a composio. Exemplo:
Um cliente uma pessoa.
Uma pessoa contm um endereo.

Figura 8: Exemplo de agregao

A composio definida quando pelo menos uma das classes no tem sentido, quando utilizada separadamente da outra.

Um exemplo muito utilizado, para explicar esse conceito, um pedido


de compra. Esse pedido uma classe e um item de compra outra classe, porm, um item de compra no pode existir sem que exista um pedido de compra, ele dependente do pedido. Por isso, temos a utilizao
de uma composio, a classe item de compra no tem sentido quando
utilizada separadamente.
Para ilustrar a composio, podemos utilizar um diagrama, assim como
foi utilizado na agregao, porm, a diferena que na composio o
losango preenchido. Veja:

Nos exemplos apresentados no


destaque, voc pde notar facilmente na primeira frase que um
cliente uma pessoa e no contm uma pessoa, logo, se utiliza
herana. J na segunda frase, uma
pessoa contm um endereo e
no um endereo, logo, , se utiliza a agregao.
Em vrios momentos do curso,
voc acompanhou a informao
de que os conceitos podem permitir reaproveitamento de cdigos j desenvolvidos em outras
classes, tornando as aplicaes
cada vez mais fceis de compreender e manutenir.
O prximo assunto a ser estudado, est ligado a essa funcionalidade: as classes abstratas. Mas antes
de continuar, realize os exerccios
28 e 29 do caderno de atividades
prticas.

Figura 9: Exemplo de composio

Fazendo uso da composio e/ou da agregao, podemos centralizar


caractersticas que sero utilizadas por vrias outras classes, e que podem ou no ser utilizadas separadamente. Dessa forma, se pode facilitar
possveis manutenes do sistema e, claro, praticar o reaproveitamento
de cdigo.
E quanto ao fato de utilizar a herana, ao invs de agregao ou composio? Como saber quando utilizar um ou outro conceito?
A herana utilizada quando uma classe pode ser vista de duas formas,
como no exemplo do cliente, que afirmamos que um cliente pode ser
uma pessoa.
No exemplo, que uma pessoa no pode ser, mas pode conter um endereo, utiliza-se a agregao ou composio.
Para facilitar a identificao de qual conceito utilizar, existem dois exemplos muito utilizados e simples. Basta montar frases utilizando ou
contm. Se na frase encaixar o , ento voc deve utilizar a herana.

PROGRAMAO ORIENTADA A OBJETOS I

63

Unidade de
estudo 9
Sees de estudo
Seo 1 - Classes abstratas

Classes Abstratas
SEO 1

Classes abstratas
As classes abstratas no podem ser utilizadas como instncia direta, ou
seja, voc no pode utilizar o new para criar um objeto de uma classe
abstrata. Mas para que serve uma classe, se voc no pode instanci-la?
Podemos dizer que uma classe abstrata utilizada como um molde
para outras classes. Para fazer isso, vamos utilizar a herana. Vamos trabalhar novamente com as classes Pessoa, Funcionario e Cliente?
No sistema de locadora, teremos que cadastrar os funcionrios e os
clientes da loja. Como funcionrios e clientes so pessoas, faz sentido
ter um cadastro de pessoas, mas ao cadastrar preciso saber quem
funcionrio e quem cliente. Podemos, ento, utilizar uma classe Pessoa
para reunir todas as caractersticas em comum das demais classes, que
podem ser consideradas pessoas.
Fazendo isso, teremos uma classe modelo, que ser a Pessoa, e outras
classes que iro estender dessa modelo para reaproveitar suas caractersticas. Para definir uma classe como sendo um modelo, se utiliza a
palavra chave abstract. Dentro dessa classe, podemos ou no, ter mtodos abstratos, assim como, ter mtodos no abstratos. Tornando a classe
Pessoa abstrata, ela ficaria assim:

abstract class Pessoa {



private String nome;

private String telefone;

private String rg;

private String cpf;

private String estadoCivil;

private String sexo;


abstract void cadastroCpf(String cpf);

}

//implementao dos demais mtodos

Agora temos a classe Pessoa como sendo abstrata, note que apenas adicionamos a palavra chave abstract no incio da criao da classe. Alm
dessa alterao, criamos tambm um mtodo abstrato, o mtodo cadastroCpf, isso significa que na classe abstrata Pessoa existe apenas a
assinatura do mtodo, e este dever ser implementado nas classes que
estenderem da classe Pessoa. Logo, as classes Funcionario e Cliente ficam da seguinte forma:

PROGRAMAO ORIENTADA A OBJETOS I

65

public class Funcionario extends Pessoa {



private float salario;

private String carteiraTrabalho;

public void cadastroCpf(String cpf){
if(cpf.length() >= 11){
super.cadastroCpf(cpf);

}
else{

System.out.println(CPF do funcionrio invlido.);

}

}

//implementao dos demais mtodos
}
public class Cliente extends Pessoa {

private float dependentes;

public void cadastroCpf(String cpf){
if(cpf.length() >= 11){
super.cadastroCpf(cpf);

}
else{

System.out.println(CPF do cliente invlido.);

}

}

}

//implementao dos demais mtodos

Note que ambas as classes, utilizaram a palavra extends para trabalhar


com herana, estendendo da classe Pessoa. Como na classe Pessoa existe
um mtodo abstrato, este deve ser implementado em todas as classes
filhas da classe Pessoa, e isso foi feito nas duas classes filhas.
Resumindo, quais so as principais caractersticas das classes abstratas?

Elas servem como modelo para outras classes.


No podem ser instanciadas, ou seja, no se pode utilizar a palavra-

-chave new para uma classe abstrata.

Pode-se implementar mtodos abstratos dentro de uma classe abstrata.


Mtodos abstratos no possuem implementao, apenas a assinatura
do mtodo.
Pode-se implementar mtodos no abstratos dentro de uma classe
abstrata.
Os mtodos abstratos devem ser implementados dentro das classes

filhas.

66

CURSOS TCNICOS SENAI

Pode-se ainda representar as classes com o uso de uma classe abstrata


por meio dediagramas de classes UML. Veja na figura a seguir.

Figura 10: Representao da herana utilizando classe abstrata

Perceba que esse diagrama aquele apresentado quando estudamos a


herana. Sabe por qu?
Porque as classes abstratas so utilizadas para se trabalhar com herana
e como no podemos instanciar uma classe abstrata, ela utilizada para
ser herdada por outras classes.
Para no se confundir, lembre sempre que a herana existe, perfeitamente, sem as classes abstratas, mas, as classes abstratas dependem da
herana para serem utilizadas.
Na prxima unidade de estudo voc aprender a criar as interfaces. Continue atento e bom estudo!

PROGRAMAO ORIENTADA A OBJETOS I

67

Unidade de
estudo 10
Sees de estudo
Seo 1 - Interface

Interface
SEO 1
Interface

A linguagem de programao Java no permite que classes herdem de


mais de uma classe, ou seja, elas podem ter no mximo uma superclasse.
Para suprir essa necessidade de herdar propriedades de mais de uma
classe, foi desenvolvido o conceito de interfaces.
Diferente das classes abstratas, as interfaces no podem conter implementaes de mtodos e declaraes de atributos que no sejam do
tipo public, static e final. As interfaces possuem apenas as assinaturas
dos mtodos, por isso dizemos que as elas so como contratos, depois
que assinamos, temos a obrigao de implementar todos os mtodos
do contrato, ou seja, implementar todas as assinaturas de mtodos que
existem na interface.
Para criar uma interface, basta substituir a palavra class por interface.
Para ilustrar, vamos alterar a nossa classe Pessoa para que ela se torne
uma interface, veja o exemplo a seguir:

interface Pessoa {

String nome = Maria;



}

public void cadastroCpf(String cpf);


//assinatura dos demais mtodos

Nesse exemplo, no temos mais a palavra class, e sim interface. Quando existir um atributo criado dentro de uma interface, ele j deve ser
inicializado, pois, mesmo sem informar, esse atributo final (constante),
alm de esttico e pblico. Alm dessas mudanas, os mtodos no podem mais ser implementados. Observe que no exemplo, temos apenas a
assinatura do mtodo.
Quando utilizamos uma interface em outra classe, dizemos que estamos
implementando uma interface, para isso, utilizamos a palavra reservada implements. Observe o exemplo aplicado s classes Funcionario e
Cliente.

PROGRAMAO ORIENTADA A OBJETOS I

69

public class Funcionario implements Pessoa {



private float salario;

private String carteiraTrabalho;

public void cadastroCpf(String cpf){
if(cpf.length() >= 11){
super.cadastroCpf(cpf);

}
else{

System.out.println(CPF do funcionrio invlido.);

}

}

//implementao dos demais mtodos
}
public class Cliente implements Pessoa {

private float dependentes;

public void cadastroCpf(String cpf){
if(cpf.length() >= 11){
super.cadastroCpf(cpf);

}
else{

System.out.println(CPF do cliente invlido.);

}

}

}

//implementao dos demais mtodos

Perceba que nas duas classes utilizamos a palavra-chave implements


para afirmar que as classes Funcionario e Cliente vo implementar todos
os mtodos da interface Pessoa.
Uma das vantagens em utilizar interface que se pode implementar mais
de uma na mesma classe. Para fazer isso, basta separar por vrgula as
interfaces que se deseja implementar, exemplo:

public class Funcionario implements Pessoa, SegundaInterface, TerceiraInterface {



//Criao de atributos

//implementao dos mtodos
}

Nesse exemplo, separamos por vrgula trs interfaces - Pessoa, SegundaInterface e TerceiraInterface, pois, estamos nos responsabilizando por
assinar trs contratos, e com isso, temos que implementar os mtodos
assinados em todas as interfaces.

70

CURSOS TCNICOS SENAI

Deve ficar bem claro que quando se fala em interface, que, aqui, no
definido como as coisas so feitas (implementao), mas sim, o que
ser feito (assinatura). Na programao orientada a objeto, muito
importante pensar dessa forma, fazendo assim, as classes acabam
ficando mais fceis de entender e de manutenir.

Diversos autores aconselham amplamente o uso de interfaces, ao invs


de herana. A herana, se utilizada sem conhecimento, pode tornar seu
cdigo perigoso. J no uso de interfaces, cada classe responsvel pela
sua implementao, pois estamos programando voltados interface, o
que mais aconselhado.

DICA
Na prxima unidade de estudos, voc vai entender como o computador consegue executar vrias coisas ao mesmo tempo, mas antes,
teste o que aprendeu nesta unidade realizando os exerccios 33 e 34
do caderno de atividades prticas. At mais!

PROGRAMAO ORIENTADA A OBJETOS I

71

Unidade de
estudo 11
Sees de estudo
Seo 1 - Apndice Programao
concorrente e threads

Apndice Programao
Concorrente e Threads
Seo 1

Programao
concorrente e threads
Voc j se perguntou como o computador consegue executar vrias coisas ao mesmo tempo? Essa uma grande vantagem que a mquina tem
sobre os seres humanos.
Ouvir msica e utilizar um editor de texto para escrever sobre algo que
voc est pesquisando na internet... Como o computador consegue fazer
isso ao mesmo tempo? O computador divide essas tarefas em processos,
ou seja, cada ao executada por ele um novo processo. Por serem executados todos ao mesmo tempo, dizemos que so processos paralelos.
At aqui tudo bem, cada atividade um processo, mas imagine que o
nosso sistema esteja sendo executado, ento, torna-se um processo para
o sistema operacional do computador. Agora, imagine que dentro do
nosso sistema precisamos fazer mais de uma atividade por vez, como
fazer isso? Precisamos enviar um email, ao mesmo tempo em que um
cliente realiza um cadastro de usurio ou exibir a interface grfica para
que o usurio possa visualizar o sistema.
Tudo isso est sendo feito em paralelo, ento, como controlar isso tudo?
Criar mais processos? Nesse caso no, existe outro conceito que so as
threads. Se dentro de um processo, temos vrias atividades, que devem
ser executas em paralelo, ser preciso criar threads para gerenciar tudo
isso.
No Java, existe mais de uma forma de se utilizar as threads, porm, aqui
voc vai aprender a forma considerada mais correta, que implementando a interface Runnable. Essa interface implementa uma thread. Fazendo isso no Java, teremos a seguinte classe:

public class Sistema implements Runnable{



//implementao dos mtodos
}

A classe que chamamos de Sistema, implementa a interface Runnable, e


ao implementar essa a classe precisa implementar o mtodo run, que
responsvel por dar incio execuo da thread. Veja no exemplo a
seguir, uma implementao desse mtodo.

PROGRAMAO ORIENTADA A OBJETOS I

73

public class Sistema implements Runnable{


private String nome;
//get e set para a varivel nome
public void run() {

int i = 0;

while(i<10){

System.out.println(Sistema executado por + nome + !);

i++;

}
}
}

No exemplo, o mtodo run imprimir uma frase dez vezes, informando


quem executou o sistema. Para iniciar a thread, basta chamar tal mtodo.
Veja no exemplo a seguir.

public class Principal{


public static void main(String[] args) {

Sistema sis = new Sistema();

sis.setNome(Maria);
new Thread(sis).start();

}
}

Devemos criar um objeto da classe Sistema, que a classe que implementa uma thread, feito isso, colocamos um valor para o atributo nome
e em seguida criamos uma nova thread para receber o nosso sistema. A
chamada ao mtodo start() que vai iniciar a execuo do mtodo run()
da classe sistema. Nesse caso, a frase que ser impressa a seguinte:

Sistema executado por Maria!


Sistema executado por Maria!
Sistema executado por Maria!
Sistema executado por Maria!
Sistema executado por Maria!
Sistema executado por Maria!
Sistema executado por Maria!
Sistema executado por Maria!
Sistema executado por Maria!
Sistema executado por Maria!

Para visualizar a execuo dos sistemas em paralelo, podemos iniciar


vrias execues ao mesmo tempo, alterando o mtodo main para iniciar
vrios sistemas. Com a alterao, fica assim:

74

CURSOS TCNICOS SENAI

public class Principal


{
public static void main(String[] args)
{

Sistema sis = new Sistema();

sis.setNome(Maria);
new Thread(sis).start();

Sistema sis2 = new Sistema();

sis2.setNome(Joo);
new Thread(sis2).start();

Sistema sis3 = new Sistema();

sis3.setNome(Pedro);
new Thread(sis3).start();

Sistema sis4 = new Sistema();

sis4.setNome(Julia);
new Thread(sis4).start();

}
}

Com a alterao realizada no mtodo main, quatro pessoas esto iniciando seus sistemas, nesse caso, sero impressas quarenta frases, s que
dessa vez, elas sero impressas intercaladas, pois a execuo dos sistemas
realizada em paralelo, devido ao uso das threads. As frases ficam da
seguinte forma:

Sistema executado por Maria!


Sistema executado por Maria!
Sistema executado por Joo!
Sistema executado por Pedro!
Sistema executado por Maria!
Sistema executado por Julia!
Sistema executado por Julia!
Sistema executado por Pedro!
Sistema executado por Joo!
Sistema executado por Julia!
Sistema executado por Pedro!
Sistema executado por Joo!
Sistema executado por Maria!
Sistema executado por Joo!
Sistema executado por Pedro!
Sistema executado por Maria!
Sistema executado por Maria!
...

PROGRAMAO ORIENTADA A OBJETOS I

75

Observando as frases, podemos perceber que os sistemas esto sendo


executados em paralelo, pois se no estivessem primeiro, seriam impressas todas as frases com o nome de Maria, depois todas com o nome
Joo, depois as do Pedro e por ltimo as frases da Julia, pois essa foi a
ordem que chamamos o mtodo run() no main.
Imagine agora, que existem mtodos que no podem ser executados ao
mesmo tempo por threads diferentes, pois podem causar inconsistncias
de valores no sistema. Para que isso no ocorra, podemos controlar o
acesso aos mtodos, ou at mesmo a blocos de cdigos dentro de mtodos, de modo que apenas uma thread execute esse bloco e as demais
ficam esperando a sua vez na fila. Para isso, utilizamos a palavra-chave
synchronized.
Vamos alterar a classe Principal para chamar um mtodo synchronized,
e imprimir as nossas frases de execuo do sistema. Veja como ficariam
as alteraes

public class Sistema implements Runnable{



private String nome;

//get e set para a varivel nome

public synchronized void iniciarSistema(){
int i = 0;
while(i<10){

System.out.println(Sistema executado por + nome + !);

i++;

}

}


public void run() {

iniciarSistema();

}
}

No exemplo foi criado um novo mtodo, e colocado tudo que estava no


mtodo run dentro desse novo mtodo, chamado de iniciarSistema. A
diferena que o mtodo foi criado, utilizando a palavra chave synchronized junto ao modificador de acesso.
Com essa alterao, ao executar o programa, as frases no ficaram intercaladas, e sim agrupadas de dez em dez, pois o mtodo que imprime as
frases s pode ser acessado por meio de uma thread por vez.
Pode-se, ainda, deixar apenas uma parte do cdigo como synchronized,
veja no exemplo a seguir:

76

CURSOS TCNICOS SENAI


public void iniciarSistema(){
synchronized(this){
int i = 0;
while(i<10){


System.out.println(Sistema + i + em execuo!);

i++;

}

}

//continuao do mtodo
}

Nesse caso, mais de uma thread pode chegar at o mtodo iniciarSistema, porm no trecho que est entre o bloco synchronized, apenas uma
thread poder ser executada por vez.
Utilizando as threads, possvel realizar vrias atividades ao mesmo
tempo no mesmo sistema, e ainda controlar quando uma ou mais threads
podem acessar um determinado mtodo ou trecho de cdigo do nosso
sistema simultaneamente.

PROGRAMAO ORIENTADA A OBJETOS I

77

Finalizando
Parabns, voc acaba de concluir mais uma etapa do Curso Tcnico em Informtica. Durante
o estudo voc pde entender que tudo o que est ao nosso redor pode se tornar um objeto e
pode ser representado dentro de um sistema. Entendeu que o reaproveitamento de cdigo reduz o tempo de desenvolvimento de um sistema, auxilia no momento de manutenir o sistema
e facilita o entendimento, entre outras vantagens.
A orientao a objetos empregada em inmeras linguagens e utilizada por grandes empresas. Tendo conhecimento dos conceitos fundamentais da POO, o profissional aprende
outras linguagens mais facilmente, sem contar que o conhecimento das prticas da orientao
a objeto um grande diferencial no momento de buscar uma vaga no mercado de trabalho.
recomendvel que, de vez em quando, voc releia as unidades de estudos e aperfeioe
seus conhecimentos buscando outras fontes de informao. Nunca pare de estudar, a informtica est em constante evoluo, e nosso papel acompanh-la para sermos profissionais
de sucesso.
Sucesso e at uma prxima!

PROGRAMAO ORIENTADA A OBJETOS I

79

Referncias

BOOCH, Grady; RUMBAUGH, James; JACOBSON, Ivar. UML Guia do Usurio. 2.


ed. Rio de Janeiro: Campus, 2006.

DEITEL, Paul J. Java: como programar. 6. ed. So Paulo: Pearson, 2005. 1152 p.

SIERRA, Kathy; BATES, Bert. Use a cabea! Java. Traduo da segunda edio. Rio de
janeiro, RJ: Editora Alta Books, 2005. 470 p.

Bibliografia complementar

LUCKOW, Decio Heinzelmann; MELO, Alexandre Altair de. Programao Java Para a
Web Aprenda a desenvolver uma aplicao financeira pessoal com as ferramentas
mais modernas da plataforma Java. So Paulo: Novatec, 2010.

SINTES, Anthony. Aprenda Programao Orientada a Objetos em 21 dias. So Paulo:


Makron Books, 2002.

SOMMERVILLE, Ian. Engenharia de Software. 8. ed. So Paulo: Pearson, 2007.

PROGRAMAO ORIENTADA A OBJETOS I

81

Equipe de Desenvolvimento de Recursos Didticos


Coordenao de Educao a Distncia
Beth Schirmer
Coordenao Projetos EaD
Maristela de Lourdes Alves
Coordenao de Desenvolvimento de Recursos
Didticos
Gisele Umbelino
Projeto Educacional
Angela Maria Mendes
Israel Braglia
Projeto Grfico
Daniela de Oliveira Costa
Jordana Paula Schulka
Juliana Vieira de Lima

Design Educacional
Evelin Lediani Bao
Capa, Ilustraes, Tratamento de Imagens
Dimitre Camargo Martins
Diego Fernandes
Luiz Eduardo Meneghel
Diagramao
Carlos Filip Lehmkuhl Loccioni
Reviso e Fechamento de Arquivos
Daniela de Oliveira Costa
Juliana Vieira de Lima
Reviso Ortogrfica e Normatizao
SENAI/SC em Jaragu do Sul

PROGRAMAO ORIENTADA A OBJETOS I

83

Você também pode gostar