Você está na página 1de 15

PROGRAMAÇÃO

ORIENTADA A
OBJETOS
Classes e objetos
Rafael Leal Martins

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
2 Classes e objetos

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 objetos 3

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 é
4 Classes e objetos

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 objetos 5

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-
butos definidos 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;
6 Classes e objetos

        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 objetos 7

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;
    }
8 Classes e objetos

    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 objetos 9

      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.
10 Classes e objetos

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 explicitamente como 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 objetos 11

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
12 Classes e objetos

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 objetos 13

       //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.

Você também pode gostar