Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um...

50
1 Conceito de classe, características (atributos), Ações (métodos) e construtores Na Programação Orientada a Objetos (POO) um projeto de sistema não está centrado na identificação de procedimentos, como na programação estruturada, mas sim na identificação de objetos. A partir da identificação dos elementos do mundo real, envolvidos com o problema, é que são realizadas as demais tarefas. Três das principais atividades envolvidas em um projeto orientado a objetos são as seguintes: 1. Identificação dos objetos envolvidos com o sistema a ser desenvolvido e sua representação em forma de classes; 2. Identificação de suas características relevantes e sua representação em forma de atributos; 3. Identificação de ações (comportamentos) realizadas por esses objetos e sua representação em forma de métodos. 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, também será necessário analisar o conceito de atributos e de métodos. Objeto Objeto é qualquer entidade do mundo real que apresente algum significado, mesmo que tal entidade não 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 avião, o Sol, a lua, uma estrela, uma nuvem, um pássaro, uma árvore e etc. Todo objeto possui algumas características próprias, também chamadas de atributos. Esses atributos são as qualidades que permitem distinguir um objeto de outros objetos semelhantes. Por exemplo: É possível distinguir um cachorro dos outros em função de vários atributos: cor, raça, altura, comprimento, peso e etc. Do mesmo modo, é possível distinguir um carro dos outros em função de um conjunto de atributos: marca, modelo, ano, cor, placa, chassi e etc.

Transcript of Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um...

Page 1: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

1

Conceito de classe, características (atributos), Ações (métodos) e construtores Na Programação Orientada a Objetos (POO) um projet o de sistema não está centrado na identificação de procedimentos, como na programação estruturada, mas sim na identificação de objetos. A partir da identificação dos elementos do mundo real, envolvidos com o problema, é que são realizadas as demais tarefas. Três das principa is atividades envolvidas em um projeto orientado a obj etos são as seguintes:

1. Identificação dos objetos envolvidos com o sistema a ser desenvolvido e sua representação em forma de classes;

2. Identificação de suas características relevantes e sua representação em forma de atributos;

3. Identificação de ações (comportamentos) realizadas por esses objetos e sua representação em forma de métodos.

Para compreender a POO é preciso analisar o significado de diversos elementos. Inicialmente, de ve-se compreender o significado de objetos e classes. Mas , para compreendê-los, também será necessário analisar o c onceito de atributos e de métodos. Objeto Objeto é qualquer entidade do mundo real que apres ente algum significado, mesmo que tal entidade não se co nstitua em algo concreto. Exemplos de objetos do mundo real: Uma mesa, uma cadeira, um gato, um cachorro, um computador, uma c aneta, um disquete, um caderno, um carro, um avião, o Sol, a lua, uma estrela, uma nuvem, um pássaro, uma árvore e et c. Todo objeto possui algumas características própria s, também chamadas de atributos. Esses atributos são a s qualidades que permitem distinguir um objeto de out ros objetos semelhantes. Por exemplo: É possível distin guir um cachorro dos outros em função de vários atributos: cor, raça, altura, comprimento, peso e etc. Do mesmo mod o, é possível distinguir um carro dos outros em função d e um conjunto de atributos: marca, modelo, ano, cor, pla ca, chassi e etc.

Page 2: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

2

Pode haver dois ou mais objetos que possuam alguns atributos com os mesmos valores. Entretanto, em fun ção de sua própria natureza, os valores de alguns outros a tributos são únicos e não se repetem entre os diversos objet os semelhantes. Por exemplo: Existe uma infinidade de carros cuja cor é vermelha, mas não pode haver dois carros com a mesma placa ou chassi. Além de possuir atributos, os objetos também manifestam um comportamento. O comportamento dos ob jetos diz respeito às ações que eles podem realizar. O ca chorro pode correr, pular, latir e etc. O computador pode ligar-se, desligar-se, processar dados, exibir informaçõe s no vídeo, imprimir textos, emitir sons e etc. Classe Na POO, o mais importante não é a identificação do s objetos existentes no mundo real. O que realmente i mporta é a identificação de grupos de objetos com atributos e comportamentos comuns. Ter atributos e comportament os comuns não significa serem iguais. Apesar de todos os cachorros possuírem uma cor, raça, altura, comprime nto e peso, dois cachorros podem ser bem diferentes por p ossuírem diferentes valores em cada um desses atributos. Um deles pode ser preto e o outro branco, um pode ter 90cm d e 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 João e Maria são dois clientes de uma empresa, pode-se dizer que, apesar de eles serem pe ssoas distintas, pertencem a uma mesma categoria: a dos c lientes. O termo classe é utilizado para significar o mesmo que categoria. Ao invés de dizer que João e Maria perte ncem à categoria dos clientes, pode-se dizer que eles pert encem à classe dos clientes. Uma classe representa um grupo de objetos com características e comportamentos comuns e compõem-s e, basicamente, de atributos e métodos. Os atributos representam as características dos objetos, e os mé todos representam as ações ou comportamentos que eles pod em realizar.

Page 3: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

3

Diferença entre Classe, Objeto e o instanciamento a partir do construtor Objeto : É a instância de uma classe. Ou seja, uma variável do tipo de dado definido pela classe. Poss uem características (atributos) comportamentos (métodos ). Objetos do mundo real possuem características e comportamentos. Já objetos de software armazenam su as características em atributos (variáveis) e implemen tam seus comportamentos em métodos Exemplo: Pessoa joao = new Pessoa(); joao.idade = 30; joao.andar(); João é uma variável (objeto) do tipo da classe Pes soa. Idade é um atributo (característica) do objeto Joã o. Andar é um método (comportamento) do objeto João. Classe : Representa a abstração de uma entidade (objeto) do mundo real. A Classe define as caracter ísticas e os comportamentos desta entidade (objeto) do mund o real. As características são os atributos e os comportame ntos são os métodos. A classe estabelece o formato dos objetos, portant o define um tipo de dado. É a representação de um con junto de objetos que compartilham as mesmas características e comportamentos. Exemplo: public class Pessoa{ String nome; int idade; String endereco; public void andar(){ } public void informarIdade(){ } } João e Maria são objetos da classe Pessoa, pois compartilham os mesmos atributos (características) e métodos (comportamentos).

