Você está na página 1de 47

Conceito de classe, caractersticas (atributos), Aes (mtodos) e construtores

Na Programao Orientada a Objetos (POO) um projeto de sistema no est centrado na identificao de procedimentos, como na programao estruturada, mas sim na identificao de objetos. A partir da identificao dos elementos do mundo real, envolvidos com o problema, que so realizadas as demais tarefas. Trs das principais atividades envolvidas em um projeto orientado a objetos so as seguintes: 1. Identificao dos objetos envolvidos com o sistema a ser desenvolvido e sua representao em forma de classes; Identificao de suas caractersticas relevantes e sua representao em forma de atributos; Identificao de aes (comportamentos) realizadas por esses objetos e sua representao em forma de mtodos.

2. 3.

Para compreender a POO preciso analisar o significado de diversos elementos. Inicialmente, deve-se compreender o significado de objetos e classes. Mas, para compreend-los, tambm ser necessrio analisar o conceito de atributos e de mtodos.

Objeto Objeto qualquer entidade do mundo real que apresente algum significado, mesmo que tal entidade no se constitua em algo concreto. Exemplos de objetos do mundo real: Uma mesa, uma cadeira, um gato, um cachorro, um computador, uma caneta, um disquete, um caderno, um carro, um avio, o Sol, a lua, uma estrela, uma nuvem, um pssaro, uma rvore e etc. Todo objeto possui algumas caractersticas prprias, tambm chamadas de atributos. Esses atributos so as qualidades que permitem distinguir um objeto de outros objetos semelhantes. Por exemplo: possvel distinguir um cachorro dos outros em funo de vrios atributos: cor, raa, altura, comprimento, peso e etc. Do mesmo modo, possvel distinguir um carro dos outros em funo de um conjunto de atributos: marca, modelo, ano, cor, placa, chassi e etc.

Pode haver dois ou mais objetos que possuam alguns atributos com os mesmos valores. Entretanto, em funo de sua prpria natureza, os valores de alguns outros atributos so nicos e no se repetem entre os diversos objetos semelhantes. Por exemplo: Existe uma infinidade de carros cuja cor vermelha, mas no pode haver dois carros com a mesma placa ou chassi. Alm de possuir atributos, os objetos tambm manifestam um comportamento. O comportamento dos objetos diz respeito s aes que eles podem realizar. O cachorro pode correr, pular, latir e etc. O computador pode ligarse, desligar-se, processar dados, exibir informaes no vdeo, imprimir textos, emitir sons e etc.

Classe Na POO, o mais importante no a identificao dos objetos existentes no mundo real. O que realmente importa a identificao de grupos de objetos com atributos e comportamentos comuns. Ter atributos e comportamentos comuns no significa serem iguais. Apesar de todos os cachorros possurem uma cor, raa, altura, comprimento e peso, dois cachorros podem ser bem diferentes por possurem diferentes valores em cada um desses atributos. Um deles pode ser preto e o outro branco, um pode ter 90cm de altura e o outro ter apenas 70cm e assim por diante. Quando um conjunto de objetos possui atributos e comportamentos comuns, significa que eles pertencem a uma mesma categoria. Se Joo e Maria so dois clientes de uma empresa, pode-se dizer que, apesar de eles serem pessoas distintas, pertencem a uma mesma categoria: a dos clientes. O termo classe utilizado para significar o mesmo que categoria. Ao invs de dizer que Joo e Maria pertencem categoria dos clientes, pode-se dizer que eles pertencem classe dos clientes. Uma classe representa um grupo de objetos com caractersticas e comportamentos comuns e compem-se, basicamente, de atributos e mtodos. Os atributos representam as caractersticas dos objetos, e os mtodos representam as aes ou comportamentos que eles podem realizar.

Diferena entre Classe, Objeto e o instanciamento a partir do construtor


Objeto: a instncia de uma classe. Ou seja, uma varivel do tipo de dado definido pela classe. Possuem caractersticas (atributos) comportamentos (mtodos). Objetos do mundo real possuem caractersticas e comportamentos. J objetos de software armazenam suas caractersticas em atributos (variveis) e implementam seus comportamentos em mtodos Exemplo: Pessoa joao = new Pessoa(); joao.idade = 30; joao.andar(); Joo uma varivel (objeto) do tipo da classe Pessoa. Idade um atributo (caracterstica) do objeto Joo. Andar um mtodo (comportamento) do objeto Joo.

Classe: Representa a abstrao de uma entidade (objeto) do mundo real. A Classe define as caractersticas e os comportamentos desta entidade (objeto) do mundo real. As caractersticas so os atributos e os comportamentos so os mtodos. A classe estabelece o formato dos objetos, portanto define um tipo de dado. a representao de um conjunto de objetos que compartilham as mesmas caractersticas e comportamentos. Exemplo:
public class Pessoa{ String nome; int idade; String endereco; public void andar(){ } public void informarIdade(){ } }

Joo e Maria so objetos da compartilham os mesmos atributos mtodos (comportamentos).

classe Pessoa, pois (caractersticas) e

Instanciao Instanciar uma classe significa criar um novo objeto a partir dela prpria. Do mesmo modo que toda varivel de determinado tipo primitivo, todo objeto pertence a uma classe. Assim como uma varivel precisa ser declarada e iniciada, todo objeto precisa ser declarado e instanciado. A declarao de um objeto muito parecida com a declarao de uma varivel, mas o tipo do objeto ser sempre uma classe ao invs de um tipo primitivo. Sintaxe para declarao de um objeto: <Classe> <nomeDoObjeto>; Exemplo para declarao de objeto: String str; Depois de declarado, todo objeto precisa ser instanciado. A instanciao de um objeto consiste, basicamente, na alocao de um espao na memria para que ele possa ser representado. Sintaxe para instanciar um objeto: <nomeDoObjeto> = new <construtor>([argumentos]);

Mtodo Construtor O responsvel pela instanciao de um objeto sempre ser um mtodo construtor disponvel em sua classe. Todo construtor possui o mesmo nome da classe a que se refere e h um construtor padro na maioria das classes que dispensa o uso de argumentos. Toda classe tem, pelo menos, um construtor que o compilador adiciona, quando nenhum for declarado (construtor default). A instanciao feita atravs de uma operao de atribuio em que o objeto recebe o espao na memria que lhe for reservado pelo construtor. O operador new sempre preceder o construtor utilizado nessa operao. Caso seja utilizado o construtor padro (default), o nome do construtor ser seguido de um par de parnteses sem nada dentro, uma vez que ele no exige nenhum argumento.

Exemplo para instanciar um objeto: Str = new String(); Alm disso, tambm possvel declarar e instanciar um objeto em uma nica instruo. Veja a sintaxe abaixo:
<Classe> <nomeDoObjeto> = new <construtor>([argumentos]);

Veja o exemplo: String str = new String();

Alm de exercerem um papel essencial no processo de instanciao de classes, os construtores tambm so utilizados para iniciar os atributos com valores padro ou com valores informados. Os construtores so mtodos especiais que so invocados em conjunto com o operador new para reservar espao na memria do computador a ser ocupado por um novo objeto. Algumas classes possuem um construtor padro que eficaz para a criao de objetos. Entretanto, possvel substituir esse construtor padro por outro diferente, definindo-se parmetros e adicionando-se quaisquer tipos de instrues que deseje que sejam executadas sempre que um novo objeto for criado. Sintaxe para a criao de um mtodo construtor: public <nome> ([<parmetros>]){ } A sintaxe para implementao de um construtor se assemelha de um mtodo qualquer. No entanto, em uma anlise mais detalhada, possvel identificar importantes distines. Alm de iniciar com a diretiva de encapsulamento "public" ou default, os construtores no possuem um tipo de retorno e tampouco podem ser precedidos de quaisquer outros tipos de qualificadores. Desse modo, a sua sintaxe muito mais simples que a sintaxe aplicada implementao de um mtodo. Outra caracterstica peculiar do construtor que seu nome deve sempre ser idntico ao nome da classe. Desse modo, dificilmente haver dificuldades em distinguir os construtores dos mtodos. Se o nome for idntico ao da classe, ento se trata de um construtor. Alm disso, se o nome for precedido por um tipo ou por um qualificador

