Você está na página 1de 18

Aprendendo

Java 2
Rodrigo Mello
Ramon Chiara
Renato Villela

Novatec Editora Ltda.


www.novateceditora.com.br

1
Programao Orientada a Objetos

O que Programao Orientada a Objetos?


um paradigma de programao baseado no conceito de classes e objetos.
As classes so elementos em que dados e procedimentos podem ser agrupados,
segundo sua funo para um determinado sistema; essas classes so codificaes
no formato de arquivos. Quando uma dessas classes utilizada como um tipo de
dado para a criao de uma varivel, esta chamada de objeto.

O que Classe?
A classe definida como uma estrutura de dados que contm mtodos e
atributos. No paradigma da orientao a objetos, os procedimentos ou funes
(presentes em linguagens estruturadas, tais como C e Pascal) so chamados de
mtodos de uma classe. As variveis, que so declaradas dentro de uma classe,
so chamadas de atributos.
Ao se criar uma classe, o objetivo agrupar mtodos e atributos que estejam
relacionados entre si. Uma classe composta de partes e estas devem representar
alguma funcionalidade segundo o objetivo da classe. Por exemplo, uma classe
Cliente pode ter atributos como nome_cliente, endereco_cliente e outros dados relacionados
ao cliente. Exemplos dos mtodos que atuam sobre tais dados podem ser
inserir_cliente, excluir_cliente e alterar_cliente.

13

Captulo 1: Programao Orientada a Objetos


As partes que compem a classe Cliente devem representar funcionalidades
segundo o objetivo dessa classe, ou seja:
1. Quais os dados relacionados a um cliente (nome, endereo, cidade,
estado, pas etc.).
2. Quais outras informaes desse cliente devem ser armazenadas?
3. Quais atitudes um cliente pode tomar ou quais atitudes podem ser
tomadas diante de um cliente (estas, geralmente, se tornam mtodos da
classe)?
Enfim, a classe o cdigo que declara atributos e mtodos, em que cada um
destes possa fazer parte da representao de um mesmo objetivo. O objetivo da
classe representar de forma adequada uma entidade (tal como um cliente,
fornecedor etc.) dentro de um sistema.

Exemplo de uma classe em Java


// declarao inicial da classe Cliente
public class cliente
{
// atributos da classe Cliente
String nome;
String endereco;

// mtodos da classe Cliente


public void setNome (String novo_nome)
{
nome = novo_nome;
}
public void setEndereco (String novo_endereco)
{
endereco = novo_endereco;
}
public String getNome()
{
return nome;
}
public String getEndereco()
{
return endereco;
}
} // fim da declarao da classe Cliente
14

Captulo 1: Programao Orientada a Objetos


A classe Cliente apresenta atributos, que so utilizados para armazenar
informaes relacionadas ao cliente, e mtodos, que representam aes tomadas
sobre os dados contidos em um objeto dessa classe ou objetos de outras classes.
Os mtodos definidos na classe Cliente recuperam e alteram somente os dados
contidos em um objeto dessa prpria classe.

O que Objeto?
Enquanto uma classe somente a codificao na forma de um arquivo texto,
um objeto uma instncia de uma classe, ou seja, uma poro de memria
reservada para armazenar os dados e os mtodos declarados na classe. Enfim, um
objeto a instanciao de uma classe na memria.
A classe o cdigo-fonte escrito em um arquivo texto, enquanto o objeto
uma parte de uma aplicao durante o processo de execuo. No objeto, pode-se
executar os mtodos que foram definidos, alm de acessar e alterar dados.

class X {
...
}

Disco
Rgido

Memria

Figur
a1
.1 Objeto do tipo Cliente e sua classe correspondente.
igura
1.1

O que Mensagem?
A mensagem definida como o ato de chamar ou requisitar a execuo de
um mtodo. Portanto um objeto do tipo Cliente apresenta diversos mtodos; o ato
de requisitar a execuo de um desses mtodos conhecido como mensagem.
Um objeto pode enviar mensagens para outros objetos requisitando a execuo
de mtodos.

