Você está aqui: Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Programação Orientada a Objetos

Exercícios Resolvidos de Java - Crie uma classe Contato que possui dois atributos: nome e email do tipo String. Crie outra classe, chamada Agenda, que possui um atributo contatos do tipo vetor de Contato

Quantidade de visualizações: 212 vezes
Exercício Resolvido de Java - Crie uma classe Contato que possui dois atributos: nome e email do tipo String. Crie outra classe, chamada Agenda, que possui um atributo contatos do tipo vetor de Contato

Pergunta/Tarefa:

Crie uma classe Contato que possui dois atributos: nome e email do tipo String. Crie outra classe, chamada Agenda, que possui um atributo contatos do tipo vetor de Contato. A classe Agenda deve conter um método para adicionar um novo contato em uma posição vazia do vetor, outro método para buscar um contato (retorna uma instância de Contato) através do nome e, por fim, um método para excluir um contato através do nome.

Veja um print deste exercício em execução:



Resposta/Solução:

A resolução deste exercício sobre Programação Orientada a Objetos em Java é um pouco mais demorada que as demais, pois temos que criar um menu de opções. Note que temos que informar também o tamanho do vetor de objetos da classe Contato, ou seja, a quantidade de contatos de poderão ser cadastrados na agenda.

Vamos começar com o código da classe Contato:

Código para a classe Contato.java:

package arquivodecodigos;

public class Contato {
  // atributos da classe Contato
  String nome;
  String email;  
}

Agora o código para a classe Agenda.java, que contém um vetor de objetos da classe Contato:

Código para Agenda.java:

package arquivodecodigos;

public class Agenda {
  // vetor de contatos
  int quantContatos = 2;
  Contato contatos[] = new Contato[quantContatos];

  public void adicionarNovoContato(Contato c){
    boolean sucesso = false; // a operação obteve sucesso?
    
    // procuramos uma posição vazia
    for(int i = 0; i < quantContatos; i++){
      if(contatos[i] == null){
        // encontramos uma posição vazia
        contatos[i] = c;
        sucesso = true;
        break;
      }
    }
    
    if(sucesso){
      System.out.println("\nContato cadastrado com sucesso.\n");
    }
    else{
      System.out.println("\nErro: Lista de contatos cheia.\n");
    }
  } 
  
  // permite que permite pesquisar e retornar um contato
  public Contato pesquisarContato(String nome){
    Contato contato = null;
    
    // varre o vetor de contatos
    for(int i = 0; i < contatos.length; i++){
      // o contato foi encontrado?
      if((contatos[i] != null) && (contatos[i].nome.equals(nome))){
        contato = contatos[i]; // retorna o contato
        break;
      }
    }
    
    return contato;
  }
  
  // permite que permite pesquisar e excluir um contato
  public void excluirContato(String nome){
    Contato contato = null;
    boolean excluido = false;
    
    // varre o vetor de contatos
    for(int i = 0; i < contatos.length; i++){
      // o contato foi encontrado?
      if((contatos[i] != null) && (contatos[i].nome.equals(nome))){
        contatos[i] = null; // exclui o contato
        System.out.println("\nContato excluído com sucesso.\n");
        excluido = true;
        break;
      }
    }
    
    if(!excluido){
      System.out.println("\nContato não encontrado.\n");
    }
  }
}

E aqui está o código completo para a classe principal, com comentários, que cria um objeto da classe Agenda e oferece o menu de opções para o gerenciamento dos contatos:

Código para Principal.java:

package arquivodecodigos;

import java.util.Scanner;

public class Estudos{
  public static void main(String args[]){
    // vamos efetuar a leitura usando um objeto da
    // classe Scanner
    Scanner entrada = new Scanner(System.in);
    String nome, email; // dados temporários
    Contato c;
    
    // criamos um novo objeto da classe Agenda
    Agenda agenda = new Agenda();
    
    // um laço while infinito para exibir o menu
    while(true){
      System.out.println("1. Cadastrar Novo Contato");
      System.out.println("2. Pesquisar Contato");
      System.out.println("3. Excluir Contato");
      System.out.println("4. Sair");
      System.out.print("Sua opção: ");
      int opcao = Integer.parseInt(entrada.nextLine());
      
      switch(opcao){
        case 1: // cadastrar novo contato
          System.out.print("\nNome: ");
          nome = entrada.nextLine();
          System.out.print("E-Mail: ");
          email = entrada.nextLine();
          // cria um novo objeto da classe Contato
          c = new Contato();
          c.nome = nome;
          c.email = email;
          // e gravamos o novo contato
          agenda.adicionarNovoContato(c);
          break;
          
        case 2: // pesquisar um contato
          System.out.print("\nInforme o Nome: ");
          nome = entrada.nextLine();
          
          // pesquisa o contato
          c = agenda.pesquisarContato(nome);
          if(c == null){
            System.out.println("\nContato não encontrado.\n");
          }
          else{
            System.out.println("Contato encontrado:\nNome: " + c.nome +
              "; E-Mail: " + c.email + "\n");
          }
          
          break;
          
        case 3: // exclui um contato
          System.out.print("\nInforme o Nome: ");
          nome = entrada.nextLine();
          
          // exclui o contato
          agenda.excluirContato(nome);
          
          break;
          
        case 4: // fecha o programa
          System.exit(0);
      }
    }
  }
} 