qualquer (static, final ou abstract), ento se trata de um mtodo. H dois procedimentos bsicos a serem compreendidos para se trabalhar com construtores. O primeiro diz respeito substituio do construtor padro por um construtor alternativo e o segundo faz a incluso de um construtor alternativo sem que seja eliminado o construtor padro. O exemplo abaixo faz uso de um construtor alternativo, o qual substitui o construtor padro. Primeiramente devemos criar a classe Pessoa:
public class Pessoa{ String nome = null; int idade = 0; String endereco = null; public Pessoa (String n, int i, String e){ nome = n; idade = i; endereco = e; } }

Agora vamos criar a classe TestePessoa que ir criar um objeto da classe Pessoa.
public class TestePessoa { public static void main(String[] args) { String nome = "Joao"; int idade = 30; String endereco = "Av Paulista 900"; Pessoa joao = new Pessoa(nome, idade, endereco); System.out.println(joao.nome); System.out.println(joao.idade); System.out.println(joao.endereco); } }

OBS: Note que a classe Pessoa possui apenas o construtor alternativo, o qual possui trs parmetros. A classe TestePessoa cria um novo objeto da classe Pessoa (joao) utilizando este construtor alternativo. A sada gerada pela execuo da classe TestePessoa a seguinte: Joao 30 Av Paulista 900

Vamos analisar agora um segundo exemplo que faz a incluso de um construtor alternativo sem que seja eliminado o construtor padro. Neste caso a classe Pessoa ir possuir dois construtores.
public class Pessoa{ String nome = null; int idade = 0; String endereco = null; public Pessoa(){ } public Pessoa (String n, int i, String e){ nome = n; idade = i; endereco = e; } }

Agora vamos criar a classe TestePessoa que ir criar dois objetos da classe Pessoa.
public class TestePessoa { public static void main(String[] args) { String nome = "Joao"; int idade = 30; String endereco = "Av Paulista 900"; Pessoa joao = new Pessoa(nome, idade, endereco); System.out.println(joao.nome); System.out.println(joao.idade); System.out.println(joao.endereco); Pessoa maria = new Pessoa(); System.out.println(maria.nome); System.out.println(maria.idade); System.out.println(maria.endereco); } }

OBS: Note que a classe Pessoa possui dois construtores: O primeiro o padro (default) e o segundo o alternativo, o qual possui trs parmetros. A classe TestePessoa cria um novo objeto da classe Pessoa (joao) utilizando o construtor alternativo e em seguida cria um outro objeto da classe Pessoa (maria), porm desta vez utilizando o construtor padro (default).

A sada gerada pela execuo da classe TestePessoa a seguinte: Joao 30 Av Paulista 900 null 0 null

Modificadores de Acesso de Visibilidade


Os modificadores de acesso visam controlar a acessibilidade dos elementos que compem a classe. Conseqentemente, podemos definir que apenas os mtodos podem ser chamados, restringindo o acesso direto aos atributos. Modificador public Quando utilizamos este modificador em atributos, mtodos ou classes o compilador compreende que o atributo, mtodo ou classe pode ser acessado diretamente por qualquer outra classe.

Modificador private Ao utilizarmos este modificador em atributos ou mtodos implica que, para o compilador, estes elementos no podem ser acessados diretamente por qualquer outra classe, exceto por ela mesma. O modificador private no aplicvel para classes.

Modificador protected As restries impostas por esse tipo de modificador de acesso representam um nvel intermedirio entre o pblico e o privado. Com este modificador os atributos e mtodos so acessveis somente na prpria classe, em classes especializadas e em classes do mesmo pacote. O modificador protected no aplicvel para classes.

Modificador default O modificador default utilizado quando no se especifica nenhum outro modificador, ou seja, quando no especificado nenhum modificador, o atributo, mtodo ou classe esto acessveis apenas no mesmo pacote.

Encapsulamento de atributos
Vamos imaginar que temos uma classe chamada Data com os seguintes atributos: ano, mes e dia. Um usurio desatento poderia atribuir ao atributo ano um valor negativo, um ms igual a 20 ou um dia igual a 53. Todos este valores no so permitidos pois, um ano nunca poderia ser negativo, um ms nunca poderia ser maior do que 12 e um dia nunca poderia ser maior do que 31. Para uma implementao mais robusta destes atributos interessante que o acesso seja mais controlado, ou seja, realizado atravs de mtodos que permitam criar regras para atribuio e leitura. Esta prtica chamada encapsulamento. Vantagens encapsulamento: obtidas atravs da utilizao do

Validar valores a serem atribudos a cada atributo; Definir quais/quando alterados; os atributos podem ser

Fazer um log das modificaes dos atributos;

O encapsulamento de atributos pode utilizar mtodos padronizados. Contudo, quando existirem mtodos relacionados lgica de negcio, ou ainda, que facilitem a manipulao de atributos, podemos utilizar nomes que no sigam esta conveno. Os mtodos padro Getters e Setters. para encapsulamento so chamados

Getters So mtodos que permitem a leitura de atributos da classe, sendo uma boa prtica cria-los para cada atributo que desejarmos encapsular.

Exemplos: String getNome() long getCpf()

Setters So mtodos para modificar os valores dos atributos visando protege-los da escrita ou modificao indevida. possvel estabelecer certas normas e controles dentro dos mtodos Setters. Exemplos: void SetNome(String nome) void setCpf(long cpf)

Mtodos is So mtodos booleanos. Exemplos: boolean isConnected() boolean isMaiorDeIdade() utilizados para leitura de atributos

Vamos analisar o exemplo abaixo e a utilizao do encapsulamento dos atributos.


public class Data{ private int ano; private byte mes; private byte dia; public int getAno() { return ano; } public void setAno(int a) { if (a > 0){ ano = a; } else System.out.println("Ano invalido"); } public byte getDia() { return dia; } public void setDia(byte d) { if (d > 0 && d <= 31){ dia = d; }

10

else System.out.println("Dia invalido"); } public byte getMes() { return mes; } public void ajustarMes(byte m) { if (m > 0 && m <= 12){ mes = m; } else System.out.println("Mes invalido"); } public boolean isAnoBissexto(){ if (((ano % 4 == 0) && (ano % 100 != 0)) || (ano % 400 == 0)) return true; else return false; } }

Podemos observar pela classe acima que ao invs de modificar os atributos diretamente, devemos faz-lo atravs dos mtodos de acesso aos atributos. Os mtodos setAno, setDia e ajustarMes alteram os valores dos atributos ano, dia e mes respectivamente. Cada mtodo faz validaes antes de realizar a atribuio propriamente dita, isto impede que valores incorretos sejam atribudos aos atributos. O nome dos mtodos no precisa comear necessariamente com a palavra "set", voc pode implementar um mtodo com qualquer outro nome. Como exemplo disto, foi criado o mtodo "ajustarMes", porm o mesmo poderia se chamar "setMes" tambm.

Modificadores finais

de

Acesso

Membros

estticos

Modificador static Atributos: Quando temos um atributo esttico dentro de uma classe, este atributo ser nico para todos os objetos instanciados a partir desta classe. Os atributos estticos podem ser acessados diretamente a partir da classe e so alocados na memria na primeira vez que forem referenciados. Portanto, no preciso criar uma instncia (objeto) da classe.

