Aprenda POO Java

  • Página Inicial
  • Contato!
  • Tudo sobre POO Java Parte 1!
  • Tudo sobre POO Java Parte 2!
  • Tudo sobre POO Java Parte 3!
  • Tudo sobre POO Java Parte 4!
  • Tudo sobre POO Java Parte 5!
  • Tudo sobre POO Java Parte 6!
  • Tudo sobre POO Java Parte 7!
  • Tudo sobre POO Java Parte 4

    Exercício prático POO em Java

    Para esse exercício, faremos um encapsulamento com a classe Pessoa, uma agregação entre essa classe e a classe Livro, e uma interface. Veja o diagrama abaixo:

    Pessoa
    - nome
    - idade
    - sexo
    + fazerAniver()
    Livro
    - titulo
    - autor
    - totPaginas
    - pagAtual
    - aberto
    - leitor
    + detalhes()
    <<interface>>
    Publicacao
    + abrir()
    + fechar()
    + folhear(p)
    + avancarPag()
    + voltarPag()

    Abra um novo projeto Java com classe principal, e crie os arquivos de classes Pessoa, Livro e o de interface Publicacao.

    Esse é o código da interface Publicacao:

    
    package projetoleitura;
    
    public interface Publicacao {
        public void detalhes();
        public void abrir();
        public void fechar();
        public void folhear(int p);
        public void avancarPag();
        public void voltarPag();
    }
    
    

    Esse é o código da classe Pessoa:

    
    package projetoleitura;
    
    public class Pessoa {
        private String nome;
        private int idade;
        private String sexo;
        
        public void fazerAniver() {
            this.idade++;
        }
    
        public Pessoa(String nome, int idade, String sexo) {
            this.nome = nome;
            this.idade = idade;
            this.sexo = sexo;
        }
    
        public String getNome() {
            return nome;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        public int getIdade() {
            return idade;
        }
    
        public void setIdade(int idade) {
            this.idade = idade;
        }
    
        public String getSexo() {
            return sexo;
        }
    
        public void setSexo(String sexo) {
            this.sexo = sexo;
        }   
    }
    
    

    E esse é o código da classe Livro:

    
    package projetoleitura;
    
    public class Livro implements Publicacao {
        private String titulo;
        private String autor;
        private int totPaginas;
        private int pagAtual;
        private boolean aberto;
        private Pessoa leitor; // No lugar do tipo, usamos a classe criada.
    
        @Override
        public void detalhes() {
            System.out.println("Livro " + this.titulo + " escrito por " + this.autor + ".");
            if(this.aberto == true) {
                System.out.println("O livro está aberto!");
                System.out.println("Páginas: " + this.totPaginas + ", página atual " + this.pagAtual + ".");
                System.out.println("Sendo lido por " + this.leitor.getNome() + ".");
                System.out.println("De idade de " + this.leitor.getIdade() + " anos.");
                System.out.println("E de sexo " + this.leitor.getSexo() + ".");
            }
            else {
                System.out.println("O livro está fechado no momento!");
            }  
        }
    
        @Override
        public void abrir() {
            this.aberto = true;
        }
    
        @Override
        public void fechar() {
            this.aberto = false;
        }
    
        @Override
        public void folhear(int p) {
            if(this.getAberto() == true) {
                if(p > this.totPaginas) {
                    this.setPagAtual(this.getTotPaginas());
                }
                else if(p < 0) {
                    this.setPagAtual(0);
                }
                else {
                    this.pagAtual = p;
                }
            }
        }
    
        @Override
        public void avancarPag() {
            if(this.getAberto() == true) {
                if(this.getPagAtual() < this.getTotPaginas()) {
                    this.setPagAtual(this.getPagAtual() + 1);
                } 
            }
        }
    
        @Override
        public void voltarPag() {
            if(this.getAberto() == true) {
                if(this.getPagAtual() > 0) {
                    this.setPagAtual(this.getPagAtual() - 1);
                } 
            }
        }
        
        public Livro(String titulo, String autor, int totPaginas, Pessoa leitor) {
            this.titulo = titulo;
            this.autor = autor;
            this.totPaginas = totPaginas;
            this.leitor = leitor;
            this.pagAtual = 0;
            this.aberto = false;
        }
    
        public String getTitulo() {
            return titulo;
        }
    
        public void setTitulo(String titulo) {
            this.titulo = titulo;
        }
    
        public String getAutor() {
            return autor;
        }
    
        public void setAutor(String autor) {
            this.autor = autor;
        }
    
        public int getTotPaginas() {
            return totPaginas;
        }
    
        public void setTotPaginas(int totPaginas) {
            this.totPaginas = totPaginas;
        }
    
        public int getPagAtual() {
            return pagAtual;
        }
    
        public void setPagAtual(int pagAtual) {
            this.pagAtual = pagAtual;
        }
    
        public boolean getAberto() {
            return aberto;
        }
    
        public void setAberto(boolean aberto) {
            this.aberto = aberto;
        }
    
        public Pessoa getLeitor() {
            return leitor;
        }
    
        public void setLeitor(Pessoa leitor) {
            this.leitor = leitor;
        }
    }
    
    

    E na classe principal, coloque isso:

    
    package projetoleitura;
    
    public class ProjetoLeitura {
        public static void main(String[] args) {
            Pessoa p[] = new Pessoa[2];
            Publicacao l[] = new Publicacao[3]; // Implementação de interface
            
            p[0] = new Pessoa("Sérgio", 22, "M");
            p[1] = new Pessoa("Maria", 31, "F");
            
            l[0] = new Livro("Java Básico", "José da Silva", 300, p[0]);
            l[1] = new Livro("POO com Java", "Maria de Souza", 500, p[0]);
            l[2] = new Livro("Java Avançado", "Ana Paula", 800, p[1]);
            
            l[2].abrir();
            l[2].folhear(305);
            l[2].avancarPag();
            l[2].detalhes();
        }
    }
    
    

    Teste outros "livros", outras funções.

    PS: Tente colocar como privados os getters e setters.

    Herança - Parte 1

    Como sabemos, a POO tem três pilares, Encapsulamento, Herança e Polimorfismo (representados pelas letras EHP). O segundo que vamos tratar é a herança.

    O conceito herança é o de mãe e filha, se definimos uma classe como mãe, todas as classes filhas herdam suas características e comportamentos.

    A herança permite basear uma nova classe na definição de uma outra classe previamente existente. A classe filha é criada baseada na classe mãe já existente.

    Lembra do objeto Caneta? Vamos supor uma caneta esferográfica comum, e queiramos fazer uma caneta com luzinha, vamos pegar a caneta já pronta (classe mãe), e colocaremos a luzinha nela (classe filha), mantendo as características e comportamentos da caneta (de escrever, ter tinta, etc.), para isso usamos uma caneta já pronta e adicionamos esses recursos.

    Vamos supor que temos três pessoas, um aluno, um professor e um funcionário. Alguns atributos e métodos em comum entre eles colocaremos numa classe separada, que será a superclasse (progenitora ou mãe), e o Aluno, Professor e Funcionario serão subclasses (filhas). Veja o diagrama delas abaixo:

    Classe Mãe
    Pessoa
    - nome
    - idade
    - sexo
    + fazerAniver()

    Classes filhas:

    Aluno
    - matr
    - curso
    +cancelarMatr()
    Professor
    - especialidade
    - salario
    + receberAumento(aum)
    Funcionario
    - setor
    - trabalhando
    + mudarTrabalho()

    Vamos criar um novo projeto com classe principal pra isso, mas vamos usar a classe Pessoa que criamos na aula anterior, para isso, pegamos a classe Pessoa do projeto anterior e arrastamos pro pacote java "classes" do novo projeto (segure o Ctrl pra copiar), clique em refatorar para a classe do segundo projeto. Mas elimine o método construtor dela (ou crie um construtor vazio), e crie um método toString na mesma (para vermos os dados da mesma, para sobrepor o método original do Java).

    Para ele "herdar" elementos de outra classe, usamos o extends (extender), como veremos abaixo, na criação da classe Aluno:

    
    package faculdadepoo;
    
    public class Aluno extends Pessoa {
        private int matr;
        private String curso;
        
        public void cancelarMatr() {
            System.out.println("Matrícula será cancelada!");
        }
    
        public int getMatr() {
            return matr;
        }
    
        public void setMatr(int matr) {
            this.matr = matr;
        }
    
        public String getCurso() {
            return curso;
        }
    
        public void setCurso(String curso) {
            this.curso = curso;
        }
    }
    
    

    E fazer o mesmo com Professor:

    
    package faculdadepoo;
    
    public class Professor extends Pessoa {
        private String especialidade;
        private float salario;
        
        public void receberAumento(float aum) {
            this.salario += aum;
        }
    
        public String getEspecialidade() {
            return especialidade;
        }
    
        public void setEspecialidade(String especialidade) {
            this.especialidade = especialidade;
        }
    
        public float getSalario() {
            return salario;
        }
    
        public void setSalario(float salario) {
            this.salario = salario;
        }
    }
    
    

    E com funcionário:

    
    package faculdadepoo;
    
    public class Funcionario extends Pessoa {
        private String setor;
        private boolean trabalhando;
        
        public void mudarTrabalho() {
            this.trabalhando = !this.trabalhando;
        }
    
        public String getSetor() {
            return setor;
        }
    
        public void setSetor(String setor) {
            this.setor = setor;
        }
    
        public boolean getTrabalhando() {
            return trabalhando;
        }
    
        public void setTrabalhando(boolean trabalhando) {
            this.trabalhando = trabalhando;
        }
    }
    
    

    E esse é o código da classe principal:

    
    package faculdadepoo;
    
    public class FaculdadePoo {
    
        public static void main(String[] args) {
            Pessoa p1 = new Pessoa();
            Aluno p2 = new Aluno();
            Professor p3 = new Professor();
            Funcionario p4 = new Funcionario();
    
            p1.setNome("Sérgio");
            p2.setNome("Maria");
            p3.setNome("Cláudio");
            p4.setNome("Fabiana");
    
            p1.setSexo("M");
            p4.setSexo("F");
    
            p2.setCurso("Informática");
            p3.setSalario(2500.75f);
            p4.setSetor("Estoque");
    
            // Esses métodos não funcionarão, apenas nos objetos especificados, altere os objetos associados:
    
            p1.receberAumento(550.20);
            p2.mudarTrabalho();
            p4.cancelarMatr();
    
            System.out.println(p1.toString());
            System.out.println(p2.toString());
            System.out.println(p3.toString());
            System.out.println(p4.toString());
        }
    }
    
    

    Aí podemos entender o que é herança, onde podemos criar objetos com alguns atributos padrão (no caso, Pessoa), e outros com especialidades.

    PS: No Java, ao colocar o objeto sozinho no print, ele invoca automaticamente o método toString(), mas é bom para manter o uso dele para melhor entendimento do código.

    Na classe principal, tente colocar outros "setter" pra todos os atributos.

    PS: Não é possível uma mesma classe ter herança de mais de uma classe (herança múltipla), o que pode é uma classe ter uma herança e uma ou mais implementações de interfaces, seria algo tipo public class NomeDaClasse2 extends NomeDaClasse1 implements NomeDaInterface, a indicação da classe sempre vem antes das interfaces. E é possível usar o extends em interfaces, no caso de uma interface herdar os métodos de outras (em interfaces podemos ter herança de mais de uma interface).