Page 4: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

4

Instanciação Instanciar uma classe significa criar um novo obje to a partir dela própria. Do mesmo modo que toda variáve l é de determinado tipo primitivo, todo objeto pertence a uma classe. Assim como uma variável precisa ser declarada e iniciada, todo objeto precisa ser declarado e insta nciado. A declaração de um objeto é muito parecida com a de claração de uma variável, mas o tipo do objeto será sempre u ma classe ao invés de um tipo primitivo. Sintaxe para declaração de um objeto: <Classe> <nomeDoObjeto>; Exemplo para declaração de objeto: String str; Depois de declarado, todo objeto precisa ser instanciado. A instanciação de um objeto consiste, basicamente, na alocação de um espaço na memória pa ra que ele possa ser representado. Sintaxe para instanciar um objeto: <nomeDoObjeto> = new <construtor>([argumentos]); Método Construtor O responsável pela instanciação de uma classe semp re será um método construtor disponível em sua classe. Todo construtor possui o mesmo nome da classe a que se r efere e há um construtor padrão na maioria das classes que dispensa o uso de argumentos. Toda classe tem, pelo menos, u m construtor que o compilador adiciona, quando nenhum for declarado (construtor default). A instanciação é feita através de uma operação de atribuição em que o objeto recebe o espaço na memór ia que lhe for reservado pelo construtor. O operador new s empre precederá o construtor utilizado nessa operação. Ca so seja utilizado o construtor padrão (default), o nome do construtor será seguido de um par de parênteses sem nada dentro, uma vez que ele não exige nenhum argumento.

Page 5: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

5

Exemplo para instanciar um objeto: Str = new String(); Além disso, também é possível declarar e instanciar um objeto em uma única instrução. Veja a sintaxe abaix o: <Classe> <nomeDoObjeto> = new <construtor>([argume ntos]); Veja o exemplo: String str = new String(); Além de exercerem um papel essencial no processo d e instanciação de classes, os construtores também são utilizados para iniciar os atributos com valores pa drão ou com valores informados. Os construtores são métodos especiais que são invocados em conjunto com o opera dor new para reservar espaço na memória do computador a ser ocupado por um novo objeto. Algumas classes possuem um construtor padrão que é eficaz para a criação de objetos. Entretanto, é pos sível substituir esse construtor padrão por outro diferen te, definindo-se parâmetros e adicionando-se quaisquer tipos de instruções que deseje que sejam executadas sempre q ue um novo objeto for criado. Sintaxe para a criação de um método construtor: <visibilidade> <nome> ([<parâmetros>]){ } A sintaxe para implementação de um construtor se assemelha à de um método qualquer. No entanto, em u ma análise mais detalhada, é possível identificar impo rtantes distinções. Os construtores não possuem um tipo de retorno e tampouco podem ser precedidos de quaisquer outros tipos de qualificadores. Desse modo, a sua sintaxe é muit o mais simples que a sintaxe aplicada à implementação de u m método. Outra característica peculiar do construtor é que seu nome deve sempre ser idêntico ao nome da classe. De sse modo, dificilmente haverá dificuldades em distingui r os construtores dos métodos. Se o nome for idêntico ao da classe, então se trata de um construtor. Além disso , se o nome for precedido por um tipo ou por um qualificad or

Page 6: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

6

qualquer (static, final ou abstract), então se trat a de um método. Há dois procedimentos básicos a serem compreendido s para se trabalhar com construtores. O primeiro diz respeito à substituição do construtor padrão por um construt or alternativo e o segundo faz a inclusão de um constr utor alternativo sem que seja eliminado o construtor pad rão. O exemplo abaixo faz uso de um construtor alternat ivo, o qual substitui o construtor padrão. 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á cria r 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 const rutor alternativo, o qual possui três parâmetros. A class e TestePessoa cria um novo objeto da classe Pessoa (j oao) utilizando este construtor alternativo. A saída gerada pela execução da classe TestePessoa é a seguinte: Joao 30 Av Paulista 900

Page 7: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

7

Vamos analisar agora um segundo exemplo que faz a inclusão de um construtor alternativo sem que seja eliminado o construtor padrão. 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á cria r 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 construto res: O primeiro é o padrão (default) e o segundo é o alter nativo, o qual possui três parâmetros. A classe TestePessoa cria um novo objeto da classe Pessoa (joao) utilizando o co nstrutor alternativo e em seguida cria um outro objeto da cl asse Pessoa (maria), porém desta vez utilizando o constr utor padrão (default).

Page 8: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

8

A saída gerada pela execução 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 compõem a classe. Conseqüentemente, podemos definir que apenas os mét odos podem ser chamados, restringindo o acesso direto ao s atributos. Modificador public Quando utilizamos este modificador em atributos, métodos ou classes o compilador compreende que o at ributo, método ou classe pode ser acessado diretamente por qualquer outra classe. Modificador private Ao utilizarmos este modificador em atributos ou métodos implica que, para o compilador, estes eleme ntos não podem ser acessados diretamente por qualquer outra classe, exceto por ela mesma. O modificador private não é aplicável para classes . Modificador protected As restrições impostas por esse tipo de modificado r de acesso representam um nível intermediário entre o p úblico e o privado. Com este modificador os atributos e méto dos são acessíveis somente na própria classe, em classes especializadas e em classes do mesmo pacote. O modificador protected não é aplicável para class es.

Page 9: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

9

Modificador default O modificador default é utilizado quando não se especifica nenhum outro modificador, ou seja, quand o não é especificado nenhum modificador, o atributo, método ou classe estão acessíveis apenas no mesmo pacote. Encapsulamento de atributos Vamos imaginar que temos uma classe chamada Data c om os seguintes atributos: ano, mes e dia. Um usuário desatento poderia atribuir ao atributo ano um valor negativo, um mês igual a 20 ou um dia igua l a 53. Todos este valores não são permitidos pois, um ano nunca poderia ser negativo, um mês nunca poderia ser maio r do que 12 e um dia nunca poderia ser maior do que 31. Para uma implementação mais robusta destes atribut os é interessante que o acesso seja mais controlado, ou seja, realizado através de métodos que permitam criar reg ras para atribuição e leitura. Esta prática é chamada encapsulamento. Vantagens obtidas através da utilização do encapsulamento:

• Validar valores a serem atribuídos a cada atributo;

• Definir quais/quando os atributos podem ser alterados;

• Fazer um log das modificações dos atributos; O encapsulamento de atributos pode utilizar método s padronizados. Contudo, quando existirem métodos relacionados à lógica de negócio, ou ainda, que fac ilitem a manipulação de atributos, podemos utilizar nomes qu e não sigam esta convenção. Os métodos padrão para encapsulamento são chamados Getters e Setters. Getters

Page 10: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

10

São métodos que permitem a leitura de atributos da classe, sendo uma boa prática cria-los para cada at ributo que desejarmos encapsular. Exemplos: String getNome() long getCpf() Setters São métodos para modificar os valores dos atributo s visando protege-los da escrita ou modificação indev ida. É possível estabelecer certas normas e controles dent ro dos métodos Setters. Exemplos: void SetNome(String nome) void setCpf(long cpf) Métodos is São métodos utilizados para leitura de atributos booleanos. Exemplos: boolean isConnected() boolean isMaiorDeIdade() Vamos analisar o exemplo abaixo e a utilização 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;

Page 11: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

11

} public void setDia( byte d) { if (d > 0 && d <= 31){ dia = d; } 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 invés de modificar os atributos diretamente, devemos fazê-lo através dos métodos de acesso aos atributos. Os métodos setAno, setDia e ajustarMes alteram os valores dos atributos ano, dia e mes respectivament e. Cada método faz validações antes de realizar a atribuiçã o propriamente dita, isto impede que valores incorret os sejam atribuídos aos atributos. O nome dos métodos não precisa começar necessariam ente com a palavra "set", você pode implementar um métod o com qualquer outro nome. Como exemplo disto, foi criado o método "ajustarMes", porém o mesmo poderia se chama r "setMes" também. Modificadores de Acesso – Membros estáticos e finais Modificador static Atributos: Quando temos um atributo estático dentro de uma classe, este atributo será único para todos os objetos instanciados a partir desta classe.

Page 12: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

12

Os atributos estáticos podem ser acessados diretamente a partir da classe e são alocados na me mória na primeira vez que forem referenciados. Portanto, não é preciso criar uma instância (objeto) da classe. Atributos estáticos devem ser utilizados quando for necessário compartilhar um valor entre t odas as instâncias da classe. Desta forma, a variável será alocada apenas uma vez na memória. Vejamos o exemplo da classe Pessoa (abaixo), que contém os seguintes atributos: Nome: Característica específica de cada Pessoa, logo, é uma característica de cada instânci a;

Telefone: Cada Pessoa tem seu próprio telefone, que é uma característica da instância;

Sexo: Assinala-se o sexo de cada Pessoa com um int (1 ou 2) por exemplo. No intuito de padroniz ar é conveniente definir duas constantes: MASCULINO e FE MININO 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 (MASCULI NO e FEMININO) na classe Pessoa. Estas constantes são es táticas e, portanto podem ser utilizadas sem a necessidade de criar um objeto da classe. Veja na classe TestePessoa que estamos acessando o atributo estático MASCULINO pela classe (Pessoa.MAS CULINO) e não pela instância da classe.

Page 13: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

13

Devemos tomar cuidado quando utilizamos atributos estáticos, pois eles são compartilhados por todas a s instâncias da classe. 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 saída gerada pela execução do progra ma 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 objeto s da classe Carro. Quando mudamos o valor da placa para qualquer uma das instâncias da classe Carro, todas as demais são afetadas porque o atributo placa é estático e compa rtilhado por todas as instâncias da classe. Métodos: Os métodos estáticos são aqueles que realizam tarefas que não dependem das característic as específicas de cada objeto. Para a execução da tare fa que se destinam, eles utilizam somente as informações c ontidas em seus próprios parâmetros e informações contidas em atributos estáticos.

Page 14: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

14

A vantagem de um método estático em relação aos demais é que ele pode ser invocado a partir da própria classe, sem a necessidade de instanciá-la. Como exemplo de métodos estáticos podemos citar os métodos parseXXX das classes Wrapper, pois estes métodos são utilizados sem a necessidade de criar u ma instância 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 método parseInt da classe Integer foi invocado sem a necessidade da criação da instância da classe Integer. Portanto este é um método estático. Um outro exemplo de método estático é o método mai n, pois o mesmo é chamado pela JVM sem a criação da in stância da classe. Classes: O modificador static não é aplicável para classes. Modificador final Atributos: Quando o modificador final é utilizado em atributos, significa que somente uma atribuição pod erá ser feita ao atributo, podendo ser feita na declaração ou no construtor. Em outras palavras, quando queremos dec larar um atributo constante devemos utilizar o modificador f inal. 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 ; } }

Page 15: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

15

Quando compilamos a classe TesteFinal obtemos o seguinte erro de compilação: cannot assign a value to final variable num Isto quer dizer que não podemos atribuir um novo v alor (100) ao atributo final "num", pois o mesmo já tinh a sido iniciado com o valor 350. Métodos: Podemos utilizar o modificador final na declaração de um método para que este não possa ser sobrescrito em classes filhas. OBS: Sobrescrita de métodos será visto mais adiante . Classes: O modificador final pode ser utilizado na declaração de classes, indicando que não poderá ser estendida por outra, ou seja, não poderá ser herdad a. OBS: Herança será visto mais adiante. Relacionamento Entre Classes Uma das formas mais simples de relacionamento entr e classes é a associação, 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 defin ir a multiplicidade de um dos lados do relacionamento sã o: 1 Obrigatoriamente 1 0..1 Zero ou um 1..* Um ou mais 0..* Zero ou mais * Zero ou mais OBS: Quando não definimos valores para a cardinalid ade fica implícito que o valor da associação é 1.

Page 16: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

16