11

Atributos estticos devem ser utilizados quando for necessrio compartilhar um valor entre todas as instncias da classe. Desta forma, a varivel ser alocada apenas uma vez na memria. Vejamos o exemplo da classe Pessoa (abaixo), que contm os seguintes atributos: Nome: Caracterstica especfica de Pessoa, logo, uma caracterstica de cada instncia; Telefone: Cada Pessoa tem seu telefone, que uma caracterstica da instncia; cada

prprio

Sexo: Assinala-se o sexo de cada Pessoa com um int (1 ou 2) por exemplo. No intuito de padronizar conveniente definir duas constantes: MASCULINO e FEMININO do tipo int.
public class Pessoa{ private String nome; private String telefone; int sexo; public static int MASCULINO = 1; public static int FEMININO = 2; public void setSexo(int s){ sexo = s; } }

Veja abaixo a classe TestePessoa:


public class TestePessoa { public static void main(String[] args) { Pessoa joao = new Pessoa(); joao.setSexo(Pessoa.MASCULINO); } }

Foram criadas duas constantes para o sexo (MASCULINO e FEMININO) na classe Pessoa. Estas constantes so estticas e, portanto podem ser utilizadas sem a necessidade de criar um objeto da classe. Veja na classe TestePessoa que estamos acessando o atributo esttico MASCULINO pela classe (Pessoa.MASCULINO) e no pela instncia da classe. Devemos tomar cuidado quando utilizamos estticos, pois eles so compartilhados por instncias da classe. atributos todas as

12

Veja o exemplo abaixo:


public class Carro { public static String placa = "ABD-1563"; public static void main(String[] args) { Carro carro1 = new Carro(); Carro carro2 = new Carro(); System.out.println("Carro.placa: " + Carro.placa); System.out.println("carro1.placa: " + carro1.placa); System.out.println("carro2.placa: " + carro2.placa); System.out.println("Alterando a placa do carro 1"); carro1.placa = "DBX-4034"; System.out.println("carro1.placa: " + carro1.placa); System.out.println("carro2.placa: " + carro2.placa); System.out.println("Carro.placa: " + Carro.placa); } }

Veja abaixo a sada gerada pela execuo do programa acima: Carro.placa: ABD-1563 carro1.placa: ABD-1563 carro2.placa: ABD-1563 Alterando a placa do carro 1 carro1.placa: DBX-4034 carro2.placa: DBX-4034 Carro.placa: DBX-4034 O que aconteceu? Perceba que a placa a mesma para todos os objetos da classe Carro. Quando mudamos o valor da placa para qualquer uma das instncias da classe Carro, todas as demais so afetadas porque o atributo placa esttico e compartilhado por todas as instncias da classe.

Mtodos: Os mtodos estticos so aqueles que realizam tarefas que no dependem das caractersticas especficas de cada objeto. Para a execuo da tarefa que se destinam, eles utilizam somente as informaes contidas em seus prprios parmetros e informaes contidas em atributos estticos. A vantagem de um mtodo esttico em relao aos demais que ele pode ser invocado a partir da prpria classe, sem a necessidade de instanci-la.

13

Como exemplo de mtodos estticos podemos citar os mtodos parseXXX das classes Wrapper, pois estes mtodos so utilizados sem a necessidade de criar uma instncia da classe. Veja o exemplo abaixo:
public class Exemplo005 { public static void main(String[] args) { String str = "130"; int num = Integer.parseInt(str); } }

Note que o mtodo parseInt da classe Integer foi invocado sem a necessidade da criao da instncia da classe Integer. Portanto este um mtodo esttico. Um outro exemplo de mtodo esttico o mtodo main, pois o mesmo chamado pela JVM sem a criao da instncia da classe.

Classes: O modificador static no aplicvel para classes.

Modificador final Atributos: Quando o modificador final utilizado em atributos, significa que somente uma atribuio poder ser feita ao atributo, podendo ser feita na declarao ou no construtor. Em outras palavras, quando queremos declarar um atributo constante devemos utilizar o modificador final. Veja o exemplo abaixo:
public class TesteFinal { private final int num = 350; public static void main(String[] args) { TesteFinal tf = new TesteFinal (); tf.num = 100; } }

14

Quando compilamos a classe seguinte erro de compilao:

TesteFinal

obtemos

cannot assign a value to final variable num Isto quer dizer que no podemos atribuir um novo valor (100) ao atributo final "num", pois o mesmo j tinha sido iniciado com o valor 350.

Mtodos: Podemos utilizar declarao de um mtodo para sobrescrito em classes filhas. o modificador final na que este no possa ser

OBS: Sobrescrita de mtodos ser visto mais adiante.

Classes: O modificador final pode ser utilizado na declarao de classes, indicando que no poder ser estendida por outra, ou seja, no poder ser herdada. OBS: Herana ser visto mais adiante.

Relacionamento Entre Classes


Uma das formas mais simples de relacionamento entre classes a associao, que ocorre quando temos uma classe que possui um atributo de outra classe (objetos ou array de objetos). Cardinalidade / Multiplicidade Alguns valores que podem ser utilizados para definir a multiplicidade de um dos lados do relacionamento so: 1 0..1 1..* 0..* * Obrigatoriamente 1 Zero ou um Um ou mais Zero ou mais Zero ou mais

OBS: Quando no definimos valores para a cardinalidade fica implcito que o valor da associao 1.

15

Exemplo de associao 1 para 1 O exemplo abaixo pode ser lido da seguinte forma: Uma Pessoa tem um Endereo e o Endereo pertence a uma Pessoa.

Pessoa

tem

Endereo

Atravs do diagrama apresentado, podemos assumir que a classe Pessoa tem um atributo do tipo Endereo, e a classe Endereo tem um atributo do tipo Pessoa.

Exemplo de associao 1 para muitos Podemos assumir a partir do seguinte diagrama que uma Empresa pode ter um ou mais Departamentos, e cada Departamento pertence a apenas uma Empresa. Empresa tem 1..* A partir do diagrama acima podemos assumir que na implementao, a classe Empresa deve ter uma coletividade de departamentos. Veja o exemplo abaixo: Empresa.java
public class Empresa{ private Departamento[] departamentos; }

Departamento

Departamento.java
public class Departamento{ Private Empresa empresa; }

Exemplo de associao muitos para muitos O relacionamento muitos para muitos apresentado a seguir pode ser entendido da seguinte forma: Um funcionrio trabalha para um ou mais departamentos, e um departamento emprega uma ou mais pessoas, ou seja, no temos um Funcionrio que no trabalha para nenhum departamento, 16

assim como no temos um departamento que no emprega nenhum funcionrio. Funcionrio 1..* Funcionario.java
public class Funcionario{ private Departamento[] departamentos; }

Departamento 1..*

Departamento.java
public class Departamento{ Private Funcionario[] funcionarios; }

Classe Calendar
A classe Calendar uma classe abstrata que prov mtodos para converso entre um instante especfico no tempo e um conjunto de atributos tais como ano (YEAR), ms (MONTH), dia (DAY), hora (HOUR) e assim por diante. A classe Calendar possui um mtodo chamado "getInstace", que utilizado para gerar um objeto (instncia) da classe. O mtodo getInstance da classe Calendar retorna um objeto Calendar cujos atributos so iniciados com a data e hora atual. Exemplo: Calendar agora = Calendar.getInstance(); OBS: No possvel gerar um objeto da classe Calendar por meio do operador new. Obtendo e ajustando valores para os atributos da classe Calendar: public int get(int field) O mtodo get utilizado para obter o valor presente (atual) do atributo passado como parmetro. Exemplo: c.get(Calendar.YEAR); // Este comando retorna o ano que est presente no atributo YEAR da classe calendar.