Java ::: Dicas & Truques ::: Gráficos

Computação Gráfica em Java - Como definir a cor para o contexto de desenho usando o método setColor() da classe Graphics

Quantidade de visualizações: 7150 vezes
Muitas vezes queremos definir com qual cor um determinado desenho será realizado. Isso é feito por meio do uso do método setColor() da classe Graphics. Este método aceita um objeto da classe Color.

Veja um exemplo no qual definimos a cor que será usada para desenhar na superfície de um JLabel:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Estudos extends JFrame{
  JLabel label;  

  public Estudos() {
    super("Desenhando");
    
    Container c = getContentPane();
    c.setLayout(new BorderLayout());

    // Cria um JLabel
    label = new JLabel();
    c.add(label, BorderLayout.CENTER);

    // Cria um botão
    JButton btn = new 
      JButton("Desenhar Linhas Coloridas");
    btn.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent e){
          
          Graphics graphics = label.getGraphics();
          
          // obtém a cor atual
          Color corAnt = graphics.getColor();

          // desenha linhas coloridas no JLabel
          graphics.setColor(Color.RED); // vermelho
          graphics.drawLine(10, 15, 100, 10);
          
          graphics.setColor(Color.BLUE); // azul
          graphics.drawLine(20, 30, 80, 150);
          
          graphics.setColor(Color.YELLOW); // amarelo
          graphics.drawLine(50, 50, 120, 30);
          
          graphics.setColor(Color.GREEN); // verde
          graphics.drawLine(100, 100, 310, 100);    

          // retorna a cor original
          graphics.setColor(corAnt);

        }
      }
    );
    
    // Adiciona o botão à janela
    c.add(btn, BorderLayout.SOUTH);

    setSize(350, 250);
    setVisible(true);
  }
  
  public static void main(String args[]){
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}



Java ::: Reflection (introspecção) e RTI (Runtime Type Information) ::: Passos Iniciais

Como obter o nome de uma classe usando os métodos getClass() e getName() em um objeto usando Java

Quantidade de visualizações: 9977 vezes
Entre os métodos que uma classe herda da classe Object, está o método getClass(). Este método retorna um objeto da classe Class e podemos tirar proveito disso para fazer em encadeamento e chamar também o método getName() para obter o nome de uma determinada classe.

Veja o exemplo no qual obtemos uma String contendo o nome de uma classe (juntamente com o nome do pacote ao qual ela pertence):

import javax.swing.*;
 
public class Estudos{
  public static void main(String args[]){
    JButton btn = new JButton();
    String nomeClasse = btn.getClass().getName();
    System.out.println(nomeClasse);
 
    // exibirá: "javax.swing.JButton"
 
    System.exit(0);
  }
} 

Ao executarmos este código nós teremos o seguinte resultado:

javax.swing.JButton


Java ::: Tratamento de Erros ::: Erros de Tempo de Execução

Como tratar o erro StringIndexOutOfBoundsException em seus programas Java - A exceção StringIndexOutOfBoundsException da linguagem Java

Quantidade de visualizações: 9795 vezes
A exceção StringIndexOutOfBoundsException é uma exceção (erro) que acontece quando fornecemos um índice fora dos limites permitidos para o acesso de caracteres individuais em uma string, geralmente usando o método charAt. Lembre-se de que os índices dos caracteres em uma string Java começam em 0 e vão até o tamanho da string menos 1.

Antes de vermos os exemplos, observe a posição da classe pública StringIndexOutOfBoundsException na hierarquia de classes da plataforma Java:

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        java.lang.IndexOutOfBoundsException
          java.lang.StringIndexOutOfBoundsException

Esta classe implementa a interface Serializable.

Veja um trecho de código no qual fornecemos um índice de caractere inválido para o método charAt da classe String:

public class Estudos{
  public static void main(String args[]){
    String nome = "Java";     

    // vamos fornecer um índice inválido
    System.out.println(nome.charAt(4)); 

    System.exit(0);
  }
}