Exemplo de associação 1 para 1 O exemplo abaixo pode ser lido da seguinte forma: Uma Pessoa tem um Endereço e o Endereço pertence a uma Pessoa. Através do diagrama apresentado, podemos assumir q ue a classe Pessoa tem um atributo do tipo Endereço, e a classe Endereço tem um atributo do tipo Pessoa. Exemplo de associação 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. A partir do diagrama acima podemos assumir que na implementação, a classe Empresa deve ter uma coleti vidade de departamentos. Veja o exemplo abaixo: Empresa.java public class Empresa{ private Departamento[] departamentos; } Departamento.java public class Departamento{ Private Empresa empresa; } Exemplo de associação muitos para muitos O relacionamento muitos para muitos apresentado a seguir pode ser entendido da seguinte forma: Um fun cionário trabalha para um ou mais departamentos, e um depart amento emprega uma ou mais pessoas, ou seja, não temos um

Pessoa Endereço tem

Empresa Departamento tem

1..*

Page 17: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

17

Funcionário que não trabalha para nenhum departamen to, assim como não temos um departamento que não empreg a nenhum funcionário. Funcionario.java public class Funcionario{ private Departamento[] departamentos; } Departamento.java public class Departamento{ Private Funcionario[] funcionarios; } Classe Calendar A classe Calendar é uma classe abstrata que provê métodos para conversão entre um instante específico no tempo e um conjunto de atributos tais como ano (YEA R), mês (MONTH), dia (DAY), hora (HOUR) e assim por diante. A classe Calendar possui um método chamado "getInstace", que é utilizado para gerar um objeto (instância) da classe. O método getInstance da clas se Calendar retorna um objeto Calendar cujos atributos são iniciados com a data e hora atual. Exemplo: Calendar agora = Calendar.getInstance(); OBS: Não é possível gerar um objeto da classe Calen dar por meio do operador new. Obtendo e ajustando valores para os atributos da cl asse Calendar: public int get(int field) O método get é utilizado para obter o valor presen te (atual) do atributo passado como parâmetro. Exemplo: c.get(Calendar.YEAR); // Este comando retorna o an o que está presente no atributo YEAR da classe calend ar.

Funcionário Departamento

1..* 1..*

Page 18: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

18

public void set(int field, int value) O método set é utilizado para alterar o valor pres ente (atual) do atributo passado como parâmetro para o v alor passado como parâmetro. 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 (); //métodos getters para obter: ano, mes, dia, hora, minuto e segundo //retorna o ano System. out .println(c.get(Calendar. YEAR)); //retorna o mês. Janeiro é o primeiro mês, o qual p ossui índice zero System. out .println(c.get(Calendar. MONTH)+1); //retorna o dia do mês. 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 (não se sabe se é manhã ou tard e) 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)); //métodos setters para modificar: ano, mês, dia, ho ra minuto e segundo //altera o ano para 1990 c.set(Calendar. YEAR, 1990); //altera o mês 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)); } }

Page 19: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

19

Herança Herança é o mecanismo que possibilita a definição de novas classes a partir de uma já existente, como fo rma de reutilizar seus atributos e métodos. Isso é possíve l mesmo quando não se tem acesso ao código fonte da supercl asse. A aplicação do mecanismo de herança sempre envolve dois elementos: uma superclasse e uma subclasse. A superclasse, também conhecida como classe ancestral , é aquela que representa as características genéricas de um conjunto de objetos. A subclasse, também conhecida como classe descendente, é aquela que estende a supercla sse para incluir a representação de características específi cas de um subconjunto desses objetos. Vale destacar que as classes que contenham o qualificador final não podem ser estendidas. Isso s ignifica que não se pode utilizá-las como superclasse em uma operação de especialização porque o qualificador fi nal indica exatamente que elas não podem conter subclas ses. A Declaração extends O termo extends é utilizado na declaração de uma classe para especificar quem é sua superclasse. Cas o ele seja omitido, como se fez em todos os exemplos ante riores, 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 é cham ada de superclasse de todas as classes, pois todas são der ivadas dela. A declaração extends figura depois do nome da nova classe. Observe a sintaxe: [public] [abstract | final] class <subclasse> exten ds <superclasse>

Veja o exemplo abaixo: public class PessoaFisica extends ClienteBanco{ }

Page 20: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

20

Note que a única novidade desta forma de declaraçã o, comparativamente aquela adotada até aqui, é a prese nça do termo "extends" após o nome da classe (PessoaFisica ) seguido do nome da superclasse, que neste caso, é a classe ClienteBanco. Suponha que a classe anterior tenha sido declarada da seguinte forma: public class PessoaFisica{ } Observe que a declaração extends foi omitida. Ness e caso, a classe PessoaFisica terá como superclasse a classe Object, uma vez que toda e qualquer classe implemen tada em Java é vinculada, explicitamente ou implicitamente, à hierarquia de classes de sua API. Como a classe Obj ect é aquela que se encontra no topo dessa hierarquia, el a é assumida como a superclasse de todas as novas class es que não contenham a declaração extends para indicar, explicitamente, a sua superclasse. Java não possui herança múltipla, ou seja, uma cla sse não pode herdar atributos e métodos diretamente de mais de uma classe A Referência this Cada objeto que é instanciado a partir de uma clas se Java mantém uma cópia própria dos atributos para qu e os valores neles armazenados não se confundam com os v alores dos demais. No entanto, somente uma cópia de cada m étodo é mantida para cada classe. Isso significa que, quand o um objeto invoca um de seus métodos, ele está executan do a única cópia desse método, que é compartilhada com t odos os demais objetos dessa mesma classe. A referência this é um valor especial através do q ual é possível referir-se ao objeto corrente de uma cla sse dentro de quaisquer métodos da mesma. É através des sa referência que é possível identificar o objeto espe cífico que invocou determinado método. Quando uma classe possui algum atributo cujo nome coincide com o nome de um parâmetro de um método, a referência this torna-se especialmente importante. É somente através dela que é possível referir-se ao a tributo da classe dentro do método que contém um parâmetro cujo nome coincida com o seu.

Page 21: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

21