17

public void set(int field, int value) O mtodo set utilizado para alterar o valor presente (atual) do atributo passado como parmetro para o valor passado como parmetro. Exemplo: c.set(Calendar.YEAR, 1990); // Este comando altera o valor do atributo ano (YEAR) para 1990. Veja o exemplo abaixo:
import java.util.Calendar; public class TesteCalendar { public static void main (String args[]){ //obtem a instancia Calendar c = Calendar.getInstance(); //mtodos getters para obter: ano, mes, dia, hora, minuto e segundo //retorna o ano System.out.println(c.get(Calendar.YEAR));
//retorna o ms. Janeiro o primeiro ms, o qual possui ndice zero

System.out.println(c.get(Calendar.MONTH)+1); //retorna o dia do ms. O primeiro dia 1. System.out.println(c.get(Calendar.DAY_OF_MONTH)); //retorna a hora em um ciclo de 12 horas. //Exemplo: 10 horas (no se sabe se manh ou tarde) System.out.println(c.get(Calendar.HOUR)); //retorna a hora em um ciclo de 24 horas. //Exemplo: 22:00 (dez horas da noite) System.out.println(c.get(Calendar.HOUR_OF_DAY)); //retorna minuto System.out.println(c.get(Calendar.MINUTE)); //retorna segundo System.out.println(c.get(Calendar.SECOND)); //metodos setters para modificar: ano, ms, dia, hora minuto e segundo //altera o ano para 1990 c.set(Calendar.YEAR, 1990); //altera o ms para Dezembro c.set(Calendar.MONTH, 11); //altera o dia para 25 c.set(Calendar.DAY_OF_MONTH, 25); //altera a hora para onze da noite c.set(Calendar.HOUR_OF_DAY, 23); //altera o minuto para zero c.set(Calendar.MINUTE, 0); //altera o segundo para zero c.set(Calendar.SECOND, 0); System.out.println(c.get(Calendar.YEAR)); System.out.println(c.get(Calendar.MONTH)+1); System.out.println(c.get(Calendar.DAY_OF_MONTH)); System.out.println(c.get(Calendar.HOUR)); System.out.println(c.get(Calendar.HOUR_OF_DAY)); System.out.println(c.get(Calendar.MINUTE)); System.out.println(c.get(Calendar.SECOND)); } }

18

Herana
Herana o mecanismo que possibilita a definio de novas classes a partir de uma j existente, como forma de reutilizar seus atributos e mtodos. Isso possvel mesmo quando no se tem acesso ao cdigo fonte da superclasse. A aplicao do mecanismo de herana sempre envolve dois elementos: uma superclasse e uma subclasse. A superclasse, tambm conhecida como classe ancestral, aquela que representa as caractersticas genricas de um conjunto de objetos. A subclasse, tambm conhecida como classe descendente, aquela que estende a superclasse para incluir a representao de caractersticas especficas de um subconjunto desses objetos. Vale destacar que as classes que contenham o qualificador final no podem ser estendidas. Isso significa que no se pode utiliz-las como superclasse em uma operao de especializao porque o qualificador final indica exatamente que elas no podem conter subclasses.

A Declarao extends O termo extends utilizado na declarao de uma classe para especificar quem sua superclasse. Caso ele seja omitido, como se fez em todos os exemplos anteriores, a classe Object ser assumida como a superclasse da nova classe. Ou seja, quando a palavra chave extends for omitida, o compilador ir adicionar automaticamente a palavra extends e a classe java.lang.Object como superclasse da classe atual. A classe Object chamada de superclasse de todas as classes, pois todas so derivadas dela. A declarao extends figura depois do nome da nova classe. Observe a sintaxe:
[public] [abstract | final] class <subclasse> extends <superclasse>

Veja o exemplo abaixo:


public class PessoaFisica extends ClienteBanco{ }

19

Note que a nica novidade comparativamente aquela adotada termo "extends" aps o nome seguido do nome da superclasse, ClienteBanco.

desta forma de declarao, at aqui, a presena do da classe (PessoaFisica) que neste caso, a classe

Suponha que a classe anterior tenha sido declarada da seguinte forma:


public class PessoaFisica{ }

Observe que a declarao extends foi omitida. Nesse caso, a classe PessoaFisica ter como superclasse a classe Object, uma vez que toda e qualquer classe implementada em Java vinculada, explicitamente ou implicitamente, hierarquia de classes de sua API. Como a classe Object aquela que se encontra no topo dessa hierarquia, ela assumida como a superclasse de todas as novas classes que no contenham a declarao extends para indicar, explicitamente, a sua superclasse. Java no possui herana mltipla, ou seja, uma classe no pode herdar atributos e mtodos diretamente de mais de uma classe A Referncia this Cada objeto que instanciado a partir de uma classe Java mantm uma cpia prpria dos atributos para que os valores neles armazenados no se confundam com os valores dos demais. No entanto, somente uma cpia de cada mtodo mantida para cada classe. Isso significa que, quando um objeto invoca um de seus mtodos, ele est executando a nica cpia desse mtodo, que compartilhada com todos os demais objetos dessa mesma classe. A referncia this um valor especial atravs do qual possvel referir-se ao objeto corrente de uma classe dentro de quaisquer mtodos da mesma. atravs dessa referncia que possvel identificar o objeto especfico que invocou determinado mtodo. Quando uma classe possui algum atributo cujo nome coincide com o nome de um parmetro de um mtodo, a referncia this torna-se especialmente importante. somente atravs dela que possvel referir-se ao atributo da classe dentro do mtodo que contm um parmetro cujo nome coincida com o seu.

20

Para fazer referncia a um atributo ou a um mtodo do objeto corrente dentro de quaisquer mtodos, basta utilizar a referncia this seguida do operador ponto e do nome do atributo ou do mtodo. Veja a sintaxe: this.<atributo> this.<mtodo> Suponha a classe Amigo, contendo um atributo chamado "nome" e um mtodo chamado setNome(). Se o mtodo setNome() possuir um parmetro chamado "nome", a nica forma de voc se referir ao atributo "nome" dessa classe dentro desse mtodo utilizando a referncia this, como segue:
public class Amigo{ private String nome; public void setNome(String nome){ this.nome = nome; } }

A referncia this tambm til em classes onde h mais que um construtor. Nesse caso, interessante que um construtor faa uso da tarefa que j est sendo realizada por outro. Isso tambm possvel com o uso da referncia this. Veja um exemplo:
public class Amigo{ private String nome; private String fone; public Amigo(){ this(new String(""), new String("")); } public Amigo(String nome, String fone){ this.nome = nome; this.fone = fone; } }

Neste caso, a referncia this foi utilizada, dentro do construtor padro, para invocar o segundo construtor, utilizando como argumentos dois textos vazios. Esses dois argumentos sero atribudos, pelo segundo construtor, aos atributos nome e fone.

21

A Referncia super Enquanto a referncia this permite que o objeto corrente seja identificado e que seus atributos e mtodos sejam referenciados em seus prprios mtodos, a referncia super possibilita que atributos e mtodos da superclasse sejam referenciados pelos mtodos da subclasse. Para referir-se a um atributo ou a um mtodo da superclasse em um mtodo de uma subclasse, basta utilizar a referncia super seguida do operador ponto e do nome do atributo ou do nome do mtodo. Observe a sintaxe: super.<atributo> super.<mtodo> Caso queira referir-se a um construtor da superclasse, a sintaxe diferente. Nesse caso, deve ser utilizada a referncia super seguida de um par de parnteses. Veja como seria invocado o construtor da superclasse, que no contenha parmetros. super(); importante lembrar que a superclasse pode conter diversos construtores alternativos. Caso o construtor que deseja invocar contenha parmetros, voc deve informar um valor para cada um deles entre os parnteses.

Exemplo de herana Vamos observar o exemplo abaixo para entender melhor o conceito de herana. Este exemplo compe-se de trs classes: Fornecedor, FornecedorPessoa, FornecedorEmpresa. Observe que h setas que partem das classes FornecedorPessoa e FornecedorEmpresa em direo classe Fornecedor, indicando a direo da operao de especializao que est sendo realizada. Nessa operao, a classe Fornecedor a superclasse e as outras duas classes so as subclasses.

22

Fornecedor - nome: String - fone: String + Fornecedor() + Fornecedor(nome: String, fone: String) + setNome(nome: String) :void + setFone(fone: String) :void + getNome() :String + getFone() :String + main(args: String[]) :void

FornecedorPessoa - RG: String - CPF: String + FornecedorPessoa() + FornecedorPessoa(nome: String, fone: String, RG: String, CPF: String) + setRG(RG: String) :void + setCPF(CPF: String) :void + getRG() :String + getCPF() :String

FornecedorEmpresa - IE: String - CNPJ: String + FornecedorEmpresa() + FornecedorEmpresa(nome: String, fone: String, IE: String, CNPJ: String) + setIE(IE: String) :void + setCNPJ(CNPJ: String) :void + getIE() :String + getCNPJ() :String

A classe Fornecedor representa duas caractersticas comuns a todos os fornecedores (nome e fone), a classe FornecedorPessoa adiciona duas caractersticas especficas que somente aqueles fornecedores que so pessoas fsicas possuem (RG e CPF) e a classe FornecedorEmpresa adiciona duas caractersticas especficas de fornecedores que so pessoas jurdicas (Inscrio Estadual e CNPJ). Veja na Fornecedor. prxima pgina a implementao da classe

23

public class Fornecedor{ private String nome; private String fone; public Fornecedor(){ this ("", ""); } public Fornecedor(String nome, String fone){ this.nome = nome; this.fone = fone; } public void setNome(String nome){ this.nome = nome; } public void setFone (String fone){ this.fone = fone; } public String getNome(){ return nome; } public String getFone(){ return fone; } public static void main (String args[]){ FornecedorPessoa carlos = new FornecedorPessoa(); FornecedorEmpresa gtaLtda = new FornecedorEmpresa(); carlos.setNome("Carlos"); carlos.setFone("2345-6789"); carlos.setRG("26.832.821-5"); carlos.setCPF("237.235.385-32"); gtaLtda.setNome("Gta transportes LTDA"); gtaLtda.setFone("2543-3675"); gtaLtda.setIE("23.2582.214"); gtaLtda.setCNPJ("36.254.321/0001-52"); System.out.println("Nome da Pessoa: " + carlos.getNome()); System.out.println("Nome da Empresa: " + gtaLtda.getNome()); } }

Observe no mtodo main acima que o objeto "carlos" e o objeto "gtaLtda" so do tipo FornecedorPessoa e FornecedorEmpresa respectivamente e que ambos esto utilizando os mtodos setNome(), setFone() e getNome(), porm as classes FornecedorPessoa e FornecedorEmpresa no possuem estes mtodos. Devemos lembrar que os mtodos citados acima so herdados da superclasse (Fornecedor), e devido a isto os objetos tm acesso a estes mtodos. 24

Abaixo a implementao da classe FornecedorPessoa.

public class FornecedorPessoa extends Fornecedor{ private String RG; private String CPF; public FornecedorPessoa(){ this("", "", "", ""); } public FornecedorPessoa(String nome, String fone, String RG, String CPF){ super(nome, fone); this.RG = RG; this.CPF = CPF; } public void setRG(String RG){ this.RG = RG; } public void setCPF (String CPF){ this.CPF = CPF; } public String getRG(){ return RG; } public String getCPF(){ return CPF; } }

25

Abaixo a implementao da classe FornecedorEmpresa.


public class FornecedorEmpresa extends Fornecedor{ private String IE; private String CNPJ; public FornecedorEmpresa(){ this("", "", "", ""); } public FornecedorEmpresa(String nome, String fone, String IE, String CNPJ){ super(nome, fone); this.IE = IE; this.CNPJ = CNPJ; } public void setIE(String IE){ this.IE = IE; } public void setCNPJ (String CNPJ){ this.CNPJ = CNPJ; } public String getIE(){ return IE; } public String getCNPJ(){ return CNPJ; } }

Sobrescrita e Sobrecarga de mtodos e construtores


Sobrecarga A sobrecarga (overload em ingls) a implementao, em uma mesma classe ou em classes ligadas pelo mecanismo de herana, de duas ou mais verses para um mesmo mtodo, de modo que manifestem comportamentos distintos. Nesse caso, o que os distinguir sua assinatura, ou seja, seu conjunto de parmetros. Sobrecarregar um mtodo escrever mtodos com nomes iguais, porm, com quantidade e tipos de parmetros de entrada diferentes. No possvel implementar um mtodo duas vezes com os mesmos tipos e quantidades de parmetros. Tambm possvel realizar a sobrecarga construtores. Para isto basta definir mais do que construtor seguindo as mesmas regras da sobrecarga mtodos. de um de

26

Veja abaixo um exemplo da sobrecarga de mtodos.


public class Calculadora{ public int soma (int a, int b){ return a + b; } public int soma (int a, int b, int c){ int resultado = this.soma(a, b) + c; return resultado; } public float soma (float a, float b){ return a + b; } public long soma (int[] numeros){ long resultado = 0; for (int cont = 0; cont < numeros.length; cont++){ retultado += numeros[cont]; } return resultado; } }

No exemplo acima foi feita a sobrecarga do mtodo soma. Note que existem quatros implementaes diferentes para o mtodo soma e que a assinatura diferente para cada mtodo. Veja abaixo um exemplo da sobrecarga de construtores
public class Pessoa{ private String nome; private String fone; public Pessoa(){ this ("", ""); } public Pessoa(String nome, String fone){ this.nome = nome; this.fone = fone; } }

Sobrescrita A sobrescrita (override em ingls) a implementao de mtodos em subclasses que possuem o mesmo nome e mesma assinatura de mtodos de sua superclasse, de tal forma que

27

anule o comportamento que ele apresentava em superclasse ou apenas acrescente novas instrues. As seguintes regras devem ser respeitadas sobrescrever um mtodo de uma superclasse:

sua

ao

O novo mtodo deve ter exatamente o mesmo nome daquele que queremos sobrescrever; O mtodo dever ter a mesma lista de parmetros (assinatura); O retorno do mtodo dever ser mtodo que estamos sobrescrevendo; o mesmo do

No podemos lanar Exceptions que no estejam declaradas no mtodo, ou seja, apenas a mesma Exception declarada na assinatura do mtodo ou que sejam subclasses daquela declarada; Um mtodo static no pode sobrescrever mtodo no static e vice-versa; Um mtodo no acesso mais sobrescrito; um

dever ter um modificador de restritivo que o mtodo

Veja abaixo um exemplo da sobrescrita de mtodos. SuperClasse.Java


public class SuperClasse{ public void metodoImprimir(){ System.out.println("SuperClasse - metodoImprimir"); } }

ClasseFilha.Java
public class ClasseFilha extends SuperClasse{ public void metodoImprimir(){
System.out.println("ClasseFilha -sobrescrita do metodoImprimir");

} }

O mtodo "metodoImprimir" da classe "ClasseFilha" est sobrescrevendo o mtodo de mesmo nome da classe "SuperClasse".

28

Sobrescrita do mtodo toString() A classe Object, como j descrito anteriormente, a classe pai de todas as classes da hierarquia de classes Java. Esta classe possui um mtodo chamado toString(), que tem como objetivo retornar uma representao em String do objeto em questo. Segundo o javadoc, recomendado que todas as subclasses sobrescrevam este mtodo. Caso este mtodo no seja sobrescrito e seja invocado pelo objeto, a seguinte string ser retornada: <nomeDaClasse>@hashCode Vejamos o exemplo abaixo:
public class Pessoa{ private String nome; private int idade; private String endereco; private String tel; public Pessoa (String nome, int idade, String endereco, String tel){ this.nome = nome; this.idade = idade; this.endereco = endereco; this.tel = tel; } public String toString(){ String str = this.nome + "\n" + idade + "\n" + this.endereco + "\n" + tel; return str; } public static void main (String args[]){ Pessoa p = new Pessoa("Leandro", 25, "Rua XV", "2586-3247"); String str = p.toString(); System.out.println(str + "\n"); System.out.println(p); } }

Note na classe Pessoa (acima) que a mesma sobrescreve o mtodo toString() da classe Object . O novo mtodo faz uma concatenao de todos os atributos da classe e retorna a string desta concatenao.

29

Observe no mtodo main que existem duas formas de invocar o mtodo toString(): A primeira chamando explicitamente o mtodo e a segunda chamando o mtodo println passando como parmetro o prprio objeto.

Veja abaixo a sada gerada pela execuo da classe Pessoa: Leandro 25 Rua XV 2586-3247 Leandro 25 Rua XV 2586-3247 Caso a classe Pessoa no sobrescrevesse o mtodo toString(), a sada gerada pela execuo da classe seria a seguinte: Pessoa@10b62c9 Pessoa@10b62c9

Polimorfismo
Polimorfismo uma significa muitas formas. palavra de origem grega que

Polimorfismo um mecanismo da POO que possibilita a sobrecarga de mtodos e construtores dentro de uma mesma classe ou sobrecarga de mtodos em subclasses e a sobrescrita de mtodos em subclasses. O polimorfismo ocorre quando um mesmo trecho de cdigo assume comportamentos diferenciados de acordo com o estado do objeto. Em outras palavras, quando subtipos herdam um comportamento de um supertipo, porm o executam de forma diferenciada.

30

Veja o exemplo abaixo: Bicho.java


public class Bicho{ public void fala(){ } }

Cachorro.java
public class Cachorro extends Bicho{ public void fala(){ System.out.println("Au au"); } }

Gato.java
public class Gato extends Bicho{ public void fala(){ System.out.println("Miau"); } }

TestePolimorfismo.java
public class TestePolimorfismo{ public static void main(String args[]){ Bicho b; if (args[0].equals("cachorro")){ b = new Cachorro(); } else{ b = new Gato(); } b.fala(); } }

O polimorfismo est no mtodo fala. Note que a classe Bicho a generalizao das classes Cachorro e Gato, logo todo cachorro um Bicho e todo Gato tambm um Bicho. Com isto possvel armazenar a instncia do objeto Cachorro ou Gato em uma varivel do tipo Bicho e com isto podemos realizar o polimorfismo atravs do mtodo fala.

31

Vamos ver agora mais um exemplo para desenvolver o entendimento acerca do mecanismo de polimorfismo. Vamos analisar o diagrama de classes abaixo. A classe Veculo ser a superclasse das outras duas classes (nibus e caminho) e ser utilizada para demonstrar tanto a sobrecarga de construtores quanto a sobrecarga de mtodos. As classes nibus e Caminho, por sua vez, ilustraro a sobrescrita de mtodos.

Veiculo - placa: String - ano: int + Veiculo() + Veiculo(placa: String, ano: int) + setPlaca(placa: String) :void + setAno(ano: int) :void + setAno(ano: String) :void + getPlaca() :String + getAno() :int + mostrarDados() : void + main(args: String[]) :void

Onibus - passageiros: int + Onibus(placa: String, ano: int, passagerios: int) + setPassageiros(passageiros: int) :void + getPassageiros() :int + mostrarDados() :void

Caminhao - pesoCarga: int + Caminhao(placa: String, ano: int, pesoCarga: int) + setPesoCarga(pesoCarga: int) :void + getPesoCarga() :int + mostrarDados() :void

32

Veja abaixo a classe Veculo.


public class Veiculo{ private String placa; private int ano; public Veiculo(){ this("", 0); } public Veiculo(String placa, int ano){ this.placa = placa; this.ano = ano; } public void setPlaca(String placa){ this.placa = placa; } public void setAno(int ano){ this.ano = ano; } public void setAno(String ano){ this.ano = Integer.parseInt(ano); } public String getPlaca(){ return placa; } public int getAno(){ return ano; } public void mostrarDados(){ System.out.println("\n------Dados do veiculo--------"); System.out.println("placa: " + this.getPlaca()); System.out.println("ano: " + this.getAno()); } public static void main (String args[]){ Veiculo veiculo = new Veiculo(); Onibus onibus = new Onibus("DXG-3592", 1982, 40); Caminhao caminhao = new Caminhao("BWE-2712", 1990, 1208); veiculo.setPlaca("BDE-6419"); veiculo.setAno(1995); onibus.setPlaca("CTD-6582"); caminhao.setAno("2003"); veiculo.mostrarDados(); onibus.mostrarDados(); caminhao.mostrarDados(); } }

33

A classe veculo compe-se de dois atributos privados, dois construtores e sete mtodos, incluindo o mtodo main(). A presena de duas verses distintas do construtor caracteriza o primeiro caso de sobrecarga dessa classe, e a presena de duas verses distintas do mtodo setAno() caracteriza o segundo caso. A declarao extends no est presente na implementao da classe Veculo, o que significa que ela, implicitamente, deriva diretamente da classe Object. Seus atributos, placa e ano, representam duas caractersticas comuns dos objetos do mundo real que essa classe representa: os veculos em geral. A presena de duas verses distintas para o construtor da classe Veculo s possvel porque a linguagem Java d suporte ao polimorfismo. Caso ele no fosse suportado, seria necessrio excluir uma das verses do construtor e manter apenas uma. Note tambm a sobrecarga do mtodo setAno() que possui duas assinaturas, uma com parmetro do tipo int e outra do tipo String. O mtodo mostrarDados() da classe veculos apresenta na tela as informaes contidas nos atributos placa e ano. Este mtodo importante, dentro do contexto deste exemplo, pois o mesmo tambm ser implementado nas classes nibus e Caminho e com isto ser possvel exemplificar a sobrescrita de mtodos. Veja abaixo a classe nibus.
public class Onibus extends Veiculo{ private int passageiros; public Onibus(String placa, int ano, int passageiros){ super (placa, ano); this.passageiros = passageiros; } public void setPassageiros(int passageiros){ this.passageiros = passageiros; } public int getPassageiros(){ return passageiros; } public void mostrarDados(){ System.out.println("\n-----Dados do Onibus--------"); System.out.println("Qtde passageiros:"+ this.getPassageiros()); System.out.println("Placa onibus: " + getPlaca()); System.out.println("Ano onibus: " + super.getAno()); } }

34

Note na classe nibus que a mesma estende a classe Veculo, e com isto herda todos os atributos e mtodos da mesma. Alm disto, a classe nibus declara um atributo que especfico dos nibus: o atributo "passageiros", que representa a quantidade de passageiros presentes no nibus. A classe nibus declara um nico construtor que recebe como parmetro a placa, o ano e passageiros para o nibus. Para iniciar os atributos placa e ano, feita a chamada do construtor de sua superclasse, ou seja, a classe Veculo. A classe nibus realiza a sobrescrita do mtodo mostrarDados() de sua superclasse, ou seja, o mtodo da classe nibus realizar uma tarefa diferente daquele implementado na superclasse.

Veja abaixo a classe Caminho.


public class Caminhao extends Veiculo{ private int pesoCarga; public Caminhao(String placa, int ano, int pesoCarga){ super (placa, ano); this.pesoCarga = pesoCarga; } public void setPesoCarga(int pesoCarga){ this.pesoCarga = pesoCarga; } public int getPesoCarga(){ return pesoCarga; } public void mostrarDados(){ super.mostrarDados(); System.out.println("Peso da carga: " + getPesoCarga()); } }

Note na classe Caminho que a mesma estende a classe Veculo, e com isto herda todos os atributos e mtodos da mesma. Alm disto, a classe Caminho declara um atributo que especfico dos Caminhes: o atributo "pesoCarga", que representa a o peso da carga do caminho. A classe Caminho declara um nico construtor que recebe como parmetro a placa, o ano e pesoCarga para o Caminho. Para iniciar os atributos placa e ano, feita a chamada do construtor de sua superclasse, ou seja, a classe Veculo.

35

A classe Caminho realiza a sobrescrita do mtodo mostrarDados() de sua superclasse, porm ao contrrio da classe nibus que faz uma implementao diferente do mtodo mortarDados() da superclasse, o mtodo mostrarDados() da classe Caminho realiza uma tarefa complementar ao mtodo da superclasse, pois dentro deste mtodo feita a chamada ao seu correspondente na superclasse e em seguida realiza a sua tarefa especfica. Aps a compilao destas classes e execuo da classe Veculo, veja abaixo a sada gerada. ------Dados do veiculo-------placa: BDE-6419 ano: 1995 -----Dados do Onibus-------Qtde passageiros:40 Placa onibus: CTD-6582 Ano onibus: 1982 ------Dados do veiculo-------placa: BWE-2712 ano: 2003 Peso da carga: 1208

Converso de Tipos (Type Casting)


A operao de cast de objetos semelhante operao de cast de tipos primitivos, com a diferena que, no segundo o tipo e a estrutura da varivel so alterados definitivamente e, no primeiro, as caractersticas e funcionalidades estaro apenas ocultas, podendo ser restitudos posteriormente. Veja a estrutura hierrquica das classes abaixo:

Object

Pessoa

Funcionrio

Cliente

36

possvel fazer cast de classes desde que estejam em uma mesma hierarquia; no podemos fazer cast entre classes "irms", tal como entre Funcionrio e Cliente. importante ressaltar que o cast no representa uma mudana estrutural do objeto, mas to somente o tipo de varivel reference que est apontando para o objeto na memria. Cast up Com base na hierarquia anterior, podemos concluir que: de classes do diagrama

Cliente uma Pessoa e toda Pessoa um Object.

Portanto, podemos realizar a operao de cast up, visualizando um objeto da classe Cliente como Pessoa ou Object, mas o objeto no perder definitivamente suas caractersticas de Cliente. Veja o exemplo abaixo:
public class TesteCastUp{ public static void main (String args[]){ //O objeto c foi declarado e instanciado como Cliente Cliente c = new Cliente();
//Cast up explicito do objeto da classe Cliente para a classe Pessoa

Pessoa p = (Pessoa) c; //Cast up do objeto da classe Cliente para a classe Pessoa Pessoa p2 = c; //Cast up do objeto da classe Cliente para Pessoa Pessoa p3 = new Cliente();
//Cast up explicito do objeto da classe Cliente para a classe Object

Object o = (Object) c; //Cast up do objeto da classe Cliente para a classe Object Object o2 = c; } }

37

Cast down A operao de cast down oposta operao de cast up, isto , ao invs de generalizarmos um objeto vamos especializ-lo. A generalizao uma operao mais previsvel do que especializao, porque a anlise da hierarquia de classes permite saber se a operao ou no possvel, na especializao, ao contrrio, a operao ir depender da forma como o objeto foi criado. Por exemplo, se um objeto criado e declarado como Cliente, e sofre um cast up para Pessoa, possvel fazer o cast down para voltar a visualiz-lo como Cliente, uma vez que foi criado como Cliente. No entanto, se um objeto criado e declarado como Pessoa, no possvel fazer o cast down para transform-lo em Cliente. Lembrando que: Todo Cliente uma Pessoa, mas nem toda Pessoa um Cliente, assim a operao de cast down dever ser feita sempre de forma explcita. Veja o exemplo abaixo:
public class TesteCastDown { public static void main (String args[]){ Cliente c = new Cliente(); //Cast up de Cliente para Pessoa Pessoa p = c; //Cast down de Pessoa para Cliente Cliente c2 = (Cliente) p; //Criacao de uma instancia da classe Pessoa Pessoa p2 = new Pessoa(); //Cast down invalido de Pessoa para Cliente Cliente c3 = (Cliente) p2; } }

O Cliente uma especializao da Pessoa, logo sempre possvel fazer um cast (up) de Cliente para Pessoa, porm s possvel fazer cast (down) de Pessoa para Cliente se o objeto armazenado em uma varivel do tipo Pessoa for um Cliente. No exemplo acima foi criado um Objeto a partir da classe Pessoa (p2) e em seguida tentou-se fazer um cast down para Cliente e isto ir gerar uma exceo em tempo de 38

execuo. Esta exceo chama-se "ClassCastException", ou seja, houve a tentativa de converter um objeto gerado a partir da classe Pessoa para um objeto da classe Cliente.

Veja abaixo a sada gerada pela execuo do programa acima.


Exception in thread "main" java.lang.ClassCastException: Pessoa at TesteCastDown.main(TesteCastDown.java:16)

Exemplo sobre converso de tipos Vamos analisar o exemplo abaixo para entender melhor a converso de tipos para objetos. Quando analisar as classes tenha em mente o diagrama de classes que est no incio do tpico "Converso de Tipos (Type Casting)". Pessoa.java
public class Pessoa { public void imprimir(){ System.out.println("Dentro da classe Pessoa"); } }

Cliente.java
public class Cliente extends Pessoa { public void imprimir(){ System.out.println("Dentro da classe cliente"); } }

Funcionario.java
public class Funcionario extends Pessoa { public void imprimir(){ System.out.println("Dentro da classe funcionario"); } }

39

Teste.java
public class Teste { public static void main (String args[]){ Cliente c = new Cliente(); Funcionario f = new Funcionario(); Teste t = new Teste(); t.converter(c); t.converter(f); } public void converter(Pessoa p){ //verifica se o objeto p eh uma instancia da classe Cliente if (p instanceof Cliente){ Cliente cli = (Cliente) p; cli.imprimir(); } else{ Funcionario fun = (Funcionario) p; fun.imprimir(); } } }

Neste exemplo a classe Pessoa a superclasse das classes Cliente e Funcionrio. A classe Teste foi criada somente para dar suporte ao exemplo de polimorfismo e type casting. Note que a classe Pessoa possui o mtodo imprimir, o qual exibe na tela uma mensagem dizendo que est dentro da classe Pessoa. As classes Cliente e Funcionrio estendem a classe Pessoa (herana), sobrescrevem o mtodo imprimir e cada uma imprima a sua mensagem na tela. A classe Teste possui o mtodo main e o mtodo converter. No mtodo main criado um objeto da classe Cliente e outro da classe Funcionrio. Em seguida o mtodo converter chamado duas vezes: Na primeira passando como parmetro um objeto da classe Cliente e na segunda passando um objeto da classe Funcionrio. Este procedimento s possvel porque Java suporta a orientao a objetos, uma vez que na assinatura do mtodo converter podemos definir como parmetro um objeto da classe Pessoa que superclasse das classes Cliente e Funcionrio.

40

Com isto, na chamada do mtodo converter feito um cast up de Cliente para Pessoa e em seguida de Funcinrio para Pessoa. J dentro do mtodo converter verifica-se se o parmetro uma instncia da classe Cliente, e em caso afirmativo, faz-se um cast down de Pessoa para Cliente e em seguida chama-se o mtodo imprimir. Caso o parmetro Cliente, significa que Funcionrio, e com isto funcionrio e logo aps no seja uma instncia da classe o mesmo uma instncia da classe feito um cast down de Pessoa para chama-se o mtodo imprimir.

41

Exerccios Sobre Java e o Paradigma Orientado a Objeto


1) Qual a diferena entre classe e objeto? 2) Qual a finalidade do mtodo construtor? 3) Identifique na instruo abaixo: a classe, o objeto, o construtor e a operao de instanciao. Computador computador = new Computador(); 4) O que diferencia um construtor de um mtodo qualquer? 5) Observe que a classe abaixo no possui um construtor, porm para que seja criado um objeto sempre necessrio utilizar o operador new seguido do nome do construtor. Desta forma, no ser possvel criar um objeto desta classe? Explique.
public class Garrafa{ private String tipo; public void setTipo (String tipo){ this.tipo = tipo; } public String getTipo(){ return tipo; } }

6) A classe abaixo parecida com a classe do exerccio anterior, porm agora ela possui um construtor alternativo. O que ir acontecer se em outra classe voc desejar criar um objeto da mesma com a seguinte instruo: Garrafa gar = new Garrafa();
public class Garrafa{ private String tipo; public Garrafa (String tipo){ this.tipo = tipo; } public void setTipo (String tipo){ this.tipo = tipo; } public String getTipo(){ return tipo; } }

42

7) As duas classes abaixo no esto no mesmo pacote. Faa uma anlise das mesmas e corrija possveis erros de compilao.
public class Carro{ protected int litrosNoTanque; protected boolean carroLigado; private void encherTanque(int litros){ litrosNoTanque = litros; } } public class TesteCarro{ public static void main (String args[]){ Carro carro = new Carro(); carro.encherTanque(10); carro.carroLigado = true; } }

8) Observe as classes Circulo e realize as seguintes tarefas:

TesteCirculo

abaixo

- Declare o atributo raio da classe Circulo como privado; - Crie os mtodos necessrios na classe Circulo de modo que seja possvel obter ou alterar o valor do atributo raio pela classe TesteCirculo; - Caso o objetivo seja alterar o valor do atributo raio, faa a seguinte verificao: Se o valor do novo raio for positivo, faa a atribuio, caso contrrio no faa; Siga as orientaes presentes TesteCirculo e execute cada tarefa;
public class Circulo{ double raio; }

na

classe

public class TesteCirculo{ public static void main /* Crie um objeto /* Coloque aqui o /* Coloque aqui o } }

(String args[]){ da classe Circulo */ codigo para alterar o raio para 10 */ codigo para obter o valor do raio */

43

9) Observe as classes AcessaBanco e TesteBanco abaixo e realize as seguintes tarefas: - Declare os atributos login e conectado da classe AcessaBanco como privado; - Crie os mtodos necessrios na classe AcessaBanco de modo que seja possvel obter ou alterar o valor dos atributos login e conectado pela classe TesteBanco; - Siga as orientaes presentes na classe TesteBanco e execute cada tarefa;

public class AcessaBanco{ String login; boolean conectado; }

public class TesteBanco{ public static void main (String args[]){ /* Crie um objeto da classe AcessaBanco */ /* Coloque aqui o codigo para alterar o login para o seu nome */ /* Coloque aqui o codigo para ajustar conectado para true */ } }

