Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO ORIENTADA A OBJETOS OBJETIVOS DE APRENDIZAGEM > Descrever o processo de criação de objetos e classes. > Explicar a criação de atributos e métodos. > Apresentar conceitos de abstração. Introdução A programação orientada a objetos é um dos principais paradigmas de pro- gramação usados atualmente. A linguagem Java é uma das mais populares linguagens orientadas a objetos. Segundo Deitel e Deitel (2010), os programas orientados a objetos costumam ser mais fáceis de entender, corrigir e modificar. Neste capítulo, você vai conhecer os fundamentos da programação orien- tada a objetos. Além disso, vai ver como criar classes e objetos na linguagem Java e como declarar atributos e métodos para uma classe. Por fim, vai aplicar na prática dois conceitos primordiais da orientação a objetos: abstração e encapsulamento. Fundamentos da orientação a objetos: classes e objetos A programação orientada a objetos consiste em criar modelos de objetos do mundo real dentro de sistemas computacionais. Observe os objetos à sua volta: todos eles têm algum estado, que podemos entender de forma simplificada como um conjunto de características de cada objeto, como forma, cor, peso, valor, etc. Eles também têm algum comportamento: as formas como ele se Classes e objetos Rafael Leal Martins comporta ou age. A programação orientada a objetos fornece uma maneira mais intuitiva de representar esses elementos do mundo real dentro de um programa. As características de um objeto no mundo real que podem ser representadas quantitativamente são chamadas de atributos, enquanto suas ações e comportamentos são codificadas como métodos. Segundo Schildt (2015), a programação orientada a objetos tem alguns princípios fundamentais: abstração, encapsulamento, herança e polimorfismo. Neste capítulo, trataremos sobre dois deles: abstração e encapsulamento. Abstração Os objetos do mundo real são complexos, com uma infinidade de caracterís- ticas, ações e comportamentos. Seria inviável, ou até impossível, representar todas essas informações dentro de um sistema de software. A abstração consiste em criar um modelo do objeto do mundo real dentro do software, e apenas as características, os comportamentos e as ações do objeto que são relevantes para o sistema desenvolvido são consideradas. O restante das informações do objeto é simplesmente ignorado. Uma pessoa do mundo real tem uma quantidade indefinida de características. Além de suas características físicas (altura, peso, idade, constituição óssea, muscular, etc.), cada pessoa também tem inúmeras características psicológicas, emocionais e cognitivas. Se considerarmos os comportamentos e as ações, esse número aumenta absurdamente. Cada indivíduo humano contém um universo único de características e possibilidades. Isso sem considerar as características (informações) sociais ligadas a uma pessoa, como o número de CPF, RG, CNH, etc. Entretanto, um sistema de cadastro de candidatos a uma vaga de traba- lho não está interessado em processar a grande maioria dessas informações. Ele manipula um conjunto muito restrito de informações das pessoas: nome completo, endereço, telefone, idade, nível de escolaridade, experiência pro- fissional e mais algumas outras informações relevantes para esse cenário específico. Já um sistema de cadastro de alunos de uma academia poderia estar interessada em outras informações sobre uma pessoa, como altura e peso. Um sistema de controle acadêmico de uma faculdade, por exemplo, se interessa- ria em processar as notas e quantidades de faltas de cada pessoa matriculada. A abstração consiste em observar um objeto complexo (pessoa) e mapeá-lo para um modelo relevante para o cenário em questão. Classes e objetos2 Encapsulamento Na programação orientada a objetos, o encapsulamento é uma forma de vincular o código e os dados que esse código trata, e isso mantém os dois seguros contra a interferência e a má utilização externa (SCHILDT, 2015). Em uma linguagem orientada a objetos, os dados e as operações que podem ser realizadas sobre eles podem ser vinculados de tal forma que se cria um sistema tipo “caixa preta”. Quando as instruções do programa e os dados são vinculados dessa forma, cria-se um objeto. O conceito de objeto é o que dá então suporte ao encapsulamento. Em um objeto, o código (métodos) e os dados (atributos) podem ser privados desse objeto ou públicos. Métodos ou atributos privados só são acessíveis dentro do próprio objeto, ou seja, o código ou os dados privados não podem ser acessados por uma parte do programa que esteja fora da estrutura do objeto. Quando os atributos e métodos são públicos, outras partes do programa podem acessá-los. Normalmente, as partes públicas de um objeto são usadas para fornecer uma interface de acesso para os seus elementos privados. Vamos nos basear em uma pessoa novamente para dar um exemplo sobre encapsulamento. Os pensamentos de uma pessoa são gerados e processados pelo seu cérebro. Se quisermos saber o que uma pessoa pensa sobre alguma coisa, obviamente não podemos acessar diretamente seu cérebro. Isso geraria consequências fatais. O cérebro de alguém é como um atributo privado, que só o próprio objeto pessoa tem acesso direto. Então, como saber o que uma pessoa pensa? Ela pode executar ações (métodos) que nos permitem ter o acesso autorizado: falar, escrever e desenhar o que pensa. A seguir, vamos estudar como criar classes em Java, com atributos e métodos. Criação de atributos e métodos em uma classe Segundo Deitel e Deitel (2010), a classe é o elemento essencial da linguagem Java. Classes são a fundação na qual a linguagem Java se estrutura, pois definem a natureza de um objeto. Na seção anterior, vimos que um objeto é Classes e objetos 3 uma espécie de cápsula (de onde vem o termo encapsulamento), contendo os dados e o código que manipula esses dados. Dentro de uma classe, são definidos dados, que em Java são chamados de atributos, e o código que age sobre eles, sendo contido em métodos. Pela definição de Schildt (2015, p. 101), “[...] uma classe é um modelo que define a forma de um objeto. Ela especifica tanto os dados quanto o código que operará sobre eles. Java usa uma especificação de classe para construir objetos. Os objetos são instâncias de uma classe”. Quando definimos uma classe, especificamos seus atributos, que são variáveis que serão comuns a qualquer objeto dela, e os métodos que operam sobre esses atributos. Embora classes muito simples possam conter apenas métodos ou apenas variáveis de instância, a maioria das classes do mundo real contém ambos. Uma classe é criada com o uso da palavra-chave class. Como exemplo, vamos criar uma classe chamada Cliente, que pode ser usada para um sistema de controle de clientes (alunos) de uma academia. Para cada cliente, desejamos armazenar as seguintes informações: � CPF; � nome completo; � telefone; � idade; � altura; � peso. Podemos então criar um arquivo chamado Cliente.java e nele escrever o código de uma classe para objetos que armazenam dados dos clientes, conforme o código mostrado a seguir: class Cliente { String cpf; String nome; String telefone; int idade; double altura; double peso; } Classes e objetos4 A classe Cliente é um bloco de código delimitado por chaves e é composta, por enquanto, apenas por seus atributos, que são variáveis declaradas dentro do bloco, representando as informações que especificamos anteriormente. A classe pode ser usada para criar objetos Cliente nos programas Java. Uma vez definida uma classe, podemos usá-la para criar objetos. Para criar um objeto em Java, usamos a seguinte instrução: NomeClasse nomeObjeto = new NomeClasse(); NomeClasse é o nome da classe desejada e nomeObjeto é o nome da variável que armazenará o objeto criado. O comando new NomeClasse(); criará, de fato, o objeto desejado. Quanto aos atributos, todo objeto de uma classe tem o conjunto de atri- butosdefinidos nela. Os atributos podem ser acessados diretamente usando: nomeObjeto.nomeAtributo Podemos ler e armazenar valores em atributos de objetos da mesma forma que fazemos com variáveis comuns em Java. Veja a seguir um exemplo de criação de um objeto da classe Cliente e o acesso aos seus atributos criada no exemplo anterior da academia. Os objetos da classe Cliente podem ser criados em um programa Java como mostrado a seguir: class AppCliente { public static void main(String[] args) { Cliente novoCliente = new Cliente(); novoCliente.cpf = "999.888.777-66"; novoCliente.nome = "Fulano de Tal"; novoCliente.telefone = "(62)9999-8888"; novoCliente.idade = 34; novoCliente.altura = 1.72; novoCliente.peso = 85.3; Classes e objetos 5 System.out.println("Nome do Cliente: " + novoCliente. nome); double imc = novoCliente.peso / (novoCliente.al- tura * novoCliente.altura); System.out.println("IMC: " + imc); } } Nesse código, criamos um objeto da classe Cliente denominado novo- Cliente. Em seguida, atribuímos valores aos seus atributos e, finalmente, utilizamos os valores dos atributos para imprimir o nome do cliente e calcular seu índice de massa corporal (IMC), que é exibido ao final. As classes também podem conter métodos. Os métodos são sub-rotinas que processam os atributos da classe e, em muitos casos, dão acesso a esses dados. Quase sempre, outras partes do programa interagem com uma classe por seus métodos. Um método contém uma ou mais instruções. Cada método tem um nome, e é esse nome que é usado para chamá-lo. A forma geral de um método é mostrada a seguir: tipoRetornado nomeMetodo(listaParametros) { instruções ... return valor; } tipoRetornado é o nome do tipo de dado retornado. Um método pode retornar qualquer tipo de dado aceito em Java, desde tipos primitivos (int, char, double, float, etc.) até tipos de referência de objetos (como string, arrays ou qualquer outra classe definida na linguagem Java ou pelo progra- mador). nomeMetodo é um identificador para o método e fica a critério do desenvolvedor. listaParametros é uma sequência de pares separados por vírgulas compostos por tipo e identificador. Os parâmetros são basicamente variáveis que recebem o valor dos argumentos passados para o método quando ele é chamado. Se o método não tiver parâmetros, a lista estará vazia. Dentro do corpo do método, escrevemos uma sequência de instruções Java para realizar o processamento desejado (não há limites para a quantidade de Classes e objetos6 instruções inserida em um método). Finalmente, um método pode retornar algum valor quando chamado em um programa. Embora possa haver métodos com tipo de retorno void, que não retornam valor, a maioria dos métodos retorna um valor. A possibilidade de retornar um valor é um recurso útil dos métodos. Veja a seguir alguns exemplos de definição de métodos para uma classe Java. Exemplos Vamos criar dois métodos para a classe Cliente definida anteriormente. Criaremos um método denominado calcularIMC, que retorna o valor do IMC de um objeto cliente a partir dos valores dos seus atributos peso e altura. Também vamos criar um método denominado calcularPesoDesejado, que retorna a diferença do peso atual do cliente para o peso que ele deseja alcançar. Por fim, vamos criar o método imprimirDados, que imprime na tela do console os dados do cliente. O código Java para esses métodos é mostrado a seguir: class Cliente { String cpf; String nome; String telefone; int idade; double altura; double peso; double calcularIMC() { double imc = peso / (altura * altura); return imc; } double calcularPesoDesejado(double metaPeso) { if (peso > metaPeso) return peso - metaPeso; else return metaPeso - peso; } Classes e objetos 7 void imprimirDados() { System.out.println( "CPF=" + cpf + ", Nome=" + nome + ", Telefone=" + telefone + ", Idade=" + idade + ", Altura=" + altura + "m" + ", Peso=" + peso + "Kg"); } } Observe, no método calcularIMC, que seu tipo retornado é double e, ao final do seu bloco de execução, a palavra return seguida do valor a ser retornado. O tipo de dado do valor após o return deve ser compatível com o tipo de retorno declarado pelo método. Veja também que esse método não usa parâmetros de entrada, logo sua lista de parâmetros está vazia. O método calcularPesoDesejado requer que um parâmetro chamado de metaPeso do tipo double seja fornecido para que ele possa realizar seu processamento. O método imprimirDados não retorna qualquer valor específico; ele apenas imprime na tela os valores dos atributos do objeto. Por isso, ele é declarado com o tipo de retorno void. Uma vez que uma classe tenha métodos definidos, é possível chamar esses métodos dentro do programa Java de forma similar à forma como se acessa os atributos de um objeto. Os métodos da classe Cliente criados no nosso exemplo anterior podem ser utilizados em um programa Java da seguinte forma: class AppCliente { public static void main(String[] args) { Cliente novoCliente = new Cliente(); novoCliente.cpf = "999.888.777-66"; novoCliente.nome = "Fulano de Tal"; novoCliente.telefone = "(62)9999-8888"; novoCliente.idade = 34; novoCliente.altura = 1.72; novoCliente.peso = 85.3; Classes e objetos8 novoCliente.imprimirDados(); System.out.println("IMC: " + novoCliente.calcularIMC()); double dif = novoCliente.calcularPesoDesejado(70.0); System.out.println("Você está a " + dif + "Kg da su a meta!"); } } Esse código, além de criar um objeto da classe Cliente denominado no- voCliente e atribuir valores aos seus atributos, invoca os métodos definidos na classe. A saída desse programa é mostrada a seguir: Depois de estudar os atributos e métodos, você vai ver na próxima seção como garantir o seu encapsulamento. Garantia do encapsulamento para as classes Segundo Schildt (2015), a restrição do acesso a atributos e métodos de uma classe é parte fundamental do conceito de encapsulamento na programa- ção orientada a objetos, pois ajuda a impedir a má utilização de um objeto. Quando se restringe o acesso a dados privados apenas por intermédio de um conjunto definido de métodos, é possível impedir que valores inapropriados sejam atribuídos a esses dados (executando uma verificação, por exemplo). Um código de fora da classe não pode definir o valor de um atributo ou executar um método privado diretamente. Também é possível controlar exatamente como e quando os dados de um objeto serão usados. Modificadores de acesso O controle de acesso a atributos e métodos é obtido com o uso de três modi- ficadores de acesso: public, private e protected. Se nenhum modificador de acesso for usado, será presumido o uso da configuração de acesso padrão. Classes e objetos 9 A visibilidade de um elemento é determinada por sua especificação de acesso (private, public, protected ou padrão, sem modificador) e pelo pacote em que ele reside. Logo, a visibilidade de um elemento é determinada por sua visibilidade dentro de uma classe e por sua visibilidade dentro de um pacote. Um pacote é, basicamente, um agrupamento de classes. Todas as classes em Java pertencem a algum pacote. Quando não é especificada uma instrução package, o pacote padrão (global) é usado. O pacote padrão não tem nome, sendo transparente para o usuário. Se o atributo e/ou método de uma classe não tiver um modificador de acesso explícito, ou seja, se tiver acesso padrão, ele pode ser visto dentro de seu pacote, mas não fora dele. Portanto, você usará a especificação de acesso padrão para elementos que quiser manter privados para outras classes fora do pacote, mas públicos para as classes dentro dele. Atributos e métodos declarados explicitamentecomo public podem ser vistos em todos os locais, inclusive em classes e pacotes diferentes, pois não há restrição quanto ao seu uso ou acesso. Um atributo e/ou método private só pode ser acessado por outros atributos e métodos de sua classe. Ele não é afetado por sua associa- ção a um pacote. Um atributo e/ou método especificado como protected pode ser acessado dentro de seu pacote e por todas as subclasses, inclusive subclasses de outros pacotes. Veja a seguir um exemplo do uso dos modificadores de acesso e seu impacto no acesso aos atributos e métodos de uma classe. Exemplo Vamos implementar a classe DeDentro, que tem atributos declarados como public, private, protected e sem modificador (ou seja, acesso padrão). Essa classe está inserida em um pacote chamado meupacote. O arquivo dessa classe (DeDentro.java) deve estar inserido dentro de uma subpasta com o nome meupacote, para que o código funcione corretamente. Dentro desse pacote (subpasta), criaremos uma outra classe, denominada DoPacote, que tentará acessar os atributos da classe DeDentro. Também vamos criar uma terceira classe chamada de DeFora, que ficará de fora do pacote meupa- cote (ou seja, dentro do pacote padrão de Java). Os arquivos estão organizados como mostra a figura a seguir. Classes e objetos10 Agora observe os códigos das classes: package meupacote; public class DeDentro { public int A; private double B; protected char C; String D; //Acesso padrão public void atribuirValores() { A = 1; B = 2.0; C = '3'; D = "4.0"; } public void imprimirAtributos() { System.out.println("A: " + A); System.out.println("B: " + B); System.out.println("C: " + C); System.out.println("D: " + D); } } A classe DeDentro tem quatro atributos (A, B, C, D) de tipos variados, cada um com um modificador de acesso. Ela também declara dois métodos public: atribuirValores, que insere valores arbitrários nos seus atributos, e imprimirAtributos, que imprime na tela os valores dos atributos da Classes e objetos 11 classe. Note que qualquer atributo, independentemente do tipo de modifi- cador de acesso, é acessível de dentro da classe DeDentro. Observe agora a classe DoPacote, inserida no mesmo pacote da classe DeDentro: package meupacote; public class DoPacote { public static void main(String[] args) { DeDentro objeto = new DeDentro(); objeto.A = 10; //OK: o atributo A foi declarado como public //objeto.B = 7.0; //ERRO: o atributo B foi declarado como private objeto.C = 'R'; //OK: o atributo C foi declarado como protected objeto.D = "Teste de acesso"; //OK: o atributo D tem acesso padrão objeto.atribuirValores(); objeto.imprimirAtributos(); } } Essa classe cria um objeto da classe DeDentro e tenta acessar seus atributos e métodos. Por estar no mesmo pacote (meupacote) da classe DeDentro, ela pode acessar tudo que é declarado como public, protected e com acesso padrão, mas não pode acessar o atributo B, que foi declarado como private. Quando ela chama os métodos atribuirValores e impri- mirAtributos, entretanto, o valor de B é atribuído e exibido na tela. Isso ocorre porque quem está acessando os valores de B nesse caso são métodos definidos na própria classe DeDentro. Por fim, veja o código para a classe DeFora, criada no pacote padrão, ou seja, fora do pacote meupacote: import meupacote.DeDentro; public class DeFora { public static void main(String[] args) { DeDentro objeto = new DeDentro(); objeto.A = 10; //OK: o atributo A foi declarado como public //objeto.B = 7.0; //ERRO: o atributo B foi declarado como private Classes e objetos12 //objeto.C = 'R'; //ERRO: o atributo C foi declarado como protected //objeto.D = "Teste de acesso"; //ERRO: o atributo D tem acesso padrão objeto.atribuirValores(); objeto.imprimirAtributos(); } } Como estão em pacotes diferentes, para poder criar um objeto da classe DeDentro, a classe DeFora precisa importar a classe por meio do comando import. Essa classe só pode acessar diretamente o que foi declarado como public no objeto da classe DeDentro criado. A linguagem Java tem ainda várias formas de uso para métodos e atributos. Para uma referência mais completa, recomenda-se o estudo da documentação padrão da linguagem Java, disponível no site da Oracle (THE JAVA tutorials, c2021). Referências DEITEL, P.; DEITEL, H. Java: como programar. 8. ed. São Paulo: Prentice-Hall, 2010. SCHILDT, H. Java para iniciantes: crie, compile e execute programas Java rapidamente. 6. ed. Porto Alegre: Bookman, 2015. THE JAVA tutorials. Oracle, c2021. Disponível em: https://docs.oracle.com/javase/ tutorial/essential/. Acesso em: 18 ago. 2021. Os links para sites da web fornecidos neste capítulo foram todos testados, e seu funcionamento foi comprovado no momento da publicação do material. No entanto, a rede é extremamente dinâmica; suas páginas estão constantemente mudando de local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade sobre qualidade, precisão ou integralidade das informações referidas em tais links. Classes e objetos 13
Compartilhar