Para fazer referência a um atributo ou a um método do objeto corrente dentro de quaisquer métodos, basta utilizar a referência this seguida do operador ponto e do no me do atributo ou do método. Veja a sintaxe: this.<atributo> this.<método> Suponha a classe Amigo, contendo um atributo chama do "nome" e um método chamado setNome(). Se o método s etNome() possuir um parâmetro chamado "nome", a única forma de você se referir ao atributo "nome" dessa classe dentro d esse método é utilizando a referência this, como segue: public class Amigo{ private String nome; public void setNome( String nome){ this .nome = nome; } } A referência this também é útil em classes onde há mais que um construtor. Nesse caso, é interessante que um construtor faça uso da tarefa que já está sendo rea lizada por outro. Isso também é possível com o uso da refe rência 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 referência this foi utilizada, dentr o do construtor padrão, para invocar o segundo construto r, utilizando como argumentos dois textos vazios. Esse s dois argumentos serão atribuídos, pelo segundo construto r, aos atributos nome e fone.

Page 22: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

22

A Referência super Enquanto a referência this permite que o objeto corrente seja identificado e que seus atributos e m étodos sejam referenciados em seus próprios métodos, a ref erência super possibilita que atributos e métodos da superc lasse sejam referenciados pelos métodos da subclasse. Para referir-se a um atributo ou a um método da superclasse em um método de uma subclasse, basta ut ilizar a referência super seguida do operador ponto e do nom e do atributo ou do nome do método. Observe a sintaxe: super.<atributo> super.<método> Caso queira referir-se a um construtor da supercla sse, a sintaxe é diferente. Nesse caso, deve ser utiliza da a referência super seguida de um par de parênteses. V eja como seria invocado o construtor da superclasse, que não contenha parâmetros. super(); É importante lembrar que a superclasse pode conter diversos construtores alternativos. Caso o construt or que deseja invocar contenha parâmetros, você deve infor mar um valor para cada um deles entre os parênteses. Exemplo de herança Vamos observar o exemplo abaixo para entender melh or o conceito de herança. Este exemplo compõe-se de três classes: Fornecedor, FornecedorPessoa, FornecedorEm presa. Observe que há setas que partem das classes FornecedorPessoa e FornecedorEmpresa em direção à c lasse Fornecedor, indicando a direção da operação de especialização que está sendo realizada. Nessa oper ação, a classe Fornecedor é a superclasse e as outras duas classes são as subclasses.

Page 23: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

23

A classe Fornecedor representa duas característica s comuns a todos os fornecedores (nome e fone), a cla sse FornecedorPessoa adiciona duas características espe cíficas que somente aqueles fornecedores que são pessoas fí sicas possuem (RG e CPF) e a classe FornecedorEmpresa adi ciona duas características específicas de fornecedores qu e são pessoas jurídicas (Inscrição Estadual e CNPJ). Veja na próxima página a implementação da classe Fornecedor. public class Fornecedor{

- 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

FornecedorEmpresa FornecedorPessoa

- 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

Fornecedor

- 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

Page 24: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

24

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 método main acima que o objeto "carlos" e o objeto "gtaLtda" são do tipo FornecedorPessoa e FornecedorEmpresa respectivamente e que ambos estão utilizando os métodos setNome(), setFone() e getNom e(), porém as classes FornecedorPessoa e FornecedorEmpre sa não possuem estes métodos. Devemos lembrar que os métodos citados acima são herdados da superclasse (Fornecedor), e devido a is to os objetos têm acesso a estes métodos.

Page 25: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

25

Abaixo a implementação 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; } }

Abaixo a implementação da classe FornecedorEmpresa . public class FornecedorEmpresa extends Fornecedor{

Page 26: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

26

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 métodos e construtores Sobrecarga A sobrecarga (overload em inglês) é a implementaçã o, em uma mesma classe ou em classes ligadas pelo meca nismo de herança, de duas ou mais versões para um mesmo méto do, de modo que manifestem comportamentos distintos. Nesse caso, o que os distinguirá é sua assinatura, ou seja, seu c onjunto de parâmetros. Sobrecarregar um método é escrever métodos com nom es iguais, porém, com quantidade e tipos de parâmetros de entrada diferentes. Não é possível implementar um m étodo duas vezes com os mesmos tipos e quantidades de par âmetros. Também é possível realizar a sobrecarga de construtores. Para isto basta definir mais do que u m construtor seguindo as mesmas regras da sobrecarga de métodos. Veja abaixo um exemplo da sobrecarga de métodos.

Page 27: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

27

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 método soma. Note que existem quatros implementações difer entes para o método soma e que a assinatura é diferente p ara cada método. Veja abaixo um exemplo da sobrecarga de construtore s 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 inglês) é a implementaç ão de métodos em subclasses que possuem o mesmo nome e mesma

Page 28: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

28

assinatura de métodos de sua superclasse, de tal fo rma que anule o comportamento que ele apresentava em sua superclasse ou apenas acrescente novas instruções. As seguintes regras devem ser respeitadas ao sobrescrever um método de uma superclasse:

� O novo método deve ter exatamente o mesmo nome daquele que queremos sobrescrever;

� O método deverá ter a mesma lista de parâmetros (assinatura);

� O retorno do método deverá ser o mesmo do método que estamos sobrescrevendo;

� Não podemos lançar Exceptions que não estejam declaradas no método, ou seja, apenas a mesma Exception declarada na assinatura do método ou que sejam subclasses daquela declarada;

� Um método static não pode sobrescrever um método não static e vice-versa;

� Um método não dever ter um modificador de acesso mais restritivo que o método sobrescrito;

Veja abaixo um exemplo da sobrescrita de métodos. 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 método "metodoImprimir" da classe "ClasseFilha" está sobrescrevendo o método de mesmo nome da classe "SuperClasse". Sobrescrita do método toString()

Page 29: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

29

A classe Object, como já descrito anteriormente, é a classe pai de todas as classes da hierarquia de cla sses Java. Esta classe possui um método chamado toString(), q ue tem como objetivo retornar uma representação em Str ing do objeto em questão. Segundo o javadoc, é recomendado que todas as subclasses sobrescrevam este método. Caso este método não seja sobrescrito e seja invoc ado 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 sobrescr eve o método toString() da classe Object . O novo métod o faz uma concatenação de todos os atributos da classe e retorna a string desta concatenação. Observe no método main que existem duas formas de invocar o método toString(): A primeira é chamando

Page 30: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

30

explicitamente o método e a segunda é chamando o mé todo println passando como parâmetro o próprio objeto. Veja abaixo a saída gerada pela execução da classe Pessoa:

Leandro 25 Rua XV 2586-3247 Leandro 25 Rua XV 2586-3247