10) Analise o cdigo abaixo e descreva em poucas linhas onde est o erro de compilao e qual seria a soluo para corrigir o mesmo.
public class TesteStatic{ private int a1; private int a2; public static void main (String args[]){ iniciar(10,40); } public void iniciar(int v1, int v2){ int b1 = v1; int b2 = v2; } }

44

11) Analise as classes abaixo e descreva em poucas linhas se existe erro de compilao ou no. E caso exista algum, descreva qual deveria ser a soluo.
public final class Veiculo{ private String chassi; public String getChassi(){ return chassi; } }

public class Carro extends Veiculo{ private String cad; public String getCad(){ return cad; } }

12) A classe mtodos.

Jogo

abaixo

foi

descrita

sem

atributos

public class Jogo{ }

Logo aps o processo de compilao foi utilizado o utilitrio javap (que transforma cdigo binrio em cdigo Java) e o mesmo retornou o cdigo abaixo.
public class Jogo extends java.lang.Object{ public Jogo(); }

Note que existem mais informaes no cdigo gerado pelo utilitrio javap do que o cdigo original. O que aconteceu?

13) Analisando a classe Java abaixo podemos observar que a mesma possui apenas um atributo, um construtor e dois mtodos. Perceba que dentro do mtodo main esto sendo invocados mtodos e atributos que no pertencem classe. Isto um erro de compilao? Justifique sua resposta.
public class PessoaFisica extends Pessoa{ private String RG; public PessoaFisica(){ super(); } public String getRG(){

45

return RG; } public static void main (String args[]){ PessoaFisica pf = new PessoaFisica(); pf.setEndereco("Rua XV n. 10"); pf.setFone("2546-3274"); System.out.println(pf.endereco); System.out.println(pf.fone); } }