15

Captulo 1: Programao Orientada a Objetos

O que Encapsulamento?
a capacidade de restringir o acesso a elementos de uma classe utilizando
qualificadores. Um qualificador uma palavra reservada, que define a visibilidade
de determinado atributo ou mtodo, em uma linguagem orientada a objetos. Por
exemplo, na linguagem C++ existem os qualificadores private, public e protected, e na
linguagem Java existe, ainda, mais um qualificador, conhecido como package.
A funo dos qualificadores definir o acesso aos dados e mtodos de uma
classe. O qualificador public, por exemplo, permite que determinado mtodo ou
atributo seja acessado diretamente por qualquer outro objeto. Observe a seguir a
tabela 1.1 com as caractersticas dos qualificadores na linguagem C++ e Java:

Qualificadores

Java

private

O mtodo ou atributo pode ser


acessado somente dentro da
prpria classe.

public

O mtodo ou atributo pode ser


acessado externamente por
outro cdigo.

protected

O mtodo ou atributo pode ser


acessado pela prpria classe ou
por classes-filhas (aquelas que
herdam desta classe).

package (sem
modificador)

O mtodo ou atributo pode ser


acessado pela prpria classe ou
por classes que participem do
mesmo pacote.

C++

O mtodo ou atributo pode ser


acessado somente dentro da
prpria classe.
O mtodo ou atributo pode ser
acessado externamente por outro
cdigo.
O mtodo ou atributo pode ser
acessado pela prpria classe ou
por classes-filhas (aquelas que
herdam desta classe).

No existe em C++.

Tabela 1
.1 Tabela com os qualificadores nas linguagens Java e C++.
1.1

Mtodos
Atributos

Figur
a1
.2 Encapsulamento em uma classe.
igura
1.2

16

Captulo 1: Programao Orientada a Objetos


A seguir, um exemplo de uma classe em Java que utiliza qualificadores:

// declarao inicial da classe Clientes


public class Clientes
{

// atributos da classe Clientes - estes podem ser acessados somente dentro da classe
private String nome;
private String endereco;

// atributos da classe Clientes acessveis por meio de cdigo externo classe


public String cidade;
public int idade;

// atributos da classe Clientes acessveis por meio de cdigo externo classe,


// desde que pertena ao mesmo pacote dessa classe existe em Java,
// no existe esse tipo de declarao em C++
float saldo;
String rg;

// mtodos da classe Clientes


public void setNome (String novo_nome)
{
nome = novo_nome;
}
public void setEndereco (String novo_endereco)
{
endereco = novo_endereco;
}
public String getNome()
{
return nome;
}
public String getEndereco()
{
return endereco;
}
} // fim da declarao da classe Clientes

17

Captulo 1: Programao Orientada a Objetos

O que Herana?
A herana torna possvel a reutilizao de funcionalidades previamente definidas
em uma classe. A finalidade que a subclasse (aquela que herda as caractersticas de
determinada classe) inclua o comportamento da superclasse (aquela que contm o
comportamento a ser herdado) e adicione mais funcionalidades. No seria interessante
a herana se no houvesse a possibilidade de adicionar funcionalidades subclasse.
A figura 1.3 representa uma subclasse que herda caractersticas da superclasse
e lhe adiciona alguma funcionalidade.

Figura 1.3 Mecanismo da Herana.


Ao processo de definio de subclasses, em que uma classe herda caractersticas
de outra e assim sucessivamente, d-se o nome de hierarquia de classes. Essa
hierarquia de classes segue uma apresentao na forma de rvore, em que a raiz a
superclasse de todo o sistema. Cada nvel abaixo dessa superclasse do sistema
acrescenta funes especficas.

Figura 1.4 Exemplo de Hierarquia de Classes.

18

Captulo 1: Programao Orientada a Objetos