Caso a classe Pessoa não sobrescrevesse o método toString(), a saída gerada pela execução da classe seria a seguinte:

Pessoa@10b62c9 Pessoa@10b62c9

Polimorfismo Polimorfismo é uma palavra de origem grega que significa muitas formas. Polimorfismo é um mecanismo da POO que possibilita a sobrecarga de métodos e construtores dentro de uma mesma classe ou sobrecarga de métodos em subclasses e a sobrescrita de métodos em subclasses. O polimorfismo ocorre quando um mesmo trecho de có digo assume comportamentos diferenciados de acordo com o estado do objeto. Em outras palavras, quando subtipos herd am um comportamento de um supertipo, porém o executam de forma diferenciada. Veja o exemplo abaixo: Bicho.java public class Bicho{ public void fala(){ } }

Cachorro.java public class Cachorro extends Bicho{

Page 31: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

31

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 método fala. Note que a cla sse Bicho é a generalização das classes Cachorro e Gato , logo todo cachorro é um Bicho e todo Gato também é um Bi cho. Com isto é possível armazenar a instância do objet o Cachorro ou Gato em uma variável do tipo Bicho e co m isto podemos realizar o polimorfismo através do método f ala. Vamos ver agora mais um exemplo para desenvolver o entendimento acerca do mecanismo de polimorfismo. V amos analisar o diagrama de classes abaixo. A classe Veículo será a superclasse das outras dua s classes (Ônibus e caminhão) e será utilizada para demonstrar tanto a sobrecarga de construtores quant o a sobrecarga de métodos. As classes Ônibus e Caminhão , por sua vez, ilustrarão a sobrescrita de métodos.

Page 32: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

32

Veja abaixo a classe Veículo. public class Veiculo{

- pesoCarga: int

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

Caminhao Onibus

- 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

Veiculo

- passageiros: int

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

Page 33: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

33

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(); } }

A classe veículo compõe-se de dois atributos priva dos, dois construtores e sete métodos, incluindo o métod o main(). A presença de duas versões distintas do con strutor

Page 34: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

34

caracteriza o primeiro caso de sobrecarga dessa cla sse, e a presença de duas versões distintas do método setAno () caracteriza o segundo caso. A declaração extends não está presente na implementação da classe Veículo, o que significa qu e ela, implicitamente, deriva diretamente da classe Object . Seus atributos, placa e ano, representam duas caracterís ticas comuns dos objetos do mundo real que essa classe representa: os veículos em geral. A presença de duas versões distintas para o constr utor da classe Veículo só é possível porque a linguagem Java dá suporte ao polimorfismo. Caso ele não fosse suporta do, seria necessário excluir uma das versões do constru tor e manter apenas uma. Note também a sobrecarga do método setAno() que po ssui duas assinaturas, uma com parâmetro do tipo int e o utra do tipo String. O método mostrarDados() da classe veículos apresen ta na tela as informações contidas nos atributos placa e ano. Este método é importante, dentro do contexto deste exemplo, pois o mesmo também será implementado nas classes Ô nibus e Caminhão e com isto será possível exemplificar a sobrescrita de métodos. 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()); } }

Note na classe Ônibus que a mesma estende a classe Veículo, e com isto herda todos os atributos e méto dos da mesma. Além disto, a classe Ônibus declara um atrib uto que

Page 35: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

35

é específico dos Ônibus: o atributo "passageiros", que representa a quantidade de passageiros presentes no Ônibus. A classe Ônibus declara um único construtor que re cebe como parâmetro a placa, o ano e passageiros para o Ônibus. Para iniciar os atributos placa e ano, é feita a ch amada do construtor de sua superclasse, ou seja, a classe Ve ículo. A classe Ônibus realiza a sobrescrita do método mostrarDados() de sua superclasse, ou seja, o métod o da classe Ônibus realizar uma tarefa diferente daquele implementado na superclasse. Veja abaixo a classe Caminhão. 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 Caminhão que a mesma estende a clas se Veículo, e com isto herda todos os atributos e méto dos da mesma. Além disto, a classe Caminhão declara um atr ibuto que é específico dos Caminhões: o atributo "pesoCar ga", que representa a o peso da carga do caminhão. A classe Caminhão declara um único construtor que recebe como parâmetro a placa, o ano e pesoCarga pa ra o Caminhão. Para iniciar os atributos placa e ano, é feita a chamada do construtor de sua superclasse, ou seja, a classe Veículo. A classe Caminhão realiza a sobrescrita do método mostrarDados() de sua superclasse, porém ao contrár io da classe Ônibus que faz uma implementação diferente d o método mortarDados() da superclasse, o método mostrarDados () da

Page 36: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

36

classe Caminhão realiza uma tarefa complementar ao método da superclasse, pois dentro deste método é feita a chamada ao seu correspondente na superclasse e em seguida r ealiza a sua tarefa específica. Após a compilação destas classes e execução da cla sse Veículo, veja abaixo a saída 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

Conversão de Tipos (Type Casting) A operação de cast de objetos é semelhante à opera ção de cast de tipos primitivos, com a diferença que, n o segundo o tipo e a estrutura da variável são altera dos definitivamente e, no primeiro, as características e funcionalidades estarão apenas ocultas, podendo ser restituídos posteriormente. Veja a estrutura hierárquica das classes abaixo:

É possível fazer cast de classes desde que estejam em uma mesma hierarquia; não podemos fazer cast entre classes "irmãs", tal como entre Funcionário e Cliente.

Object

Pessoa

Cliente Funcionário

Page 37: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

37

