UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas Programação Orientada a Objetos - 3º semestre Prof. André Moraes 6 AULA 04 COMPORTAMENTO DOS OBJETOS Sabe-se que os objetos possuem um estado e comportamento, representados pelas variáveis de instância e também os métodos. Mas ainda estão faltando alguns detalhes de como é estado e o comportamento estão relacionados. Vimos em exemplos anteriores que as instâncias podem ter seus próprios valores exclusivos para as variáveis de instância. Vimos em exemplos anteriores um comportamento da classe cachorro onde cães de nomes diferentes que tinham um método latido() , e o som do latido a ser emitido pode ser diferente de acordo com a altura ou idade do cachorro que está latindo. Em outras palavras, vimos que os métodos usam os valores das variáveis de instância para poderem ser executados. O fato é que podemos enviar valores para um método, no caso do Cachorro, poderíamos enviar como parâmetro latido(4) e o mesmo seria executado 4 vezes. Porém sabemos que o método não exige que seja enviado argumento algum. 6.1 PARÂMETROS E ARGUMENTOS Dependendo da formalidade de alguns livros e/ou cursos relacionados a Ciência da Computação, é comum o uso do termo argumentos ou parâmetros para valores que são passados para um método. Embora sejam distinções formais na informática, precisaremos convencionar estes termos: Um método usa parâmetros, um chamador usa argumentos. Ou seja, argumentos serão os valores que serão passados aos métodos, podendo ser um valor como 2, ou uma string A, B, C; ou até mesmo uma referência que aponte para um objeto. Estes argumentos serão inseridos em um parâmetro, que por sua vez não passa de uma variável local. Uma variável com um tipo e um nome, que poderá ser usada dentro do corpo do método. Poderíamos realizar uma pequena alteração na classe Cachorro3, para que o método latido() possua parâmetros, referentes a quantidade de latidos a serem executados. Vejamos o exemplo: 6.1.1 EXEMPLO 1 – MODIFICANDO A CLASSE CACHORRO3 PARA POSSUIR PARÂMETROS DE LATIDOS Modificaremos as classes Cachorro3 para possuir parâmetros da quantidade de latidos a aceitar e TestaCachorro3 para que possa enviar a quantidade de latidos a ser executada. P á g | 25 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. No exemplo anterior da classe cachorro, utilizávamos o método latido() para fazer com que uma das instâncias criadas (Cachorro x = new Cachorro()) pudessem chamar o método e executar o latido. UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas Chamaremos a classe agora de Cachorro4.java Visualizando: OBSERVAÇÕES: • Na classe testadora (TestaCachorro4) chamamos o método latido() na variável de referência cao1 e passamos como argumento do método um valor qualquer, neste caso para cada variável de referência cao um valor de latidos; • Os valores informados serão os argumentos que foram passados para o método latido(); • Por sua vez, o método latido(), em sua estrutura, possui parâmetros da quantidade de latidos, que deverão ser sempre inteiros; P á g | 26 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Salve a classe testadora como TestaCachorro4.java UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas 6.2 PASSANDO MAIS VARIÁVEIS PARA MÉTODOS E RETORNANDO VALORES Métodos retornam valores. Todos os métodos são declarados com um tipo de retorno, mas até agora foram criados todos os métodos com um tipo de retorno void, significando que não retornam nada. Aqui, o método está trabalhando com valores inteiros, o que significa que o chamador também deverá ser inteiro e esperar que sejam retornados valores inteiros. Exemplificando: 6.2.1 EXEMPLO 2 – PASSANDO MAIS DE UMA VARIÁVEL PARA UM MÉTODO Criaremos duas novas classes simulando uma conta utilizando algumas variáveis. Estas variáveis trocarão valores por cópia, típico do Java, e veremos como as duas trocam informações em sua execução. Salve esta classe como TestaSomaNumeros.java Resultado: OBSERVAÇÕES: • Desta vez criamos uma classe SomaNumeros.java e declaramos apenas um método onde foram criadas duas variáveis inteiras (x e y) como parâmetros. • Ainda, internamente foi declarada uma variável z recebendo o valor de x e y somados, note que estes valores serão informados pelo chamador que enviará os números a serem utilizados; P á g | 27 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Salve esta classe com o nome SomaNumeros.java UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas • Ainda, o retorno deste método é apenas uma impressão de tela contendo o valor de z, que é a soma de x e y; • Na classe testadora TestaSomaNumeros.java, foram declaradas duas variáveis inteiras (com nomes diferentes), criamos uma variável de referência t ao objeto SomaNumeros e chamamos o método somatorio; • O método somatorio() exige que sejam informadas as variáveis de argumento que são esperadas como inteiros, elas serão recebidas pelos parâmetros x e y do método, calculadas e retornados com o valor atribuído a z, visível ao usuário; Alguns detalhes a mais: 1. Os métodos podem usar variáveis de instância para que objetos do mesmo tipo possam se comportar diferentemente; 2. Um método pode ter parâmetros, o que significa que podemos passar um ou mais valores para ele; 3. A quantidade e o tipo dos valores que forem passados devem corresponder à ordem e tipo dos parâmetros declarados pelo método; 5. Se um método declarar um tipo de retorno que não seja void, deve retornar um valor compatível com o tipo declarado. 6.3 UTILIZANDO MELHOR OS PARÂMETROS E TIPOS DE RETORNO Agora que sabemos que os parâmetros e tipos de retorno podem ser utilizados, podemos fazer uma outra abordagem sobre o uso deles. Existem métodos comumente utilizados no Java que são denominados como Getter e Setter, podemos visualizá-los como acessadores e modificadores. Em outras palavras, métodos Getter (captura) e Setter (configuração), permitirão que capturemos e configuremos normalmente valores de variáveis de instância dos objetos. A única finalidade de um método de captura é enviar, como valor de retorno, o valor do que quer que esse método de captura específico capture. Um exemplo disto seria: GuitarraEletrica cor numCordas() defineUso getCor() setCor() getNumCordas() setNumCordas() getDefineUso() setDefineUso() Aqui estamos seguindo a convenção de nomes do Java. Os gets e sets trabalham as informações da classe e podem “setar” e “recuperar” os valores das variáveis. P á g | 28 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. 4. Um método deve declarar um tipo de retorno, um tipo de retorno void significa que o método não retorna nada; UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas 6.3.1 EXEMPLO 3 – ELABORANDO UMA PROTEÇÃO AOS SEUS DADOS DE UMA CLASSE Criaremos uma classe GuitarraEletrica, esta será composta pelas variáveis de instância cor, numCordas e defineUso. E desta vez teremos uma série de métodos, utilizados para efetuar o tráfego dos dados das suas variáveis. Salve a classe testadora como TestaGuitarraEletrica.class OBSERVAÇÕES: • Agora o que estamos fazendo chama-se Encapsulamento. Significa que estamos ocultando o acesso direto às informações existentes na classe. • Por exemplo, não mais permitiremos que os dados sejam acessados diretamente com o operador ponto como: P á g | 29 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Salve esta classe como GuitarraEletrica.class UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas o • dadosPessoa.altura = 0; O que acontece é que estamos construindo métodos de configuração para todas as variáveis de instância e encontrando uma maneira de forçarmos os outros códigos a chamarem estes métodos em vez de acessar os dados diretamente. 6.4 ENCAPSULAMENTO COM OS MODIFICADORES PUBLIC E PRIVATE O que precisamos fazer agora é ocultar e proteger os dados.Fazemos isto com os modificadores de acesso public e private, o public foi utilizado em todos os métodos main até agora e em quase todas as classes que foram desenvolvidas. Para todos os efeitos, podemos proteger as variáveis de instância da classe através do modificador private, e com o modificador public deixarmos acesso somente aos métodos que modificam ou recuperam as informações das variáveis de instância. O encapsulamento permite que possamos definir os limites de valores que são apropriados de serem atribuídos as variáveis de instância. P á g | 30 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Ainda assim, se tentarmos acessar os dados com o operador ponto na classe GuitarraEletrica será possível: UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas 6.4.1 EXEMPLO 4 – MODIFIQUE A CLASSE GUITARRAELETRICA Agora a classe testadora não mais conseguirá acessar diretamente os valores das variáveis de instância utilizando o operador ponto. Praticamente todas as classes devem proteger as suas informações, sob pena de serem utilizados valores inválidos para elas ou corrermos o risco de serem alteradas com valores fora do normal. Por exemplo, uma conta de banco onde o saldo da conta for zerado, ou aumentado sem a devida situação. P á g | 31 Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Se tornarmos as variáveis da classe GuitarraEletrica privadas, veremos que ao tentar compilar a classe testadora teremos o seguinte erro (parte dele): UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas 6.4.2 EXEMPLO 5 – ENCAPSULANDO A CLASSE CACHORRO Agora faremos o mesmo com a classe cachorro, encapsularemos suas informações para que possam ser validadas para serem modificadas ou acessadas externamente pelo código de outras classes: Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. Esta é a classe Cachorro5.java Esta é a classe testadora TestaCachorro5.java OBSERVAÇÕES: • Qualquer local onde um valor específico puder ser usado, uma chamada de método que retorne esse tipo poderá ser empregada; P á g | 32 UC – Prog. Orientada a Objetos Docente: André Luiz Silva de Moraes 3º sem – Análise e Desenvolvimento de Sistemas o Int x = 3 _+ 24; Int x = 3 + um.getSize(); Ainda que métodos não adicionem realmente uma nova funcionalidade, o interessante é que você pode mudar de idéia posteriormente e mudar para tornar o método de privado para público e vice versa. Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004. • Ex: P á g | 33