Na figura 1.4 apresentada uma hierarquia de classes, em que a classe Funcionario
representa a superclasse do sistema. No nvel abaixo dessa superclasse existem
especializaes da superclasse, ou seja, subclasses que herdam as caractersticas
da classe Funcionario e nas quais podem ser adicionadas caractersticas especficas.
Na figura 1.4 existem as subclasses FuncionarioContratado e FuncionarioTemporario.
Pode-se relacionar subclasses superclasse questionando se a subclasse "
uma" superclasse. Por exemplo, pense na seguinte questo: "um FuncionarioContratado
um Funcionario?". A resposta sim. Caso a resposta seja negativa, a herana
provavelmente esteja incorreta ou durante a fase de projeto do sistema foi necessria
a criao de tal estrutura.

Figura 1.5 Exemplo de hierarquia errada.


Existem construes de hierarquia de classes que apresentam erros. A figura
1.5 apresenta um exemplo de hierarquia em que a superclasse Carro tem as
subclasses Porta e Pneu. Essa tcnica no expressa corretamente o conceito de
hierarquia, em que as subclasses especializam, ou seja, afunilam o conceito da
superclasse. Caso se utilize o mesma linha de raciocnio realizada anteriormente
para essa hierarquia, tal como: "Uma Porta um Carro?", a resposta ser negativa.
Portanto o correto definir uma subclasse que se relacione com a superclasse, em
que a subclasse seja o conceito da superclasse adicionando-se algum contedo
que possa representar de forma mais especfica o conceito apresentado pela
superclasse.
A herana pode ser mltipla em que uma subclasse herda caractersticas de
diversas superclasses. A linguagem C++ suporta esse tipo de herana, enquanto a
linguagem Java suporta somente a herana de uma nica classe.

19

Captulo 1: Programao Orientada a Objetos

Figura 1.6 Mecanismo da Herana Mltipla.


A seguir, um exemplo de herana em Java:

/*declarao da superclasse*/
class madeira
{
// atributo da classe madeira
String cor;

// mtodos da classe madeira


public String getCor()
{
return cor;
}
public void setCor(String nova_cor)
{
cor = nova_cor;
}
} // fim da declarao da superclasse
/*declarao da subclasse*/
class cadeira extends madeira
{
// atributos adicionais superclasse
int peso;
// mtodos adicionais superclasse
public void escreve_tela()
{
System.out.println(this.getCor());
}
} // fim da declarao da subclasse
20

Captulo 1: Programao Orientada a Objetos

O que Sobrecarga de Mtodos e


Operadores?
Sobrecarregar um mtodo ou operador permitir que se utilize o mesmo
nome de chamada para operar sobre uma variedade de tipos de dados.
Pode-se ter diversos mtodos declarados com o mesmo nome dentro de uma
classe, entretanto tais mtodos no podem ter os mesmos tipos de parmetros
seguindo a ordem de declarao. Por exemplo, pode-se ter o mtodo setValor(float
novo_x) e setValor(float novo_x, float novo_y) em que o tipo do primeiro parmetro o
mesmo, mas existe um segundo parmetro em um dos mtodos que diferencia as
duas declaraes. Errado, portanto, seria declarar o mtodo setValor(float novo_x) e
setValor(float novo_y), pois o tipo do parmetro idntico e o nmero de parmetros
tambm, no havendo diferenas entre as duas declaraes.
Para sobrecarregar mtodos, deve-se, inicialmente, detectar quais mtodos
sero sobrecarregados. Nunca defina mtodos que apresentem a mesma ordem
de declarao de parmetros, tendo estes o mesmo tipo de dados e estando em
nmero idntico.
Como saber se vlida a sobrecarga de mtodos?
Mtodo

Caso coexistam em uma classe

1. setValor(float novo_x)

O mtodo tem uma varivel do tipo float.

2. setValor(float novo_y)

Caso coexistam os mtodos 1 e 2 na mesma classe,


o compilador apresentar erros, pois detectar dois
mtodos que recebem apenas uma varivel do mesmo
tipo.

3. setValor(float novo_x, float novo_y)

Caso coexistam os mtodos 1 e 3 ou os mtodos 2 e


3, o exemplo funcionar corretamente.