Compile este código e execute-o. Você verá a seguinte mensagem de erro:

Exception in thread "main" 
java.lang.StringIndexOutOfBoundsException: String 
index out of range: 4
  at java.lang.String.charAt(Unknown Source)
  at Estudos.main(Estudos.java:6)

Experimente trocar a linha:

System.out.println(nome.charAt(4));

por:

System.out.println(nome.charAt(3));

Compile novamente e execute. Você verá que a mensagem de erro desapareceu.


Java ::: Tratamento de Erros ::: Erros de Tempo de Execução

Como tratar o erro IndexOutOfBoundsException do Java - A exceção IndexOutOfBoundsException da linguagem Java

Quantidade de visualizações: 13461 vezes
A exceção IndexOutOfBoundsException é uma exceção (erro) que acontece quando fornecemos um índice fora dos limites permitidos para o acesso de elementos em um vetor, matriz, string ou demais coleções. Lembre-se de que os índices em Java começam em 0 e vão até a quantidade de elementos menos 1.

Antes de vermos os exemplos, observe a posição da classe pública IndexOutOfBoundsException na hierarquia de classes da plataforma Java:

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        java.lang.IndexOutOfBoundsException


Esta classe implementa a interface Serializable e possui duas sub-classes conhecidas: ArrayIndexOutOfBoundsException e StringIndexOutOfBoundsException.

Veja um exemplo no qual tentamos acessar um elemento de um vetor usando um índice inválido:

public class Estudos{
  public static void main(String args[]){
    // um array de quatro elementos
    int[] valores = {5, 23, 76, 3};     

    // vamos fornecer um índice inválido
    System.out.println(valores[4]); 

    System.exit(0);
  }
}

Este código compila normalmente. Porém, ao tentarmos executá-lo, temos a seguinte mensagem de erro:

Exception in thread "main" 
java.lang.ArrayIndexOutOfBoundsException: 4
  at Estudos.main(Estudos.java:7)

A forma mais adequada de corrigir este erro é fornecendo um valor de índice que realmente esteja na faixa permitida. Veja agora o mesmo trecho de código usando uma string:

public class Estudos{
  public static void main(String args[]){
    String nome = "Java";     

    // vamos fornecer um índice inválido
    System.out.println(nome.charAt(4)); 

    System.exit(0);
  }
}

Compile este código e execute-o. Você verá a seguinte mensagem de erro:

Exception in thread "main" 
java.lang.StringIndexOutOfBoundsException: String 
index out of range: 4
  at java.lang.String.charAt(Unknown Source)
  at Estudos.main(Estudos.java:6)

Vamos fazer o mesmo usando uma ArrayList:

import java.util.ArrayList;

public class Estudos{
  public static void main(String[] args){
    // cria uma ArrayList que conterá strings
    ArrayList<String> nomes = new ArrayList<String>();
    
    // adiciona itens na lista
    nomes.add("Carlos");
    nomes.add("Maria");
    nomes.add("Fernanda");
    nomes.add("Osmar");    
	
    // fornecemos um índica inválido
    String nome = nomes.get(4);

    System.out.println("O valor obtido foi: " + nome); 

    System.exit(0);
  }
}

Compile, execute e veja a mensagem de erro:

Exception in thread "main" 
java.lang.IndexOutOfBoundsException: Index: 4, 
Size: 4
  at java.util.ArrayList.RangeCheck(Unknown Source)
  at java.util.ArrayList.get(Unknown Source)
  at Estudos.main(Estudos.java:15)

Veja que no caso do vetor, a exceção lançada foi ArrayIndexOutOfBoundsException, no caso da string a exceção foi StringIndexOutOfBoundsException e no caso do ArrayList tivemos IndexOutOfBoundsException. Resolvemos abordar estas três exceções em apenas uma anotação para que você perceba a semelhança entre elas.


Java ::: Dicas & Truques ::: Programação Orientada a Objetos

Programação orientada a objetos em Java - Java OOP - Como usar variáveis estáticas em suas classes Java

Quantidade de visualizações: 10144 vezes
Variáveis estáticas podem ser definidas em Java por meio do uso da palavra-chave static. Uma variável estática pertence à classe na qual ela é definida e não à cada uma de suas instâncias. Pareceu confuso? Você pode pensar assim: quando definida com o modificador static, uma variável será única na classe, não importa a quantidade de instâncias da classe que serão criadas. Cada uma destas instâncias compartilhará o valor da variável estática.

Além disso, uma variável estática pode ser acessada por meio do nome da classe, sem a necessidade de uma referência a uma de suas instâncias. Uma variável estática pode ser public, private ou protected.