14) Faa um programa em Java para implementar uma calculadora simples com as quatro operaes bsicas da matemtica. Crie trs mtodos para cada uma das operaes e cada mtodo dever ser sobrecarregado, pois um deles deve receber apenas dois parmetros do tipo int, o outro apenas dois parmetros do tipo float e o ltimo apenas dois parmetros do tipo String. Quando os parmetros forem do tipo String, os mesmos devero ser convertidos para o tipo int.

15) Crie uma classe Java chamada ClienteBanco com os seguintes atributos (privados): - nome; - Data de Nascimento; - CPF; - endereo; Alm do construtor padro, crie um construtor alternativo para iniciar cada um dos atributos. Crie os mtodos necessrios para acessar estes atributos. Faa a sobrescrita do mtodo toString() da classe Object para o mesmo retornar a seguinte mensagem: "O Sr." <nome> "portador do CPF n." <CPF> "nascido em" <data de nascimento> "residente e domiciliado a " <endereo> "vem por meio desta solicitar o encerramento de sua conta corrente". Crie um mtodo main e dentro do mesmo faa com que a mensagem gerada pelo mtodo toString() seja impressa na tela.

46

16) Crie uma classe Java chamada Pessoa com os seguintes atributos privados: - nome; - Data de Nascimento; Crie os mtodos necessrios para acessar estes atributos. Crie tambm um mtodo chamado "informarIdade", este mtodo deve imprimir na tela a idade desta pessoa em anos, meses e dias. Crie um mtodo main para criar um objeto da classe Pessoa, inicie os atributos "nome" e "Data de nascimento" e em seguida chame o mtodo "informarIdade" para que o mesmo informe a idade desta Pessoa.

17) Crie uma classe Java para um Celular, com os seguintes atributos: modelo (String) e nmero (int). - Faa o encapsulamento destes atributos; - Faa a sobrecarga do mtodo que ir alterar o valor do atributo nmero, permitindo que o programador informe uma string ou um inteiro; - Faa a sobrescrita do mtodo correto da classe Object para retornar uma string que representa a concatenao dos atributos da classe.

47