4. setValor(float novo_x, int nova_variavel)

Caso coexistam os mtodos 1 e 4 ou 2 e 4, o exemplo


funcionar corretamente. Caso os mtodos 3 e 4
estejam na mesma classe, o exemplo tambm
funcionar corretamente, pois apesar de o nmero de
parmetros ser igual, o tipo deles na ordem de
declarao diferente. Ou seja, pode-se ter o mesmo
nmero de parmetros quando o tipo deles na ordem
de declarao do mtodo diferente (pois assim
que o compilador analisa para fazer a chamada ao
mtodo); no caso 3 tem-se (float, float) e no caso 4 temse (float, int).

Existe, ainda, como citado anteriormente, a sobrecarga de operadores. A


linguagem Java suporta somente sobrecarga de mtodos. Existem, contudo,
linguagens, como C++, que suportam sobrecarga de mtodos e operadores.

21

Captulo 1: Programao Orientada a Objetos


A seguir, um exemplo de classe em Java que tem o mtodo setValor
sobrecarregado:

// declarao da classe vetor


public class vetor
{
// atributos da classe vetor
private float X;
private float Y;
// mtodos da classe vetor
// ocorre sobrecarga no mtodo setValor, pois ele manipula
// uma ou duas variveis do tipo float
public void setValor(float novo_x)
{
X = novo_x;
}
public void setValor(float novo_x, float novo_y)
{
X = novo_x;
Y = novo_y;
}
} // fim da declarao da classe vetor
A sobrecarga de operadores oferecida para classes que desejem efetuar
adio, subtrao e outras operaes.
A seguir, um exemplo na linguagem C++ em que existe a sobrecarga do
operador adio (+) para a manipulao de objetos do tipo Vetor2D.

// declarao da classe em C++


class Vetor2D
{
// atributos
float x, y;
public:
// construtor
Vetor2D(Vetor2D v2);
// mtodos
void EscreveVideo(char texto[]);
Vetor2D operator + (Vetor2D v2);
} // fim da classe Vetor2D

22

Captulo 1: Programao Orientada a Objetos


No exemplo anterior declarado um mtodo:

Vetor2D operator + (Vetor2D v2);


Existe nesse mtodo a sobrecarga do operador + (adio). Essa sobrecarga
torna possvel a soma de dois objetos do tipo Vetor2D:

Vetor2D v1 = new Vetor2D;


Vetor2D v2 = new Vetor2D;

// uso do operador adio entre instncias do tipo Vetor2D


Vetor2D v3 = v2 + v1;
No caso apresentado acima, o objeto v2 responsvel por executar de forma
implcita uma chamada para o operador adio sobrecarregado (+), o qual executa
uma determinada funo sobre os dados. Na chamada para execuo do operador
sobrecarregado, enviado o objeto v1 como parmetro. Na declarao da classe
Vetor2D, observa-se que o operador adio sobrecarregado recebe somente um
parmetro que do mesmo tipo da classe.

O que Polimorfismo?
a troca de mensagens entre mtodos de uma subclasse com sua superclasse
e assim sucessivamente. O polimorfismo pode ser observado por meio de mtodos
virtuais de uma classe como representado a seguir:

Figura 1.7 Mtodos Virtuais.


Na figura acima observa-se que o mtodo M1 da classe A chama o mtodo M2
da mesma classe. Caso seja criada uma classe B que seja subclasse da classe A e seja
reescrito o mtodo M2, tm-se:
1. Quando o mtodo M1 for chamado por meio de um objeto da classe B,
ento o mtodo M1 procurado nesta e no encontrado, procura-se o
mtodo nas superclasses da classe B at ser encontrado.

23

Captulo 1: Programao Orientada a Objetos