É importante ressaltar que o cast não representa u ma mudança estrutural do objeto, mas tão somente o tip o de variável reference que está apontando para o objeto na memória. Cast up Com base na hierarquia de classes do diagrama anterior, podemos concluir que: Cliente é uma Pessoa e toda Pessoa é um Object. Portanto, podemos realizar a operação de cast up, visualizando um objeto da classe Cliente como Pesso a ou Object, mas o objeto não perderá definitivamente su as características de Cliente. Veja o exemplo abaixo: public class TesteCastUp{ public static void main ( String args[]){ //O objeto c foi declarado e instanciado como Clie nte Cliente c = new Cliente(); //Cast up explicito do objeto da classe Cliente par a a classe Pessoa Pessoa p = (Pessoa) c; //Cast up do objeto da classe Cliente para a class e 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 pa ra a classe Object Object o = ( Object ) c; //Cast up do objeto da classe Cliente para a class e Object Object o2 = c; } }

Cast down

Page 38: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

38

A operação de cast down é oposta à operação de cas t up, isto é, ao invés de generalizarmos um objeto va mos especializá-lo. A generalização é uma operação mais previsível do que especialização, porque a análise da hierarquia de c lasses permite saber se a operação é ou não possível, na especialização, ao contrário, a operação irá depend er da forma como o objeto foi criado. Por exemplo, se um objeto é criado e declarado com o Cliente, e sofre um cast up para Pessoa, é possível fazer o cast down para voltar a visualizá-lo como Cliente, uma vez que foi criado como Cliente. No entanto, se um obje to é criado e declarado como Pessoa, não é possível faze r o cast down para transformá-lo em Cliente. Lembrando que: Todo Cliente é uma Pessoa, mas nem toda Pessoa é um Cliente, assim a operação de cast down deverá ser feita sempre de forma explícita. 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 especialização da Pessoa, logo sem pre é possível fazer um cast (up) de Cliente para Pesso a, porém só é possível fazer cast (down) de Pessoa para Clie nte se o objeto armazenado em uma variável do tipo Pessoa fo r 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 exceção em t empo de execução. Esta exceção chama-se "ClassCastException ", ou

Page 39: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

39

seja, houve a tentativa de converter um objeto gera do a partir da classe Pessoa para um objeto da classe Cl iente. Veja abaixo a saída gerada pela execução do progra ma acima. Exception in thread "main" java.lang.ClassCastExcep tion: Pessoa at TesteCastDown.main(TesteCastDown.java:16 ) Exemplo sobre conversão de tipos Vamos analisar o exemplo abaixo para entender melh or a conversão de tipos para objetos. Quando analisar as classes tenha em mente o diagra ma de classes que está no início do tópico "Conversão 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" ); } }

Teste.java

Page 40: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

40

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 Funcionário. A classe Teste foi criada somente para dar suporte ao exemplo de polimorfismo e type casting. Note que a classe Pessoa possui o método imprimir, o qual exibe na tela uma mensagem dizendo que está de ntro da classe Pessoa. As classes Cliente e Funcionário estendem a classe Pessoa (herança), sobrescrevem o método imprimir e cada uma imprima a sua mensagem na tela. A classe Teste possui o método main e o método converter. No método main é criado um objeto da cla sse Cliente e outro da classe Funcionário. Em seguida o método converter é chamado duas vezes : Na primeira passando como parâmetro um objeto da class e Cliente e na segunda passando um objeto da classe Funcionário. Este procedimento só é possível porque Java suport a a orientação a objetos, uma vez que na assinatura do método converter podemos definir como parâmetro um objeto da classe Pessoa que é superclasse das classes Cliente e Funcionário.

Page 41: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

41

Com isto, na chamada do método converter é feito u m cast up de Cliente para Pessoa e em seguida de Func inário para Pessoa. Já dentro do método converter verifica-se se o parâmetro é uma instância da classe Cliente, e em c aso afirmativo, faz-se um cast down de Pessoa para Clie nte e em seguida chama-se o método imprimir. Caso o parâmetro não seja uma instância da classe Cliente, significa que o mesmo é uma instância da c lasse Funcionário, e com isto é feito um cast down de Pes soa para funcionário e logo após chama-se o método imprimir.

Page 42: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

42

Exercícios Sobre Java e o Paradigma Orientado a Objeto 1) Qual a diferença entre classe e objeto?

R: Um objeto é a instância de uma classe. Ou seja, um a variável do tipo de dado definido pela classe. A classe estabelece o formato dos objetos, portant o define um tipo de dado. É a representação de um conjunto de o bjetos que compartilham as mesmas características e comportame ntos. 2) Qual é a finalidade do método construtor?

R: É o responsável pela instanciação do objeto. 3) Identifique na instrução abaixo: a classe, o objeto , o

construtor e a operação de instanciação. Computador computador = new Computador();

R: Computador � classe computador � objeto Computador() � construtor new Computador(); � operação de instanciação 4) O que diferencia um construtor de um método qualque r?

R: O Construtor tem o mesmo nome da classe, inicia co m a diretiva de encapsulamento public, não possui um tipo de ret orno e não pode ser precedido por nenhum tipo de qualificador. 5) Observe que a classe abaixo não possui um construto r,

porém para que seja criado um objeto sempre é necessário utilizar o operador new seguido do nome do construtor. Desta forma, não será possível 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; } }

Page 43: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

43

R: Quando não é declarado explicitamente um construto r em uma classe, o compilador adiciona um construtor padrão (default) durante o processo de compilação. Logo será possível criar um objeto desta classe porque após a compilação a mesma irá possuir o construtor default. 6) A classe abaixo é parecida com a classe do exercíci o

anterior, porém agora ela possui um construtor alternativo. O que irá acontecer se em outra classe você desejar criar um objeto da mesma com a seguint e instrução:

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; } }

R: Irá ocorrer um erro de compilação, pois ao definir um construtor alternativo, o compilador não adiciona o construtor padrão, logo não existe na classe um construtor sem parâmetros. 7) As duas classes abaixo não estão no mesmo pacote. F aça

uma análise das mesmas e corrija possíveis erros de compilação.

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 ; } }

Page 44: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

44

R: public class Carro{ protected int litrosNoTanque; protected boolean carroLigado; public void encherTanque( int litros){ litrosNoTanque = litros; } public void ligarCarro( boolean carroLigado){ this .carroLigado = carroLigado; } }

public class TesteCarro{ public static void main ( String args[]){ Carro carro = new Carro(); carro.encherTanque(10); carro.ligarCarro( true ); } } 8) Observe as classes Circulo e TesteCirculo abaixo e

realize as seguintes tarefas:

- Declare o atributo raio da classe Circulo como privado;

- Crie os métodos necessários na classe Circulo de modo que seja possível obter ou alterar o valor do atributo raio pela classe TesteCirculo;

