Então podemos dizer que uma classe abstrata existe para poder servir de molde para outras classes. Levamos em consideração a ultima classe desenvolvida por nós; a classe Pessoa.java, ela pode se tornar muito genérica pois um funcionário pode ser uma pessoa, uma pessoa pode ser jurídica e pode ser física, então podemos dizer que todas as pessoas tem um padrão e esse padrão nós colocamos em classes abstratas.

Temos que saber que uma classe abstrata sempre será uma superclasse, para quem não sabe o que isso quer dizer, estaremos olhando sobre herança no próximo artigo. Uma classe abstrata também não pode ser instanciada, isto é, não pode ser dado um new nessa classe. Ela geralmente apresenta métodos incompletos, o que pode ser sobrescrito na classe filha.

Classes abstratas e encapsulamento


/**

* Métodos de importações ocultos

**/

abstract class Item { // classe abstrata

    private String titulo;

    private Usuario retiradoPor;

    private Date dtEmprestimo;

    private Date dtDevolucao;

    public Item (String tit) {

        titulo=tit;

    }

    public boolean isEmprestado() {

        return (!(retiradoPor==null));

    }

    public boolean isEmAtraso() {

        Date hoje = new Date();

    return(isEmprestado()&&

    dtDevolucao.before(hoje));

}

Então se lembre se em alguma certificação vier na pergunta o que são classes abstratas você já sabe que são classes que não tem instancias diretas. Mas cujas classes descendentes contem instancias diretas. Vamos ver um exemplo mais simples. Se eu falasse a palavra Bomba... Bom o que me vem a cabeça pode não ser a mesma coisa que você está pensando. Para isso criamos uma classe que pode ser qualquer bomba que você estiver pensando. As classes que utilizar essa classe serão derivadas dela olhe o diagrama UML.

Classes abstratas e encapsulamento
Figura 1. Classe Bomba

Olhando para o diagrama de classe acima vimos uma classe chamada Bomba e essa classe é ligada a outras três classes chamadas Bomba de Água, Bomba de Combustível, Bomba Atômica e todas elas usam o atributo ativa(). Quando formos olhar um pouco melhor herança e Orientação a Objetos vamos voltar e rever essa classe importante.

Encapsulamento

O encapsulamento é a técnica para agregação das partes de um subprograma (dados e códigos) numa forma que seja tratada como uma unidade indivisível pelas demais partes do programa. Imagine aquele programa que usamos no artigo passado. Quando utilizamos p.nome para que o objeto retorne o nome da referencia desse objeto deixamos com que o atributo nome possa ser acessado de qualquer parte do programa e não sabemos se ele é de um atributo de retorno ou de modificação. Para isso utilizamos padrões JavaBens como Get e Set.

Por exemplo, quando queremos receber algum valor utilizamos o método get + o nome do atributo com a inicial capitalizada, como vemos no exemplo getNome já quando queremos modificar ou repassar uma valor utilizamos o set da mesma forma como apresentada acima, exemplo setNome os padrões gets sempre retornam algum valor já os sets geralmente somente modificam estes valores. Vamos ver um método get.


public String getNome(){

    return nome;

}

Então para ter um método encapsulado utilizamos um modificador de acesso que geralmente é public o tipo de retorno que ele terá que neste caso é String e o nome do método e o tipo de retorno dele. Uma coisa que devemos saber é que o retorno sempre tem que ser alcançável e do mesmo tipo.

Má prática de programação pois o retorno pode não ser alcançável.


public String getNome(){

    if(this.nome == null){

            return 1;

    } else {

            return 2;

    }

}

Vejamos como ficaria a classe pessoa com encapsulamento.


Pessoa.java

public class Pessoa{

      private String nome;

      private String sobrenome;

      private String dataNasc;

      private String rg;

      private String[] telefones;

     

      public String getNome(){

            return nome;

      }

      public void setNome(String n){

            nome = n;

      }

      public String getSobrenome(){

            return sobrenome;

      }

      public void setSobrenome(String s){

            sobrenome = s;

      }

      public String getDataNasc(){

            return dataNasc;

      }

      public void setDataNasc(String d){

            dataNasc = d;

      }

      public String getRg(){

            return rg;

      }

      public void setRg(String r){

            r = rg;

      }

      public String getTelefones(){

            return telefones;

      }

      public void setTelefones(String[] telefones){

            telefones[] = telefones;

      }

}
Exercício de Encapsulamento
Como exercício tente encapsular a seguinte classe

Saiu na DevMedia!

  • CSS Tutorial: da Sintaxe ao Flexbox:
    CSS é um item que não pode faltar na caixa de ferramentas de um programador web, pois é com ela que descrevemos para o navegador como os elementos em uma página serão apresentados para o usuário.
  • Guia de React Native: do Hello World ao CRUD:
    React é um framework JavaScript criado pelo Facebook para facilitar a construção de interfaces de usuário. React Native, da mesma empresa, nos permite criar aplicações mobile nativas utilizando JavaScript, na lógica, e React, para estruturar as views. No DevCast abaixo matamos a sua curiosidade sobre como isso tudo se parece na prática. Assista.
  • Guia de Levantamento de Requisitos:
    Nesta série, falamos sobre as técnicas, como conduzir uma reunião com o cliente e gerar os documentos mínimos necessários para o levantamento dos requisitos do software. Confira!

Saiba mais sobre Encapsulamento ;)