2. Aps o mtodo M1 ser chamado, ele chama o mtodo M2 que , ento,
procurado desde a subclasse, onde foi originada a mensagem, passando
s superclasses da hierarquia at ser encontrado.
3. Caso o mtodo M2 seja encontrado na classe B (que enviou uma mensagem
para M1), ento o mtodo a ser chamado o M2 da classe A ou o M2 da
classe B? A resposta correta o M2 da classe B, pois ele foi reescrito na
classe que est fazendo chamadas para o mtodo M1.
Para entender melhor o funcionamento do polimorfismo, considere uma
classe Madeira como superclasse, e uma subclasse chamada Cadeira. Considere o
mtodo escreve_na_tela na classe Madeira, o qual faz uma chamada para o mtodo
escreve na mesma classe. Caso o mtodo escreve seja redefinido na subclasse, ou
seja, na classe Cadeira, se ocorrer uma chamada do mtodo escreve_na_tela por meio
de um objeto da classe Cadeira, que originou a mensagem, o mtodo a ser chamado
por escreve_na_tela ser o escreve da classe Cadeira.
Desta forma, partindo de um objeto do tipo Cadeira toda mensagem executada,
ou seja, uma chamada a um mtodo gera uma busca do mtodo nesta classe, e
caso no seja encontrado, feita uma busca na superclasse da classe Cadeira, ou
seja, a classe Madeira.
Caso no seja encontrado na classe Madeira, ocorre uma busca na superclasse
da classe Madeira e assim sucessivamente, at chegar raiz da hierarquia de classes.
Encontrando o mtodo, ele executado e qualquer outra chamada dentro dele
gera novamente uma busca por um mtodo desde a classe Cadeira; caso no seja
encontrado, ser feita um busca na superclasse da classe Cadeira e assim
sucessivamente. Considere o exemplo em Java a seguir:

/*declarao da superclasse*/
class Madeira
{
// atributo da classe Madeira
String cor;
// mtodos da classe Madeira
public void escreve_na_tela()
{
escreve();
}
public void escreve()
{
System.out.println("estou na classe Madeira!");
}
} // fim da declarao da superclasse
24

Captulo 1: Programao Orientada a Objetos

/*declarao da subclasse*/
class Cadeira extends Madeira
{
// mtodos adicionais superclasse
public void escreve()
{
System.out.println("estou na classe Cadeira!");
}
} // fim da declarao da subclasse
Caso se declare um objeto da classe Madeira e execute o mtodo escreve_na_tela,
este faz uma chamada a escreve da classe Madeira retornando o texto:

estou na classe Madeira!


Caso se declare um objeto da classe Cadeira que chame o mtodo escreve_na_tela,
este faz uma chamada ao mtodo escreve da classe em que o objeto foi declarado,
ou seja, classe Cadeira, e caso o mtodo no seja encontrado, a chamada ser
repassada superclasse da classe Cadeira e assim sucessivamente.
Como o mtodo escreve foi encontrado na classe Cadeira esse executado e
gera a sada:

estou na classe Cadeira!


Na prtica, cada classe procura os mtodos sempre da classe de onde est
fazendo as chamadas em direo s superclasses, por exemplo:

Figura 1.8 Busca de mtodos virtuais.

25

Captulo 1: Programao Orientada a Objetos


Na figura 1.8, o mtodo M1 chama o mtodo M2 na classe A. Considere a
declarao da classe B que herda as caractersticas da classe A e nesta seja reescrito
o mtodo M2, declarando um objeto do tipo classe B que executa o mtodo M1, o
que ocorre?
1. Primeiro, como se sabe, os mtodos so procurados a partir de um objeto
de uma determinada classe em direo s superclasses.
2. Como o mtodo M1 no existe na subclasse B, ele procurado nas
superclasses at ser encontrado na classe A.
3. Aps ser encontrado, ele executado e chama o mtodo M2. Quando
essa chamada ocorre, o compilador procura o mtodo M2 a partir do tipo
do objeto que executou a primeira chamada, ou seja, um objeto do tipo B.
4. A procura do mtodo M2 inicia-se a partir da classe B, onde j encontrado
e chamado.
5. O conceito de polimorfismo a ordem em que os mtodos so montados
para sua chamada, da subclasse para a superclasse at ser encontrado.
Na linguagem Java todos os mtodos so virtuais, portanto suportam
polimorfismo, bastando ser redeclarados nas subclasses. Em C++ isso no ocorre,
a superclasse deve permitir que determinado mtodo seja reescrito nas subclasses.