Vamos ver um exemplo? Considere a situação na qual gostaríamos de criar um identificador único para cada um dos objetos de uma classe. Veja o código para a classe Livro:

Código para Livro.java:

package estudos;

public class Livro {
  // variáveis privadas
  private String titulo; // título do livro
  // variável estática que permitirá definir um
  // identificador único para cada livro
  private static int id;

  // construtor da classe Livro
  public Livro(){
    // vamos incrementar a variável estática
    Livro.id++;
  }

  // método que permite obter o id do livro
  public int getId(){
    return Livro.id;
  }

  // método que permite definir o título do livro
  public void setTitulo(String titulo){
    this.titulo = titulo;
  }

  // método que permite obter o título do livro
  public String getTitulo(){
    return this.titulo;
  }
}

Veja agora como criar três objetos da classe Livro a partir do método main() da aplicação:

Código para Main.java:

package estudos;

public class Main {
  public static void main(String[] args) {
    // vamos criar um objeto da classe Livro
    Livro a = new Livro();
    a.setTitulo("Programando em Java 2");

    // vamos exibir os dados do livro
    System.out.println("Id: " + a.getId());
    System.out.println("Titulo: " + a.getTitulo());

    // vamos criar mais um livro
    Livro b = new Livro();
    b.setTitulo("A biblia do C/C++");

    // vamos exibir os dados do livro
    System.out.println("Id: " + b.getId());
    System.out.println("Titulo: " + b.getTitulo());

    // e mais um livro aqui
    Livro c = new Livro();
    c.setTitulo("PHP + MySQL");

    // vamos exibir os dados do livro
    System.out.println("Id: " + c.getId());
    System.out.println("Titulo: " + c.getTitulo());
  }
}

Ao executar esta aplicação teremos o seguinte resultado:

Id: 1
Titulo: Programando em Java 2
Id: 2
Titulo: A biblia do C/C++
Id: 3
Titulo: PHP + MySQL

Como podemos ver, a cada instância criada a variável id é incrementada em 1. Caso você não tenha entendido todo o processo, este incremento acontece no construtor da classe Livro. Veja:

// vamos incrementar a variável estática
Livro.id++;

Nas situações em que as variáveis estáticas são públicas, podemos acessá-la usando o nome da classe seguida de um ponto. Assim, se a variável id fosse pública, poderíamos acessá-la de qualquer lugar de nossa aplicação da seguinte forma:

System.out.println(Livro.id);


Veja mais Dicas e truques de Java

Dicas e truques de outras linguagens

Quem Somos

Osmar J. Silva
WhatsApp +55 (062) 98553-6711

Goiânia-GO
Full Stack Developer, Professional Java Developer, PHP, C/C++, Python Programmer, wxWidgets Professional C++ Programmer, Freelance Programmer. Formado em Ciência da Computação pela UNIP (Universidade Paulista Campus Goiânia) e cursando Engenharia Elétrica pela PUC-Goiás. Possuo conhecimentos avançados de Java, Python, JavaScript, C, C++, PHP, C#, VB.NET, Delphi, Android, Perl, e várias tecnologias que envolvem o desenvolvimento web, desktop, front-end e back-end. Atuo há mais de 15 anos como programador freelancer, atendendo clientes no Brasil, Portugal, Argentina e vários outros paises.
Entre em contato comigo para, juntos, vermos em que posso contribuir para resolver ou agilizar o desenvolvimento de seus códigos.
José de Angelis
WhatsApp +55 (062) 98243-1195

Goiânia-GO
Formado em Sistemas de Informação pela Faculdade Delta, Pós graduado em Engenharia de Software (PUC MINAS), Pós graduado Marketing Digital (IGTI) com ênfase em Growth Hacking. Mais de 15 anos de experiência em programação Web. Marketing Digital focado em desempenho, desenvolvimento de estratégia competitiva, analise de concorrência, SEO, webvitals, e Adwords, Métricas de retorno. Especialista Google Certificado desde 2011 Possui domínio nas linguagens PHP, C#, JavaScript, MySQL e frameworks Laravel, jQuery, flutter. Atualmente aluno de mestrado em Ciência da Computação (UFG)
Não basta ter um site. É necessário ter um site que é localizado e converte usuários em clientes. Se sua página não faz isso, Fale comigo e vamos fazer uma analise e conseguir resultados mais satisfatórios..

Linguagens Mais Populares

1º lugar: Java
2º lugar: C#
3º lugar: PHP
4º lugar: Delphi
5º lugar: Python
6º lugar: JavaScript
7º lugar: C
8º lugar: C++
9º lugar: VB.NET
10º lugar: JSP (Java Server Pages)



© 2021 Arquivo de Códigos - Todos os direitos reservados | Versión en Español | Versão em Português