- Caso o objetivo seja alterar o valor do atributo raio, faça a seguinte verificação: Se o valor do novo raio for positivo, faça a atribuição, caso contrário não faça;

- Siga as orientações presentes na classe TesteCirculo e execute cada tarefa;

public class Circulo{ double raio; }

public class TesteCirculo{ public static void main ( String args[]){ /* Crie um objeto da classe Circulo */ /* Coloque aqui o codigo para alterar o raio para 1 0 */ /* Coloque aqui o codigo para obter o valor do raio */ } }

Page 45: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

45

R: public class Circulo{ private double raio; public void setRaio( double raio){ if (raio > 0) this .raio = raio; } public double getRaio(){ return raio; } }

public class TesteCirculo{ public static void main ( String args[]){ Circulo circulo = new Circulo(); circulo.setRaio(10); double raio = circulo.getRaio(); } }

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 métodos necessários na classe AcessaBanco de modo que seja possível obter ou alterar o valor dos atributos login e conectado pela classe TesteBanco;

- Siga as orientações presentes na classe TesteBanc o 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 par a true */ } }

Page 46: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

46

R: public class AcessaBanco{ private String login; private boolean conectado; public void setLogin( String login){ this .login = login; } public String getLogin(){ return login; } public void setConectado( boolean conectado){ this .conectado = conectado; } public boolean isConectado(){ return conectado; } }

public class TesteBanco{ public static void main ( String args[]){ AcessaBanco banco = AcessaBanco(); banco.setLogin( "Glauco" ); banco.conectado( true ); } }

10) Analise o código abaixo e descreva em poucas linhas

onde está o erro de compilação e qual seria a soluç ão 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; } }

R: O método main é estático e dentro do mesmo está se ndo feita a chamada a um método não estático (iniciar). Um método não estático (iniciar) não pode ser refe renciado dentro de um contexto estático, ou seja, dentro do método main.

Page 47: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

47

A solução para o problema pode ser implementada de duas formas: A primeira seria declarar o método iniciar como estático. A segunda seria criar um objeto da classe TesteS tatic e por meio deste objeto invocar o método inciar. 11) Analise as classes abaixo e descreva em poucas linh as

se existe erro de compilação ou não. E caso exista algum, descreva qual deveria ser a solução.

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; } }

R: A classe Veículo foi declarada com o modificador f inal, e isto indica que a mesma não poderá ser estendida por nen huma outra, porém a classe Carro está estendendo a classe Veículo, e is to não é permitido. Logo o compilador Java irá gerar um erro de compila ção. 12) A classe Jogo abaixo foi descrita sem atributos e

métodos. public class Jogo{ }

Logo após o processo de compilação foi utilizado o utilitário javap (que transforma código binário em código Java) e o mesmo retornou o código abaixo.

public class Jogo extends java.lang.Object{ public Jogo(); }

Note que existem mais informações no código gerado pelo utilitário javap do que o código original. O que aconteceu?

Page 48: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

48

R: A classe Object é a super classe de todas as class es Java. Quando uma classe não é declarada filha de nenhuma outra, a mesma é assumida como filha da classe Object e quem faz est a declaração é o compilador Java. Note que no código original também não foi declara do nenhum construtor, e quando isto ocorre o compilador Java também adiciona um construtor padrão (default). 13) Analisando a classe Java abaixo podemos observar qu e a

mesma possui apenas um atributo, um construtor e do is métodos.

Perceba que dentro do método main estão sendo invocados métodos e atributos que não pertencem à classe. Isto é um erro de compilação? Justifique sua resposta.

public class PessoaFisica extends Pessoa{ private String RG; public PessoaFisica(){ super (); } public String getRG(){ 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); } }

R: Isto não é um erro de compilação, pois a classe Pe ssoaFisica está herdando da classe Pessoa os métodos setEndere co, setFone e os atributos endereço e fone. 14) Faça um programa em Java para implementar uma

calculadora simples com as quatro operações básicas da matemática. Crie três métodos para cada uma das operações e cada método deverá ser sobrecarregado, pois um deles deve receber apenas dois parâmetros do tip o int, o outro apenas dois parâmetros do tipo float e o último apenas dois parâmetros do tipo String. Quand o os parâmetros forem do tipo String, os mesmos deverão ser convertidos para o tipo int.

Page 49: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

49

15) Crie uma classe Java chamada ClienteBanco com os seguintes atributos (privados):

- nome; - Data de Nascimento; - CPF; - endereço;

Além do construtor padrão, crie um construtor alternativo para iniciar cada um dos atributos. Crie os métodos necessários para acessar estes atributos. Faça a sobrescrita do método 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 " <endereço> "vem por meio desta solicitar o encerramento de sua conta corrente".

Crie um método main e dentro do mesmo faça com que a mensagem gerada pelo método toString() seja impressa na tela.

16) Crie uma classe Java chamada Pessoa com os seguinte s

atributos privados: - nome; - Data de Nascimento;

Crie os métodos necessários para acessar estes atributos. Crie também um método chamado "informarI dade", este método deve imprimir na tela a idade desta pes soa em anos, meses e dias. Crie um método main para criar um objeto da classe Pessoa, inicie os atributos "nome" e "Data de nasci mento" e em seguida chame o método "informarIdade" para que o mesmo informe a idade desta Pessoa. 17) Crie uma classe Java para um Celular, com os seguin tes

atributos: modelo (String) e número (int). - Faça o encapsulamento destes atributos; - Faça a sobrecarga do método que irá alterar o

valor do atributo número, permitindo que o programador informe uma string ou um inteiro;

- Faça a sobrescrita do método correto da classe Object para retornar uma string que representa a concatenação dos atributos da classe.

Page 50: Conceito de classe, características (atributos), Ações ... · atividades envolvidas em um projeto orientado a objetos são as seguintes: ... Exemplos de objetos do mundo real:

50

R: public class Celular { private String modelo ; private int numero ; public String getModelo() { return modelo ; } public void setModelo(String modelo) { this . modelo = modelo; } public int getNumero() { return numero ; } public void setNumero( int numero) { this . numero = numero; } public void setNumero(String numero) { this . numero = Integer. parseInt (numero); } public String toString(){ return "modelo: " + this . modelo + "\n" + "número: " + this . numero ; } }

18) fddfd