O que so Construtores e Destrutores?


Construtores so mtodos especiais chamados no processo de instanciao
de um objeto no sistema. A execuo de tais mtodos garante a inicializao dos
identificadores de forma correta. Todo construtor tem o mesmo nome da classe.
O exemplo a seguir apresenta dois construtores, um que no recebe parmetro
algum e outro que recebe o nome de um cliente:

// declarao inicial da classe ciente


public class cliente
{
// atributos da classe cliente
private String nome;
private String endereco;

26

Captulo 1: Programao Orientada a Objetos

// construtores
public cliente()
{
nome = "";
endereco = "";
}
public cliente(String novo_nome)
{
nome = novo_nome;
endereco = "";
}

// mtodos da classe cliente


public void setNome (String novo_nome)
{
nome = novo_nome;
}
public void setEndereco (String novo_endereco)
{
endereco = novo_endereco;
}
public String getNome()
{
return nome;
}
public String getEndereco()
{
return endereco;
}
} // fim da declarao da classe Cliente
Todo construtor recebe o mesmo nome da classe. No exemplo anterior
existem dois construtores sobrecarregados, um que no recebe nenhum parmetro
e outro que recebe uma string novo_nome. Portanto a criao de um objeto da classe
cliente pode ser feita de duas formas, pois existem dois construtores:
Primeira Forma

// utilizando o construtor sem parmetros que inicia o objeto do tipo cliente.


// executado o cdigo contido nesse construtor
cliente c1 = new cliente();

27

Captulo 1: Programao Orientada a Objetos


Segunda Forma

// utilizando o construtor que recebe como parmetro uma string que identifica
// o nome do cliente. executado o cdigo contido nesse construtor
cliente c2 = new cliente("o cliente");
O construtor chamado somente durante o processo de instanciao do
objeto. Nos construtores so definidos comportamentos de iniciao do objeto.
Quando um objeto, por exemplo, do tipo Cliente instanciado, espera-se que o
comportamento inicial do cliente seja satisfeito pelos construtores. Quais tipos de
comportamento so esperados na instanciao de um cliente? Existem parmetros
como nome do cliente, endereo, cidade, estado etc. Por meio dessa anlise de
comportamento so implementados os construtores.
Destrutores so mtodos especiais chamados na finalizao do objeto.
Quando as posies de memria que um objeto ocupa devem ser liberadas, o
destrutor chamado. Na linguagem C++, todo destrutor tem o nome da classe
precedido por ~ (til).
Observe o exemplo em C++ a seguir:

// declarao da classe em C++


class Vetor2D
{
// atributos
float x, y;
public:
// construtor
Vetor2D(Vetor2D v2);
// destrutor
~Vetor2D();
// mtodos
void EscreveVideo(char texto[]);
Vetor2D operator+ (Vetor2D v2);
} // fim da classe Vetor2D

28

Captulo 1: Programao Orientada a Objetos


Quando um objeto do tipo Vetor2D estiver sendo removido da memria, o
destrutor chamado e nele deve haver chamadas que liberem a memria que est
sendo utilizada pelo objeto.
Quando uma instncia criada utilizando a palavra new, ela alocada na memria
heap. As demais instncias, tais como int, long entre outras, so alocadas na stack
(pilha do sistema). A stack liberada automaticamente quando um programa ou
objeto morre, entretanto a memria heap no liberada automaticamente. Portanto,
deve-se liberar a memria que foi alocada na heap utilizando a chamada delete sobre
as instncias que foram declaradas com o uso da palavra reservada new. Por exemplo:

// para instanciar
cliente c1 = new cliente();
// para liberar a memria heap
delete c1;

Figura 1.9 A memria heap e stack.


Portanto, o objetivo do destrutor liberar a memria heap, alocada usando
new, que no liberada automaticamente. A stack liberada automaticamente.

29

Você também pode gostar